diff --git a/open-sse/executors/codex.ts b/open-sse/executors/codex.ts index 5351677789..eb207f2683 100644 --- a/open-sse/executors/codex.ts +++ b/open-sse/executors/codex.ts @@ -1388,15 +1388,13 @@ export class CodexExecutor extends BaseExecutor { const fallbackReasoningEffort = allowConnectionReasoningDefaults ? requestDefaults.reasoningEffort || "medium" : undefined; + // Issue #2331: model suffix aliases (for example gpt-5.5-xhigh) represent an + // explicit model selection, so they must override client-injected defaults such + // as OpenCode's automatic reasoning.effort=medium for GPT-5-family requests. const rawEffort = - explicitReasoning || requestReasoningEffort || modelEffort || fallbackReasoningEffort; + modelEffort || explicitReasoning || requestReasoningEffort || fallbackReasoningEffort; - if (explicitReasoning) { - body.reasoning = { - ...(reasoningRecord || {}), - effort: clampEffort(cleanModel, explicitReasoning), - }; - } else if (rawEffort) { + if (rawEffort) { body.reasoning = { ...(reasoningRecord || {}), effort: clampEffort(cleanModel, rawEffort), diff --git a/tests/unit/plan3-p0.test.ts b/tests/unit/plan3-p0.test.ts index 7c4a786dcf..d622861fe9 100644 --- a/tests/unit/plan3-p0.test.ts +++ b/tests/unit/plan3-p0.test.ts @@ -317,6 +317,25 @@ test("CodexExecutor preserves native responses payloads for Codex passthrough", assert.ok(!("_nativeCodexPassthrough" in transformed)); }); +test("CodexExecutor gives model reasoning suffix precedence over client defaults", () => { + const executor = new CodexExecutor(); + const transformed = executor.transformRequest( + "gpt-5.5-xhigh", + { + model: "gpt-5.5-xhigh", + input: [], + reasoning: { effort: "medium", summary: "auto" }, + reasoning_effort: "low", + }, + true, + {} + ); + + assert.equal(transformed.model, "gpt-5.5"); + assert.deepEqual(transformed.reasoning, { effort: "xhigh", summary: "auto" }); + assert.equal(transformed.reasoning_effort, undefined); +}); + test("CodexExecutor strips streaming fields for compact passthrough", () => { const executor = new CodexExecutor(); const transformed = executor.transformRequest(