UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

110 lines (109 loc) 4.29 kB
import { t as AssistantMessageEventStream } from "./event-stream-ReMmOTzX.js"; import { s as buildBaseOptions } from "./sanitize-unicode-CgzZKr22.js"; import { a as runGoogleGenerateContentLifecycle, i as getDisabledGoogleThinkingConfig, n as buildGoogleSimpleThinking, r as createGoogleAssistantOutput, t as buildGoogleGenerateContentParams } from "./google-shared-DoWyTeaD.js"; import { GoogleGenAI, ResourceScope, ThinkingLevel } from "@google/genai"; //#region src/llm/providers/google-vertex.ts const API_VERSION = "v1"; const GCP_VERTEX_CREDENTIALS_MARKER = "gcp-vertex-credentials"; const THINKING_LEVEL_MAP = { THINKING_LEVEL_UNSPECIFIED: ThinkingLevel.THINKING_LEVEL_UNSPECIFIED, MINIMAL: ThinkingLevel.MINIMAL, LOW: ThinkingLevel.LOW, MEDIUM: ThinkingLevel.MEDIUM, HIGH: ThinkingLevel.HIGH }; let toolCallCounter = 0; const streamGoogleVertex = (model, context, options) => { const stream = new AssistantMessageEventStream(); runGoogleGenerateContentLifecycle({ stream, model, output: createGoogleAssistantOutput(model, "google-vertex"), options, createClient: () => { const apiKey = resolveApiKey(options); return apiKey ? createClientWithApiKey(model, apiKey, options?.headers) : createClient(model, resolveProject(options), resolveLocation(options), options?.headers); }, buildParams: () => buildParams(model, context, options), nextToolCallId: (name) => `${name}_${Date.now()}_${++toolCallCounter}` }); return stream; }; const streamSimpleGoogleVertex = (model, context, options) => { return streamGoogleVertex(model, context, { ...buildBaseOptions(model, options, void 0), thinking: buildGoogleSimpleThinking(model, options) }); }; function createClient(model, project, location, optionsHeaders) { return new GoogleGenAI({ vertexai: true, project, location, apiVersion: API_VERSION, httpOptions: buildHttpOptions(model, optionsHeaders) }); } function createClientWithApiKey(model, apiKey, optionsHeaders) { return new GoogleGenAI({ vertexai: true, apiKey, apiVersion: API_VERSION, httpOptions: buildHttpOptions(model, optionsHeaders) }); } function buildHttpOptions(model, optionsHeaders) { const httpOptions = {}; const baseUrl = resolveCustomBaseUrl(model.baseUrl); if (baseUrl) { httpOptions.baseUrl = baseUrl; httpOptions.baseUrlResourceScope = ResourceScope.COLLECTION; if (baseUrlIncludesApiVersion(baseUrl)) httpOptions.apiVersion = ""; } if (model.headers || optionsHeaders) httpOptions.headers = { ...model.headers, ...optionsHeaders }; return Object.keys(httpOptions).length > 0 ? httpOptions : void 0; } function resolveCustomBaseUrl(baseUrl) { const trimmed = baseUrl.trim(); if (!trimmed || trimmed.includes("{location}")) return; return trimmed; } function baseUrlIncludesApiVersion(baseUrl) { try { return new URL(baseUrl).pathname.split("/").some((part) => /^v\d+(?:beta\d*)?$/.test(part)); } catch { return /(?:^|\/)v\d+(?:beta\d*)?(?:\/|$)/.test(baseUrl); } } function resolveApiKey(options) { const apiKey = options?.apiKey?.trim() || process.env.GOOGLE_CLOUD_API_KEY?.trim(); if (!apiKey || apiKey === GCP_VERTEX_CREDENTIALS_MARKER || isPlaceholderApiKey(apiKey)) return; return apiKey; } function isPlaceholderApiKey(apiKey) { return /^<[^>]+>$/.test(apiKey); } function resolveProject(options) { const project = options?.project || process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT; if (!project) throw new Error("Vertex AI requires a project ID. Set GOOGLE_CLOUD_PROJECT/GCLOUD_PROJECT or pass project in options."); return project; } function resolveLocation(options) { const location = options?.location || process.env.GOOGLE_CLOUD_LOCATION; if (!location) throw new Error("Vertex AI requires a location. Set GOOGLE_CLOUD_LOCATION or pass location in options."); return location; } function buildParams(model, context, options = {}) { return buildGoogleGenerateContentParams(model, context, options, { mapThinkingLevel: mapVertexThinkingLevel, getDisabledThinkingConfig: (modelLocal) => getDisabledGoogleThinkingConfig(modelLocal, { mapThinkingLevel: mapVertexThinkingLevel }) }); } function mapVertexThinkingLevel(level) { return THINKING_LEVEL_MAP[level]; } //#endregion export { streamGoogleVertex, streamSimpleGoogleVertex };