From bbc4c56a6d6f9abda7e425d45f5da5c4ec9016ea Mon Sep 17 00:00:00 2001 From: Yuval Dinodia <102706514+yetval@users.noreply.github.com> Date: Sun, 28 Jun 2026 22:15:19 -0400 Subject: [PATCH] fix(config): name openai-chatgpt-responses for the removed openai-codex-responses api id --- src/config/validation.allowed-values.test.ts | 43 ++++++++++++++++++++ src/config/zod-schema.core.ts | 11 ++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/config/validation.allowed-values.test.ts b/src/config/validation.allowed-values.test.ts index cf21e48fd926..d0e3cf7a7cf5 100644 --- a/src/config/validation.allowed-values.test.ts +++ b/src/config/validation.allowed-values.test.ts @@ -148,6 +148,49 @@ describe("config validation allowed-values metadata", () => { }); }); +describe("config validation legacy openai-codex api", () => { + it("names openai-chatgpt-responses for the removed openai-codex-responses api id", () => { + const result = validateConfigObjectRaw({ + models: { + providers: { + "openai-codex": { + api: "openai-codex-responses", + models: [{ id: "gpt-5.5", api: "openai-codex-responses" }], + }, + }, + }, + }); + + expect(result.ok).toBe(false); + if (!result.ok) { + const providerIssue = requireIssue(result.issues, "models.providers.openai-codex.api"); + expect(providerIssue.message).toContain('"openai-codex-responses" is a removed api id'); + expect(providerIssue.message).toContain('use "openai-chatgpt-responses"'); + const modelIssue = requireIssue(result.issues, "models.providers.openai-codex.models.0.api"); + expect(modelIssue.message).toContain('use "openai-chatgpt-responses"'); + } + }); + + it("keeps the generic enum message for other invalid api ids", () => { + const result = validateConfigObjectRaw({ + models: { + providers: { + "openai-codex": { + api: "openai-codex", + }, + }, + }, + }); + + expect(result.ok).toBe(false); + if (!result.ok) { + const issue = requireIssue(result.issues, "models.providers.openai-codex.api"); + expect(issue.message).toContain("expected one of"); + expect(issue.message).not.toContain("removed api id"); + } + }); +}); + describe("config validation numeric bound hints", () => { it("appends maximum for inclusive too_big numeric bound", () => { const issue = mapFirstIssue( diff --git a/src/config/zod-schema.core.ts b/src/config/zod-schema.core.ts index 9dd45c1367a3..d0193f606e44 100644 --- a/src/config/zod-schema.core.ts +++ b/src/config/zod-schema.core.ts @@ -207,7 +207,16 @@ export const SecretsConfigSchema = z .strict() .optional(); -const ModelApiSchema = z.enum(MODEL_APIS); +const LEGACY_OPENAI_CODEX_RESPONSES_API = "openai-codex-responses"; +const OPENAI_CHATGPT_RESPONSES_API = + "openai-chatgpt-responses" satisfies (typeof MODEL_APIS)[number]; + +const ModelApiSchema = z.enum(MODEL_APIS, { + error: (issue) => + issue.input === LEGACY_OPENAI_CODEX_RESPONSES_API + ? `"${LEGACY_OPENAI_CODEX_RESPONSES_API}" is a removed api id; use "${OPENAI_CHATGPT_RESPONSES_API}"` + : undefined, +}); const ModelCompatSchema = z .object({