UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

100 lines (99 loc) 4.93 kB
import { c as normalizeOptionalLowercaseString } from "./string-coerce-CIXf7egm.js"; import { n as attachModelProviderRequestRouteFacts, p as sanitizeConfiguredModelProviderRequest, r as attachModelProviderRequestTransport, u as resolveProviderRequestConfig } from "./provider-request-config-DIOYidiO.js"; import { u as isSecretRefHeaderValueMarker } from "./model-auth-markers-jBKQn38x.js"; import { t as attachModelProviderLocalService } from "./provider-local-service-D9Gl9HJT.js"; import { n as normalizeGoogleApiBaseUrl } from "./google-api-base-url-UBNiBOzj.js"; //#region src/agents/embedded-agent-runner/model.inline-provider.ts /** * Converts inline provider model config into runtime model definitions. */ /** Returns a supported transport API id from raw config values. */ function normalizeResolvedTransportApi(api) { switch (api) { case "anthropic-messages": case "bedrock-converse-stream": case "github-copilot": case "google-generative-ai": case "google-vertex": case "ollama": case "openai-chatgpt-responses": case "openai-completions": case "openai-responses": case "azure-openai-responses": return api; default: return; } } /** Sanitizes configured provider/model headers before they enter runtime model metadata. */ function sanitizeModelHeaders(headers, opts) { if (!headers || typeof headers !== "object" || Array.isArray(headers)) return; const next = {}; for (const [headerName, headerValue] of Object.entries(headers)) { if (typeof headerValue !== "string") continue; if (opts?.stripSecretRefMarkers && isSecretRefHeaderValueMarker(headerValue)) continue; next[headerName] = headerValue; } return Object.keys(next).length > 0 ? next : void 0; } function isLegacyFoundryVisionModelCandidate(params) { if (normalizeOptionalLowercaseString(params.provider) !== "microsoft-foundry") return false; return [params.modelId, params.modelName].filter((value) => typeof value === "string").map((value) => normalizeOptionalLowercaseString(value)).filter((value) => Boolean(value)).some((candidate) => candidate.startsWith("gpt-") || candidate.startsWith("o1") || candidate.startsWith("o3") || candidate.startsWith("o4") || candidate === "computer-use-preview"); } /** Resolves model input modalities with Foundry legacy vision-model compatibility. */ function resolveProviderModelInput(params) { const resolvedInput = Array.isArray(params.input) ? params.input : params.fallbackInput; const normalizedInput = Array.isArray(resolvedInput) ? resolvedInput.filter((item) => item === "text" || item === "image") : []; if (normalizedInput.length > 0 && !normalizedInput.includes("image") && isLegacyFoundryVisionModelCandidate(params)) return ["text", "image"]; return normalizedInput.length > 0 ? normalizedInput : ["text"]; } function resolveInlineProviderTransport(params) { const api = normalizeResolvedTransportApi(params.api); return { api, baseUrl: api === "google-generative-ai" ? normalizeGoogleApiBaseUrl(params.baseUrl) : params.baseUrl }; } /** Builds runtime model records from inline provider config. */ function buildInlineProviderModels(providers, options = {}) { return Object.entries(providers).flatMap(([providerId, entry]) => { const trimmed = providerId.trim(); if (!trimmed) return []; const providerHeaders = sanitizeModelHeaders(entry?.headers, { stripSecretRefMarkers: true }); const providerRequest = sanitizeConfiguredModelProviderRequest(entry?.request); return (entry?.models ?? []).map((model) => { const transport = resolveInlineProviderTransport({ api: model.api ?? entry?.api, baseUrl: model.baseUrl ?? entry?.baseUrl }); const modelHeaders = sanitizeModelHeaders(model.headers, { stripSecretRefMarkers: true }); const requestConfig = resolveProviderRequestConfig({ provider: trimmed, api: transport.api ?? model.api, baseUrl: transport.baseUrl, ...options.providerMetadataOwners ? { providerMetadataOwners: options.providerMetadataOwners } : {}, providerHeaders, modelHeaders, authHeader: entry?.authHeader, request: providerRequest, capability: "llm", transport: "stream" }); const maxTokens = model.maxTokens ?? entry?.maxTokens; return attachModelProviderRequestRouteFacts(attachModelProviderLocalService(attachModelProviderRequestTransport({ ...model, ...maxTokens !== void 0 ? { maxTokens } : {}, input: resolveProviderModelInput({ provider: trimmed, modelId: model.id, modelName: model.name, input: model.input }), provider: trimmed, baseUrl: requestConfig.baseUrl ?? transport.baseUrl, api: requestConfig.api ?? model.api, headers: requestConfig.headers }, providerRequest), entry?.localService), options.providerMetadataOwners); }); }); } //#endregion export { sanitizeModelHeaders as i, normalizeResolvedTransportApi as n, resolveProviderModelInput as r, buildInlineProviderModels as t };