fix: gate claude adaptive thinking defaults (#5480)

Co-authored-by: KooshaPari <koosha@example.com>
This commit is contained in:
KooshaPari
2026-06-29 18:03:25 -07:00
committed by GitHub
parent 3e03213ed0
commit 3f8995deb6
2 changed files with 59 additions and 2 deletions

View File

@@ -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

View File

@@ -35,6 +35,60 @@ function toolUseEdits(body: Record<string, unknown> | 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 {