From e544bfceae2bff3288c07c191a35113331d65cfa Mon Sep 17 00:00:00 2001 From: tenglong Date: Fri, 26 Jun 2026 10:36:24 +0700 Subject: [PATCH] fix(codex): preserve Responses text format Add "text" to Codex Responses API allowlist so text.format.json_schema reaches upstream for structured outputs instead of being stripped. Co-authored-by: Cursor --- open-sse/executors/codex.js | 3 +- tests/unit/codex-tool-normalization.test.js | 41 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/open-sse/executors/codex.js b/open-sse/executors/codex.js index 03779b4a..e19b0787 100644 --- a/open-sse/executors/codex.js +++ b/open-sse/executors/codex.js @@ -32,7 +32,8 @@ const CODEX_PASSTHROUGH_TOOL_TYPES = new Set(["custom"]); // Allowlist of fields accepted by Codex Responses API — anything else is stripped const RESPONSES_API_ALLOWLIST = new Set([ "model", "input", "instructions", "tools", "tool_choice", "stream", "store", - "reasoning", "service_tier", "include", "prompt_cache_key", "client_metadata" + "reasoning", "service_tier", "include", "prompt_cache_key", "client_metadata", + "text" ]); // Convert role=system → role=developer in body.input (keeps content in cacheable prefix) diff --git a/tests/unit/codex-tool-normalization.test.js b/tests/unit/codex-tool-normalization.test.js index 1f3c6f94..d1b5901e 100644 --- a/tests/unit/codex-tool-normalization.test.js +++ b/tests/unit/codex-tool-normalization.test.js @@ -20,6 +20,47 @@ function normalizeTools(tools) { } describe("CodexExecutor tool normalization", () => { + it("preserves Responses text.format for structured outputs", () => { + const executor = new CodexExecutor(); + const schema = { + type: "object", + additionalProperties: false, + properties: { + title: { type: "string" }, + }, + required: ["title"], + }; + const body = { + model: "gpt-5.4-mini", + input: [{ type: "message", role: "user", content: [{ type: "input_text", text: "test for session title" }] }], + stream: true, + metadata: { unsupported: true }, + text: { + format: { + type: "json_schema", + name: "codex_output_schema", + strict: true, + schema, + }, + }, + }; + + executor.transformRequest("gpt-5.4-mini", body, true, { + connectionId: "test-codex-structured-output", + providerSpecificData: {}, + }); + + expect(body.text).toEqual({ + format: { + type: "json_schema", + name: "codex_output_schema", + strict: true, + schema, + }, + }); + expect(body.metadata).toBeUndefined(); + }); + it("preserves Responses-native tool_search tools", () => { const tools = normalizeTools([ {