UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

175 lines (174 loc) 5.46 kB
import { d as asPositiveSafeInteger } from "./number-coercion-CLj0HTDM.js"; import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import "./string-coerce-runtime-GQa0ehRA.js"; import { c as getCachedLiveProviderModelRows } from "./provider-catalog-live-runtime-EZZSw18v.js"; import { a as resolveGoogleStaticModelId, n as isGoogleTextGenerationModelId } from "./provider-models-D_K96y_e.js"; //#region extensions/google/provider-catalog.ts const GOOGLE_GEMINI_BASE_URL = "https://generativelanguage.googleapis.com/v1beta"; const GOOGLE_GEMINI_MODELS_ENDPOINT = `${GOOGLE_GEMINI_BASE_URL}/models?pageSize=1000`; const GOOGLE_VERTEX_BASE_URL = "https://{location}-aiplatform.googleapis.com"; const GOOGLE_GEMINI_MODELS_CACHE_TTL_MS = 6e4; const GOOGLE_GEMINI_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }; const GOOGLE_GEMINI_TEXT_MODELS = [ [ "gemini-2.5-pro", "Gemini 2.5 Pro", false ], [ "gemini-2.5-flash", "Gemini 2.5 Flash", false ], [ "gemini-2.5-flash-lite", "Gemini 2.5 Flash-Lite", false ], [ "gemini-3.5-flash", "Gemini 3.5 Flash", true ], [ "gemini-3.6-flash", "Gemini 3.6 Flash", true ], [ "gemini-3.7-flash", "Gemini 3.7 Flash", true, { minimal: null } ], [ "gemini-3.5-flash-lite", "Gemini 3.5 Flash-Lite", true ], [ "gemini-3.1-pro-preview", "Gemini 3.1 Pro Preview", true ], [ "gemini-3.1-flash-lite", "Gemini 3.1 Flash Lite", true ], [ "gemini-3-flash-preview", "Gemini 3 Flash Preview", true ] ].map(([id, name, prefersCodeMode, thinkingLevelMap]) => { const model = { id, name, reasoning: true, input: ["text", "image"], cost: GOOGLE_GEMINI_COST, contextWindow: 1048576, maxTokens: 65536 }; if (thinkingLevelMap) model.thinkingLevelMap = thinkingLevelMap; if (prefersCodeMode) model.compat = { codeMode: "preferred" }; return model; }); const GOOGLE_GEMINI_TEXT_MODEL_BY_ID = new Map(GOOGLE_GEMINI_TEXT_MODELS.map((model) => [model.id, model])); const GOOGLE_GEMINI_TEXT_MODEL_IDS = new Set(GOOGLE_GEMINI_TEXT_MODEL_BY_ID.keys()); function buildGoogleStaticCatalogProvider() { return { baseUrl: GOOGLE_GEMINI_BASE_URL, api: "google-generative-ai", models: GOOGLE_GEMINI_TEXT_MODELS.map((model) => ({ ...model, input: [...model.input, "video"] })) }; } function readGoogleLiveModels(body) { if (!body || typeof body !== "object" || Array.isArray(body)) return []; const models = body.models; return Array.isArray(models) ? models : []; } function googleLiveModelInput(id) { if (!id.startsWith("gemma-")) return [ "text", "image", "video" ]; return /^gemma-3-(?:4b|12b|27b)(?:-|$)/.test(id) || id.startsWith("gemma-3n-") || id.startsWith("gemma-4-") ? ["text", "image"] : ["text"]; } function buildGoogleLiveModel(row) { if (!row || typeof row !== "object" || Array.isArray(row)) return; const record = row; const resourceName = normalizeOptionalString(record.name); const id = resourceName?.startsWith("models/") ? resourceName.slice(7) : void 0; const methods = record.supportedGenerationMethods; const contextWindow = asPositiveSafeInteger(record.inputTokenLimit); const maxTokens = asPositiveSafeInteger(record.outputTokenLimit); if (!id || !isGoogleTextGenerationModelId(id) || !Array.isArray(methods) || !methods.includes("generateContent") || !contextWindow || !maxTokens) return; const staticId = resolveGoogleStaticModelId(id, GOOGLE_GEMINI_TEXT_MODEL_IDS); const staticModel = staticId ? GOOGLE_GEMINI_TEXT_MODEL_BY_ID.get(staticId) : void 0; return { id, name: normalizeOptionalString(record.displayName) ?? id, reasoning: record.thinking === true, input: googleLiveModelInput(id), cost: GOOGLE_GEMINI_COST, contextWindow, maxTokens, ...staticModel?.compat ? { compat: { ...staticModel.compat } } : {}, ...staticModel?.thinkingLevelMap ? { thinkingLevelMap: { ...staticModel.thinkingLevelMap } } : {} }; } function parseGoogleLiveModels(rows) { const models = rows.map(buildGoogleLiveModel).filter((model) => Boolean(model)); return [...new Map(models.map((model) => [model.id, model])).values()].toSorted((a, b) => a.id.localeCompare(b.id)); } async function buildGoogleLiveCatalogProvider(params) { const fallback = { ...buildGoogleStaticCatalogProvider(), ...params.apiKey ? { apiKey: params.apiKey } : {} }; try { const models = parseGoogleLiveModels(await getCachedLiveProviderModelRows({ providerId: "google", endpoint: GOOGLE_GEMINI_MODELS_ENDPOINT, apiKey: params.apiKey, discoveryApiKey: params.discoveryApiKey, fetchGuard: params.fetchGuard, signal: params.signal, ttlMs: GOOGLE_GEMINI_MODELS_CACHE_TTL_MS, auditContext: "google-model-discovery", readRows: readGoogleLiveModels, buildRequestHeaders: ({ discoveryApiKey, apiKey }) => ({ Accept: "application/json", ...discoveryApiKey ?? apiKey ? { "x-goog-api-key": discoveryApiKey ?? apiKey } : {} }), shouldCacheRows: (modelRows) => parseGoogleLiveModels(modelRows).length > 0 })); if (models.length === 0) return fallback; return { ...fallback, models }; } catch { return fallback; } } function buildGoogleVertexStaticCatalogProvider() { return { baseUrl: GOOGLE_VERTEX_BASE_URL, api: "google-vertex", models: GOOGLE_GEMINI_TEXT_MODELS }; } //#endregion export { buildGoogleStaticCatalogProvider as n, buildGoogleVertexStaticCatalogProvider as r, buildGoogleLiveCatalogProvider as t };