diff --git a/extensions/openai/base-url.test.ts b/extensions/openai/base-url.test.ts index fc3a4dcf511..6d59e1196c9 100644 --- a/extensions/openai/base-url.test.ts +++ b/extensions/openai/base-url.test.ts @@ -15,6 +15,14 @@ describe("openai base URL helpers", () => { }); it("recognizes Codex ChatGPT backend routes", () => { + // New canonical form (includes /codex segment; OpenAI removed the + // /backend-api/responses alias server-side on 2026-04). + expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex")).toBe(true); + expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex/")).toBe(true); + expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex/v1")).toBe(true); + expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex/v1/")).toBe(true); + // Legacy form still recognized as a Codex baseURL for backward + // compatibility with existing user configs. expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api")).toBe(true); expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/")).toBe(true); expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/v1")).toBe(true); @@ -25,7 +33,7 @@ describe("openai base URL helpers", () => { expect(isOpenAICodexBaseUrl("https://api.openai.com/v1")).toBe(false); expect(isOpenAICodexBaseUrl("https://chatgpt.com")).toBe(false); expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/v2")).toBe(false); - expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex")).toBe(false); + expect(isOpenAICodexBaseUrl("https://chatgpt.com/backend-api/codex/v2")).toBe(false); expect(isOpenAICodexBaseUrl(undefined)).toBe(false); }); }); diff --git a/extensions/openai/base-url.ts b/extensions/openai/base-url.ts index 515f7cdf771..d188f30f4c8 100644 --- a/extensions/openai/base-url.ts +++ b/extensions/openai/base-url.ts @@ -13,5 +13,5 @@ export function isOpenAICodexBaseUrl(baseUrl?: string): boolean { if (!trimmed) { return false; } - return /^https?:\/\/chatgpt\.com\/backend-api(?:\/v1)?\/?$/i.test(trimmed); + return /^https?:\/\/chatgpt\.com\/backend-api(?:\/codex)?(?:\/v1)?\/?$/i.test(trimmed); } diff --git a/extensions/openai/openai-codex-catalog.ts b/extensions/openai/openai-codex-catalog.ts index def11b9c433..7f296bade10 100644 --- a/extensions/openai/openai-codex-catalog.ts +++ b/extensions/openai/openai-codex-catalog.ts @@ -1,6 +1,6 @@ import type { ModelProviderConfig } from "openclaw/plugin-sdk/provider-model-shared"; -export const OPENAI_CODEX_BASE_URL = "https://chatgpt.com/backend-api"; +export const OPENAI_CODEX_BASE_URL = "https://chatgpt.com/backend-api/codex"; export function buildOpenAICodexProvider(): ModelProviderConfig { return { diff --git a/extensions/openai/openai-codex-provider.test.ts b/extensions/openai/openai-codex-provider.test.ts index eb670b6cf56..0059fb958f4 100644 --- a/extensions/openai/openai-codex-provider.test.ts +++ b/extensions/openai/openai-codex-provider.test.ts @@ -465,7 +465,7 @@ describe("openai codex provider", () => { expect(model).toMatchObject({ api: "openai-codex-responses", - baseUrl: "https://chatgpt.com/backend-api", + baseUrl: "https://chatgpt.com/backend-api/codex", }); }); @@ -491,7 +491,7 @@ describe("openai codex provider", () => { expect(model).toMatchObject({ api: "openai-codex-responses", - baseUrl: "https://chatgpt.com/backend-api", + baseUrl: "https://chatgpt.com/backend-api/codex", }); }); @@ -506,7 +506,7 @@ describe("openai codex provider", () => { } as never), ).toEqual({ api: "openai-codex-responses", - baseUrl: "https://chatgpt.com/backend-api", + baseUrl: "https://chatgpt.com/backend-api/codex", }); }); }); diff --git a/extensions/openai/openai-codex-provider.ts b/extensions/openai/openai-codex-provider.ts index b1ef09c5c4f..87630295e11 100644 --- a/extensions/openai/openai-codex-provider.ts +++ b/extensions/openai/openai-codex-provider.ts @@ -34,7 +34,7 @@ import { } from "./shared.js"; const PROVIDER_ID = "openai-codex"; -const OPENAI_CODEX_BASE_URL = "https://chatgpt.com/backend-api"; +const OPENAI_CODEX_BASE_URL = "https://chatgpt.com/backend-api/codex"; const OPENAI_CODEX_GPT_54_MODEL_ID = "gpt-5.4"; const OPENAI_CODEX_GPT_54_LEGACY_MODEL_ID = "gpt-5.4-codex"; const OPENAI_CODEX_GPT_54_PRO_MODEL_ID = "gpt-5.4-pro"; diff --git a/extensions/openai/openai-provider.test.ts b/extensions/openai/openai-provider.test.ts index 9a05bf1eaf5..13c3eac7c79 100644 --- a/extensions/openai/openai-provider.test.ts +++ b/extensions/openai/openai-provider.test.ts @@ -209,7 +209,7 @@ describe("buildOpenAIProvider", () => { provider: "openai-codex", id: "gpt-5.4", api: "openai-codex-responses", - baseUrl: "https://chatgpt.com/backend-api", + baseUrl: "https://chatgpt.com/backend-api/codex", contextWindow: 1_050_000, maxTokens: 128_000, });