@genkit-ai/googleai
Version:
Genkit AI framework plugin for Google AI APIs, including Gemini APIs.
1 lines • 47 kB
Source Map (JSON)
{"version":3,"sources":["../src/gemini.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n EnhancedGenerateContentResponse,\n FileDataPart,\n FunctionCallingMode,\n FunctionCallPart,\n FunctionDeclaration,\n FunctionResponsePart,\n GenerateContentCandidate as GeminiCandidate,\n Content as GeminiMessage,\n Part as GeminiPart,\n GenerateContentResponse,\n GenerationConfig,\n GenerativeModel,\n GoogleGenerativeAI,\n InlineDataPart,\n RequestOptions,\n Schema,\n SchemaType,\n StartChatParams,\n Tool,\n ToolConfig,\n} from '@google/generative-ai';\nimport {\n Genkit,\n GENKIT_CLIENT_HEADER,\n GenkitError,\n JSONSchema,\n z,\n} from 'genkit';\nimport {\n CandidateData,\n GenerationCommonConfigSchema,\n getBasicUsageStats,\n MediaPart,\n MessageData,\n ModelAction,\n ModelInfo,\n ModelMiddleware,\n modelRef,\n ModelReference,\n Part,\n ToolDefinitionSchema,\n ToolRequestPart,\n ToolResponsePart,\n} from 'genkit/model';\nimport {\n downloadRequestMedia,\n simulateSystemPrompt,\n} from 'genkit/model/middleware';\nimport { runInNewSpan } from 'genkit/tracing';\nimport { getApiKeyFromEnvVar } from './common';\nimport { handleCacheIfNeeded } from './context-caching';\nimport { extractCacheConfig } from './context-caching/utils';\n\nconst SafetySettingsSchema = z.object({\n category: z.enum([\n 'HARM_CATEGORY_UNSPECIFIED',\n 'HARM_CATEGORY_HATE_SPEECH',\n 'HARM_CATEGORY_SEXUALLY_EXPLICIT',\n 'HARM_CATEGORY_HARASSMENT',\n 'HARM_CATEGORY_DANGEROUS_CONTENT',\n ]),\n threshold: z.enum([\n 'BLOCK_LOW_AND_ABOVE',\n 'BLOCK_MEDIUM_AND_ABOVE',\n 'BLOCK_ONLY_HIGH',\n 'BLOCK_NONE',\n ]),\n});\n\nexport const GeminiConfigSchema = GenerationCommonConfigSchema.extend({\n /** When supplied, override the plugin-configured API key and use this instead. */\n apiKey: z.string().optional(),\n safetySettings: z.array(SafetySettingsSchema).optional(),\n codeExecution: z.union([z.boolean(), z.object({}).strict()]).optional(),\n contextCache: z.boolean().optional(),\n functionCallingConfig: z\n .object({\n mode: z.enum(['MODE_UNSPECIFIED', 'AUTO', 'ANY', 'NONE']).optional(),\n allowedFunctionNames: z.array(z.string()).optional(),\n })\n .optional(),\n /**\n * Specify what modalities should be used in response. Only supported in\n * 'gemini-2.0-flash-exp' model at present.\n **/\n responseModalities: z.array(z.enum(['TEXT', 'IMAGE', 'AUDIO'])).optional(),\n});\nexport type GeminiConfig = z.infer<typeof GeminiConfigSchema>;\n\nexport const gemini10Pro = modelRef({\n name: 'googleai/gemini-1.0-pro',\n info: {\n label: 'Google AI - Gemini Pro',\n versions: ['gemini-pro', 'gemini-1.0-pro-latest', 'gemini-1.0-pro-001'],\n supports: {\n multiturn: true,\n media: false,\n tools: true,\n toolChoice: true,\n systemRole: true,\n constrained: 'no-tools',\n },\n },\n configSchema: GeminiConfigSchema,\n});\n\nexport const gemini15Pro = modelRef({\n name: 'googleai/gemini-1.5-pro',\n info: {\n label: 'Google AI - Gemini 1.5 Pro',\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n toolChoice: true,\n systemRole: true,\n constrained: 'no-tools',\n },\n versions: [\n 'gemini-1.5-pro-latest',\n 'gemini-1.5-pro-001',\n 'gemini-1.5-pro-002',\n ],\n },\n configSchema: GeminiConfigSchema,\n});\n\nexport const gemini15Flash = modelRef({\n name: 'googleai/gemini-1.5-flash',\n info: {\n label: 'Google AI - Gemini 1.5 Flash',\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n toolChoice: true,\n systemRole: true,\n constrained: 'no-tools',\n // @ts-ignore\n contextCache: true,\n },\n versions: [\n 'gemini-1.5-flash-latest',\n 'gemini-1.5-flash-001',\n 'gemini-1.5-flash-002',\n ],\n },\n configSchema: GeminiConfigSchema,\n});\n\nexport const gemini15Flash8b = modelRef({\n name: 'googleai/gemini-1.5-flash-8b',\n info: {\n label: 'Google AI - Gemini 1.5 Flash',\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n toolChoice: true,\n systemRole: true,\n constrained: 'no-tools',\n },\n versions: ['gemini-1.5-flash-8b-latest', 'gemini-1.5-flash-8b-001'],\n },\n configSchema: GeminiConfigSchema,\n});\n\nexport const gemini20Flash = modelRef({\n name: 'googleai/gemini-2.0-flash',\n info: {\n label: 'Google AI - Gemini 2.0 Flash',\n versions: [],\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n toolChoice: true,\n systemRole: true,\n constrained: 'no-tools',\n },\n },\n configSchema: GeminiConfigSchema,\n});\n\nexport const gemini20FlashExp = modelRef({\n name: 'googleai/gemini-2.0-flash-exp',\n info: {\n label: 'Google AI - Gemini 2.0 Flash (Experimental)',\n versions: [],\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n toolChoice: true,\n systemRole: true,\n constrained: 'no-tools',\n },\n },\n configSchema: GeminiConfigSchema,\n});\n\nexport const gemini20FlashLite = modelRef({\n name: 'googleai/gemini-2.0-flash-lite',\n info: {\n label: 'Google AI - Gemini 2.0 Flash Lite',\n versions: [],\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n toolChoice: true,\n systemRole: true,\n constrained: 'no-tools',\n },\n },\n configSchema: GeminiConfigSchema,\n});\n\nexport const gemini20ProExp0205 = modelRef({\n name: 'googleai/gemini-2.0-pro-exp-02-05',\n info: {\n label: 'Google AI - Gemini 2.0 Pro Exp 02-05',\n versions: [],\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n toolChoice: true,\n systemRole: true,\n constrained: 'no-tools',\n },\n },\n configSchema: GeminiConfigSchema,\n});\n\nexport const gemini25ProExp0325 = modelRef({\n name: 'googleai/gemini-2.5-pro-exp-03-25',\n info: {\n label: 'Google AI - Gemini 2.5 Pro Exp 03-25',\n versions: [],\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n toolChoice: true,\n systemRole: true,\n constrained: 'no-tools',\n },\n },\n configSchema: GeminiConfigSchema,\n});\n\nexport const SUPPORTED_V1_MODELS = {\n 'gemini-1.0-pro': gemini10Pro,\n};\n\nexport const SUPPORTED_V15_MODELS = {\n 'gemini-1.5-pro': gemini15Pro,\n 'gemini-1.5-flash': gemini15Flash,\n 'gemini-1.5-flash-8b': gemini15Flash8b,\n 'gemini-2.0-flash': gemini20Flash,\n 'gemini-2.0-flash-lite': gemini20FlashLite,\n 'gemini-2.0-pro-exp-02-05': gemini20ProExp0205,\n 'gemini-2.0-flash-exp': gemini20FlashExp,\n 'gemini-2.5-pro-exp-03-25': gemini25ProExp0325,\n};\n\nexport const GENERIC_GEMINI_MODEL = modelRef({\n name: 'googleai/gemini',\n configSchema: GeminiConfigSchema,\n info: {\n label: 'Google Gemini',\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n toolChoice: true,\n systemRole: true,\n constrained: 'no-tools',\n },\n },\n});\n\nexport const SUPPORTED_GEMINI_MODELS = {\n ...SUPPORTED_V1_MODELS,\n ...SUPPORTED_V15_MODELS,\n} as const;\n\nfunction longestMatchingPrefix(version: string, potentialMatches: string[]) {\n return potentialMatches\n .filter((p) => version.startsWith(p))\n .reduce(\n (longest, current) =>\n current.length > longest.length ? current : longest,\n ''\n );\n}\n\n/**\n * Known model names, to allow code completion for convenience. Allows other model names.\n */\nexport type GeminiVersionString =\n | keyof typeof SUPPORTED_GEMINI_MODELS\n | (string & {});\n\n/**\n * Returns a reference to a model that can be used in generate calls.\n *\n * ```js\n * await ai.generate({\n * prompt: 'hi',\n * model: gemini('gemini-1.5-flash')\n * });\n * ```\n */\nexport function gemini(\n version: GeminiVersionString,\n options: GeminiConfig = {}\n): ModelReference<typeof GeminiConfigSchema> {\n const nearestModel = nearestGeminiModelRef(version);\n return modelRef({\n name: `googleai/${version}`,\n config: options,\n configSchema: GeminiConfigSchema,\n info: {\n ...nearestModel.info,\n // If exact suffix match for a known model, use its label, otherwise create a new label\n label: nearestModel.name.endsWith(version)\n ? nearestModel.info?.label\n : `Google AI - ${version}`,\n },\n });\n}\n\nfunction nearestGeminiModelRef(\n version: GeminiVersionString,\n options: GeminiConfig = {}\n): ModelReference<typeof GeminiConfigSchema> {\n const matchingKey = longestMatchingPrefix(\n version,\n Object.keys(SUPPORTED_GEMINI_MODELS)\n );\n if (matchingKey) {\n return SUPPORTED_GEMINI_MODELS[matchingKey].withConfig({\n ...options,\n version,\n });\n }\n return GENERIC_GEMINI_MODEL.withConfig({ ...options, version });\n}\n\nfunction toGeminiRole(\n role: MessageData['role'],\n model?: ModelReference<z.ZodTypeAny>\n): string {\n switch (role) {\n case 'user':\n return 'user';\n case 'model':\n return 'model';\n case 'system':\n if (model && SUPPORTED_V15_MODELS[model.name]) {\n // We should have already pulled out the supported system messages,\n // anything remaining is unsupported; throw an error.\n throw new Error(\n 'system role is only supported for a single message in the first position'\n );\n } else {\n throw new Error('system role is not supported');\n }\n case 'tool':\n return 'function';\n default:\n return 'user';\n }\n}\n\nfunction convertSchemaProperty(property) {\n if (!property || !property.type) {\n return undefined;\n }\n const baseSchema = {} as Schema;\n if (property.description) {\n baseSchema.description = property.description;\n }\n if (property.enum) {\n baseSchema.type = SchemaType.STRING;\n // supported in API but not in SDK\n (baseSchema as any).enum = property.enum;\n }\n if (property.nullable) {\n baseSchema.nullable = property.nullable;\n }\n let propertyType;\n // nullable schema can ALSO be defined as, for example, type=['string','null']\n if (Array.isArray(property.type)) {\n const types = property.type as string[];\n if (types.includes('null')) {\n baseSchema.nullable = true;\n }\n // grab the type that's not `null`\n propertyType = types.find((t) => t !== 'null');\n } else {\n propertyType = property.type;\n }\n if (propertyType === 'object') {\n const nestedProperties = {};\n Object.keys(property.properties).forEach((key) => {\n nestedProperties[key] = convertSchemaProperty(property.properties[key]);\n });\n return {\n ...baseSchema,\n type: SchemaType.OBJECT,\n properties: nestedProperties,\n required: property.required,\n };\n } else if (propertyType === 'array') {\n return {\n ...baseSchema,\n type: SchemaType.ARRAY,\n items: convertSchemaProperty(property.items),\n };\n } else {\n const schemaType = SchemaType[propertyType.toUpperCase()] as SchemaType;\n if (!schemaType) {\n throw new GenkitError({\n status: 'INVALID_ARGUMENT',\n message: `Unsupported property type ${propertyType.toUpperCase()}`,\n });\n }\n return {\n ...baseSchema,\n type: schemaType,\n };\n }\n}\n\n/** @hidden */\nexport function toGeminiTool(\n tool: z.infer<typeof ToolDefinitionSchema>\n): FunctionDeclaration {\n const declaration: FunctionDeclaration = {\n name: tool.name.replace(/\\//g, '__'), // Gemini throws on '/' in tool name\n description: tool.description,\n parameters: convertSchemaProperty(tool.inputSchema),\n };\n return declaration;\n}\n\nfunction toInlineData(part: MediaPart): InlineDataPart {\n const dataUrl = part.media.url;\n const b64Data = dataUrl.substring(dataUrl.indexOf(',')! + 1);\n const contentType =\n part.media.contentType ||\n dataUrl.substring(dataUrl.indexOf(':')! + 1, dataUrl.indexOf(';'));\n return { inlineData: { mimeType: contentType, data: b64Data } };\n}\n\nfunction toFileData(part: MediaPart): FileDataPart {\n if (!part.media.contentType)\n throw new Error(\n 'Must supply a `contentType` when sending File URIs to Gemini.'\n );\n return {\n fileData: { mimeType: part.media.contentType, fileUri: part.media.url },\n };\n}\n\nfunction fromInlineData(inlinePart: InlineDataPart): MediaPart {\n // Check if the required properties exist\n if (\n !inlinePart.inlineData ||\n !inlinePart.inlineData.hasOwnProperty('mimeType') ||\n !inlinePart.inlineData.hasOwnProperty('data')\n ) {\n throw new Error('Invalid InlineDataPart: missing required properties');\n }\n const { mimeType, data } = inlinePart.inlineData;\n // Combine data and mimeType into a data URL\n const dataUrl = `data:${mimeType};base64,${data}`;\n return {\n media: {\n url: dataUrl,\n contentType: mimeType,\n },\n };\n}\n\nfunction toFunctionCall(part: ToolRequestPart): FunctionCallPart {\n if (!part?.toolRequest?.input) {\n throw Error('Invalid ToolRequestPart: input was missing.');\n }\n return {\n functionCall: {\n name: part.toolRequest.name,\n args: part.toolRequest.input,\n },\n };\n}\n\nfunction fromFunctionCall(\n part: FunctionCallPart,\n ref: string\n): ToolRequestPart {\n if (!part.functionCall) {\n throw Error('Invalid FunctionCallPart');\n }\n return {\n toolRequest: {\n name: part.functionCall.name,\n input: part.functionCall.args,\n ref,\n },\n };\n}\n\nfunction toFunctionResponse(part: ToolResponsePart): FunctionResponsePart {\n if (!part?.toolResponse?.output) {\n throw Error('Invalid ToolResponsePart: output was missing.');\n }\n return {\n functionResponse: {\n name: part.toolResponse.name,\n response: {\n name: part.toolResponse.name,\n content: part.toolResponse.output,\n },\n },\n };\n}\n\nfunction fromFunctionResponse(part: FunctionResponsePart): ToolResponsePart {\n if (!part.functionResponse) {\n throw new Error('Invalid FunctionResponsePart.');\n }\n return {\n toolResponse: {\n name: part.functionResponse.name.replace(/__/g, '/'), // restore slashes\n output: part.functionResponse.response,\n },\n };\n}\n\nfunction fromExecutableCode(part: GeminiPart): Part {\n if (!part.executableCode) {\n throw new Error('Invalid GeminiPart: missing executableCode');\n }\n return {\n custom: {\n executableCode: {\n language: part.executableCode.language,\n code: part.executableCode.code,\n },\n },\n };\n}\n\nfunction fromCodeExecutionResult(part: GeminiPart): Part {\n if (!part.codeExecutionResult) {\n throw new Error('Invalid GeminiPart: missing codeExecutionResult');\n }\n return {\n custom: {\n codeExecutionResult: {\n outcome: part.codeExecutionResult.outcome,\n output: part.codeExecutionResult.output,\n },\n },\n };\n}\n\nfunction toCustomPart(part: Part): GeminiPart {\n if (!part.custom) {\n throw new Error('Invalid GeminiPart: missing custom');\n }\n if (part.custom.codeExecutionResult) {\n return { codeExecutionResult: part.custom.codeExecutionResult };\n }\n if (part.custom.executableCode) {\n return { executableCode: part.custom.executableCode };\n }\n throw new Error('Unsupported Custom Part type');\n}\n\nfunction toGeminiPart(part: Part): GeminiPart {\n if (part.text !== undefined) return { text: part.text || ' ' };\n if (part.media) {\n if (part.media.url.startsWith('data:')) return toInlineData(part);\n return toFileData(part);\n }\n if (part.toolRequest) return toFunctionCall(part);\n if (part.toolResponse) return toFunctionResponse(part);\n if (part.custom) return toCustomPart(part);\n throw new Error('Unsupported Part type' + JSON.stringify(part));\n}\n\nfunction fromGeminiPart(\n part: GeminiPart,\n jsonMode: boolean,\n ref: string\n): Part {\n if (part.text !== undefined) return { text: part.text };\n if (part.inlineData) return fromInlineData(part);\n if (part.functionCall) return fromFunctionCall(part, ref);\n if (part.functionResponse) return fromFunctionResponse(part);\n if (part.executableCode) return fromExecutableCode(part);\n if (part.codeExecutionResult) return fromCodeExecutionResult(part);\n throw new Error('Unsupported GeminiPart type');\n}\nexport function toGeminiMessage(\n message: MessageData,\n model?: ModelReference<z.ZodTypeAny>\n): GeminiMessage {\n let sortedParts = message.content;\n if (message.role === 'tool') {\n sortedParts = [...message.content].sort((a, b) => {\n const aRef = a.toolResponse?.ref;\n const bRef = b.toolResponse?.ref;\n if (!aRef && !bRef) return 0;\n if (!aRef) return 1;\n if (!bRef) return -1;\n return parseInt(aRef, 10) - parseInt(bRef, 10);\n });\n }\n return {\n role: toGeminiRole(message.role, model),\n parts: sortedParts.map(toGeminiPart),\n };\n}\n\nexport function toGeminiSystemInstruction(message: MessageData): GeminiMessage {\n return {\n role: 'user',\n parts: message.content.map(toGeminiPart),\n };\n}\n\nfunction fromGeminiFinishReason(\n reason: GeminiCandidate['finishReason']\n): CandidateData['finishReason'] {\n if (!reason) return 'unknown';\n switch (reason) {\n case 'STOP':\n return 'stop';\n case 'MAX_TOKENS':\n return 'length';\n case 'SAFETY': // blocked for safety\n case 'RECITATION': // blocked for reciting training data\n return 'blocked';\n default:\n return 'unknown';\n }\n}\n\nexport function fromGeminiCandidate(\n candidate: GeminiCandidate,\n jsonMode: boolean = false\n): CandidateData {\n const parts = candidate.content?.parts || [];\n const genkitCandidate: CandidateData = {\n index: candidate.index || 0,\n message: {\n role: 'model',\n content: parts.map((part, index) =>\n fromGeminiPart(part, jsonMode, index.toString())\n ),\n },\n finishReason: fromGeminiFinishReason(candidate.finishReason),\n finishMessage: candidate.finishMessage,\n custom: {\n safetyRatings: candidate.safetyRatings,\n citationMetadata: candidate.citationMetadata,\n },\n };\n\n return genkitCandidate;\n}\nexport function cleanSchema(schema: JSONSchema): JSONSchema {\n const out = structuredClone(schema);\n for (const key in out) {\n if (key === '$schema' || key === 'additionalProperties') {\n delete out[key];\n continue;\n }\n if (typeof out[key] === 'object') {\n out[key] = cleanSchema(out[key]);\n }\n // Zod nullish() and picoschema optional fields will produce type `[\"string\", \"null\"]`\n // which is not supported by the model API. Convert them to just `\"string\"`.\n if (key === 'type' && Array.isArray(out[key])) {\n // find the first that's not `null`.\n out[key] = out[key].find((t) => t !== 'null');\n }\n }\n return out;\n}\n\n/**\n * Defines a new GoogleAI model.\n */\nexport function defineGoogleAIModel({\n ai,\n name,\n apiKey: apiKeyOption,\n apiVersion,\n baseUrl,\n info,\n defaultConfig,\n debugTraces,\n}: {\n ai: Genkit;\n name: string;\n apiKey?: string | false;\n apiVersion?: string;\n baseUrl?: string;\n info?: ModelInfo;\n defaultConfig?: GeminiConfig;\n debugTraces?: boolean;\n}): ModelAction {\n let apiKey: string | undefined;\n // DO NOT infer API key from environment variable if plugin was configured with `{apiKey: false}`.\n if (apiKeyOption !== false) {\n apiKey = apiKeyOption || getApiKeyFromEnvVar();\n if (!apiKey) {\n throw new GenkitError({\n status: 'FAILED_PRECONDITION',\n message:\n 'Please pass in the API key or set the GEMINI_API_KEY or GOOGLE_API_KEY environment variable.\\n' +\n 'For more details see https://firebase.google.com/docs/genkit/plugins/google-genai',\n });\n }\n }\n\n const apiModelName = name.startsWith('googleai/')\n ? name.substring('googleai/'.length)\n : name;\n\n const model: ModelReference<z.ZodTypeAny> =\n SUPPORTED_GEMINI_MODELS[name] ??\n modelRef({\n name: `googleai/${apiModelName}`,\n info: {\n label: `Google AI - ${apiModelName}`,\n supports: {\n multiturn: true,\n media: true,\n tools: true,\n systemRole: true,\n output: ['text', 'json'],\n },\n ...info,\n },\n configSchema: GeminiConfigSchema,\n });\n\n const middleware: ModelMiddleware[] = [];\n if (SUPPORTED_V1_MODELS[name]) {\n middleware.push(simulateSystemPrompt());\n }\n if (model.info?.supports?.media) {\n // the gemini api doesn't support downloading media from http(s)\n middleware.push(\n downloadRequestMedia({\n maxBytes: 1024 * 1024 * 10,\n // don't downlaod files that have been uploaded using the Files API\n filter: (part) => {\n try {\n const url = new URL(part.media.url);\n if (\n // Gemini can handle these URLs\n [\n 'generativelanguage.googleapis.com',\n 'www.youtube.com',\n 'youtube.com',\n 'youtu.be',\n ].includes(url.hostname)\n )\n return false;\n } catch {}\n return true;\n },\n })\n );\n }\n\n return ai.defineModel(\n {\n name: model.name,\n ...model.info,\n configSchema: model.configSchema,\n use: middleware,\n },\n async (request, sendChunk) => {\n const options: RequestOptions = { apiClient: GENKIT_CLIENT_HEADER };\n if (apiVersion) {\n options.apiVersion = apiVersion;\n }\n if (apiVersion) {\n options.baseUrl = baseUrl;\n }\n const requestConfig: z.infer<typeof GeminiConfigSchema> = {\n ...defaultConfig,\n ...request.config,\n };\n\n // Make a copy so that modifying the request will not produce side-effects\n const messages = [...request.messages];\n if (messages.length === 0) throw new Error('No messages provided.');\n\n // Gemini does not support messages with role system and instead expects\n // systemInstructions to be provided as a separate input. The first\n // message detected with role=system will be used for systemInstructions.\n let systemInstruction: GeminiMessage | undefined = undefined;\n if (SUPPORTED_V15_MODELS[name]) {\n const systemMessage = messages.find((m) => m.role === 'system');\n if (systemMessage) {\n messages.splice(messages.indexOf(systemMessage), 1);\n systemInstruction = toGeminiSystemInstruction(systemMessage);\n }\n }\n\n const tools: Tool[] = [];\n if (request.tools?.length) {\n tools.push({\n functionDeclarations: request.tools.map(toGeminiTool),\n });\n }\n\n if (requestConfig.codeExecution) {\n tools.push({\n codeExecution:\n request.config.codeExecution === true\n ? {}\n : request.config.codeExecution,\n });\n }\n\n let toolConfig: ToolConfig | undefined;\n if (requestConfig.functionCallingConfig) {\n toolConfig = {\n functionCallingConfig: {\n allowedFunctionNames:\n requestConfig.functionCallingConfig.allowedFunctionNames,\n mode: toFunctionModeEnum(requestConfig.functionCallingConfig.mode),\n },\n };\n } else if (request.toolChoice) {\n toolConfig = {\n functionCallingConfig: {\n mode: toGeminiFunctionModeEnum(request.toolChoice),\n },\n };\n }\n\n // Cannot use tools with JSON mode\n const jsonMode =\n request.output?.format === 'json' ||\n (request.output?.contentType === 'application/json' &&\n tools.length === 0);\n\n const generationConfig: GenerationConfig = {\n candidateCount: request.candidates || undefined,\n temperature: requestConfig.temperature,\n maxOutputTokens: requestConfig.maxOutputTokens,\n topK: requestConfig.topK,\n topP: requestConfig.topP,\n stopSequences: requestConfig.stopSequences,\n responseMimeType: jsonMode ? 'application/json' : undefined,\n };\n if (requestConfig.responseModalities) {\n // HACK: cast to any since this isn't officially supported in the old SDK yet\n (generationConfig as any).responseModalities =\n requestConfig.responseModalities;\n }\n\n if (request.output?.constrained && jsonMode) {\n generationConfig.responseSchema = cleanSchema(request.output.schema);\n }\n\n const msg = toGeminiMessage(messages[messages.length - 1], model);\n\n const fromJSONModeScopedGeminiCandidate = (\n candidate: GeminiCandidate\n ) => {\n return fromGeminiCandidate(candidate, jsonMode);\n };\n\n let chatRequest: StartChatParams = {\n systemInstruction,\n generationConfig,\n tools: tools.length ? tools : undefined,\n toolConfig,\n history: messages\n .slice(0, -1)\n .map((message) => toGeminiMessage(message, model)),\n safetySettings: requestConfig.safetySettings,\n } as StartChatParams;\n const modelVersion = (request.config?.version ||\n model.version ||\n name) as string;\n const cacheConfigDetails = extractCacheConfig(request);\n\n const { chatRequest: updatedChatRequest, cache } =\n await handleCacheIfNeeded(\n apiKey!,\n request,\n chatRequest,\n modelVersion,\n cacheConfigDetails\n );\n\n if (!requestConfig.apiKey && !apiKey) {\n throw new GenkitError({\n status: 'INVALID_ARGUMENT',\n message:\n 'GoogleAI plugin was initialized with {apiKey: false} but no apiKey configuration was passed at call time.',\n });\n }\n const client = new GoogleGenerativeAI(requestConfig.apiKey || apiKey!);\n let genModel: GenerativeModel;\n\n if (cache) {\n genModel = client.getGenerativeModelFromCachedContent(\n cache,\n {\n model: modelVersion,\n },\n options\n );\n } else {\n genModel = client.getGenerativeModel(\n {\n model: modelVersion,\n },\n options\n );\n }\n\n const callGemini = async () => {\n let response: EnhancedGenerateContentResponse;\n\n if (sendChunk) {\n const result = await genModel\n .startChat(updatedChatRequest)\n .sendMessageStream(msg.parts, options);\n\n for await (const item of result.stream) {\n (item as GenerateContentResponse).candidates?.forEach(\n (candidate) => {\n const c = fromJSONModeScopedGeminiCandidate(candidate);\n sendChunk({\n index: c.index,\n content: c.message.content,\n });\n }\n );\n }\n\n response = await result.response;\n } else {\n const result = await genModel\n .startChat(updatedChatRequest)\n .sendMessage(msg.parts, options);\n\n response = result.response;\n }\n\n const candidates = response.candidates || [];\n if (response.candidates?.['undefined']) {\n candidates.push(response.candidates['undefined']);\n }\n if (!candidates.length) {\n throw new GenkitError({\n status: 'FAILED_PRECONDITION',\n message: 'No valid candidates returned.',\n });\n }\n\n const candidateData =\n candidates.map(fromJSONModeScopedGeminiCandidate) || [];\n\n return {\n candidates: candidateData,\n custom: response,\n usage: {\n ...getBasicUsageStats(request.messages, candidateData),\n inputTokens: response.usageMetadata?.promptTokenCount,\n outputTokens: response.usageMetadata?.candidatesTokenCount,\n totalTokens: response.usageMetadata?.totalTokenCount,\n },\n };\n };\n\n // If debugTraces is enable, we wrap the actual model call with a span, add raw\n // API params as for input.\n return debugTraces\n ? await runInNewSpan(\n ai.registry,\n {\n metadata: {\n name: sendChunk ? 'sendMessageStream' : 'sendMessage',\n },\n },\n async (metadata) => {\n metadata.input = {\n sdk: '@google/generative-ai',\n cache: cache,\n model: genModel.model,\n chatOptions: updatedChatRequest,\n parts: msg.parts,\n options,\n };\n const response = await callGemini();\n metadata.output = response.custom;\n return response;\n }\n )\n : await callGemini();\n }\n );\n}\n\n/** Converts mode from the config, which follows Gemini naming convention. */\nfunction toFunctionModeEnum(\n configEnum: string | undefined\n): FunctionCallingMode | undefined {\n if (configEnum === undefined) {\n return undefined;\n }\n switch (configEnum) {\n case 'MODE_UNSPECIFIED': {\n return FunctionCallingMode.MODE_UNSPECIFIED;\n }\n case 'ANY': {\n return FunctionCallingMode.ANY;\n }\n case 'AUTO': {\n return FunctionCallingMode.AUTO;\n }\n case 'NONE': {\n return FunctionCallingMode.NONE;\n }\n default:\n throw new Error(`unsupported function calling mode: ${configEnum}`);\n }\n}\n\n/** Converts mode from genkit tool choice. */\nfunction toGeminiFunctionModeEnum(\n genkitMode: 'auto' | 'required' | 'none'\n): FunctionCallingMode | undefined {\n if (genkitMode === undefined) {\n return undefined;\n }\n switch (genkitMode) {\n case 'required': {\n return FunctionCallingMode.ANY;\n }\n case 'auto': {\n return FunctionCallingMode.AUTO;\n }\n case 'none': {\n return FunctionCallingMode.NONE;\n }\n default:\n throw new Error(`unsupported function calling mode: ${genkitMode}`);\n }\n}\n"],"mappings":"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","names":[]}