Problem
The thinking/effort level UI shows OpenAI-centric levels (off/minimal/low/medium/high/xhigh) for all providers, including Anthropic models that use the adaptive thinking API. This is incorrect and confusing for Anthropic models.
Anthropic adaptive thinking (Opus 4.6, Sonnet 4.6)
The Anthropic API defines effort levels as:
low — Minimal thinking, skips for simple tasks
medium — Moderate thinking, may skip for simple queries
high — Always thinks, deep reasoning (default)
max — Always thinks with no constraints (Opus 4.6 only)
Additionally, omitting the effort parameter (null) lets the model decide autonomously — effectively "auto" mode.
What the UI currently shows
For all reasoning models:
off / minimal / low / medium / high (standard)
off / minimal / low / medium / high / xhigh (for models where supportsXhigh() returns true)
Issues
- Duplicate levels:
minimal and low both map to Anthropic's low in mapThinkingLevelToEffort() — they're indistinguishable
- Wrong naming:
xhigh is shown instead of max, which is what Anthropic's API calls it
- Missing
auto: No way to let the model decide when/how much to think (Anthropic's default adaptive behavior when no effort is specified)
- Sonnet 4.6 excluded:
supportsXhigh() in models.ts only returns true for Opus 4.6 on the anthropic-messages API, but Sonnet 4.6 also supports adaptive thinking (just not max)
THINKING_DESCRIPTIONS are misleading: Token budget descriptions like "~1k tokens" and "~8k tokens" don't apply to adaptive thinking, which doesn't use token budgets
Affected files
packages/ai:
src/types.ts — ThinkingLevel type is provider-agnostic but values are OpenAI-centric
src/models.ts — supportsXhigh() doesn't account for provider-specific level sets
src/providers/anthropic.ts — has correct mapping internally (mapThinkingLevelToEffort), but the UI layer has no way to know the actual provider levels
packages/coding-agent:
src/core/agent-session.ts — THINKING_LEVELS / THINKING_LEVELS_WITH_XHIGH constants and getAvailableThinkingLevels() are not provider-aware
src/modes/interactive/components/settings-selector.ts — THINKING_DESCRIPTIONS and level labels are hardcoded
src/modes/interactive/interactive-mode.ts — cycleThinkingLevel() cycles through the wrong set
src/cli/args.ts — VALID_THINKING_LEVELS validation
packages/web-ui:
src/components/MessageEditor.ts — hardcoded off/minimal/low/medium/high options
Expected behavior
When an Anthropic adaptive thinking model is selected:
- Show effort levels:
off / low / medium / high / max (and auto if supported)
- Use Anthropic's own terminology in labels and descriptions
- Descriptions should reference adaptive thinking behavior, not token budgets
When an OpenAI model is selected:
- Continue showing:
off / minimal / low / medium / high (and xhigh for supported models)
Reference
The GitHub Copilot Anthropic integration already uses these correct levels (low/medium/high/max) with the adaptive thinking API. See Anthropic SDK OutputConfig.effort: 'low' | 'medium' | 'high' | 'max' | null.
Problem
The thinking/effort level UI shows OpenAI-centric levels (
off/minimal/low/medium/high/xhigh) for all providers, including Anthropic models that use the adaptive thinking API. This is incorrect and confusing for Anthropic models.Anthropic adaptive thinking (Opus 4.6, Sonnet 4.6)
The Anthropic API defines effort levels as:
low— Minimal thinking, skips for simple tasksmedium— Moderate thinking, may skip for simple querieshigh— Always thinks, deep reasoning (default)max— Always thinks with no constraints (Opus 4.6 only)Additionally, omitting the effort parameter (
null) lets the model decide autonomously — effectively "auto" mode.What the UI currently shows
For all reasoning models:
off / minimal / low / medium / high(standard)off / minimal / low / medium / high / xhigh(for models wheresupportsXhigh()returns true)Issues
minimalandlowboth map to Anthropic'slowinmapThinkingLevelToEffort()— they're indistinguishablexhighis shown instead ofmax, which is what Anthropic's API calls itauto: No way to let the model decide when/how much to think (Anthropic's default adaptive behavior when no effort is specified)supportsXhigh()inmodels.tsonly returns true for Opus 4.6 on theanthropic-messagesAPI, but Sonnet 4.6 also supports adaptive thinking (just notmax)THINKING_DESCRIPTIONSare misleading: Token budget descriptions like "~1k tokens" and "~8k tokens" don't apply to adaptive thinking, which doesn't use token budgetsAffected files
packages/ai:
src/types.ts—ThinkingLeveltype is provider-agnostic but values are OpenAI-centricsrc/models.ts—supportsXhigh()doesn't account for provider-specific level setssrc/providers/anthropic.ts— has correct mapping internally (mapThinkingLevelToEffort), but the UI layer has no way to know the actual provider levelspackages/coding-agent:
src/core/agent-session.ts—THINKING_LEVELS/THINKING_LEVELS_WITH_XHIGHconstants andgetAvailableThinkingLevels()are not provider-awaresrc/modes/interactive/components/settings-selector.ts—THINKING_DESCRIPTIONSand level labels are hardcodedsrc/modes/interactive/interactive-mode.ts—cycleThinkingLevel()cycles through the wrong setsrc/cli/args.ts—VALID_THINKING_LEVELSvalidationpackages/web-ui:
src/components/MessageEditor.ts— hardcoded off/minimal/low/medium/high optionsExpected behavior
When an Anthropic adaptive thinking model is selected:
off / low / medium / high / max(andautoif supported)When an OpenAI model is selected:
off / minimal / low / medium / high(andxhighfor supported models)Reference
The GitHub Copilot Anthropic integration already uses these correct levels (
low/medium/high/max) with the adaptive thinking API. See Anthropic SDKOutputConfig.effort:'low' | 'medium' | 'high' | 'max' | null.