UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

171 lines (170 loc) 8.08 kB
import { o as normalizeLowercaseStringOrEmpty } from "./string-coerce-CIXf7egm.js"; import { h as normalizeUniqueStringEntries } from "./string-normalization-DsCfAx8q.js"; import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js"; import { t as buildModelCatalogMergeKey } from "./model-catalog-refs-BdjEHOKQ.js"; import { n as normalizeModelCatalogProviderRows } from "./model-catalog-normalize-Cvl7-6m6.js"; //#region src/model-catalog/manifest-planner.ts function mergeRemoteModelWithTrustedTransport(remoteModel, trustedModel) { return { ...remoteModel, ...trustedModel?.baseUrl ? { baseUrl: trustedModel.baseUrl } : {}, ...trustedModel?.headers ? { headers: trustedModel.headers } : {} }; } function planManifestModelCatalogRows(params) { const providerFilters = Boolean(params.providerFilter) || params.providerFilters !== void 0 ? new Set(normalizeUniqueStringEntries([...params.providerFilter !== void 0 ? [params.providerFilter] : [], ...params.providerFilters ?? []].map(normalizeProviderId))) : void 0; const entries = []; for (const plugin of params.registry.plugins) for (const entry of planManifestModelCatalogPluginEntries({ plugin, providerFilters, mergeKeyFilter: params.mergeKeyFilter, remoteOverlay: params.remoteOverlay, resolveRemoteProvider: params.resolveRemoteProvider })) entries.push(entry); const seenRows = /* @__PURE__ */ new Map(); const conflicts = /* @__PURE__ */ new Map(); for (const entry of entries) for (const row of entry.rows) { const seen = seenRows.get(row.mergeKey); if (seen) { if (!conflicts.has(row.mergeKey)) conflicts.set(row.mergeKey, { mergeKey: row.mergeKey, ref: seen.row.ref, provider: seen.row.provider, modelId: seen.row.id, firstPluginId: seen.pluginId, secondPluginId: entry.pluginId }); continue; } seenRows.set(row.mergeKey, { pluginId: entry.pluginId, row, discovery: entry.discovery }); } const rows = []; for (const { row, discovery } of seenRows.values()) { if (conflicts.has(row.mergeKey) || (params.selection === "static" ? discovery !== "static" : params.selection === "supplemental" && discovery === "runtime" && row.source !== "runtime-refresh")) continue; rows.push(row); } return { entries, conflicts: [...conflicts.values()], rows: rows.sort((left, right) => left.provider.localeCompare(right.provider) || left.id.localeCompare(right.id)) }; } function planManifestModelCatalogPluginEntries(params) { const providers = params.plugin.modelCatalog?.providers; if (!providers) return []; const aliasesByTargetProvider = buildModelCatalogProviderAliasTargets(params.plugin); return Object.entries(providers).flatMap(([provider, providerCatalog]) => { const normalizedProvider = normalizeProviderId(provider); if (!normalizedProvider) return []; const providerAliases = aliasesByTargetProvider.get(normalizedProvider) ?? []; const plannedProviders = params.providerFilters ? normalizeUniqueStringEntries([normalizedProvider, ...providerAliases]).filter((candidateProvider) => params.providerFilters?.has(candidateProvider)) : [normalizedProvider]; if (plannedProviders.length === 0) return []; const remoteProvider = params.resolveRemoteProvider ? params.resolveRemoteProvider(normalizedProvider) : params.remoteOverlay?.[normalizedProvider]; return plannedProviders.flatMap((plannedProvider) => { const includesModel = (model) => !params.mergeKeyFilter || params.mergeKeyFilter.has(buildModelCatalogMergeKey(plannedProvider, model.id)); const manifestModels = providerCatalog.models.filter(includesModel); const remoteModels = remoteProvider?.models.filter(includesModel) ?? []; const remoteModelIds = new Set(remoteModels.map((model) => model.id)); const manifestModelsById = new Map(manifestModels.map((model) => [model.id, model])); const providerDefaults = remoteProvider ? { ...providerCatalog, ...remoteProvider, ...providerCatalog.baseUrl ? { baseUrl: providerCatalog.baseUrl } : {}, ...providerCatalog.headers ? { headers: providerCatalog.headers } : {} } : providerCatalog; const manifestRows = normalizeModelCatalogProviderRows({ provider: plannedProvider, providerCatalog: { ...providerDefaults, models: manifestModels.filter((model) => !remoteModelIds.has(model.id)) }, source: "manifest" }); const remoteRows = remoteProvider ? normalizeModelCatalogProviderRows({ provider: plannedProvider, providerCatalog: { ...providerDefaults, models: remoteModels.map((model) => mergeRemoteModelWithTrustedTransport(model, manifestModelsById.get(model.id))) }, source: "runtime-refresh" }) : []; const rows = [...manifestRows, ...remoteRows].sort((left, right) => left.provider.localeCompare(right.provider) || left.id.localeCompare(right.id)); if (rows.length === 0) return []; return [{ pluginId: params.plugin.id, provider: plannedProvider, discovery: params.plugin.modelCatalog?.discovery?.[normalizedProvider], rows: applyModelCatalogAliasOverrides({ rows, alias: params.plugin.modelCatalog?.aliases?.[plannedProvider] }) }]; }); }); } function buildOwnedProviderSet(plugin) { return new Set(normalizeUniqueStringEntries((plugin.providers ?? []).map(normalizeProviderId))); } function buildModelCatalogProviderAliasTargets(plugin) { const ownedProviders = buildOwnedProviderSet(plugin); const aliasesByTargetProvider = /* @__PURE__ */ new Map(); for (const [rawAlias, alias] of Object.entries(plugin.modelCatalog?.aliases ?? {})) { const aliasProvider = normalizeProviderId(rawAlias); const targetProvider = normalizeProviderId(alias.provider); if (!aliasProvider || !targetProvider || !ownedProviders.has(targetProvider)) continue; const aliases = aliasesByTargetProvider.get(targetProvider) ?? []; aliases.push(aliasProvider); aliasesByTargetProvider.set(targetProvider, aliases); } return aliasesByTargetProvider; } function buildModelCatalogProviderRefs(plugin) { const ownedProviders = buildOwnedProviderSet(plugin); const refs = new Set(ownedProviders); for (const [rawAlias, alias] of Object.entries(plugin.modelCatalog?.aliases ?? {})) { const aliasProvider = normalizeProviderId(rawAlias); const targetProvider = normalizeProviderId(alias.provider); if (aliasProvider && targetProvider && ownedProviders.has(targetProvider)) refs.add(aliasProvider); } return refs; } function applyModelCatalogAliasOverrides(params) { const alias = params.alias; if (!alias) return params.rows; return params.rows.map((row) => ({ ...row, ...alias.api ? { api: alias.api } : {}, ...alias.baseUrl ? { baseUrl: alias.baseUrl } : {} })); } function planManifestModelCatalogSuppressions(params) { const providerFilter = params.providerFilter ? normalizeProviderId(params.providerFilter) : void 0; const modelFilter = params.modelFilter ? normalizeLowercaseStringOrEmpty(params.modelFilter) : void 0; const suppressions = []; for (const plugin of params.registry.plugins) { const providerRefs = buildModelCatalogProviderRefs(plugin); for (const suppression of plugin.modelCatalog?.suppressions ?? []) { const provider = normalizeProviderId(suppression.provider); const model = normalizeLowercaseStringOrEmpty(suppression.model); if (!provider || !model) continue; if (providerFilter && provider !== providerFilter) continue; if (modelFilter && model !== modelFilter) continue; if (!providerRefs.has(provider)) continue; suppressions.push({ pluginId: plugin.id, provider, model, mergeKey: buildModelCatalogMergeKey(provider, model), ...suppression.reason ? { reason: suppression.reason } : {}, ...suppression.when ? { when: suppression.when } : {} }); } } return { suppressions: suppressions.sort((left, right) => left.provider.localeCompare(right.provider) || left.model.localeCompare(right.model) || left.pluginId.localeCompare(right.pluginId)) }; } //#endregion export { planManifestModelCatalogSuppressions as n, planManifestModelCatalogRows as t };