From 8efaa547dd46917bd0ffabe1b7963f47b03e1381 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Fri, 6 Mar 2026 00:29:02 -0500 Subject: [PATCH] Models: resolve GPT-5.3 Codex Spark fallback --- src/agents/model-compat.test.ts | 12 ++++++++++++ src/agents/model-forward-compat.ts | 8 ++++++++ .../pi-embedded-runner/model.forward-compat.test.ts | 10 ++++++++++ src/agents/pi-embedded-runner/model.test.ts | 11 +++++++++++ 4 files changed, 41 insertions(+) diff --git a/src/agents/model-compat.test.ts b/src/agents/model-compat.test.ts index 232543ce86d..c8a0491dda3 100644 --- a/src/agents/model-compat.test.ts +++ b/src/agents/model-compat.test.ts @@ -368,6 +368,18 @@ describe("resolveForwardCompatModel", () => { expect(model?.maxTokens).toBe(128_000); }); + it("resolves openai-codex gpt-5.3-codex-spark via codex template fallback", () => { + const registry = createRegistry({ + "openai-codex/gpt-5.2-codex": createOpenAICodexTemplateModel("gpt-5.2-codex"), + }); + const model = resolveForwardCompatModel("openai-codex", "gpt-5.3-codex-spark", registry); + expectResolvedForwardCompat(model, { provider: "openai-codex", id: "gpt-5.3-codex-spark" }); + expect(model?.api).toBe("openai-codex-responses"); + expect(model?.baseUrl).toBe("https://chatgpt.com/backend-api"); + expect(model?.contextWindow).toBe(272_000); + expect(model?.maxTokens).toBe(128_000); + }); + it("resolves anthropic opus 4.6 via 4.5 template", () => { const registry = createRegistry({ "anthropic/claude-opus-4-5": createTemplateModel("anthropic", "claude-opus-4-5"), diff --git a/src/agents/model-forward-compat.ts b/src/agents/model-forward-compat.ts index 95d13832cc7..558eb6624d2 100644 --- a/src/agents/model-forward-compat.ts +++ b/src/agents/model-forward-compat.ts @@ -275,6 +275,7 @@ export function augmentKnownForwardCompatModels(models: Model[]): Model); } + if (lower === OPENAI_CODEX_GPT_53_SPARK_MODEL_ID) { + return buildOpenAICodexSparkFallbackModel(); + } + return normalizeModelCompat({ id: trimmedModelId, name: trimmedModelId, diff --git a/src/agents/pi-embedded-runner/model.forward-compat.test.ts b/src/agents/pi-embedded-runner/model.forward-compat.test.ts index 56fd4654e91..50ac667a37e 100644 --- a/src/agents/pi-embedded-runner/model.forward-compat.test.ts +++ b/src/agents/pi-embedded-runner/model.forward-compat.test.ts @@ -57,6 +57,16 @@ describe("pi embedded model e2e smoke", () => { expect(result.model).toMatchObject(buildOpenAICodexForwardCompatExpectation("gpt-5.4")); }); + it("builds an openai-codex forward-compat fallback for gpt-5.3-codex-spark", () => { + mockOpenAICodexTemplateModel(); + + const result = resolveModel("openai-codex", "gpt-5.3-codex-spark", "/tmp/agent"); + expect(result.error).toBeUndefined(); + expect(result.model).toMatchObject( + buildOpenAICodexForwardCompatExpectation("gpt-5.3-codex-spark"), + ); + }); + it("keeps unknown-model errors for non-forward-compat IDs", () => { const result = resolveModel("openai-codex", "gpt-4.1-mini", "/tmp/agent"); expect(result.model).toBeUndefined(); diff --git a/src/agents/pi-embedded-runner/model.test.ts b/src/agents/pi-embedded-runner/model.test.ts index 25936e3d444..1697e812214 100644 --- a/src/agents/pi-embedded-runner/model.test.ts +++ b/src/agents/pi-embedded-runner/model.test.ts @@ -407,6 +407,17 @@ describe("resolveModel", () => { expect(result.model).toMatchObject(buildOpenAICodexForwardCompatExpectation("gpt-5.4")); }); + it("builds an openai-codex fallback for gpt-5.3-codex-spark", () => { + mockOpenAICodexTemplateModel(); + + const result = resolveModel("openai-codex", "gpt-5.3-codex-spark", "/tmp/agent"); + + expect(result.error).toBeUndefined(); + expect(result.model).toMatchObject( + buildOpenAICodexForwardCompatExpectation("gpt-5.3-codex-spark"), + ); + }); + it("applies provider overrides to openai gpt-5.4 forward-compat models", () => { mockDiscoveredModel({ provider: "openai",