refactor: dedupe openai codex url helper

This commit is contained in:
Peter Steinberger
2026-04-06 19:47:41 +01:00
parent 60fb7a318e
commit fd05e7ca1a
4 changed files with 32 additions and 17 deletions

View File

@@ -27,6 +27,7 @@ import {
cloneFirstTemplateModel,
findCatalogTemplate,
isOpenAIApiBaseUrl,
isOpenAICodexBaseUrl,
matchesExactOrPrefix,
} from "./shared.js";
import {
@@ -83,14 +84,6 @@ const OPENAI_CODEX_MODERN_MODEL_IDS = [
] as const;
const OPENAI_RESPONSES_STREAM_HOOKS = buildProviderStreamFamilyHooks("openai-responses-defaults");
function isOpenAICodexBaseUrl(baseUrl?: string): boolean {
const trimmed = baseUrl?.trim();
if (!trimmed) {
return false;
}
return /^https?:\/\/chatgpt\.com\/backend-api\/?$/i.test(trimmed);
}
function normalizeCodexTransport(model: ProviderRuntimeModel): ProviderRuntimeModel {
const useCodexTransport =
!model.baseUrl || isOpenAIApiBaseUrl(model.baseUrl) || isOpenAICodexBaseUrl(model.baseUrl);

View File

@@ -23,4 +23,12 @@ export function isOpenAIApiBaseUrl(baseUrl?: string): boolean {
return /^https?:\/\/api\.openai\.com(?:\/v1)?\/?$/i.test(trimmed);
}
export function isOpenAICodexBaseUrl(baseUrl?: string): boolean {
const trimmed = baseUrl?.trim();
if (!trimmed) {
return false;
}
return /^https?:\/\/chatgpt\.com\/backend-api\/?$/i.test(trimmed);
}
export { cloneFirstTemplateModel, findCatalogTemplate, matchesExactOrPrefix };

View File

@@ -104,4 +104,26 @@ describe("openai transport policy", () => {
degradeCooldownMs: 60_000,
});
});
it("treats ChatGPT Codex backend routes as native OpenAI-family transports", () => {
expect(
resolveOpenAIWebSocketSessionPolicy({
provider: "openai-codex",
modelId: "gpt-5.4",
model: {
...nativeModel,
provider: "openai-codex",
api: "openai-codex-responses",
baseUrl: "https://chatgpt.com/backend-api",
},
sessionId: "session-123",
}),
).toMatchObject({
headers: {
"x-client-request-id": "session-123",
"x-openclaw-session-id": "session-123",
},
degradeCooldownMs: 60_000,
});
});
});

View File

@@ -5,20 +5,12 @@ import type {
ProviderWebSocketSessionPolicy,
} from "openclaw/plugin-sdk/plugin-entry";
import { normalizeProviderId } from "openclaw/plugin-sdk/provider-model-shared";
import { isOpenAIApiBaseUrl } from "./shared.js";
import { isOpenAIApiBaseUrl, isOpenAICodexBaseUrl } from "./shared.js";
const DEFAULT_OPENAI_WS_DEGRADE_COOLDOWN_MS = 60_000;
const AZURE_PROVIDER_IDS = new Set(["azure-openai", "azure-openai-responses"]);
const OPENAI_CODEX_PROVIDER_ID = "openai-codex";
function isOpenAICodexBaseUrl(baseUrl?: string): boolean {
const trimmed = baseUrl?.trim();
if (!trimmed) {
return false;
}
return /^https?:\/\/chatgpt\.com\/backend-api\/?$/i.test(trimmed);
}
function isAzureOpenAIBaseUrl(baseUrl?: string): boolean {
const trimmed = baseUrl?.trim();
if (!trimmed) {