UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

155 lines (154 loc) 5.76 kB
import { _ as parseStrictFiniteNumber, l as asPositiveSafeInteger } from "./number-coercion-CJQ8TR--.js"; import { t as createSubsystemLogger } from "./subsystem-BzXSmsuh.js"; import "./number-runtime-DBLVDypr.js"; import "./runtime-env-D_2q8-VK.js"; import "./string-coerce-runtime-CEGJWkQ_.js"; import { a as getCachedLiveProviderModelRows, t as LiveModelCatalogHttpError } from "./provider-catalog-live-runtime-D65zJRSj.js"; //#region extensions/vercel-ai-gateway/models.ts const VERCEL_AI_GATEWAY_PROVIDER_ID = "vercel-ai-gateway"; const VERCEL_AI_GATEWAY_BASE_URL = "https://ai-gateway.vercel.sh"; const VERCEL_AI_GATEWAY_DEFAULT_MODEL_ID = "anthropic/claude-opus-4.6"; const VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF = `${VERCEL_AI_GATEWAY_PROVIDER_ID}/${VERCEL_AI_GATEWAY_DEFAULT_MODEL_ID}`; const VERCEL_AI_GATEWAY_DEFAULT_CONTEXT_WINDOW = 2e5; const VERCEL_AI_GATEWAY_DEFAULT_MAX_TOKENS = 128e3; const VERCEL_AI_GATEWAY_DEFAULT_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }; const log = createSubsystemLogger("agents/vercel-ai-gateway"); const VERCEL_AI_GATEWAY_DISCOVERY_CACHE_TTL_MS = 6e4; const VERCEL_AI_GATEWAY_DISCOVERY_TIMEOUT_MS = 5e3; const STATIC_VERCEL_AI_GATEWAY_MODEL_CATALOG = [ { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", reasoning: true, input: ["text", "image"], contextWindow: 1e6, maxTokens: 128e3, cost: { input: 5, output: 25, cacheRead: .5, cacheWrite: 6.25 } }, { id: "openai/gpt-5.4", name: "GPT 5.4", reasoning: true, input: ["text", "image"], contextWindow: 2e5, maxTokens: 128e3, cost: { input: 2.5, output: 15, cacheRead: .25 } }, { id: "openai/gpt-5.4-pro", name: "GPT 5.4 Pro", reasoning: true, input: ["text", "image"], contextWindow: 2e5, maxTokens: 128e3, cost: { input: 30, output: 180, cacheRead: 0 } }, { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", reasoning: true, input: ["text", "image"], contextWindow: 262144, maxTokens: 262144, cost: { input: .95, output: 4, cacheRead: .16 } } ]; function toPerMillionCost(value) { const numeric = typeof value === "number" ? value : typeof value === "string" ? parseStrictFiniteNumber(value) : void 0; if (numeric === void 0 || numeric < 0) return 0; return numeric * 1e6; } function normalizeCost(pricing) { return { input: toPerMillionCost(pricing?.input), output: toPerMillionCost(pricing?.output), cacheRead: toPerMillionCost(pricing?.input_cache_read), cacheWrite: toPerMillionCost(pricing?.input_cache_write) }; } function buildStaticModelDefinition(model) { return { id: model.id, name: model.name, reasoning: model.reasoning, input: model.input, contextWindow: model.contextWindow, maxTokens: model.maxTokens, cost: { ...VERCEL_AI_GATEWAY_DEFAULT_COST, ...model.cost } }; } function getStaticFallbackModel(id) { const fallback = STATIC_VERCEL_AI_GATEWAY_MODEL_CATALOG.find((model) => model.id === id); return fallback ? buildStaticModelDefinition(fallback) : void 0; } function getStaticVercelAiGatewayModelCatalog() { return STATIC_VERCEL_AI_GATEWAY_MODEL_CATALOG.map(buildStaticModelDefinition); } function buildDiscoveredModelDefinition(model) { const id = typeof model.id === "string" ? model.id.trim() : ""; if (!id) return null; const fallback = getStaticFallbackModel(id); const contextWindow = asPositiveSafeInteger(model.context_window) ?? fallback?.contextWindow ?? 2e5; const maxTokens = asPositiveSafeInteger(model.max_tokens) ?? fallback?.maxTokens ?? 128e3; const normalizedCost = normalizeCost(model.pricing); return { id, name: (typeof model.name === "string" ? model.name.trim() : "") || fallback?.name || id, reasoning: Array.isArray(model.tags) && model.tags.includes("reasoning") ? true : fallback?.reasoning ?? false, input: Array.isArray(model.tags) ? model.tags.includes("vision") ? ["text", "image"] : ["text"] : fallback?.input ?? ["text"], contextWindow, maxTokens, cost: normalizedCost.input > 0 || normalizedCost.output > 0 || normalizedCost.cacheRead > 0 || normalizedCost.cacheWrite > 0 ? normalizedCost : fallback?.cost ?? VERCEL_AI_GATEWAY_DEFAULT_COST }; } function asVercelGatewayModelShape(value) { if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error("Vercel AI Gateway model list: malformed JSON response"); return value; } async function discoverVercelAiGatewayModels() { if (process.env.VITEST || false) return getStaticVercelAiGatewayModelCatalog(); try { const discovered = (await getCachedLiveProviderModelRows({ providerId: VERCEL_AI_GATEWAY_PROVIDER_ID, endpoint: `${VERCEL_AI_GATEWAY_BASE_URL}/v1/models`, timeoutMs: VERCEL_AI_GATEWAY_DISCOVERY_TIMEOUT_MS, ttlMs: VERCEL_AI_GATEWAY_DISCOVERY_CACHE_TTL_MS, auditContext: "vercel-ai-gateway.models" })).map(asVercelGatewayModelShape).map(buildDiscoveredModelDefinition).filter((entry) => entry !== null); return discovered.length > 0 ? discovered : getStaticVercelAiGatewayModelCatalog(); } catch (error) { if (error instanceof LiveModelCatalogHttpError) { log.warn(`Failed to discover Vercel AI Gateway models: HTTP ${error.status}`); return getStaticVercelAiGatewayModelCatalog(); } log.warn(`Failed to discover Vercel AI Gateway models: ${String(error)}`); return getStaticVercelAiGatewayModelCatalog(); } } //#endregion export { VERCEL_AI_GATEWAY_DEFAULT_MODEL_ID as a, discoverVercelAiGatewayModels as c, VERCEL_AI_GATEWAY_DEFAULT_MAX_TOKENS as i, getStaticVercelAiGatewayModelCatalog as l, VERCEL_AI_GATEWAY_DEFAULT_CONTEXT_WINDOW as n, VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF as o, VERCEL_AI_GATEWAY_DEFAULT_COST as r, VERCEL_AI_GATEWAY_PROVIDER_ID as s, VERCEL_AI_GATEWAY_BASE_URL as t };