diff --git a/src/auto-reply/reply/directive-handling.levels.test.ts b/src/auto-reply/reply/directive-handling.levels.test.ts index b47fa247f2b..45797d8a0ed 100644 --- a/src/auto-reply/reply/directive-handling.levels.test.ts +++ b/src/auto-reply/reply/directive-handling.levels.test.ts @@ -94,8 +94,8 @@ describe("resolveCurrentDirectiveLevels", () => { expect(result.currentReasoningLevel).toBe("stream"); }); - it("skips agent reasoningDefault when thinking is active", async () => { - const resolveDefaultThinkingLevel = vi.fn().mockResolvedValue("low"); + it("applies agent reasoningDefault even when thinking is active", async () => { + const resolveDefaultThinkingLevel = vi.fn().mockResolvedValue("high"); const result = await resolveCurrentDirectiveLevels({ sessionEntry: {}, @@ -105,6 +105,20 @@ describe("resolveCurrentDirectiveLevels", () => { resolveDefaultThinkingLevel, }); + // reasoningDefault should work independently of thinking level + expect(result.currentThinkLevel).toBe("high"); + expect(result.currentReasoningLevel).toBe("stream"); + }); + + it("defaults reasoning to off when no agent default is set", async () => { + const resolveDefaultThinkingLevel = vi.fn().mockResolvedValue("low"); + + const result = await resolveCurrentDirectiveLevels({ + sessionEntry: {}, + agentEntry: {}, + resolveDefaultThinkingLevel, + }); + expect(result.currentReasoningLevel).toBe("off"); }); }); diff --git a/src/auto-reply/reply/directive-handling.levels.ts b/src/auto-reply/reply/directive-handling.levels.ts index 42f9fcc224a..df9b252b6d6 100644 --- a/src/auto-reply/reply/directive-handling.levels.ts +++ b/src/auto-reply/reply/directive-handling.levels.ts @@ -39,12 +39,10 @@ export async function resolveCurrentDirectiveLevels(params: { const currentVerboseLevel = (params.sessionEntry?.verboseLevel as VerboseLevel | undefined) ?? (params.agentCfg?.verboseDefault as VerboseLevel | undefined); - const sessionReasoningLevel = params.sessionEntry?.reasoningLevel as ReasoningLevel | undefined; const currentReasoningLevel = - sessionReasoningLevel ?? - (currentThinkLevel === "off" - ? ((params.agentEntry?.reasoningDefault as ReasoningLevel | undefined) ?? "off") - : "off"); + (params.sessionEntry?.reasoningLevel as ReasoningLevel | undefined) ?? + (params.agentEntry?.reasoningDefault as ReasoningLevel | undefined) ?? + "off"; const currentElevatedLevel = (params.sessionEntry?.elevatedLevel as ElevatedLevel | undefined) ?? (params.agentCfg?.elevatedDefault as ElevatedLevel | undefined); diff --git a/src/auto-reply/reply/get-reply-directives.ts b/src/auto-reply/reply/get-reply-directives.ts index 4b65c29751e..9dad0b76875 100644 --- a/src/auto-reply/reply/get-reply-directives.ts +++ b/src/auto-reply/reply/get-reply-directives.ts @@ -386,9 +386,8 @@ export async function resolveReplyDirectives(params: { let resolvedReasoningLevel: ReasoningLevel = directives.reasoningLevel ?? (sessionEntry?.reasoningLevel as ReasoningLevel | undefined) ?? + (agentEntry?.reasoningDefault as ReasoningLevel | undefined) ?? "off"; - const agentReasoningDefault = agentEntry?.reasoningDefault as ReasoningLevel | undefined; - const hasAgentReasoningDefault = agentReasoningDefault !== undefined; const resolvedElevatedLevel = elevatedAllowed ? (directives.elevatedLevel ?? (sessionEntry?.elevatedLevel as ElevatedLevel | undefined) ?? @@ -434,20 +433,13 @@ export async function resolveReplyDirectives(params: { (await modelState.resolveDefaultThinkingLevel()) ?? (agentCfg?.thinkingDefault as ThinkLevel | undefined); - // When neither directive nor session set reasoning, default to model capability - // (e.g. OpenRouter with reasoning: true). Skip auto-enabling when thinking is - // active, including model-inferred defaults, or internal thinking blocks can - // be emitted as visible "Reasoning:" messages. + // When neither directive nor session nor agent set reasoning, default to model capability + // (e.g. OpenRouter with reasoning: true). const reasoningExplicitlySet = directives.reasoningLevel !== undefined || (sessionEntry?.reasoningLevel !== undefined && sessionEntry?.reasoningLevel !== null); - const thinkingActive = resolvedThinkLevelWithDefault !== "off"; - if (!reasoningExplicitlySet && resolvedReasoningLevel === "off" && !thinkingActive) { - if (hasAgentReasoningDefault) { - resolvedReasoningLevel = agentReasoningDefault; - } else { - resolvedReasoningLevel = await modelState.resolveDefaultReasoningLevel(); - } + if (!reasoningExplicitlySet && resolvedReasoningLevel === "off") { + resolvedReasoningLevel = await modelState.resolveDefaultReasoningLevel(); } let contextTokens = resolveContextTokens({