From 0e2d04526c6b08b8a7bf2e2e16e6cdbbf1f5a21d Mon Sep 17 00:00:00 2001 From: terence71-glitch Date: Mon, 18 May 2026 00:38:25 +0200 Subject: [PATCH] fix: honor Codex reasoning suffix aliases (#2335) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Integrated into release/v3.8.0 — fixes issue #2331: Codex model suffix aliases now correctly override client-injected reasoning defaults --- open-sse/executors/codex.ts | 12 +++++------- tests/unit/plan3-p0.test.ts | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 7 deletions(-) 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(