openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
76 lines (75 loc) • 3.18 kB
JavaScript
import { r as resolveProviderRequestCapabilities } from "./provider-attribution-CDS-94hQ.js";
import { a as getModelProviderRequestRouteFacts } from "./provider-request-config-DIOYidiO.js";
import { resolveUnsupportedToolSchemaKeywords } from "@openclaw/ai/internal/openai";
import { resolveOpenAICompletionsCompat } from "@openclaw/ai/transports";
//#region src/plugins/provider-model-compat.ts
function extractModelCompat(modelOrCompat) {
if (!modelOrCompat || typeof modelOrCompat !== "object") return;
if ("compat" in modelOrCompat) {
const compat = modelOrCompat.compat;
return compat && typeof compat === "object" ? compat : void 0;
}
return modelOrCompat;
}
/** @deprecated Provider-owned model compat helper; do not use from third-party plugins. */
function applyModelCompatPatch(model, patch) {
const nextCompat = {
...model.compat,
...patch
};
const currentCompat = model.compat;
if (model.compat && Object.entries(patch).every(([key, value]) => currentCompat?.[key] === value)) return model;
return {
...model,
compat: nextCompat
};
}
function hasToolSchemaProfile(modelOrCompat, profile) {
return extractModelCompat(modelOrCompat)?.toolSchemaProfile === profile;
}
function resolveToolCallArgumentsEncoding(modelOrCompat) {
return extractModelCompat(modelOrCompat)?.toolCallArgumentsEncoding;
}
function isOpenAiCompletionsModel(model) {
return model.api === "openai-completions";
}
function isAnthropicMessagesModel(model) {
return model.api === "anthropic-messages";
}
function normalizeAnthropicBaseUrl(baseUrl) {
return baseUrl.replace(/\/v1\/?$/, "");
}
function normalizeModelCompat(model, providerMetadataOwners) {
const baseUrl = model.baseUrl ?? "";
if (isAnthropicMessagesModel(model) && baseUrl) {
const normalized = normalizeAnthropicBaseUrl(baseUrl);
if (normalized !== baseUrl) return {
...model,
baseUrl: normalized
};
}
if (!isOpenAiCompletionsModel(model)) return model;
const compat = model.compat ?? void 0;
if (!baseUrl) return model;
const resolvedProviderMetadataOwners = providerMetadataOwners ?? getModelProviderRequestRouteFacts(model)?.providerMetadataOwners;
const resolved = resolveOpenAICompletionsCompat(model, (input) => resolveProviderRequestCapabilities({
...input,
...resolvedProviderMetadataOwners ? { providerMetadataOwners: resolvedProviderMetadataOwners } : {}
}));
if (resolved.supportsDeveloperRole && resolved.supportsUsageInStreaming && resolved.supportsStrictMode) return model;
const patch = {
...compat?.supportsDeveloperRole === void 0 ? { supportsDeveloperRole: resolved.supportsDeveloperRole } : {},
...compat?.supportsUsageInStreaming === void 0 ? { supportsUsageInStreaming: resolved.supportsUsageInStreaming } : {},
...compat?.supportsStrictMode === void 0 ? { supportsStrictMode: resolved.supportsStrictMode } : {}
};
if (Object.keys(patch).length === 0) return model;
return {
...model,
compat: {
...compat,
...patch
}
};
}
//#endregion
export { resolveToolCallArgumentsEncoding as a, normalizeModelCompat as i, extractModelCompat as n, resolveUnsupportedToolSchemaKeywords as o, hasToolSchemaProfile as r, applyModelCompatPatch as t };