UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

431 lines (430 loc) 19.1 kB
import { c as normalizeOptionalLowercaseString, l as normalizeOptionalString, o as normalizeLowercaseStringOrEmpty } from "./string-coerce-CIXf7egm.js"; import { n as normalizeAgentId } from "./agent-id-CeT3w4ap.js"; import { D as tryResolveLegacyCompatibilityAgentId, c as resolveAgentConfig } from "./agent-scope-config-DcbEhP0R.js"; import "./session-key-BnWWjqNc.js"; import "./legacy.default-agent-owner-BGwEdQRe.js"; import { S as modelSupportsInput, b as findModelCatalogEntry, c as inferUniqueProviderFromConfiguredModels, g as resolveConfiguredModelRef } from "./model-selection-shared-BlLyx1r2.js"; import { n as DEFAULT_MODEL, r as DEFAULT_PROVIDER } from "./defaults-CdX9UGcX.js"; import { _ as resolveSessionAgentId } from "./agent-scope-DbtJyKUL.js"; import { n as parseModelRef, t as findNormalizedProviderValue } from "./model-selection-normalize-D1HuPOqZ.js"; import { t as resolveDefaultModelForAgent } from "./model-selection-config-BrdmmqKD.js"; import { s as normalizeThinkLevel } from "./thinking.shared-bHYuuc1L.js"; import "./model-catalog-DOgUhUHe.js"; import { n as publishedModelCatalogOwnerMatchesAgent } from "./prepared-model-catalog-owner-Ce5GdRSZ.js"; import { r as resolveSqliteTargetFromSessionStorePath } from "./session-sqlite-target-Dp-kgpcT.js"; import { r as resolveAgentMainSessionKey } from "./main-session-Br0F9dzh.js"; import { c as resolveThinkingProfile, o as resolveSupportedThinkingLevel } from "./thinking-DterdXhr.js"; import { o as resolveEffectiveAgentRuntime, t as concretizeAgentRuntime } from "./thinking-runtime-BiFbTVdI.js"; import { s as isCliProvider } from "./model-selection-di2kjKCB.js"; import { i as resolveThinkingDefaultCore, n as resolveThinkingDefault } from "./model-thinking-default-1g_x1V4J.js"; import { a as readAcpSessionMetaForEntry, r as readAcpSessionMeta } from "./session-meta-dzG4VkYo.js"; import "./sessions-9nxpeTwt.js"; import { n as resolveSessionModelRef } from "./session-model-ref-CPZiclLt.js"; import { n as resolveModelAgentRuntimeMetadata, t as resolveCurrentSessionAgentRuntimeMetadata } from "./agent-runtime-metadata-BVVh8XFs.js"; import { a as resolveContextTokensForModel } from "./context-B0EuZFRZ.js"; import { t as resolveModelContextWindowProfile } from "./model-context-window-CoR3Uyg1.js"; import { n as projectPublicSessionEntry } from "./session-entry-projection-1R43v9cM.js"; import { t as projectWorkerPlacementAgentRuntime } from "./placement-session-runtime-Cts2P0Rr.js"; //#region src/gateway/session-utils-contracts.ts function createSessionRowModelCacheKey(provider, model) { return `${normalizeLowercaseStringOrEmpty(provider)}\0${normalizeOptionalString(model) ?? ""}`; } //#endregion //#region src/gateway/session-utils-model.ts function listGatewayThinkingLevelOptions(params) { return resolveThinkingProfile({ provider: params.provider, model: params.model, catalog: params.modelCatalog, agentRuntime: params.agentRuntime, configuredReasoning: params.configuredReasoning, providerPolicySource: params.providerPolicySource }).levels.map(({ id, label }) => ({ id, label })); } function resolveGatewaySessionThinkingLevel(params) { const catalogEntry = params.modelCatalog ? findModelCatalogEntry(params.modelCatalog, { provider: params.catalogProvider ?? params.provider, modelId: params.model }) : void 0; if (!catalogEntry || params.providerPolicySource !== void 0 && params.providerPolicySource !== "active-or-bundled" && catalogEntry.reasoning === void 0) return params.level; return resolveSupportedThinkingLevel({ provider: params.provider, model: params.model, level: params.level, catalog: params.modelCatalog, agentRuntime: params.agentRuntime, configuredReasoning: params.configuredReasoning, providerPolicySource: params.providerPolicySource }); } function resolveGatewaySessionThinkingDefault(params) { const agentThinkingDefault = params.agentId ? resolveAgentConfig(params.cfg, params.agentId)?.thinkingDefault : void 0; const resolveDefault = params.providerPolicySource !== void 0 && params.providerPolicySource !== "active-or-bundled" ? (defaultParams) => resolveThinkingDefaultCore({ ...defaultParams, providerPolicySource: params.providerPolicySource }) : resolveThinkingDefault; const defaultLevel = agentThinkingDefault ?? resolveDefault({ cfg: params.cfg, provider: params.provider, model: params.model, catalog: params.modelCatalog, agentRuntime: params.agentRuntime }); return resolveGatewaySessionThinkingLevel({ provider: params.thinkingPolicyProvider ?? params.provider, catalogProvider: params.provider, model: params.model, level: defaultLevel, modelCatalog: params.modelCatalog, agentRuntime: params.agentRuntime, configuredReasoning: params.configuredReasoning, providerPolicySource: params.providerPolicySource }); } function resolveGatewayModelThinkingProfile(params) { const catalogEntry = params.modelCatalog ? findModelCatalogEntry(params.modelCatalog, { provider: params.provider, modelId: params.model }) : void 0; const agentRuntime = params.agentRuntime ?? resolveEffectiveAgentRuntime({ cfg: params.cfg, provider: params.provider, modelId: params.model, modelApi: catalogEntry?.api, modelBaseUrl: catalogEntry?.baseUrl, agentId: params.agentId, sessionKey: params.sessionKey }); const thinkingPolicyProvider = params.thinkingPolicyProvider ?? params.provider; const policySource = typeof params.providerPolicySource === "object" ? "prepared" : params.providerPolicySource; const key = `${normalizeAgentId(params.agentId)}\0${agentRuntime}\0${normalizeLowercaseStringOrEmpty(thinkingPolicyProvider)}\0${String(params.configuredReasoning)}\0${policySource ?? "active-or-bundled"}\0${createSessionRowModelCacheKey(params.provider, params.model)}`; const cached = params.rowContext?.thinkingMetadataByModelRef.get(key); if (cached) return cached; const metadata = { thinkingLevels: listGatewayThinkingLevelOptions({ provider: thinkingPolicyProvider, model: params.model, modelCatalog: params.modelCatalog, agentRuntime, configuredReasoning: params.configuredReasoning, providerPolicySource: params.providerPolicySource }), thinkingDefault: resolveGatewaySessionThinkingDefault({ cfg: params.cfg, provider: params.provider, thinkingPolicyProvider, model: params.model, agentId: params.agentId, modelCatalog: params.modelCatalog, agentRuntime, configuredReasoning: params.configuredReasoning, providerPolicySource: params.providerPolicySource }) }; params.rowContext?.thinkingMetadataByModelRef.set(key, metadata); return metadata; } function resolveGatewaySessionRuntimeProjection(params) { const { cfg, agentId, sessionKey, entry } = params; const cachedAcpMeta = params.rowContext?.acpSessionMetaByEntry; const acpMeta = entry?.acp ?? (entry && cachedAcpMeta?.has(entry) ? cachedAcpMeta.get(entry) : entry ? readAcpSessionMetaForEntry({ cfg, sessionKey, agentId, entry }) : readAcpSessionMeta({ sessionKey, agentId })); return { acpMeta, agentRuntime: resolveCurrentSessionAgentRuntimeMetadata({ cfg: params.cfg, agentId: params.agentId, provider: params.provider, model: params.model, sessionKey: params.sessionKey, sessionEntry: params.entry, acpRuntime: acpMeta != null, acpBackend: acpMeta?.backend }) }; } function resolveGatewaySessionThinkingProjectionInternal(params) { const { acpMeta, agentRuntime } = resolveGatewaySessionRuntimeProjection(params); const catalogEntry = params.modelCatalog ? findModelCatalogEntry(params.modelCatalog, { provider: params.provider, modelId: params.model }) : void 0; const thinkingRuntime = acpMeta ? concretizeAgentRuntime(acpMeta.backend ?? agentRuntime.id) : resolveEffectiveAgentRuntime({ cfg: params.cfg, provider: params.provider, modelId: params.model, modelApi: catalogEntry?.api, modelBaseUrl: catalogEntry?.baseUrl, agentId: params.agentId, sessionKey: params.sessionKey, sessionEntry: params.entry }); const metadata = resolveGatewayModelThinkingProfile({ cfg: params.cfg, agentId: params.agentId, provider: params.provider, model: params.model, agentRuntime: thinkingRuntime, modelCatalog: params.modelCatalog, rowContext: params.rowContext, providerPolicySource: params.providerPolicySource }); const storedThinkingLevel = normalizeThinkLevel(params.entry?.thinkingLevel); const thinkingLevel = storedThinkingLevel ? resolveGatewaySessionThinkingLevel({ provider: params.provider, model: params.model, level: storedThinkingLevel, modelCatalog: params.modelCatalog, agentRuntime: thinkingRuntime, providerPolicySource: params.providerPolicySource }) : void 0; return { agentRuntime, thinkingLevel, effectiveThinkingLevel: thinkingLevel ?? metadata.thinkingDefault, thinkingLevels: metadata.thinkingLevels, thinkingOptions: metadata.thinkingLevels.map((level) => level.label), thinkingDefault: metadata.thinkingDefault }; } function getSessionDefaults(cfg, modelCatalog, options) { const agentId = normalizeAgentId(options?.agentId ?? tryResolveLegacyCompatibilityAgentId(cfg) ?? "main"); const resolved = options?.agentId ? resolveDefaultModelForAgent({ cfg, agentId, allowPluginNormalization: options.allowPluginNormalization }) : resolveConfiguredModelRef({ cfg, defaultProvider: DEFAULT_PROVIDER, defaultModel: DEFAULT_MODEL, allowPluginNormalization: options?.allowPluginNormalization }); const catalogEntry = modelCatalog ? findModelCatalogEntry(modelCatalog, { provider: resolved.provider, modelId: resolved.model }) : void 0; const contextWindowProfile = resolveModelContextWindowProfile({ catalogEntry }); const resolvedContextTokens = resolveContextTokensForModel({ cfg, provider: resolved.provider, model: resolved.model, modelContextTokens: catalogEntry?.contextTokens, modelContextWindow: contextWindowProfile.contextTokens, allowAsyncLoad: false }) ?? 2e5; const contextTokens = contextWindowProfile.contextTokens ? Math.min(resolvedContextTokens, contextWindowProfile.contextTokens) : resolvedContextTokens; const sessionKey = resolveAgentMainSessionKey({ cfg, agentId }); const agentRuntime = projectWorkerPlacementAgentRuntime(resolveModelAgentRuntimeMetadata({ cfg, agentId, provider: resolved.provider, model: resolved.model, sessionKey, acpRuntime: false })); const thinkingProfile = resolveGatewayModelThinkingProfile({ cfg, provider: resolved.provider, model: resolved.model, agentId, modelCatalog: modelCatalog ?? (options?.providerPolicySource !== void 0 && options.providerPolicySource !== "active-or-bundled" ? [] : void 0), sessionKey, providerPolicySource: options?.providerPolicySource }); return { modelProvider: resolved.provider ?? null, model: resolved.model ?? null, contextTokens: contextTokens ?? null, contextWindow: contextWindowProfile.contextWindow, contextWindows: contextWindowProfile.contextWindows, contextWindowDefault: contextWindowProfile.contextWindowDefault, agentRuntime, thinkingLevels: thinkingProfile.thinkingLevels, thinkingOptions: thinkingProfile.thinkingLevels.map((level) => level.label), thinkingDefault: thinkingProfile.thinkingDefault }; } function normalizeGatewayModelCapabilityBaseUrl(value) { const baseUrl = normalizeOptionalString(value); if (!baseUrl) return; try { const parsed = new URL(baseUrl); parsed.pathname = parsed.pathname.replace(/\/+$/u, "") || "/"; return parsed.toString(); } catch { return baseUrl.replace(/\/+$/u, ""); } } function isGatewayModelExplicitlyConfiguredTextOnly(params) { if (!params.provider) return false; const configuredModel = findNormalizedProviderValue(params.snapshot.config.models?.providers, params.provider)?.models?.find((model) => normalizeLowercaseStringOrEmpty(model.id) === normalizeLowercaseStringOrEmpty(params.model)); return configuredModel?.input !== void 0 && !configuredModel.input.includes("image"); } function resolveGatewayProviderStaticModel(params) { if (!params.agentId || !params.provider || !publishedModelCatalogOwnerMatchesAgent(params.snapshot, params.agentId)) return; const staticEntry = findModelCatalogEntry(params.snapshot.staticEntries ?? [], { provider: params.provider, modelId: params.model }); if (!staticEntry) return; if (params.catalogEntry?.api && params.catalogEntry.api !== staticEntry.api) return; const catalogBaseUrl = normalizeGatewayModelCapabilityBaseUrl(params.catalogEntry?.baseUrl); const staticBaseUrl = normalizeGatewayModelCapabilityBaseUrl(staticEntry.baseUrl); if (catalogBaseUrl && catalogBaseUrl !== staticBaseUrl) return; if (isGatewayModelExplicitlyConfiguredTextOnly(params)) return; const configuredProvider = findNormalizedProviderValue(params.snapshot.config.models?.providers, params.provider); const normalizedModelId = normalizeLowercaseStringOrEmpty(params.model); const configuredModel = configuredProvider?.models?.find((model) => normalizeLowercaseStringOrEmpty(model.id) === normalizedModelId); const configuredApi = configuredModel?.api ?? configuredProvider?.api; if (configuredApi && configuredApi !== staticEntry.api) return; const configuredBaseUrl = normalizeGatewayModelCapabilityBaseUrl(configuredModel?.baseUrl ?? configuredProvider?.baseUrl); if (configuredBaseUrl && configuredBaseUrl !== staticBaseUrl) return; return staticEntry; } async function resolveGatewayModelSupportsImages(params) { if (!params.model) return true; try { for (const readOnly of [true, false]) { const loadParams = { ...params.agentId ? { agentId: params.agentId } : {}, readOnly }; const snapshot = params.loadGatewayModelCatalogSnapshot ? await params.loadGatewayModelCatalogSnapshot(loadParams) : void 0; const catalog = snapshot ? snapshot.entries : await params.loadGatewayModelCatalog(loadParams); const catalogEntry = findModelCatalogEntry(catalog, { provider: params.provider, modelId: params.model }); const modelEntry = (snapshot && (!catalogEntry || !modelSupportsInput(catalogEntry, "image")) ? resolveGatewayProviderStaticModel({ snapshot, agentId: params.agentId, provider: params.provider, model: params.model, catalogEntry }) : void 0) ?? catalogEntry; const normalizedProvider = normalizeOptionalLowercaseString(params.provider ?? modelEntry?.provider); const normalizedCandidates = [normalizeLowercaseStringOrEmpty(params.model), normalizeLowercaseStringOrEmpty(modelEntry?.name)].filter(Boolean); if (modelEntry) { if (modelSupportsInput(modelEntry, "image")) return true; if (normalizedProvider === "microsoft-foundry" && normalizedCandidates.some((candidate) => candidate.startsWith("gpt-") || candidate.startsWith("o1") || candidate.startsWith("o3") || candidate.startsWith("o4") || candidate === "computer-use-preview")) return true; if (normalizedProvider === "claude-cli" && normalizedCandidates.some((candidate) => candidate === "opus" || candidate === "sonnet" || candidate === "haiku" || candidate.startsWith("claude-"))) return true; if (readOnly && !snapshot?.catalogComplete && (!snapshot || !isGatewayModelExplicitlyConfiguredTextOnly({ snapshot, provider: params.provider, model: params.model }))) continue; return false; } if (normalizedProvider === "claude-cli" && normalizedCandidates.some((candidate) => candidate === "opus" || candidate === "sonnet" || candidate === "haiku" || candidate.startsWith("claude-"))) return true; if (readOnly && snapshot?.catalogComplete) return false; } return false; } catch { return false; } } function resolveSessionDisplayModelIdentityRefCached(params) { const ctx = params.rowContext; if (!ctx) return resolveSessionDisplayModelIdentityRef(params); const key = `${params.agentId}\u0000${createSessionRowModelCacheKey(params.provider, params.model)}`; const cached = ctx.displayModelIdentityByKey.get(key); if (cached) return cached; const value = resolveSessionDisplayModelIdentityRef(params); ctx.displayModelIdentityByKey.set(key, value); return value; } function resolveSessionDisplayModelIdentityRef(params) { const provider = normalizeOptionalString(params.provider); const model = normalizeOptionalString(params.model); if (!provider || !model || !isCliProvider(provider, params.cfg)) return { provider, model }; const defaultRef = resolveDefaultModelForAgent({ cfg: params.cfg, agentId: params.agentId }); if (model.includes("/")) { const parsedModel = parseModelRef(model, defaultRef.provider); if (parsedModel && !isCliProvider(parsedModel.provider, params.cfg)) return parsedModel; } const inferredProvider = inferUniqueProviderFromConfiguredModels({ cfg: params.cfg, model, agentId: params.agentId }); if (inferredProvider && !isCliProvider(inferredProvider, params.cfg)) return { provider: inferredProvider, model }; const parsedModel = parseModelRef(model, defaultRef.provider); if (parsedModel && !isCliProvider(parsedModel.provider, params.cfg)) return parsedModel; return { provider: defaultRef.provider || provider, model }; } function projectSessionPatchResult(params) { const agentId = resolveSessionAgentId({ config: params.cfg, sessionKey: params.canonicalKey, agentId: params.targetAgentId }); const resolved = resolveSessionModelRef(params.cfg, params.entry, agentId); const displayModel = resolveSessionDisplayModelIdentityRef({ cfg: params.cfg, agentId, provider: resolved.provider, model: resolved.model }); const modelCatalog = params.modelCatalog; const thinking = resolveGatewaySessionThinkingProjectionInternal({ cfg: params.cfg, agentId, provider: displayModel.provider ?? resolved.provider, model: displayModel.model ?? resolved.model, sessionKey: params.canonicalKey, entry: params.entry, modelCatalog }); const catalogEntry = modelCatalog ? findModelCatalogEntry(modelCatalog, { provider: displayModel.provider ?? resolved.provider, modelId: displayModel.model ?? resolved.model }) : void 0; const contextWindow = resolveModelContextWindowProfile({ catalogEntry, selected: params.entry.contextWindow }); return { ok: true, path: resolveSqliteTargetFromSessionStorePath(params.storePath, { agentId: params.targetAgentId }).path, key: params.canonicalKey, entry: projectPublicSessionEntry(params.entry), resolved: { modelProvider: displayModel.provider, model: displayModel.model, agentRuntime: thinking.agentRuntime, ...modelCatalog ? { contextWindow: contextWindow.contextWindow, contextWindows: contextWindow.contextWindows, thinkingLevel: thinking.effectiveThinkingLevel, thinkingLevels: thinking.thinkingLevels } : {} } }; } //#endregion export { resolveGatewaySessionRuntimeProjection as a, createSessionRowModelCacheKey as c, resolveGatewayModelThinkingProfile as i, projectSessionPatchResult as n, resolveGatewaySessionThinkingProjectionInternal as o, resolveGatewayModelSupportsImages as r, resolveSessionDisplayModelIdentityRefCached as s, getSessionDefaults as t };