From 3f8995deb6bfd3ce77687a1a96d40edd3a98ea14 Mon Sep 17 00:00:00 2001 From: KooshaPari <42529354+KooshaPari@users.noreply.github.com> Date: Mon, 29 Jun 2026 18:03:25 -0700 Subject: [PATCH] fix: gate claude adaptive thinking defaults (#5480) Co-authored-by: KooshaPari --- open-sse/executors/base.ts | 7 ++- ...context-editing-executor-injection.test.ts | 54 +++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/open-sse/executors/base.ts b/open-sse/executors/base.ts index 6795546ad4..45e2853179 100644 --- a/open-sse/executors/base.ts +++ b/open-sse/executors/base.ts @@ -1057,8 +1057,11 @@ export class BaseExecutor { delete tb.thinking; delete tb.context_management; appliedThinking = "off"; - } else if (!effThinking && !headerEffort) { - // Default CC logic when no override headers are present + } else if (!effThinking && !headerEffort && isClaudeCodeClient) { + // Default Claude Code logic when no override headers are present. + // Generic OpenAI-compatible clients that route through native Claude OAuth + // must opt in with x-omniroute-thinking; force-injecting adaptive thinking + // leaks non-standard reasoning replay fields back into those clients. const isHaiku = typeof tb.model === "string" && tb.model.includes("haiku"); // #5312 RC-B: honor the operator's proxy-level Thinking-Budget mode. // `auto` means "strip — let the provider decide", so suppress the default diff --git a/tests/unit/context-editing-executor-injection.test.ts b/tests/unit/context-editing-executor-injection.test.ts index 44864f1c8e..799d9e85a6 100644 --- a/tests/unit/context-editing-executor-injection.test.ts +++ b/tests/unit/context-editing-executor-injection.test.ts @@ -35,6 +35,60 @@ function toolUseEdits(body: Record | undefined) { return (cm?.edits ?? []).filter((e) => e?.type === CLEAR_TOOL_USES_STRATEGY); } +test("#5312: generic Claude OAuth clients do not get implicit adaptive thinking", async () => { + const { bodies, restore } = mockFetchCapture(); + try { + await new DefaultExecutor("claude").execute({ + model: "claude-opus-4-8", + body: { + model: "claude-opus-4-8", + messages: [{ role: "user", content: "hi" }], + max_tokens: 1, + }, + stream: false, + credentials: { accessToken: "sk-ant-oat-generic-client-token" }, + clientHeaders: { + "user-agent": "Cursor/1.0", + }, + contextEditing: { enabled: false }, + }); + } finally { + restore(); + } + + assert.equal(bodies[0]?.thinking, undefined); + assert.equal(bodies[0]?.output_config, undefined); + assert.equal(bodies[0]?.context_management, undefined); +}); + +test("#5312: generic Claude OAuth clients can opt in to adaptive thinking", async () => { + const { bodies, restore } = mockFetchCapture(); + try { + await new DefaultExecutor("claude").execute({ + model: "claude-opus-4-8", + body: { + model: "claude-opus-4-8", + messages: [{ role: "user", content: "hi" }], + max_tokens: 1, + }, + stream: false, + credentials: { accessToken: "sk-ant-oat-generic-client-token" }, + clientHeaders: { + "user-agent": "Cursor/1.0", + "x-omniroute-thinking": "adaptive", + }, + contextEditing: { enabled: false }, + }); + } finally { + restore(); + } + + assert.deepEqual(bodies[0]?.thinking, { type: "adaptive" }); + assert.deepEqual(bodies[0]?.context_management, { + edits: [{ type: CLEAR_THINKING_STRATEGY, keep: "all" }], + }); +}); + test("Context Editing: enabled → genuine claude request gets clear_tool_uses with defaults", async () => { const { bodies, restore } = mockFetchCapture(); try {