openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
125 lines (124 loc) • 6.83 kB
JavaScript
import { o as normalizeLowercaseStringOrEmpty } from "./string-coerce-CIXf7egm.js";
import { i as parseModelCatalogRef } from "./model-catalog-refs-BdjEHOKQ.js";
import { n as normalizeGooglePreviewModelId, r as normalizeTogetherModelId } from "./provider-model-id-normalize-DODOj1rv.js";
//#region packages/model-catalog-core/src/provider-model-id-normalization.ts
let currentManifestModelIdNormalizationPolicies;
/** Collect provider model-id normalization policies from plugin manifests. */
function collectManifestModelIdNormalizationPolicies(plugins) {
const policies = /* @__PURE__ */ new Map();
for (const plugin of plugins) for (const [provider, policy] of Object.entries(plugin.modelIdNormalization?.providers ?? {})) policies.set(normalizeLowercaseStringOrEmpty(provider), policy);
return policies;
}
/** Replace the process-local manifest normalization policy snapshot. */
function setCurrentManifestModelIdNormalizationPolicies(policies) {
currentManifestModelIdNormalizationPolicies = policies;
}
/** Return true when a model id already includes a provider namespace. */
function hasProviderPrefix(modelId) {
return modelId.includes("/");
}
/** Join a provider prefix and model id with exactly one slash. */
function formatPrefixedModelId(prefix, modelId) {
return `${prefix.replace(/\/+$/u, "")}/${modelId.replace(/^\/+/u, "")}`;
}
/** Strip a duplicated self-provider prefix from a model id. */
function stripSelfProviderModelPrefix(provider, model) {
const prefix = `${normalizeLowercaseStringOrEmpty(provider)}/`;
const trimmed = model.trim();
return normalizeLowercaseStringOrEmpty(trimmed).startsWith(prefix) ? trimmed.slice(prefix.length) : model;
}
/** Apply manifest normalization policies for one provider/model id. */
function normalizeProviderModelIdWithPolicies(params) {
const policy = params.policies.get(normalizeLowercaseStringOrEmpty(params.provider));
if (!policy) return;
let modelId = params.context.modelId.trim();
if (!modelId) return modelId;
for (const prefix of policy.stripPrefixes ?? []) {
const normalizedPrefix = normalizeLowercaseStringOrEmpty(prefix);
if (normalizedPrefix && normalizeLowercaseStringOrEmpty(modelId).startsWith(normalizedPrefix)) {
modelId = modelId.slice(normalizedPrefix.length);
break;
}
}
modelId = policy.aliases?.[normalizeLowercaseStringOrEmpty(modelId)] ?? modelId;
if (!hasProviderPrefix(modelId)) {
for (const rule of policy.prefixWhenBareAfterAliasStartsWith ?? []) if (normalizeLowercaseStringOrEmpty(modelId).startsWith(rule.modelPrefix.toLowerCase())) return formatPrefixedModelId(rule.prefix, modelId);
if (policy.prefixWhenBare) return formatPrefixedModelId(policy.prefixWhenBare, modelId);
}
return modelId;
}
/** Apply built-in provider-specific model id normalization rules. */
function normalizeBuiltInProviderModelId(provider, model) {
const normalizedProvider = normalizeLowercaseStringOrEmpty(provider);
if (normalizedProvider === "google" || normalizedProvider === "google-gemini-cli" || normalizedProvider === "google-vertex") return normalizeGooglePreviewModelId(model);
if (normalizedProvider === "openrouter") {
const trimmed = model.trim();
return trimmed && !trimmed.includes("/") ? `openrouter/${trimmed}` : model;
}
if (normalizedProvider === "anthropic") {
const anthropicAliases = {
"opus-5": "claude-opus-5",
opus: "claude-opus-5",
"opus-4.8": "claude-opus-4-8",
"opus-4.6": "claude-opus-4-6",
"sonnet-5": "claude-sonnet-5",
sonnet: "claude-sonnet-5",
"sonnet-4.6": "claude-sonnet-4-6"
};
const providerModel = normalizeLowercaseStringOrEmpty(model).startsWith("anthropic/") ? model.trim().slice(10) : model;
return anthropicAliases[normalizeLowercaseStringOrEmpty(providerModel)] ?? providerModel;
}
if (normalizedProvider === "vercel-ai-gateway") {
const aliased = {
"opus-4.6": "claude-opus-4-6",
"sonnet-5": "claude-sonnet-5",
sonnet: "claude-sonnet-4-6",
"sonnet-4.6": "claude-sonnet-4-6"
}[normalizeLowercaseStringOrEmpty(model)] ?? model;
return normalizeLowercaseStringOrEmpty(aliased).startsWith("claude-") ? `anthropic/${aliased}` : aliased;
}
if (normalizedProvider === "huggingface") return normalizeLowercaseStringOrEmpty(model).startsWith("huggingface/") ? model.slice(12) : model;
if (normalizedProvider === "nvidia") {
const trimmed = model.trim();
return trimmed && !trimmed.includes("/") ? `nvidia/${trimmed}` : model;
}
if (normalizedProvider === "xai") return {
"grok-4.3-latest": "grok-4.3",
"grok-4.5-latest": "grok-4.5",
"grok-build-latest": "grok-4.5",
"grok-4-fast-reasoning": "grok-4-fast",
"grok-4-1-fast-reasoning": "grok-4-1-fast"
}[normalizeLowercaseStringOrEmpty(model)] ?? model;
if (normalizedProvider === "openai") return model;
if (normalizedProvider === "together") return normalizeTogetherModelId(model);
return model;
}
/** Apply manifest policies and built-in normalization to a static provider/model id. */
function normalizeStaticProviderModelIdWithPolicies(provider, model, policies) {
const normalizedProvider = normalizeLowercaseStringOrEmpty(provider);
return normalizeBuiltInProviderModelId(normalizedProvider, policies ? normalizeProviderModelIdWithPolicies({
provider: normalizedProvider,
policies,
context: { modelId: model }
}) ?? model : model);
}
/** Normalize a configured provider/model catalog reference using current policies. */
function normalizeConfiguredProviderCatalogModelId(provider, model, policies = currentManifestModelIdNormalizationPolicies) {
return normalizeConfiguredProviderCatalogModelRef(normalizeStaticProviderModelIdWithPolicies(provider, model, policies));
}
/** Normalize embedded Google model aliases inside provider/model catalog refs. */
function normalizeConfiguredProviderCatalogModelRef(providerModel) {
const googlePrefix = "google/";
if (!providerModel.startsWith(googlePrefix)) {
const parsed = parseModelCatalogRef(providerModel);
if (!parsed) return providerModel;
if (!parsed.modelId.startsWith(googlePrefix)) return providerModel;
const normalizedModelId = normalizeGooglePreviewModelId(parsed.modelId);
return normalizedModelId === parsed.modelId ? providerModel : `${parsed.provider}/${normalizedModelId}`;
}
const modelId = providerModel.slice(7);
const normalizedModelId = normalizeGooglePreviewModelId(modelId);
return normalizedModelId === modelId ? providerModel : `${googlePrefix}${normalizedModelId}`;
}
//#endregion
export { normalizeProviderModelIdWithPolicies as a, stripSelfProviderModelPrefix as c, normalizeConfiguredProviderCatalogModelRef as i, normalizeBuiltInProviderModelId as n, normalizeStaticProviderModelIdWithPolicies as o, normalizeConfiguredProviderCatalogModelId as r, setCurrentManifestModelIdNormalizationPolicies as s, collectManifestModelIdNormalizationPolicies as t };