diff --git a/extensions/openai/base-url.ts b/extensions/openai/base-url.ts new file mode 100644 index 00000000000..3806d82be29 --- /dev/null +++ b/extensions/openai/base-url.ts @@ -0,0 +1,17 @@ +import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime"; + +export function isOpenAIApiBaseUrl(baseUrl?: string): boolean { + const trimmed = normalizeOptionalString(baseUrl); + if (!trimmed) { + return false; + } + return /^https?:\/\/api\.openai\.com(?:\/v1)?\/?$/i.test(trimmed); +} + +export function isOpenAICodexBaseUrl(baseUrl?: string): boolean { + const trimmed = normalizeOptionalString(baseUrl); + if (!trimmed) { + return false; + } + return /^https?:\/\/chatgpt\.com\/backend-api\/?$/i.test(trimmed); +} diff --git a/extensions/openai/shared.ts b/extensions/openai/shared.ts index cfc36cb1a95..a6ce47eaef1 100644 --- a/extensions/openai/shared.ts +++ b/extensions/openai/shared.ts @@ -7,6 +7,7 @@ import { } from "openclaw/plugin-sdk/provider-model-shared"; import { OPENAI_RESPONSES_STREAM_HOOKS } from "openclaw/plugin-sdk/provider-stream-family"; import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime"; +import { isOpenAIApiBaseUrl, isOpenAICodexBaseUrl } from "./base-url.js"; import { buildOpenAIReplayPolicy } from "./replay-policy.js"; import { resolveOpenAITransportTurnState, @@ -41,22 +42,6 @@ export function resolveConfiguredOpenAIBaseUrl(cfg: OpenClawConfig | undefined): return normalizeOptionalString(cfg?.models?.providers?.openai?.baseUrl) ?? OPENAI_API_BASE_URL; } -export function isOpenAIApiBaseUrl(baseUrl?: string): boolean { - const trimmed = normalizeOptionalString(baseUrl); - if (!trimmed) { - return false; - } - return /^https?:\/\/api\.openai\.com(?:\/v1)?\/?$/i.test(trimmed); -} - -export function isOpenAICodexBaseUrl(baseUrl?: string): boolean { - const trimmed = normalizeOptionalString(baseUrl); - if (!trimmed) { - return false; - } - return /^https?:\/\/chatgpt\.com\/backend-api\/?$/i.test(trimmed); -} - function hasSupportedOpenAIResponsesTransport( transport: unknown, ): transport is "auto" | "sse" | "websocket" { @@ -136,4 +121,10 @@ export function buildOpenAISyntheticCatalogEntry( }; } -export { cloneFirstTemplateModel, findCatalogTemplate, matchesExactOrPrefix }; +export { + cloneFirstTemplateModel, + findCatalogTemplate, + isOpenAIApiBaseUrl, + isOpenAICodexBaseUrl, + matchesExactOrPrefix, +}; diff --git a/extensions/openai/transport-policy.ts b/extensions/openai/transport-policy.ts index e3f20b151f5..cd69858ee77 100644 --- a/extensions/openai/transport-policy.ts +++ b/extensions/openai/transport-policy.ts @@ -6,7 +6,7 @@ import type { } from "openclaw/plugin-sdk/plugin-entry"; import { normalizeProviderId } from "openclaw/plugin-sdk/provider-model-shared"; import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime"; -import { isOpenAIApiBaseUrl, isOpenAICodexBaseUrl } from "./shared.js"; +import { isOpenAIApiBaseUrl, isOpenAICodexBaseUrl } from "./base-url.js"; const DEFAULT_OPENAI_WS_DEGRADE_COOLDOWN_MS = 60_000; const AZURE_PROVIDER_IDS = new Set(["azure-openai", "azure-openai-responses"]);