UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

147 lines (146 loc) 6.33 kB
import { D as tryResolveLegacyCompatibilityAgentId, d as resolveAgentEntry } from "./agent-scope-config-DcbEhP0R.js"; import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js"; import { i as parseModelCatalogRef } from "./model-catalog-refs-BdjEHOKQ.js"; import "./legacy.default-agent-owner-BGwEdQRe.js"; import { y as resolveSessionAgentIds } from "./agent-scope-DbtJyKUL.js"; //#region src/agents/model-runtime-policy.ts /** * Model runtime policy resolution. * * Agent execution uses this to choose a model/provider-specific runtime policy * from agent entries, model catalog config, provider config, or QA overrides. */ function hasRuntimePolicy(value) { return Boolean(value?.id?.trim()); } function resolveProviderConfig(config, provider) { if (!config?.models?.providers || !provider?.trim()) return; const providers = config.models.providers; const direct = providers[provider]; if (direct) return direct; const normalizedProvider = normalizeProviderId(provider); for (const [candidateProvider, providerConfig] of Object.entries(providers)) if (normalizeProviderId(candidateProvider) === normalizedProvider) return providerConfig; } function normalizeModelIdForProvider(provider, modelId) { const trimmed = modelId?.trim(); if (!trimmed) return; const slash = trimmed.indexOf("/"); if (slash <= 0) return trimmed; const modelProvider = normalizeProviderId(trimmed.slice(0, slash)); const expectedProvider = normalizeProviderId(provider ?? ""); if (expectedProvider && modelProvider !== expectedProvider) return trimmed; return trimmed.slice(slash + 1).trim() || void 0; } function resolveEffectiveProvider(provider, modelId) { const normalizedProvider = normalizeProviderId(provider ?? ""); if (normalizedProvider) return normalizedProvider; return parseModelCatalogRef(modelId?.trim() ?? "")?.provider; } function resolvePolicyMatch(matches, callerProvider) { const providerMatches = callerProvider ? matches.filter((match) => match.provider === callerProvider) : []; const candidates = providerMatches.length > 0 ? providerMatches : matches; const [first] = candidates; if (!first) return {}; if (!callerProvider && candidates.some((match) => match.provider !== first.provider)) return { ambiguous: true }; return { policy: first.policy, source: "model", matchedProvider: first.provider || callerProvider }; } function modelEntryMatchKind(params) { const entryId = params.entry.id.trim(); if (entryId === params.modelId) return "exact"; const parsed = parseModelCatalogRef(entryId); if (!parsed) return "none"; const callerProvider = normalizeProviderId(params.provider ?? ""); if (callerProvider && parsed.provider !== callerProvider) return "none"; if (parsed.modelId === params.modelId) return "exact"; if (parsed.modelId === "*") return "provider-wildcard"; return "none"; } function resolveAgentModelEntryRuntimePolicy(params) { const modelId = normalizeModelIdForProvider(params.provider, params.modelId); if (!params.config || !modelId && params.matchKind !== "provider-wildcard") return {}; const sessionAgentId = Boolean(params.agentId?.trim() || params.sessionKey?.trim()) ? resolveSessionAgentIds({ config: params.config, agentId: params.agentId, sessionKey: params.sessionKey }).sessionAgentId : tryResolveLegacyCompatibilityAgentId(params.config); const modelMaps = [(sessionAgentId && params.config ? resolveAgentEntry(params.config, sessionAgentId) : void 0)?.models, params.config.agents?.defaults?.models]; const callerProvider = normalizeProviderId(params.provider ?? ""); for (const models of modelMaps) { const scopeMatches = []; for (const [key, entry] of Object.entries(models ?? {})) { const matches = modelEntryMatchKind({ entry: { id: key }, provider: params.provider, modelId: modelId ?? "" }) === params.matchKind; const policy = entry?.agentRuntime; if (!matches || !policy || !hasRuntimePolicy(policy)) continue; scopeMatches.push({ provider: parseModelCatalogRef(key)?.provider ?? "", policy }); } const resolved = resolvePolicyMatch(scopeMatches, callerProvider); if (resolved.policy || resolved.ambiguous) return resolved; } return {}; } function resolveModelConfig(params) { const modelId = normalizeModelIdForProvider(params.provider, params.modelId); if (!modelId || !Array.isArray(params.providerConfig?.models)) return; return params.providerConfig.models.find((entry) => modelEntryMatchKind({ entry, provider: params.provider, modelId }) === "exact"); } /** Resolves the effective runtime policy for an agent/model/provider selection. */ function resolveModelRuntimePolicy(params) { const callerProvider = normalizeProviderId(params.provider ?? ""); const effectiveProvider = resolveEffectiveProvider(params.provider, params.modelId); const inferredMatchedProvider = callerProvider ? void 0 : effectiveProvider; if (process.env.OPENCLAW_BUILD_PRIVATE_QA === "1") { const forcedRuntime = process.env.OPENCLAW_QA_FORCE_RUNTIME?.trim().toLowerCase(); if (forcedRuntime === "openclaw" || forcedRuntime === "codex") return { policy: { id: forcedRuntime }, source: "model", forcedByEnvironment: true }; } const agentModelPolicy = resolveAgentModelEntryRuntimePolicy({ ...params, provider: effectiveProvider, matchKind: "exact" }); if (agentModelPolicy.ambiguous) return {}; if (agentModelPolicy.policy) return agentModelPolicy; const providerConfig = resolveProviderConfig(params.config, effectiveProvider); const modelConfig = resolveModelConfig({ providerConfig, provider: effectiveProvider, modelId: params.modelId }); if (hasRuntimePolicy(modelConfig?.agentRuntime)) return { policy: modelConfig?.agentRuntime, source: "model", ...inferredMatchedProvider ? { matchedProvider: inferredMatchedProvider } : {} }; const agentWildcardModelPolicy = resolveAgentModelEntryRuntimePolicy({ ...params, provider: effectiveProvider, matchKind: "provider-wildcard" }); if (agentWildcardModelPolicy.policy) return agentWildcardModelPolicy; if (hasRuntimePolicy(providerConfig?.agentRuntime)) return { policy: providerConfig?.agentRuntime, source: "provider", ...inferredMatchedProvider ? { matchedProvider: inferredMatchedProvider } : {} }; return {}; } //#endregion export { resolveModelRuntimePolicy as t };