UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

142 lines (141 loc) 5.25 kB
import { c as isRecord } from "./record-coerce-DItp3I4t.js"; import "./utils-P__uGsPB.js"; import { r as normalizeConfiguredProviderCatalogModelId } from "./provider-model-id-normalization-BFjPahr6.js"; import { n as normalizeAgentModelRefForConfig, r as normalizeAgentModelSelectionForConfig, t as normalizeAgentModelMapForConfig } from "./model-input-BuGMCNOz.js"; //#region src/config/model-input-normalization.ts const MODEL_SELECTION_KEYS = [ "model", "imageModel", "voiceModel", "pdfModel" ]; const MEDIA_MODEL_KEYS = [ "image", "video", "music" ]; function normalizeStringModelRef(value) { return typeof value === "string" ? normalizeAgentModelRefForConfig(value) : value; } function normalizeNestedModelField(value, key, normalize) { if (!isRecord(value) || !Object.hasOwn(value, key)) return value; const normalized = normalize(value[key]); return normalized === value[key] ? value : { ...value, [key]: normalized }; } function normalizeAgentModelScope(value) { if (!isRecord(value)) return value; let next = value; const assign = (key, candidate) => { if (candidate === next[key]) return; next = { ...next, [key]: candidate }; }; for (const key of MODEL_SELECTION_KEYS) if (Object.hasOwn(value, key)) assign(key, normalizeAgentModelSelectionForConfig(value[key])); if (Object.hasOwn(value, "utilityModel")) assign("utilityModel", normalizeStringModelRef(value.utilityModel)); const originalMediaModels = value.mediaModels; if (isRecord(originalMediaModels)) { let mediaModelsChanged = false; const mediaModels = { ...originalMediaModels }; for (const key of MEDIA_MODEL_KEYS) { if (!Object.hasOwn(originalMediaModels, key)) continue; const normalized = normalizeAgentModelSelectionForConfig(originalMediaModels[key]); if (normalized !== mediaModels[key]) { mediaModels[key] = normalized; mediaModelsChanged = true; } } if (mediaModelsChanged) assign("mediaModels", mediaModels); } assign("heartbeat", normalizeNestedModelField(value.heartbeat, "model", normalizeStringModelRef)); assign("subagents", normalizeNestedModelField(value.subagents, "model", normalizeAgentModelSelectionForConfig)); if (isRecord(value.compaction)) { let compaction = normalizeNestedModelField(value.compaction, "model", normalizeStringModelRef); if (isRecord(compaction)) { const memoryFlush = normalizeNestedModelField(compaction.memoryFlush, "model", normalizeStringModelRef); if (memoryFlush !== compaction.memoryFlush) compaction = { ...compaction, memoryFlush }; } assign("compaction", compaction); } if (isRecord(value.models)) assign("models", normalizeAgentModelMapForConfig(value.models)); return next; } function normalizeAgentScopes(agents) { if (!isRecord(agents)) return agents; let next = agents; const assign = (key, candidate) => { if (candidate === next[key]) return; next = { ...next, [key]: candidate }; }; if (Object.hasOwn(agents, "defaults")) assign("defaults", normalizeAgentModelScope(agents.defaults)); if (isRecord(agents.entries)) { let entriesChanged = false; const entries = Object.fromEntries(Object.entries(agents.entries).map(([agentId, entry]) => { const normalized = normalizeAgentModelScope(entry); entriesChanged ||= normalized !== entry; return [agentId, normalized]; })); if (entriesChanged) assign("entries", entries); } if (Array.isArray(agents.list)) { const originalList = agents.list; const list = originalList.map(normalizeAgentModelScope); if (list.some((entry, index) => entry !== originalList[index])) assign("list", list); } return next; } function normalizeProviderCatalogs(models, modelIdNormalizationPolicies) { if (!isRecord(models) || !isRecord(models.providers)) return models; let providersChanged = false; const providers = Object.fromEntries(Object.entries(models.providers).map(([providerId, providerValue]) => { if (!isRecord(providerValue) || !Array.isArray(providerValue.models)) return [providerId, providerValue]; const originalModels = providerValue.models; const providerModels = originalModels.map((model) => { if (!isRecord(model) || typeof model.id !== "string") return model; const trimmed = model.id.trim(); if (!trimmed) return model; const id = normalizeConfiguredProviderCatalogModelId(providerId, trimmed, modelIdNormalizationPolicies); return id === model.id ? model : { ...model, id }; }); if (providerModels.every((model, index) => model === originalModels[index])) return [providerId, providerValue]; providersChanged = true; return [providerId, { ...providerValue, models: providerModels }]; })); return providersChanged ? { ...models, providers } : models; } /** Canonicalize model refs submitted through a config mutation API before persistence. */ function normalizeSubmittedConfigModelRefs(cfg, modelIdNormalizationPolicies) { let next = cfg; const agents = normalizeAgentScopes(cfg.agents); if (agents !== cfg.agents) next = { ...next, agents }; const models = normalizeProviderCatalogs(cfg.models, modelIdNormalizationPolicies); if (models !== cfg.models) next = { ...next, models }; return next; } //#endregion export { normalizeSubmittedConfigModelRefs as t };