UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

153 lines (152 loc) 6.57 kB
import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js"; import { t as buildModelCatalogMergeKey } from "./model-catalog-refs-BdjEHOKQ.js"; import { r as loadPluginManifest } from "./manifest-ByRdkf9X.js"; import { n as loadPluginManifestRegistryCore } from "./manifest-registry-DCCgYk7q.js"; import { c as loadManifestMetadataSnapshot } from "./manifest-contract-eligibility-BbV7X6pV.js"; import { t as planEffectiveModelCatalogRows } from "./model-catalog-BiOJ2EJd.js"; import { t as resolveConfiguredModelEntries } from "./configured-model-entries-CV1BLgOW.js"; import fs from "node:fs"; import path from "node:path"; //#region src/commands/models/provider-aliases.ts /** Provider alias canonicalization for model catalog rows. */ const sourcePeerModelCatalogCache = /* @__PURE__ */ new Map(); function listManifestPlugins(params) { return params.metadataSnapshot?.manifestRegistry.plugins ?? loadPluginManifestRegistryCore({ config: params.cfg }).plugins; } function resolveSourcePeerPluginRoot(plugin) { if (plugin.origin !== "bundled") return; const parts = path.resolve(plugin.rootDir).split(path.sep); const pluginDirName = parts.at(-1); const extensionsDirName = parts.at(-2); const buildDirName = parts.at(-3); if (pluginDirName !== plugin.id || extensionsDirName !== "extensions" || buildDirName !== "dist" && buildDirName !== "dist-runtime") return; const packageRoot = parts.slice(0, -3).join(path.sep) || path.sep; const sourceRoot = path.join(packageRoot, "extensions", plugin.id); return fs.existsSync(path.join(sourceRoot, "openclaw.plugin.json")) ? sourceRoot : void 0; } function loadSourcePeerModelCatalog(plugin) { const cacheKey = path.resolve(plugin.rootDir); const cached = sourcePeerModelCatalogCache.get(cacheKey); if (cached !== void 0) return cached ?? void 0; const sourceRoot = resolveSourcePeerPluginRoot(plugin); if (!sourceRoot) { sourcePeerModelCatalogCache.set(cacheKey, null); return; } const loaded = loadPluginManifest(sourceRoot, false); if (!loaded.ok || loaded.manifest.id !== plugin.id) { sourcePeerModelCatalogCache.set(cacheKey, null); return; } const modelCatalog = loaded.manifest.modelCatalog ?? null; sourcePeerModelCatalogCache.set(cacheKey, modelCatalog); return modelCatalog ?? void 0; } function hasModelCatalogAliases(modelCatalog) { return Object.keys(modelCatalog?.aliases ?? {}).length > 0; } function collectModelCatalogAliases(aliases, modelCatalog) { for (const [aliasProvider, target] of Object.entries(modelCatalog?.aliases ?? {})) { const alias = normalizeProviderId(aliasProvider); const provider = normalizeProviderId(target.provider); if (alias && provider) aliases.set(alias, provider); } } function buildProviderAliasMap(params) { const aliases = /* @__PURE__ */ new Map(); for (const plugin of listManifestPlugins(params)) { collectModelCatalogAliases(aliases, plugin.modelCatalog); if (!hasModelCatalogAliases(plugin.modelCatalog) && plugin.origin === "bundled") collectModelCatalogAliases(aliases, loadSourcePeerModelCatalog(plugin)); } return aliases; } /** Builds provider/ref canonicalizers from manifest model-catalog aliases. */ function createModelCatalogProviderAliasCanonicalizer(params) { const aliases = buildProviderAliasMap(params); const provider = (providerId) => { const normalizedProvider = normalizeProviderId(providerId); return aliases.get(normalizedProvider) ?? normalizedProvider; }; return { provider, ref: (ref) => { const canonicalProvider = provider(ref.provider); return canonicalProvider === ref.provider ? ref : { ...ref, provider: canonicalProvider }; } }; } /** Canonicalizes the provider field on a model reference. */ function canonicalizeModelCatalogProviderRef(ref, params) { return createModelCatalogProviderAliasCanonicalizer(params).ref(ref); } //#endregion //#region src/commands/models/list.configured.ts /** Adapts the shared configured-model projection to CLI provider aliases. */ const DISPLAY_MODEL_PARSE_OPTIONS = { allowPluginNormalization: false }; function resolveConfiguredEntries(cfg, metadataSnapshot, agentId) { const canonicalizer = createModelCatalogProviderAliasCanonicalizer({ cfg, metadataSnapshot }); return resolveConfiguredModelEntries({ cfg, agentId, ...DISPLAY_MODEL_PARSE_OPTIONS, canonicalizeRef: canonicalizer.ref }); } //#endregion //#region src/commands/models/model-reference-validation.ts function createModelReferenceInspector(params) { const snapshot = params.metadataSnapshot ?? loadManifestMetadataSnapshot({ config: params.cfg, env: params.env ?? process.env, ...params.workspaceDir ? { workspaceDir: params.workspaceDir } : {} }); const knownProviders = new Set([ ...snapshot.owners.providers.keys(), ...snapshot.owners.modelCatalogProviders.keys(), ...snapshot.owners.cliBackends.keys(), ...Object.keys(params.cfg.models?.providers ?? {}) ].map(normalizeProviderId).filter(Boolean)); const knownModels = new Set(planEffectiveModelCatalogRows({ registry: snapshot.manifestRegistry, config: params.cfg }).rows.map((row) => row.mergeKey)); for (const [provider, providerConfig] of Object.entries(params.cfg.models?.providers ?? {})) for (const model of providerConfig.models ?? []) knownModels.add(buildModelCatalogMergeKey(provider, model.id)); const inspect = (candidate) => { const provider = normalizeProviderId(candidate.provider); const model = candidate.model.trim(); const ref = `${provider}/${model}`; if (!knownProviders.has(provider)) return { ref, provider, model, status: "unknown-provider" }; return { ref, provider, model, status: knownModels.has(buildModelCatalogMergeKey(provider, model)) ? "known" : "unknown-model" }; }; return { inspect, snapshot }; } /** Classifies a resolved model ref without loading provider runtimes or making network calls. */ function inspectModelReference(params) { return createModelReferenceInspector(params).inspect(params.ref); } /** Inspects every default/fallback/image/configured model entry for Doctor. */ function inspectConfiguredModelReferences(params) { const { inspect, snapshot } = createModelReferenceInspector(params); return resolveConfiguredEntries(params.cfg, snapshot).entries.map((entry) => Object.assign(inspect(entry.ref), { active: [...entry.tags].some((tag) => tag !== "configured") })); } //#endregion export { createModelCatalogProviderAliasCanonicalizer as i, inspectModelReference as n, canonicalizeModelCatalogProviderRef as r, inspectConfiguredModelReferences as t };