fix(reasoning): guard model default reasoning when thinking active

- Add hasAgentReasoningDefault to reasoningExplicitlySet check
  This prevents model default from overriding agent's explicit "off"
- Restore !thinkingActive guard for model default fallback
  Prevents redundant Reasoning: output alongside internal thinking

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
fishking
2026-03-23 16:26:44 +08:00
committed by Ayaan Zaidi
parent b91374eb0d
commit 6c04ce3092
2 changed files with 23 additions and 3 deletions

View File

@@ -121,4 +121,19 @@ describe("resolveCurrentDirectiveLevels", () => {
expect(result.currentReasoningLevel).toBe("off");
});
it("respects agent reasoningDefault: off as explicit override", async () => {
const resolveDefaultThinkingLevel = vi.fn().mockResolvedValue("off");
const result = await resolveCurrentDirectiveLevels({
sessionEntry: {},
agentEntry: {
reasoningDefault: "off",
},
resolveDefaultThinkingLevel,
});
// Agent explicitly setting "off" should be respected, not overridden by model default
expect(result.currentReasoningLevel).toBe("off");
});
});

View File

@@ -434,11 +434,16 @@ export async function resolveReplyDirectives(params: {
(agentCfg?.thinkingDefault as ThinkLevel | undefined);
// When neither directive nor session nor agent set reasoning, default to model capability
// (e.g. OpenRouter with reasoning: true).
// (e.g. OpenRouter with reasoning: true). Skip model default when thinking is active
// to avoid redundant Reasoning: output alongside internal thinking blocks.
const hasAgentReasoningDefault =
agentEntry?.reasoningDefault !== undefined && agentEntry?.reasoningDefault !== null;
const reasoningExplicitlySet =
directives.reasoningLevel !== undefined ||
(sessionEntry?.reasoningLevel !== undefined && sessionEntry?.reasoningLevel !== null);
if (!reasoningExplicitlySet && resolvedReasoningLevel === "off") {
(sessionEntry?.reasoningLevel !== undefined && sessionEntry?.reasoningLevel !== null) ||
hasAgentReasoningDefault;
const thinkingActive = resolvedThinkLevelWithDefault !== "off";
if (!reasoningExplicitlySet && resolvedReasoningLevel === "off" && !thinkingActive) {
resolvedReasoningLevel = await modelState.resolveDefaultReasoningLevel();
}