diff --git a/src/agents/model-selection.ts b/src/agents/model-selection.ts index e39b850e915..515742eab1f 100644 --- a/src/agents/model-selection.ts +++ b/src/agents/model-selection.ts @@ -425,10 +425,29 @@ export function resolveThinkingDefault(params: { model: string; catalog?: ModelCatalogEntry[]; }): ThinkLevel { + // 1. Per-model thinkingDefault (highest priority) + // Normalize config keys via parseModelRef (consistent with buildModelAliasIndex, + // buildAllowedModelSet, etc.) so aliases like "anthropic/opus-4.6" resolve correctly. + const configModels = params.cfg.agents?.defaults?.models ?? {}; + for (const [rawKey, entry] of Object.entries(configModels)) { + const parsed = parseModelRef(rawKey, params.provider); + if ( + parsed && + parsed.provider === params.provider && + parsed.model === params.model && + entry?.thinkingDefault + ) { + return entry.thinkingDefault as ThinkLevel; + } + } + + // 2. Global thinkingDefault const configured = params.cfg.agents?.defaults?.thinkingDefault; if (configured) { return configured; } + + // 3. Auto-detect from model catalog (reasoning-capable → "low") const candidate = params.catalog?.find( (entry) => entry.provider === params.provider && entry.id === params.model, ); diff --git a/src/config/types.agent-defaults.ts b/src/config/types.agent-defaults.ts index 4c9dba0a238..d7ee643893c 100644 --- a/src/config/types.agent-defaults.ts +++ b/src/config/types.agent-defaults.ts @@ -18,6 +18,8 @@ export type AgentModelEntryConfig = { params?: Record; /** Enable streaming for this model (default: true, false for Ollama to avoid SDK issue #1205). */ streaming?: boolean; + /** Per-model default thinking level (overrides global thinkingDefault). */ + thinkingDefault?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh"; }; export type AgentModelListConfig = { diff --git a/src/config/zod-schema.agent-defaults.ts b/src/config/zod-schema.agent-defaults.ts index 2508179707c..cfcb81404ed 100644 --- a/src/config/zod-schema.agent-defaults.ts +++ b/src/config/zod-schema.agent-defaults.ts @@ -38,6 +38,17 @@ export const AgentDefaultsSchema = z params: z.record(z.string(), z.unknown()).optional(), /** Enable streaming for this model (default: true, false for Ollama to avoid SDK issue #1205). */ streaming: z.boolean().optional(), + /** Per-model default thinking level (overrides global thinkingDefault). */ + thinkingDefault: z + .union([ + z.literal("off"), + z.literal("minimal"), + z.literal("low"), + z.literal("medium"), + z.literal("high"), + z.literal("xhigh"), + ]) + .optional(), }) .strict(), )