refactor(openai): isolate base URL helpers

This commit is contained in:
Ayaan Zaidi
2026-04-14 21:38:50 +05:30
parent b2b3bf35cd
commit 3624dda67d
3 changed files with 26 additions and 18 deletions

View File

@@ -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);
}

View File

@@ -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,
};

View File

@@ -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"]);