UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

168 lines (167 loc) 6.71 kB
import { c as getPluginMetadataSnapshotCache } from "./plugin-cache-DGWspMEc.js"; import { o as normalizeLowercaseStringOrEmpty } from "./string-coerce-CIXf7egm.js"; import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js"; import { t as buildModelCatalogMergeKey } from "./model-catalog-refs-BdjEHOKQ.js"; import { n as planManifestModelCatalogSuppressions } from "./manifest-planner-bVm3dG3U.js"; import { c as loadManifestMetadataSnapshot, n as isManifestPluginAvailableForControlPlane } from "./manifest-contract-eligibility-BbV7X6pV.js"; import "./model-catalog-BiOJ2EJd.js"; //#region src/plugins/manifest-model-suppression.ts function listManifestModelCatalogSuppressions(params) { const snapshot = params.snapshot; const registry = { diagnostics: snapshot.diagnostics, plugins: snapshot.plugins.filter((plugin) => isManifestPluginAvailableForControlPlane({ snapshot, plugin, config: params.config })) }; return planManifestModelCatalogSuppressions({ registry }).suppressions; } function buildManifestSuppressionError(params) { const ref = `${params.provider}/${params.modelId}`; return params.reason ? `Unknown model: ${ref}. ${params.reason}` : `Unknown model: ${ref}.`; } function normalizeBaseUrlHost(baseUrl) { const trimmed = baseUrl?.trim(); if (!trimmed) return ""; try { return normalizeSuppressionHost(new URL(trimmed).hostname); } catch { return ""; } } function normalizeSuppressionHost(host) { return normalizeLowercaseStringOrEmpty(host).replace(/\.+$/, ""); } function resolveConfiguredProviderValue(params) { const providers = params.config?.models?.providers; if (!providers) return; for (const [providerId, entry] of Object.entries(providers)) { if (normalizeLowercaseStringOrEmpty(providerId) !== params.provider) continue; return { api: normalizeLowercaseStringOrEmpty(entry?.api), baseUrl: typeof entry?.baseUrl === "string" ? entry.baseUrl : void 0 }; } } function manifestSuppressionMatchesConditions(params) { const when = params.suppression.when; if (!when) return true; const configuredProvider = resolveConfiguredProviderValue({ provider: params.provider, config: params.config }); if (when.providerConfigApiIn?.length) { const allowedApis = new Set(when.providerConfigApiIn.map(normalizeLowercaseStringOrEmpty)); const effectiveApi = configuredProvider ? normalizeLowercaseStringOrEmpty(configuredProvider.api) : params.provider; if (!effectiveApi || !allowedApis.has(effectiveApi)) return false; } if (when.baseUrlHosts?.length) { const baseUrlHost = normalizeBaseUrlHost(params.baseUrl ?? configuredProvider?.baseUrl); if (!baseUrlHost && !params.baseUrl && !configuredProvider?.baseUrl) return true; if (!baseUrlHost) return false; if (!new Set(when.baseUrlHosts.map(normalizeSuppressionHost)).has(baseUrlHost)) return false; } return true; } function buildManifestBuiltInModelSuppressionResolver(params) { const snapshot = loadManifestMetadataSnapshot(params); const cache = getPluginMetadataSnapshotCache(snapshot).metadata.modelSuppressionResolvers; let compiled = cache.get(snapshot); if (!compiled) { compiled = { byConfig: /* @__PURE__ */ new WeakMap() }; cache.set(snapshot, compiled); } const cached = params.config ? compiled.byConfig.get(params.config) : compiled.unconfigured; if (cached) return cached; const suppressions = listManifestModelCatalogSuppressions({ snapshot, config: params.config }); const resolver = (input) => { const provider = normalizeLowercaseStringOrEmpty(input.provider); const modelId = normalizeLowercaseStringOrEmpty(input.id); if (!provider || !modelId) return; const mergeKey = buildModelCatalogMergeKey(provider, modelId); const suppression = suppressions.find((entry) => entry.mergeKey === mergeKey && (!input.unconditionalOnly || !entry.when) && manifestSuppressionMatchesConditions({ suppression: entry, provider, baseUrl: input.baseUrl, config: params.config })); if (!suppression) return; return { suppress: true, errorMessage: buildManifestSuppressionError({ provider, modelId, reason: suppression.reason }) }; }; if (params.config) compiled.byConfig.set(params.config, resolver); else compiled.unconfigured = resolver; return resolver; } //#endregion //#region src/agents/model-suppression.ts /** * Built-in model suppression helpers. * Resolves prepared plugin manifest suppression rules so * built-in catalog entries can be hidden or blocked consistently. */ function resolveBuiltInModelSuppressionFromManifest(params) { const provider = normalizeProviderId(params.provider ?? ""); const modelId = normalizeLowercaseStringOrEmpty(params.id); if (!provider || !modelId) return; return buildManifestBuiltInModelSuppressionResolver({ env: process.env, ...params.config ? { config: params.config } : {}, ...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {} })({ provider, id: modelId, ...params.baseUrl ? { baseUrl: params.baseUrl } : {}, ...params.unconditionalOnly !== void 0 ? { unconditionalOnly: params.unconditionalOnly } : {} }); } /** Return true when plugin manifest metadata suppresses a built-in model entry. */ function shouldSuppressBuiltInModelCore(params) { return resolveBuiltInModelSuppressionFromManifest(params)?.suppress ?? false; } /** * Return true only for unconditional manifest suppressions. * Inline model entries may override conditional suppressions, but not absolute * provider capability blocks. */ function shouldUnconditionallySuppress(params) { return resolveBuiltInModelSuppressionFromManifest({ ...params, unconditionalOnly: true })?.suppress ?? false; } /** Resolve the user-facing suppression error message for a built-in model. */ function buildSuppressedBuiltInModelError(params) { return resolveBuiltInModelSuppressionFromManifest(params)?.errorMessage; } /** Build a reusable suppression predicate for repeated catalog filtering. */ function buildShouldSuppressBuiltInModelCore(params) { const resolver = buildManifestBuiltInModelSuppressionResolver({ env: process.env, ...params.config ? { config: params.config } : {}, ...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {} }); return (input) => { const provider = normalizeProviderId(input.provider ?? ""); const id = normalizeLowercaseStringOrEmpty(input.id); if (!provider || !id) return false; return resolver({ provider, id, ...input.baseUrl ? { baseUrl: input.baseUrl } : {} })?.suppress ?? false; }; } //#endregion export { shouldUnconditionallySuppress as i, buildSuppressedBuiltInModelError as n, shouldSuppressBuiltInModelCore as r, buildShouldSuppressBuiltInModelCore as t };