{"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":[]}