UNPKG

@genkit-ai/vertexai

Version:

Genkit AI framework plugin for Google Cloud Vertex AI APIs including Gemini APIs, Imagen, and more.

966 lines 30 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var gemini_exports = {}; __export(gemini_exports, { GENERIC_GEMINI_MODEL: () => GENERIC_GEMINI_MODEL, GeminiConfigSchema: () => GeminiConfigSchema, SUPPORTED_GEMINI_MODELS: () => SUPPORTED_GEMINI_MODELS, SUPPORTED_V15_MODELS: () => SUPPORTED_V15_MODELS, SUPPORTED_V1_MODELS: () => SUPPORTED_V1_MODELS, cleanSchema: () => cleanSchema, defineGeminiKnownModel: () => defineGeminiKnownModel, defineGeminiModel: () => defineGeminiModel, fromGeminiCandidate: () => fromGeminiCandidate, gemini: () => gemini, gemini10Pro: () => gemini10Pro, gemini15Flash: () => gemini15Flash, gemini15Pro: () => gemini15Pro, gemini20Flash: () => gemini20Flash, gemini20Flash001: () => gemini20Flash001, gemini20FlashLite: () => gemini20FlashLite, gemini20FlashLitePreview0205: () => gemini20FlashLitePreview0205, gemini20ProExp0205: () => gemini20ProExp0205, gemini25ProExp0325: () => gemini25ProExp0325, gemini25ProPreview0325: () => gemini25ProPreview0325, toGeminiMessage: () => toGeminiMessage, toGeminiSystemInstruction: () => toGeminiSystemInstruction, toGeminiTool: () => toGeminiTool }); module.exports = __toCommonJS(gemini_exports); var import_vertexai = require("@google-cloud/vertexai"); var import_resources = require("@google-cloud/vertexai/build/src/resources/index.js"); var import_genkit = require("genkit"); var import_model = require("genkit/model"); var import_middleware = require("genkit/model/middleware"); var import_tracing = require("genkit/tracing"); var import_google_auth_library = require("google-auth-library"); var import_context_caching = require("./context-caching/index.js"); var import_utils = require("./context-caching/utils.js"); const SafetySettingsSchema = import_genkit.z.object({ category: import_genkit.z.nativeEnum(import_vertexai.HarmCategory), threshold: import_genkit.z.nativeEnum(import_vertexai.HarmBlockThreshold) }); const VertexRetrievalSchema = import_genkit.z.object({ datastore: import_genkit.z.object({ projectId: import_genkit.z.string().describe("Google Cloud Project ID.").optional(), location: import_genkit.z.string().describe("Google Cloud region e.g. us-central1.").optional(), dataStoreId: import_genkit.z.string().describe( 'The data store id, when project id and location are provided as separate options. Alternatively, the full path to the data store should be provided in the form: "projects/{project}/locations/{location}/collections/default_collection/dataStores/{data_store}".' ) }).describe("Vertex AI Search data store details"), disableAttribution: import_genkit.z.boolean().describe( "Disable using the search data in detecting grounding attribution. This does not affect how the result is given to the model for generation." ).optional() }); const GoogleSearchRetrievalSchema = import_genkit.z.object({ disableAttribution: import_genkit.z.boolean().describe( "Disable using the search data in detecting grounding attribution. This does not affect how the result is given to the model for generation." ).optional() }); const GeminiConfigSchema = import_model.GenerationCommonConfigSchema.extend({ location: import_genkit.z.string().describe("Google Cloud region e.g. us-central1.").optional(), /** * Safety filter settings. See: https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/configure-safety-filters#configurable-filters * * E.g. * * ```js * config: { * safetySettings: [ * { * category: 'HARM_CATEGORY_HATE_SPEECH', * threshold: 'BLOCK_LOW_AND_ABOVE', * }, * { * category: 'HARM_CATEGORY_DANGEROUS_CONTENT', * threshold: 'BLOCK_MEDIUM_AND_ABOVE', * }, * { * category: 'HARM_CATEGORY_HARASSMENT', * threshold: 'BLOCK_ONLY_HIGH', * }, * { * category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT', * threshold: 'BLOCK_NONE', * }, * ], * } * ``` */ safetySettings: import_genkit.z.array(SafetySettingsSchema).describe( "Adjust how likely you are to see responses that could be harmful. Content is blocked based on the probability that it is harmful." ).optional(), /** * Vertex retrieval options. * * E.g. * * ```js * config: { * vertexRetrieval: { * datastore: { * projectId: 'your-cloud-project', * location: 'us-central1', * collection: 'your-collection', * }, * disableAttribution: true, * } * } * ``` */ vertexRetrieval: VertexRetrievalSchema.describe( "Retrieve from Vertex AI Search data store for grounding generative responses." ).optional(), /** * Google Search retrieval options. * * ```js * config: { * googleSearchRetrieval: { * disableAttribution: true, * } * } * ``` */ googleSearchRetrieval: GoogleSearchRetrievalSchema.describe( "Retrieve public web data for grounding, powered by Google Search." ).optional(), /** * Function calling options. * * E.g. forced tool call: * * ```js * config: { * functionCallingConfig: { * mode: 'ANY', * } * } * ``` */ functionCallingConfig: import_genkit.z.object({ mode: import_genkit.z.enum(["MODE_UNSPECIFIED", "AUTO", "ANY", "NONE"]).optional(), allowedFunctionNames: import_genkit.z.array(import_genkit.z.string()).optional() }).describe( "Controls how the model uses the provided tools (function declarations). With AUTO (Default) mode, the model decides whether to generate a natural language response or suggest a function call based on the prompt and context. With ANY, the model is constrained to always predict a function call and guarantee function schema adherence. With NONE, the model is prohibited from making function calls." ).optional() }); function gemini(version, options = {}) { const nearestModel = nearestGeminiModelRef(version); return (0, import_model.modelRef)({ name: `vertexai/${version}`, config: options, configSchema: GeminiConfigSchema, info: { ...nearestModel.info, // If exact suffix match for a known model, use its label, otherwise create a new label label: nearestModel.name.endsWith(version) ? nearestModel.info?.label : `Vertex AI - ${version}` } }); } function nearestGeminiModelRef(version, options = {}) { const matchingKey = longestMatchingPrefix( version, Object.keys(SUPPORTED_GEMINI_MODELS) ); if (matchingKey) { return SUPPORTED_GEMINI_MODELS[matchingKey].withConfig({ ...options, version }); } return GENERIC_GEMINI_MODEL.withConfig({ ...options, version }); } function longestMatchingPrefix(version, potentialMatches) { return potentialMatches.filter((p) => version.startsWith(p)).reduce( (longest, current) => current.length > longest.length ? current : longest, "" ); } const gemini10Pro = (0, import_model.modelRef)({ name: "vertexai/gemini-1.0-pro", info: { label: "Vertex AI - Gemini Pro", versions: ["gemini-1.0-pro-001", "gemini-1.0-pro-002"], supports: { multiturn: true, media: false, tools: true, systemRole: true, constrained: "no-tools", toolChoice: true } }, configSchema: GeminiConfigSchema }); const gemini15Pro = (0, import_model.modelRef)({ name: "vertexai/gemini-1.5-pro", info: { label: "Vertex AI - Gemini 1.5 Pro", versions: ["gemini-1.5-pro-001", "gemini-1.5-pro-002"], supports: { multiturn: true, media: true, tools: true, toolChoice: true, systemRole: true, constrained: "no-tools" } }, configSchema: GeminiConfigSchema }); const gemini15Flash = (0, import_model.modelRef)({ name: "vertexai/gemini-1.5-flash", info: { label: "Vertex AI - Gemini 1.5 Flash", versions: ["gemini-1.5-flash-001", "gemini-1.5-flash-002"], supports: { multiturn: true, media: true, tools: true, toolChoice: true, systemRole: true, constrained: "no-tools" } }, configSchema: GeminiConfigSchema }); const gemini20Flash001 = (0, import_model.modelRef)({ name: "vertexai/gemini-2.0-flash-001", info: { label: "Vertex AI - Gemini 2.0 Flash 001", versions: [], supports: { multiturn: true, media: true, tools: true, toolChoice: true, systemRole: true, constrained: "no-tools" } }, configSchema: GeminiConfigSchema }); const gemini20Flash = (0, import_model.modelRef)({ name: "vertexai/gemini-2.0-flash", info: { label: "Vertex AI - Gemini 2.0 Flash", versions: [], supports: { multiturn: true, media: true, tools: true, toolChoice: true, systemRole: true, constrained: "no-tools" } }, configSchema: GeminiConfigSchema }); const gemini20FlashLite = (0, import_model.modelRef)({ name: "vertexai/gemini-2.0-flash-lite", info: { label: "Vertex AI - Gemini 2.0 Flash Lite", versions: [], supports: { multiturn: true, media: true, tools: true, toolChoice: true, systemRole: true, constrained: "no-tools" } }, configSchema: GeminiConfigSchema }); const gemini20FlashLitePreview0205 = (0, import_model.modelRef)({ name: "vertexai/gemini-2.0-flash-lite-preview-02-05", info: { label: "Vertex AI - Gemini 2.0 Flash Lite Preview 02-05", versions: [], supports: { multiturn: true, media: true, tools: true, toolChoice: true, systemRole: true, constrained: "no-tools" } }, configSchema: GeminiConfigSchema }); const gemini20ProExp0205 = (0, import_model.modelRef)({ name: "vertexai/gemini-2.0-pro-exp-02-05", info: { label: "Vertex AI - Gemini 2.0 Flash Pro Experimental 02-05", versions: [], supports: { multiturn: true, media: true, tools: true, toolChoice: true, systemRole: true, constrained: "no-tools" } }, configSchema: GeminiConfigSchema }); const gemini25ProExp0325 = (0, import_model.modelRef)({ name: "vertexai/gemini-2.5-pro-exp-03-25", info: { label: "Vertex AI - Gemini 2.5 Pro Experimental 03-25", versions: [], supports: { multiturn: true, media: true, tools: true, toolChoice: true, systemRole: true, constrained: "no-tools" } }, configSchema: GeminiConfigSchema }); const gemini25ProPreview0325 = (0, import_model.modelRef)({ name: "vertexai/gemini-2.5-pro-preview-03-25", info: { label: "Vertex AI - Gemini 2.5 Pro Preview 03-25", versions: [], supports: { multiturn: true, media: true, tools: true, toolChoice: true, systemRole: true, constrained: "no-tools" } }, configSchema: GeminiConfigSchema }); const GENERIC_GEMINI_MODEL = (0, import_model.modelRef)({ name: "vertexai/gemini", configSchema: GeminiConfigSchema, info: { label: "Google Gemini", supports: { multiturn: true, media: true, tools: true, toolChoice: true, systemRole: true } } }); const SUPPORTED_V1_MODELS = { "gemini-1.0-pro": gemini10Pro }; const SUPPORTED_V15_MODELS = { "gemini-1.5-pro": gemini15Pro, "gemini-1.5-flash": gemini15Flash, "gemini-2.0-flash": gemini20Flash, "gemini-2.0-flash-001": gemini20Flash001, "gemini-2.0-flash-lite": gemini20FlashLite, "gemini-2.0-flash-lite-preview-02-05": gemini20FlashLitePreview0205, "gemini-2.0-pro-exp-02-05": gemini20ProExp0205, "gemini-2.5-pro-exp-03-25": gemini25ProExp0325, "gemini-2.5-pro-preview-03-25": gemini25ProPreview0325 }; const SUPPORTED_GEMINI_MODELS = { ...SUPPORTED_V1_MODELS, ...SUPPORTED_V15_MODELS }; function toGeminiRole(role, modelInfo) { switch (role) { case "user": return "user"; case "model": return "model"; case "system": if (modelInfo && modelInfo.supports?.systemRole) { throw new Error( "system role is only supported for a single message in the first position" ); } else { throw new Error("system role is not supported"); } case "tool": return "function"; default: return "user"; } } const toGeminiTool = (tool) => { const declaration = { name: tool.name.replace(/\//g, "__"), // Gemini throws on '/' in tool name description: tool.description, parameters: convertSchemaProperty(tool.inputSchema) }; return declaration; }; const toGeminiFileDataPart = (part) => { const media = part.media; if (media.url.startsWith("gs://") || media.url.startsWith("http")) { if (!media.contentType) throw new Error( "Must supply contentType when using media from http(s):// or gs:// URLs." ); return { fileData: { mimeType: media.contentType, fileUri: media.url } }; } else if (media.url.startsWith("data:")) { const dataUrl = media.url; const b64Data = dataUrl.substring(dataUrl.indexOf(",") + 1); const contentType = media.contentType || dataUrl.substring(dataUrl.indexOf(":") + 1, dataUrl.indexOf(";")); return { inlineData: { mimeType: contentType, data: b64Data } }; } throw Error( "Could not convert genkit part to gemini tool response part: missing file data" ); }; const toGeminiToolRequestPart = (part) => { if (!part?.toolRequest?.input) { throw Error( "Could not convert genkit part to gemini tool response part: missing tool request data" ); } return { functionCall: { name: part.toolRequest.name, args: part.toolRequest.input } }; }; const toGeminiToolResponsePart = (part) => { if (!part?.toolResponse?.output) { throw Error( "Could not convert genkit part to gemini tool response part: missing tool response data" ); } return { functionResponse: { name: part.toolResponse.name, response: { name: part.toolResponse.name, content: part.toolResponse.output } } }; }; function toGeminiSystemInstruction(message) { return { role: "user", parts: message.content.map(toGeminiPart) }; } function toGeminiMessage(message, modelInfo) { let sortedParts = message.content; if (message.role === "tool") { sortedParts = [...message.content].sort((a, b) => { const aRef = a.toolResponse?.ref; const bRef = b.toolResponse?.ref; if (!aRef && !bRef) return 0; if (!aRef) return 1; if (!bRef) return -1; return parseInt(aRef, 10) - parseInt(bRef, 10); }); } return { role: toGeminiRole(message.role, modelInfo), parts: sortedParts.map(toGeminiPart) }; } function fromGeminiFinishReason(reason) { if (!reason) return "unknown"; switch (reason) { case "STOP": return "stop"; case "MAX_TOKENS": return "length"; case "SAFETY": // blocked for safety case "RECITATION": return "blocked"; default: return "unknown"; } } function toGeminiPart(part) { if (part.text) { return { text: part.text }; } else if (part.media) { return toGeminiFileDataPart(part); } else if (part.toolRequest) { return toGeminiToolRequestPart(part); } else if (part.toolResponse) { return toGeminiToolResponsePart(part); } else { throw new Error("unsupported type"); } } function fromGeminiInlineDataPart(part) { if (!part.inlineData || !part.inlineData.hasOwnProperty("mimeType") || !part.inlineData.hasOwnProperty("data")) { throw new Error("Invalid GeminiPart: missing required properties"); } const { mimeType, data } = part.inlineData; const dataUrl = `data:${mimeType};base64,${data}`; return { media: { url: dataUrl, contentType: mimeType } }; } function fromGeminiFileDataPart(part) { if (!part.fileData || !part.fileData.hasOwnProperty("mimeType") || !part.fileData.hasOwnProperty("url")) { throw new Error( "Invalid Gemini File Data Part: missing required properties" ); } return { media: { url: part.fileData?.fileUri, contentType: part.fileData?.mimeType } }; } function fromGeminiFunctionCallPart(part, ref) { if (!part.functionCall) { throw new Error( "Invalid Gemini Function Call Part: missing function call data" ); } return { toolRequest: { name: part.functionCall.name, input: part.functionCall.args, ref } }; } function fromGeminiFunctionResponsePart(part, ref) { if (!part.functionResponse) { throw new Error( "Invalid Gemini Function Call Part: missing function call data" ); } return { toolResponse: { name: part.functionResponse.name.replace(/__/g, "/"), // restore slashes output: part.functionResponse.response, ref } }; } function fromGeminiPart(part, jsonMode, ref) { if (part.text !== void 0) return { text: part.text }; if (part.inlineData) return fromGeminiInlineDataPart(part); if (part.fileData) return fromGeminiFileDataPart(part); if (part.functionCall) return fromGeminiFunctionCallPart(part, ref); if (part.functionResponse) return fromGeminiFunctionResponsePart(part, ref); throw new Error( "Part type is unsupported/corrupted. Either data is missing or type cannot be inferred from type." ); } function fromGeminiCandidate(candidate, jsonMode) { const parts = candidate.content.parts || []; const genkitCandidate = { index: candidate.index || 0, message: { role: "model", content: parts.map((part, index) => { return fromGeminiPart(part, jsonMode, index.toString()); }) }, finishReason: fromGeminiFinishReason(candidate.finishReason), finishMessage: candidate.finishMessage, custom: { safetyRatings: candidate.safetyRatings, citationMetadata: candidate.citationMetadata } }; return genkitCandidate; } function convertSchemaProperty(property) { if (!property || !property.type) { return void 0; } const baseSchema = {}; if (property.description) { baseSchema.description = property.description; } if (property.enum) { baseSchema.enum = property.enum; } if (property.nullable) { baseSchema.nullable = property.nullable; } let propertyType; if (Array.isArray(property.type)) { const types = property.type; if (types.includes("null")) { baseSchema.nullable = true; } propertyType = types.find((t) => t !== "null"); } else { propertyType = property.type; } if (propertyType === "object") { const nestedProperties = {}; Object.keys(property.properties).forEach((key) => { nestedProperties[key] = convertSchemaProperty(property.properties[key]); }); return { ...baseSchema, type: import_vertexai.FunctionDeclarationSchemaType.OBJECT, properties: nestedProperties, required: property.required }; } else if (propertyType === "array") { return { ...baseSchema, type: import_vertexai.FunctionDeclarationSchemaType.ARRAY, items: convertSchemaProperty(property.items) }; } else { const schemaType = import_vertexai.FunctionDeclarationSchemaType[propertyType.toUpperCase()]; if (!schemaType) { throw new import_genkit.GenkitError({ status: "INVALID_ARGUMENT", message: `Unsupported property type ${propertyType.toUpperCase()}` }); } return { ...baseSchema, type: schemaType }; } } function cleanSchema(schema) { const out = structuredClone(schema); for (const key in out) { if (key === "$schema" || key === "additionalProperties") { delete out[key]; continue; } if (typeof out[key] === "object") { out[key] = cleanSchema(out[key]); } if (key === "type" && Array.isArray(out[key])) { out[key] = out[key].find((t) => t !== "null"); } } return out; } function defineGeminiKnownModel(ai, name, vertexClientFactory, options, debugTraces) { const modelName = `vertexai/${name}`; const model = SUPPORTED_GEMINI_MODELS[name]; if (!model) throw new Error(`Unsupported model: ${name}`); return defineGeminiModel({ ai, modelName, version: name, modelInfo: model?.info, vertexClientFactory, options, debugTraces }); } function defineGeminiModel({ ai, modelName, version, modelInfo, vertexClientFactory, options, debugTraces }) { const middlewares = []; if (SUPPORTED_V1_MODELS[version]) { middlewares.push((0, import_middleware.simulateSystemPrompt)()); } if (modelInfo?.supports?.media) { middlewares.push( (0, import_middleware.downloadRequestMedia)({ maxBytes: 1024 * 1024 * 20, filter: (part) => { try { const url = new URL(part.media.url); if ( // Gemini can handle these URLs ["www.youtube.com", "youtube.com", "youtu.be"].includes( url.hostname ) ) return false; } catch { } return true; } }) ); } return ai.defineModel( { name: modelName, ...modelInfo, configSchema: GeminiConfigSchema, use: middlewares }, async (request, sendChunk) => { const vertex = vertexClientFactory(request); const messages = [...request.messages]; if (messages.length === 0) throw new Error("No messages provided."); let systemInstruction = void 0; if (!SUPPORTED_V1_MODELS[version]) { const systemMessage = messages.find((m) => m.role === "system"); if (systemMessage) { messages.splice(messages.indexOf(systemMessage), 1); systemInstruction = toGeminiSystemInstruction(systemMessage); } } const tools = request.tools?.length ? [{ functionDeclarations: request.tools.map(toGeminiTool) }] : []; let toolConfig; if (request?.config?.functionCallingConfig) { toolConfig = { functionCallingConfig: { allowedFunctionNames: request.config.functionCallingConfig.allowedFunctionNames, mode: toFunctionModeEnum(request.config.functionCallingConfig.mode) } }; } else if (request.toolChoice) { toolConfig = { functionCallingConfig: { mode: toGeminiFunctionModeEnum(request.toolChoice) } }; } const jsonMode = (request.output?.format === "json" || !!request.output?.schema) && tools.length === 0; let chatRequest = { systemInstruction, tools, toolConfig, history: messages.slice(0, -1).map((message) => toGeminiMessage(message, modelInfo)), generationConfig: { candidateCount: request.candidates || void 0, temperature: request.config?.temperature, maxOutputTokens: request.config?.maxOutputTokens, topK: request.config?.topK, topP: request.config?.topP, responseMimeType: jsonMode ? "application/json" : void 0, stopSequences: request.config?.stopSequences }, safetySettings: request.config?.safetySettings }; const modelVersion = request.config?.version || version; const cacheConfigDetails = (0, import_utils.extractCacheConfig)(request); const apiClient = new import_resources.ApiClient( options.projectId, options.location, "v1beta1", new import_google_auth_library.GoogleAuth(options.googleAuth) ); const { chatRequest: updatedChatRequest, cache } = await (0, import_context_caching.handleCacheIfNeeded)( apiClient, request, chatRequest, modelVersion, cacheConfigDetails ); let genModel; if (jsonMode && request.output?.constrained) { updatedChatRequest.generationConfig.responseSchema = cleanSchema( request.output.schema ); } if (request.config?.googleSearchRetrieval) { updatedChatRequest.tools?.push({ googleSearchRetrieval: request.config.googleSearchRetrieval }); } if (request.config?.vertexRetrieval) { const vertexRetrieval = request.config.vertexRetrieval; const _projectId = vertexRetrieval.datastore.projectId || options.projectId; const _location = vertexRetrieval.datastore.location || options.location; const _dataStoreId = vertexRetrieval.datastore.dataStoreId; const datastore = `projects/${_projectId}/locations/${_location}/collections/default_collection/dataStores/${_dataStoreId}`; updatedChatRequest.tools?.push({ retrieval: { vertexAiSearch: { datastore }, disableAttribution: vertexRetrieval.disableAttribution } }); } const msg = toGeminiMessage(messages[messages.length - 1], modelInfo); if (cache) { genModel = vertex.preview.getGenerativeModelFromCachedContent( cache, { model: modelVersion }, { apiClient: import_genkit.GENKIT_CLIENT_HEADER } ); } else { genModel = vertex.preview.getGenerativeModel( { model: modelVersion }, { apiClient: import_genkit.GENKIT_CLIENT_HEADER } ); } const callGemini = async () => { let response; if (sendChunk) { const result = await genModel.startChat(updatedChatRequest).sendMessageStream(msg.parts); for await (const item of result.stream) { item.candidates?.forEach( (candidate) => { const c = fromGeminiCandidate(candidate, jsonMode); sendChunk({ index: c.index, content: c.message.content }); } ); } response = await result.response; } else { const result = await genModel.startChat(updatedChatRequest).sendMessage(msg.parts); response = result.response; } if (!response.candidates?.length) { throw new import_genkit.GenkitError({ status: "FAILED_PRECONDITION", message: "No valid candidates returned." }); } const candidateData = response.candidates.map( (c) => fromGeminiCandidate(c, jsonMode) ); return { candidates: candidateData, custom: response, usage: { ...(0, import_model.getBasicUsageStats)(request.messages, candidateData), inputTokens: response.usageMetadata?.promptTokenCount, outputTokens: response.usageMetadata?.candidatesTokenCount, totalTokens: response.usageMetadata?.totalTokenCount } }; }; return debugTraces ? await (0, import_tracing.runInNewSpan)( ai.registry, { metadata: { name: sendChunk ? "sendMessageStream" : "sendMessage" } }, async (metadata) => { metadata.input = { sdk: "@google-cloud/vertexai", cache, model: genModel.getModelName(), chatOptions: updatedChatRequest, parts: msg.parts, options }; const response = await callGemini(); metadata.output = response.custom; return response; } ) : await callGemini(); } ); } function toFunctionModeEnum(enumMode) { if (enumMode === void 0) { return void 0; } switch (enumMode) { case "MODE_UNSPECIFIED": { return import_vertexai.FunctionCallingMode.MODE_UNSPECIFIED; } case "ANY": { return import_vertexai.FunctionCallingMode.ANY; } case "AUTO": { return import_vertexai.FunctionCallingMode.AUTO; } case "NONE": { return import_vertexai.FunctionCallingMode.NONE; } default: throw new Error(`unsupported function calling mode: ${enumMode}`); } } function toGeminiFunctionModeEnum(genkitMode) { if (genkitMode === void 0) { return void 0; } switch (genkitMode) { case "required": { return import_vertexai.FunctionCallingMode.ANY; } case "auto": { return import_vertexai.FunctionCallingMode.AUTO; } case "none": { return import_vertexai.FunctionCallingMode.NONE; } default: throw new Error(`unsupported function calling mode: ${genkitMode}`); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { GENERIC_GEMINI_MODEL, GeminiConfigSchema, SUPPORTED_GEMINI_MODELS, SUPPORTED_V15_MODELS, SUPPORTED_V1_MODELS, cleanSchema, defineGeminiKnownModel, defineGeminiModel, fromGeminiCandidate, gemini, gemini10Pro, gemini15Flash, gemini15Pro, gemini20Flash, gemini20Flash001, gemini20FlashLite, gemini20FlashLitePreview0205, gemini20ProExp0205, gemini25ProExp0325, gemini25ProPreview0325, toGeminiMessage, toGeminiSystemInstruction, toGeminiTool }); //# sourceMappingURL=gemini.js.map