UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

104 lines (103 loc) 4.95 kB
import { a as normalizeLowercaseStringOrEmpty, c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js"; import "./agent-scope-MrLta7Pq.js"; import { i as buildAgentMainSessionKey, u as normalizeAgentId } from "./session-key-B_NoIfpX.js"; import { c as resolveDefaultAgentId } from "./agent-scope-config-CgCYpZfK.js"; import { i as getRuntimeConfig } from "./io-Gi7-pyU-.js"; import { s as loadManifestMetadataSnapshot } from "./manifest-contract-eligibility-DEeoLRlM.js"; import { i as normalizeMessageChannel } from "./message-channel-normalize-BLLf0ubu.js"; import "./message-channel-BiOeMu0l.js"; import { c as parseModelRef, i as modelKey } from "./model-selection-normalize-roKDxQ9_.js"; import { c as resolveDefaultModelForAgent } from "./model-selection-CA_65iXi.js"; import { n as createModelVisibilityPolicy } from "./model-visibility-policy-B8VgY13t.js"; import { a as getHeader } from "./http-auth-utils-Du8mRZIw.js"; import { t as loadGatewayModelCatalog } from "./server-model-catalog-CcvpyvTp.js"; import { randomUUID } from "node:crypto"; //#region src/gateway/http-utils.ts const OPENCLAW_MODEL_ID = "openclaw"; /** Default OpenAI-compatible model alias that targets the default OpenClaw agent. */ const OPENCLAW_DEFAULT_MODEL_ID = "openclaw/default"; function resolveAgentIdFromHeader(req) { const raw = normalizeOptionalString(getHeader(req, "x-openclaw-agent-id")) || normalizeOptionalString(getHeader(req, "x-openclaw-agent")) || ""; if (!raw) return; return normalizeAgentId(raw); } /** Resolves the target agent encoded by an OpenAI-compatible model id. */ function resolveAgentIdFromModel(model, cfg = getRuntimeConfig()) { const raw = model?.trim(); if (!raw) return; const lowered = normalizeLowercaseStringOrEmpty(raw); if (lowered === "openclaw" || lowered === "openclaw/default") return resolveDefaultAgentId(cfg); const agentId = (raw.match(/^openclaw[:/](?<agentId>[a-z0-9][a-z0-9_-]{0,63})$/i) ?? raw.match(/^agent:(?<agentId>[a-z0-9][a-z0-9_-]{0,63})$/i))?.groups?.agentId; if (!agentId) return; return normalizeAgentId(agentId); } /** Validates and resolves the `x-openclaw-model` override for OpenAI-compatible requests. */ async function resolveOpenAiCompatModelOverride(params) { const requestModel = params.model?.trim(); if (requestModel && !resolveAgentIdFromModel(requestModel)) return { errorMessage: "Invalid `model`. Use `openclaw` or `openclaw/<agentId>`." }; const raw = getHeader(params.req, "x-openclaw-model")?.trim(); if (!raw) return {}; const cfg = getRuntimeConfig(); const defaultProvider = resolveDefaultModelForAgent({ cfg, agentId: params.agentId }).provider; const modelManifestContext = { manifestPlugins: loadManifestMetadataSnapshot({ config: cfg, env: process.env }).plugins }; const parsed = parseModelRef(raw, defaultProvider, { allowManifestNormalization: true, allowPluginNormalization: true, ...modelManifestContext }); if (!parsed) return { errorMessage: "Invalid `x-openclaw-model`." }; const policy = createModelVisibilityPolicy({ cfg, catalog: await loadGatewayModelCatalog(), defaultProvider, agentId: params.agentId, allowManifestNormalization: true, allowPluginNormalization: true, ...modelManifestContext }); const normalized = modelKey(parsed.provider, parsed.model); if (!policy.allowsKey(normalized)) return { errorMessage: `Model '${normalized}' is not allowed for agent '${params.agentId}'.` }; return { modelOverride: raw }; } /** Resolves the request agent from headers, model alias, or the configured default. */ function resolveAgentIdForRequest(params) { const cfg = getRuntimeConfig(); const fromHeader = resolveAgentIdFromHeader(params.req); if (fromHeader) return fromHeader; return resolveAgentIdFromModel(params.model, cfg) ?? resolveDefaultAgentId(cfg); } function resolveSessionKey(params) { const explicit = getHeader(params.req, "x-openclaw-session-key")?.trim(); if (explicit) return explicit; const user = params.user?.trim(); const mainKey = user ? `${params.prefix}-user:${user}` : `${params.prefix}:${randomUUID()}`; return buildAgentMainSessionKey({ agentId: params.agentId, mainKey }); } /** Resolves gateway agent/session/channel context for OpenAI-compatible handlers. */ function resolveGatewayRequestContext(params) { const agentId = resolveAgentIdForRequest({ req: params.req, model: params.model }); return { agentId, sessionKey: resolveSessionKey({ req: params.req, agentId, user: params.user, prefix: params.sessionPrefix }), messageChannel: params.useMessageChannelHeader ? normalizeMessageChannel(getHeader(params.req, "x-openclaw-message-channel")) ?? params.defaultMessageChannel : params.defaultMessageChannel }; } //#endregion export { resolveGatewayRequestContext as a, resolveAgentIdFromModel as i, OPENCLAW_MODEL_ID as n, resolveOpenAiCompatModelOverride as o, resolveAgentIdForRequest as r, OPENCLAW_DEFAULT_MODEL_ID as t };