mirror of https://github.com/openclaw/openclaw.git
87 lines
2.3 KiB
TypeScript
87 lines
2.3 KiB
TypeScript
import type { Api, Model } from "@mariozechner/pi-ai";
|
|
import { normalizeModelCompat } from "../model-compat.js";
|
|
import { normalizeProviderId } from "../model-selection.js";
|
|
|
|
const OPENAI_CODEX_BASE_URL = "https://chatgpt.com/backend-api";
|
|
|
|
function isOpenAIApiBaseUrl(baseUrl?: string): boolean {
|
|
const trimmed = baseUrl?.trim();
|
|
if (!trimmed) {
|
|
return false;
|
|
}
|
|
return /^https?:\/\/api\.openai\.com(?:\/v1)?\/?$/i.test(trimmed);
|
|
}
|
|
|
|
function isOpenAICodexBaseUrl(baseUrl?: string): boolean {
|
|
const trimmed = baseUrl?.trim();
|
|
if (!trimmed) {
|
|
return false;
|
|
}
|
|
return /^https?:\/\/chatgpt\.com\/backend-api\/?$/i.test(trimmed);
|
|
}
|
|
|
|
function normalizeOpenAICodexTransport(params: {
|
|
provider: string;
|
|
model: Model<Api>;
|
|
}): Model<Api> {
|
|
if (normalizeProviderId(params.provider) !== "openai-codex") {
|
|
return params.model;
|
|
}
|
|
|
|
const useCodexTransport =
|
|
!params.model.baseUrl ||
|
|
isOpenAIApiBaseUrl(params.model.baseUrl) ||
|
|
isOpenAICodexBaseUrl(params.model.baseUrl);
|
|
|
|
const nextApi =
|
|
useCodexTransport && params.model.api === "openai-responses"
|
|
? ("openai-codex-responses" as const)
|
|
: params.model.api;
|
|
const nextBaseUrl =
|
|
nextApi === "openai-codex-responses" &&
|
|
(!params.model.baseUrl || isOpenAIApiBaseUrl(params.model.baseUrl))
|
|
? OPENAI_CODEX_BASE_URL
|
|
: params.model.baseUrl;
|
|
|
|
if (nextApi === params.model.api && nextBaseUrl === params.model.baseUrl) {
|
|
return params.model;
|
|
}
|
|
|
|
return {
|
|
...params.model,
|
|
api: nextApi,
|
|
baseUrl: nextBaseUrl,
|
|
} as Model<Api>;
|
|
}
|
|
|
|
function normalizeOpenAITransport(params: { provider: string; model: Model<Api> }): Model<Api> {
|
|
if (normalizeProviderId(params.provider) !== "openai") {
|
|
return params.model;
|
|
}
|
|
|
|
const useResponsesTransport =
|
|
params.model.api === "openai-completions" &&
|
|
(!params.model.baseUrl || isOpenAIApiBaseUrl(params.model.baseUrl));
|
|
|
|
if (!useResponsesTransport) {
|
|
return params.model;
|
|
}
|
|
|
|
return {
|
|
...params.model,
|
|
api: "openai-responses",
|
|
} as Model<Api>;
|
|
}
|
|
|
|
export function normalizeResolvedProviderModel(params: {
|
|
provider: string;
|
|
model: Model<Api>;
|
|
}): Model<Api> {
|
|
const normalizedOpenAI = normalizeOpenAITransport(params);
|
|
const normalizedCodex = normalizeOpenAICodexTransport({
|
|
provider: params.provider,
|
|
model: normalizedOpenAI,
|
|
});
|
|
return normalizeModelCompat(normalizedCodex);
|
|
}
|