Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions agent-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -1036,7 +1036,7 @@
],
[
"backup_model",
"openai/gpt-5-mini"
"openai/gpt-5.6"
]
]
},
Expand Down Expand Up @@ -1518,7 +1518,7 @@
"description": "Whether to track usage"
},
"thinking_budget": {
"description": "Controls reasoning effort/budget. Use 'none' or 0 to disable thinking. OpenAI: string levels ('minimal','low','medium','high','xhigh'). Anthropic: integer token budget (1024-32768), 'adaptive' (adaptive thinking with high effort by default), 'adaptive/<effort>' where effort is low/medium/high/xhigh/max ('xhigh' is supported by Claude Opus 4.7+), or effort levels ('low','medium','high','xhigh','max') which use adaptive thinking with the given effort. Amazon Bedrock (Claude): integer token budget or effort levels ('low','medium','high') mapped to token budgets. Google Gemini 2.5: integer token budget (-1 for dynamic, 0 to disable, 24576 max). Google Gemini 3: string levels ('minimal' Flash only,'low','medium','high'). Thinking is only enabled when explicitly configured.",
"description": "Controls reasoning effort/budget. Use 'none' or 0 to disable thinking. OpenAI: string levels ('none','minimal','low','medium','high','xhigh','max') — 'xhigh' requires gpt-5.2+; 'none' and 'max' require gpt-5.6+ (Sol/Terra/Luna); 'minimal' is not accepted on gpt-5.6+. Anthropic: integer token budget (1024-32768), 'adaptive' (adaptive thinking with high effort by default), 'adaptive/<effort>' where effort is low/medium/high/xhigh/max ('xhigh' is supported by Claude Opus 4.7+), or effort levels ('low','medium','high','xhigh','max') which use adaptive thinking with the given effort. Amazon Bedrock (Claude): integer token budget or effort levels ('low','medium','high') mapped to token budgets. Google Gemini 2.5: integer token budget (-1 for dynamic, 0 to disable, 24576 max). Google Gemini 3: string levels ('minimal' Flash only,'low','medium','high'). Thinking is only enabled when explicitly configured.",
"oneOf": [
{
"type": "string",
Expand Down Expand Up @@ -1615,7 +1615,7 @@
"examples": [
[
"anthropic/claude-sonnet-4-5",
"openai/gpt-5",
"openai/gpt-5.6",
"dmr/ai/qwen3"
]
]
Expand Down
4 changes: 2 additions & 2 deletions cmd/root/doctor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ func TestDoctorCommand_ChatGPTLoginSource(t *testing.T) {

require.NoError(t, err)
assert.Regexp(t, `chatgpt\s+found\s+CHATGPT_OAUTH_TOKEN\s+chatgpt-login`, output)
assert.Contains(t, output, "auto -> chatgpt/gpt-5.2")
assert.Contains(t, output, "auto -> chatgpt/gpt-5.6")
assert.Contains(t, output, "No issues found.")
assert.NotContains(t, output, "chatgpt-access-token", "secret values must never be printed")
}
Expand Down Expand Up @@ -266,7 +266,7 @@ func TestDoctorCommand_JSON(t *testing.T) {
assert.Equal(t, dmrStatusReachable, report.DMR.Status)
assert.Equal(t, []string{"ai/qwen3:latest"}, report.DMR.Models)
assert.Equal(t, "openai", report.AutoModel.Provider)
assert.Equal(t, "gpt-5", report.AutoModel.Model)
assert.Equal(t, "gpt-5.6", report.AutoModel.Model)
assert.True(t, report.AutoModel.Usable)
assert.Empty(t, report.Issues)

Expand Down
1 change: 1 addition & 0 deletions cmd/wasm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ are intentionally tiny:
| File | Purpose |
| --- | --- |
| `pkg/cache/lock_js.go` | No-op file-lock stubs (single-threaded js). |
| `pkg/userconfig/lock_js.go` | No-op file-lock stubs for the user config file (single-threaded js). |
| `pkg/desktop/sockets_js.go` | Returns empty Docker Desktop paths. |
| `pkg/desktop/connection_js.go` | Refuses Unix-socket / named-pipe dials. |
| `pkg/desktop/connection_other.go` | Build tag updated to `!windows && !js`. |
Expand Down
19 changes: 15 additions & 4 deletions docs/concepts/models/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,22 @@ Control how much the model "thinks" before responding:

| Provider | Format | Values | Default |
| ---------- | ---------- | ------------------------------------------------------------------- | -------------------------------- |
| OpenAI | string | `minimal`, `low`, `medium`, `high`, `xhigh` | `medium` (always-reasoning models only) |
| OpenAI | string | `minimal`, `low`, `medium`, `high`, `xhigh`, `max` | `medium` (always-reasoning models only) |
| Anthropic | int or str | 1024–32768 tokens, or `adaptive`, `adaptive/<effort>`, effort level | off |
| Gemini 2.5 | int | 0 (off), -1 (dynamic), or token count | -1 (dynamic) |
| Gemini 3 | string | `minimal`, `low`, `medium`, `high` | varies |
| All | string/int | `none` or `0` to disable | — |
| All | string/int | `none` or `0` clears docker-agent's local config | — |

`none` and `0` are not universal API-level disable switches. On genuine OpenAI
gpt-5.6+ endpoints (Sol/Terra/Luna), `none` is a real `reasoning_effort` value
that docker-agent sends as-is and the model does not reason. On older OpenAI
models, `none`/`0` only clear the local `thinking_budget` — omitting the field
has the same effect — and the model falls back to the API's own default effort
(still reasoning internally for always-reasoning models like the o-series).
Providers with a true optional-thinking switch (Gemini 2.5, Claude, local
models) are fully disabled by `none`/`0`. See the
[Thinking / Reasoning guide](../../guides/thinking/index.md#disabling-thinking)
for the full per-provider breakdown.

```yaml
models:
Expand All @@ -140,8 +151,8 @@ models:

fast-responder:
provider: openai
model: gpt-5
thinking_budget: none # disable thinking
model: gpt-5.6
thinking_budget: none # real API-level disable on gpt-5.6+
```

> [!NOTE]
Expand Down
20 changes: 15 additions & 5 deletions docs/configuration/models/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -278,8 +278,8 @@ Uses effort levels as strings:
models:
gpt:
provider: openai
model: gpt-5
thinking_budget: low # minimal | low | medium | high | xhigh
model: gpt-5.6
thinking_budget: low # none | minimal | low | medium | high | xhigh | max (xhigh needs gpt-5.2+; none/max need gpt-5.6+; minimal dropped on gpt-5.6+)
```

### Anthropic
Expand Down Expand Up @@ -325,13 +325,23 @@ models:

### Disabling Thinking

Works for all providers:

```yaml
thinking_budget: none # or 0
```

Models that always reason (OpenAI o-series, gpt-5, Gemini 3) fall back to the API default and still reason internally.
`none` and `0` both clear docker-agent's local thinking configuration (omitting `thinking_budget` has the same effect); neither is guaranteed to reach the API as a real "off" switch:

- **OpenAI gpt-5.6+** (Sol/Terra/Luna) is the only case with a genuine API-level `none` reasoning effort: docker-agent sends it as-is and the model does not reason.
- **Older OpenAI reasoning models** (o-series, gpt-5 through gpt-5.5) have no such switch: `none`/`0` just clear the local config, and the model falls back to the API's own default effort and still reasons internally. Same for other always-reasoning models (Gemini 3).
- Providers with a true optional-thinking switch (Gemini 2.5, Claude, local models) are fully disabled by `none`/`0`.

```yaml
models:
fast-responder:
provider: openai
model: gpt-5.6
thinking_budget: none # real API-level disable on gpt-5.6+
```

See the [Thinking / Reasoning guide](../../guides/thinking/index.md) for per-provider details, including AWS Bedrock and Docker Model Runner.

Expand Down
23 changes: 12 additions & 11 deletions docs/guides/thinking/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ docker-agent exposes this through a single `thinking_budget` field on any named

| Provider | Format | Values | Default |
| ------------------- | ---------- | --------------------------------------------------------------------------------------- | ------------------ |
| OpenAI | string | `minimal`, `low`, `medium`, `high`, `none`; `xhigh` on gpt-5.2+ only | `medium` (API default) |
| OpenAI | string | `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`; `xhigh` on gpt-5.2+, `none`/`max` on gpt-5.6+ only, `minimal` dropped on gpt-5.6+ | `medium` (API default) |
| Anthropic | int or str | 1024–32768 tokens, or `minimal`–`max`, `adaptive`, `adaptive/<effort>`, `none` | off |
| Gemini 2.5 | int | `0` (off), `-1` (dynamic), or token count (max 24576 / 32768) | `-1` (dynamic) |
| Gemini 3 | string | `minimal`, `low`, `medium`, `high` | API default (model-dependent) |
Expand All @@ -36,33 +36,34 @@ String values are case-insensitive. The full set of accepted strings is `none`,

## OpenAI

OpenAI reasoning models (o-series, gpt-5, gpt-5-mini) use a string effort level that maps to their `reasoning_effort` API parameter. The `xhigh` level is only accepted by gpt-5.2 and later minor versions; o-series and earlier gpt-5 releases top out at `high`.
OpenAI reasoning models (o-series, gpt-5, gpt-5-mini, gpt-5.6 family) use a string effort level that maps to their `reasoning_effort` API parameter. The `xhigh` level requires gpt-5.2+; `none` and `max` require gpt-5.6+ (Sol/Terra/Luna); `minimal` is dropped on gpt-5.6+.

```yaml
models:
gpt-thinker:
provider: openai
model: gpt-5-mini
thinking_budget: high # minimal | low | medium | high | xhigh
model: gpt-5.6
thinking_budget: high # none | minimal | low | medium | high | xhigh | max
```

**Effort levels:**

| Level | Description |
| --------- | -------------------------------------------------------- |
| `none` | Don't request extra reasoning (alias for `0`); the API's own default still applies. |
| `minimal` | Fastest; lightest reasoning pass. |
| `none` | No reasoning. Sent as-is on gpt-5.6+ (a real API value); on older models it just disables the local `thinking_budget` (the API's own default still applies). |
| `minimal` | Fastest; lightest reasoning pass. Not accepted on gpt-5.6+ (dropped from the API). |
| `low` | Quick reasoning for straightforward tasks. |
| `medium` | Balanced default. |
| `high` | More thorough; recommended for complex tasks. |
| `xhigh` | Near-maximum effort; slower but most accurate. |
| `xhigh` | Near-maximum effort; slower but most accurate. Requires gpt-5.2+. |
| `max` | Maximum effort. Requires gpt-5.6+. |

These effort levels (`minimal`–`xhigh`) are the **only** values accepted for OpenAI. Token counts, `max`, `adaptive`, and `adaptive/<effort>` are rejected with a configuration error at request time. The `xhigh` level is only supported by gpt-5.2 and later minor versions (e.g. gpt-5.2, gpt-5.4-mini); o-series and earlier gpt-5 releases top out at `high`. Older models (o1, o3-mini) only accept `low`/`medium`/`high` — sending an unsupported level returns an API error.
Token counts, `adaptive`, and `adaptive/<effort>` are rejected with a configuration error at request time. `xhigh` is only supported by gpt-5.2 and later minor versions (e.g. gpt-5.2, gpt-5.4-mini); `none` and `max` are only supported by gpt-5.6 and later (Sol/Terra/Luna); `minimal` is not accepted on gpt-5.6+. Older models (o1, o3-mini) only accept `low`/`medium`/`high` — sending an unsupported level returns an API error.

> [!WARNING]
> **Tokens and max_tokens**
>
> OpenAI reasoning models always reason internally — even with `thinking_budget: none` there are hidden reasoning tokens that count against `max_tokens`. docker-agent automatically raises the output-token floor for its internal low-effort calls (e.g. title generation) so hidden reasoning cannot starve visible text output.
> Older OpenAI reasoning models always reason internally — even with `thinking_budget: none` there are hidden reasoning tokens that count against `max_tokens`. On gpt-5.6+ (Sol/Terra/Luna), `none` is a real API value that genuinely disables reasoning. docker-agent automatically raises the output-token floor for its internal low-effort calls (e.g. title generation) so hidden reasoning cannot starve visible text output.

## Anthropic

Expand Down Expand Up @@ -311,7 +312,7 @@ models:
thinking_budget: 0
```

`none` and `0` clear docker-agent's thinking configuration — no thinking parameter is sent. Models that always reason (OpenAI o-series, gpt-5, Gemini 3) then fall back to the API's default behavior and still reason internally; only models with optional thinking (Gemini 2.5, Claude, local models) are fully disabled.
`none` and `0` clear docker-agent's thinking configuration — no thinking parameter is sent. Models that always reason (OpenAI o-series, gpt-5 through gpt-5.5, Gemini 3) then fall back to the API's default behavior and still reason internally; gpt-5.6+ (Sol/Terra/Luna) sends `none` as a real API value that genuinely disables reasoning. Models with optional thinking (Gemini 2.5, Claude, local models) are also fully disabled.

## Choosing an Effort Level

Expand All @@ -328,7 +329,7 @@ models:

While running in the TUI, press **Shift+Tab** to cycle the thinking effort level for the current model without editing your YAML config, or type `/effort <level>` to jump straight to a specific level (e.g. `/effort high`). Running `/effort` without an argument opens a picker listing the levels the current model supports:

- The level steps through the model's supported range (model-specific), wrapping around — for example `none → minimal → low → medium → high → none` on OpenAI gpt-5/o-series, `none → minimal → low → medium → high → xhigh → none` on gpt-5.2+, `none → low → medium → high → max → none` on Anthropic Opus 4.6 and Sonnet 4.6, and `none → low → medium → high → xhigh → max → none` on Anthropic Opus 4.7+, Fable 5, and Mythos 5. For older Anthropic models (e.g. Sonnet 4.5) that only accept token budgets, effort-string cycling has no effect — use an integer `thinking_budget` in your YAML config instead.
- The level steps through the model's supported range (model-specific), wrapping around — for example `none → minimal → low → medium → high → none` on OpenAI gpt-5/o-series, `none → minimal → low → medium → high → xhigh → none` on gpt-5.2+, `none → low → medium → high → xhigh → max → none` on gpt-5.6+ (no `minimal`), `none → low → medium → high → max → none` on Anthropic Opus 4.6 and Sonnet 4.6, and `none → low → medium → high → xhigh → max → none` on Anthropic Opus 4.7+, Fable 5, and Mythos 5. For older Anthropic models (e.g. Sonnet 4.5) that only accept token budgets, effort-string cycling has no effect — use an integer `thinking_budget` in your YAML config instead.
- The current level is shown in the sidebar next to the model name (e.g. `openai/gpt-5 • high`).
- This applies as a session override — it is **not** saved to the config file. The next session starts from the level defined in your YAML.
- For models that don't support reasoning, and for remote runtimes, Shift+Tab is a no-op and an informational message is displayed.
Expand Down
26 changes: 16 additions & 10 deletions docs/providers/chatgpt/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ Business plan rather than pay-per-token API credits.

Under the hood, docker-agent talks to the ChatGPT Codex backend
(`https://chatgpt.com/backend-api/codex`), which serves the `gpt-5` model
family over the OpenAI Responses API.
family over the OpenAI Responses API. GPT-5.6 (Sol/Terra/Luna) is served
there too; GPT-5.2 and GPT-5.3-Codex are deprecated for ChatGPT sign-in.

## Prerequisites

Expand Down Expand Up @@ -52,7 +53,7 @@ rm ~/.config/cagent/chatgpt-auth.json # sign out (remove the stored sign-in
```yaml
agents:
root:
model: chatgpt/gpt-5.2
model: chatgpt/gpt-5.6
instruction: You are a helpful assistant.
```

Expand All @@ -62,7 +63,7 @@ agents:
models:
gpt:
provider: chatgpt
model: gpt-5.2
model: gpt-5.6
thinking_budget: medium

agents:
Expand All @@ -75,12 +76,17 @@ agents:
The Codex backend serves the models available to your ChatGPT plan,
typically:

| Model | Best For |
| ------------------- | ------------------------------------- |
| `gpt-5.2` | General purpose, strong reasoning |
| `gpt-5.2-codex` | Agentic coding workflows |
| `gpt-5.1` | Previous flagship |
| `gpt-5.1-codex-mini`| Fast and cheap coding tasks |
| Model | Best For |
| -------------------- | -------------------------------------- |
| `gpt-5.6` | Alias for `gpt-5.6-sol`; general purpose, strong reasoning |
| `gpt-5.6-sol` | Frontier model, most capable |
| `gpt-5.6-terra` | Everyday workhorse |
| `gpt-5.6-luna` | High-volume, cost-efficient |
| `gpt-5.2` | Deprecated for ChatGPT sign-in |
| `gpt-5.2-codex` | Deprecated for ChatGPT sign-in |

The effort picker exposes Low/Medium/High/XHigh/Max on the GPT-5.6 family
(no Minimal).

## How It Works

Expand Down Expand Up @@ -114,7 +120,7 @@ refreshed.
| Embeddings / reranking | Not supported | Supported |

When both credentials are configured, automatic model selection prefers
`openai`; pin `--model chatgpt/gpt-5.2` (or use a named model) to use the
`openai`; pin `--model chatgpt/gpt-5.6` (or use a named model) to use the
subscription.

> [!NOTE]
Expand Down
Loading
Loading