{"version":3,"sources":["../../src/googleai/gemini.ts"],"sourcesContent":["/**\n * Copyright 2025 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  ActionMetadata,\n  GENKIT_UI_METADATA,\n  GENKIT_UI_WIDGETS,\n  GenkitError,\n  annotateSchema,\n  modelActionMetadata,\n  z,\n} from 'genkit';\nimport { logger } from 'genkit/logging';\nimport {\n  CandidateData,\n  GenerationCommonConfigDescriptions,\n  GenerationCommonConfigSchema,\n  ModelAction,\n  ModelInfo,\n  ModelMiddleware,\n  ModelReference,\n  getBasicUsageStats,\n  modelRef,\n} from 'genkit/model';\nimport { downloadRequestMedia } from 'genkit/model/middleware';\nimport { model as pluginModel } from 'genkit/plugin';\nimport {\n  fromGeminiCandidate,\n  toGeminiFunctionModeEnum,\n  toGeminiMessage,\n  toGeminiSystemInstruction,\n  toGeminiTool,\n} from '../common/converters.mjs';\nimport {\n  applyLatLngToGoogleMapsTools,\n  fromInteractionDelta,\n  fromInteractionSync,\n  mergeStreamedAudio,\n  removeId3FromAudio,\n  selectInteractionInput,\n  toInteractionAudioResponseFormat,\n  toInteractionConfigTool,\n  toInteractionGenerationConfig,\n  toInteractionResponseModalities,\n  toInteractionSteps,\n  toInteractionTool,\n  toInteractionToolChoice,\n  toInteractionVideoResponseFormat,\n} from '../common/interaction-converters.mjs';\nimport {\n  InteractionTool,\n  ModelGenerationConfig,\n} from '../common/interaction-types.mjs';\nimport { isKnownKey, warnDroppedConfigField } from '../common/utils.mjs';\nimport {\n  createInteraction,\n  createInteractionStream,\n  generateContent,\n  generateContentStream,\n} from './client.mjs';\nimport {\n  ClientOptions,\n  CreateInteractionRequest,\n  Content as GeminiMessage,\n  GenerateContentRequest,\n  GenerateContentResponse,\n  GenerationConfig,\n  GoogleAIPluginOptions,\n  GoogleSearchRetrievalTool,\n  Model,\n  SafetySetting,\n  Tool,\n  ToolConfig,\n  UrlContextTool,\n} from './types.mjs';\nimport {\n  calculateApiKey,\n  calculateRequestOptions,\n  checkApiKey,\n  checkModelName,\n  cleanSchema,\n  extractVersion,\n  isObject,\n  removeClientOptionOverrides,\n} from './utils.mjs';\n\nconst MAX_INLINE_MEDIA_BYTES = 1024 * 1024 * 100; // 100 MB\n\n/**\n * See https://ai.google.dev/gemini-api/docs/safety-settings#safety-filters.\n */\nconst SafetySettingsSchema = z\n  .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  .passthrough();\n\n/**\n * Reports whether a safety setting is equivalent to the model default (no\n * additional filtering), i.e. it can be omitted without changing behavior.\n *\n * Per the Gemini API docs, the adjustable safety filters are Off by default for\n * current Gemini models, so `BLOCK_NONE` requests the same behavior as sending\n * no safety settings. `HARM_CATEGORY_UNSPECIFIED` entries are also dropped on\n * the generateContent path.\n * See https://ai.google.dev/gemini-api/docs/safety-settings\n */\nfunction isDefaultSafetySetting(setting: {\n  category?: string;\n  threshold?: string;\n}): boolean {\n  return (\n    setting.category === 'HARM_CATEGORY_UNSPECIFIED' ||\n    setting.threshold === 'BLOCK_NONE'\n  );\n}\n\nconst VoiceConfigSchema = z\n  .object({\n    prebuiltVoiceConfig: z\n      .object({\n        // TODO: Make this an array of objects so we can also specify the description\n        // for each voiceName.\n        voiceName: z\n          .union([\n            z.enum([\n              'Zephyr',\n              'Puck',\n              'Charon',\n              'Kore',\n              'Fenrir',\n              'Leda',\n              'Orus',\n              'Aoede',\n              'Callirrhoe',\n              'Autonoe',\n              'Enceladus',\n              'Iapetus',\n              'Umbriel',\n              'Algieba',\n              'Despina',\n              'Erinome',\n              'Algenib',\n              'Rasalgethi',\n              'Laomedeia',\n              'Achernar',\n              'Alnilam',\n              'Schedar',\n              'Gacrux',\n              'Pulcherrima',\n              'Achird',\n              'Zubenelgenubi',\n              'Vindemiatrix',\n              'Sadachbia',\n              'Sadaltager',\n              'Sulafat',\n            ]),\n            // To allow any new string values\n            z.string(),\n          ])\n          .describe('Name of the preset voice to use')\n          .optional(),\n      })\n      .describe('Configuration for the prebuilt speaker to use')\n      .passthrough()\n      .optional(),\n  })\n  .describe('Configuration for the voice to use')\n  .passthrough();\n\nexport const GeminiConfigSchema = GenerationCommonConfigSchema.extend({\n  apiKey: z\n    .string()\n    .describe('Overrides the plugin-configured API key, if specified.')\n    .optional(),\n  baseUrl: z\n    .string()\n    .describe(\n      'Overrides the plugin-configured or default baseUrl, if specified.'\n    )\n    .optional(),\n  apiVersion: z\n    .string()\n    .describe(\n      'Overrides the plugin-configured or default apiVersion, if specified.'\n    )\n    .optional(),\n  safetySettings: annotateSchema(\n    z\n      .array(SafetySettingsSchema)\n      .describe(\n        'Adjust how likely you are to see responses that could be harmful. ' +\n          'Content is blocked based on the probability that it is harmful.'\n      )\n      .optional(),\n    { [GENKIT_UI_METADATA.WIDGET]: GENKIT_UI_WIDGETS.SAFETY_SETTINGS }\n  ),\n  codeExecution: z\n    .union([z.boolean(), z.object({}).strict()])\n    .describe('Enables the model to generate and run code.')\n    .optional(),\n  // TODO(v2): Remove. This plugin does not implement context caching, so this\n  // field has no effect (it is passed through on generateContent models and\n  // dropped with a warning on Interactions models, which reject it). Kept for\n  // now because removing it is a breaking change.\n  /** @deprecated Not implemented by this plugin. Will be removed in v2. */\n  contextCache: z\n    .boolean()\n    .describe(\n      'Context caching allows you to save and reuse precomputed input ' +\n        'tokens that you wish to use repeatedly. Not currently implemented ' +\n        'by this plugin.'\n    )\n    .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    .describe(\n      'Controls how the model uses the provided tools (function declarations). ' +\n        'With AUTO (Default) mode, the model decides whether to generate a ' +\n        'natural language response or suggest a function call based on the ' +\n        'prompt and context. With ANY, the model is constrained to always ' +\n        'predict a function call and guarantee function schema adherence. ' +\n        'With NONE, the model is prohibited from making function calls.'\n    )\n    .passthrough()\n    .optional(),\n  responseModalities: z\n    .array(z.enum(['TEXT', 'IMAGE', 'AUDIO']))\n    .describe('The modalities to be used in response.')\n    .optional(),\n  googleSearchRetrieval: z // some models use this, some use just googleSearch\n    .union([z.boolean(), z.object({}).passthrough()])\n    .describe(\n      'Retrieve public web data for grounding, powered by Google Search.'\n    )\n    .optional(),\n  googleSearch: z\n    .union([z.boolean(), z.object({}).passthrough()])\n    .describe(\n      'Retrieve public web data for grounding, powered by Google Search.'\n    )\n    .optional(),\n  fileSearch: z\n    .object({\n      fileSearchStoreNames: z\n        .array(z.string())\n        .describe(\n          'The names of the fileSearchStores to retrieve from. ' +\n            'Example: fileSearchStores/my-file-search-store-123'\n        ),\n      metadataFilter: z\n        .string()\n        .optional()\n        .describe(\n          'Metadata filter to apply to the semantic retrieval documents and chunks.'\n        ),\n      topK: z\n        .number()\n        .optional()\n        .describe('The number of semantic retrieval chunks to retrieve.'),\n    })\n    .passthrough()\n    .optional(),\n  urlContext: z\n    .union([z.boolean(), z.object({}).passthrough()])\n    .describe('Return grounding metadata from links included in the query')\n    .optional(),\n  retrievalConfig: z\n    .object({\n      latLng: z\n        .object({\n          latitude: z.number().optional(),\n          longitude: z.number().optional(),\n        })\n        .optional(),\n      languageCode: z.string().optional(),\n    })\n    .passthrough()\n    .describe('Configuration for retrieval tools.')\n    .optional(),\n  temperature: z\n    .number()\n    .min(0)\n    .max(2)\n    .describe(\n      GenerationCommonConfigDescriptions.temperature +\n        ' The default value is 1.0.'\n    )\n    .optional(),\n  topP: z\n    .number()\n    .min(0)\n    .max(1)\n    .describe(\n      GenerationCommonConfigDescriptions.topP + ' The default value is 0.95.'\n    )\n    .optional(),\n  serviceTier: z\n    .union([z.enum(['standard', 'flex', 'priority']), z.string()])\n    .describe('Service tier for the Gemini API.')\n    .optional(),\n  previousInteractionId: z\n    .string()\n    .describe('The ID of the previous interaction, if any.')\n    .optional(),\n  store: z\n    .boolean()\n    .describe(\n      'Whether to store the interaction for later retrieval. Defaults to false.'\n    )\n    .optional(),\n  thinkingConfig: z\n    .object({\n      includeThoughts: z\n        .boolean()\n        .describe(\n          'Indicates whether to include thoughts in the response.' +\n            'If true, thoughts are returned only if the model supports ' +\n            'thought and thoughts are available.'\n        )\n        .optional(),\n      thinkingBudget: z\n        .number()\n        .min(0)\n        .max(24576)\n        .describe(\n          'For Gemini 2.5 - Indicates the thinking budget in tokens. 0 is DISABLED. ' +\n            '-1 is AUTOMATIC. The default values and allowed ranges are model ' +\n            'dependent. The thinking budget parameter gives the model guidance ' +\n            'on the number of thinking tokens it can use when generating a ' +\n            'response. A greater number of tokens is typically associated with ' +\n            'more detailed thinking, which is needed for solving more complex ' +\n            'tasks. '\n        )\n        .optional(),\n      thinkingLevel: z\n        .enum(['MINIMAL', 'LOW', 'MEDIUM', 'HIGH'])\n        .describe(\n          'For Gemini 3.0 - Indicates the thinking level. A higher level ' +\n            'is associated with more detailed thinking, which is needed for solving ' +\n            'more complex tasks.'\n        )\n        .optional(),\n    })\n    .passthrough()\n    .optional(),\n}).passthrough();\nexport type GeminiConfigSchemaType = typeof GeminiConfigSchema;\nexport type GeminiConfig = z.infer<GeminiConfigSchemaType>;\n\nexport const GeminiTtsConfigSchema = GeminiConfigSchema.extend({\n  speechConfig: z\n    .object({\n      voiceConfig: VoiceConfigSchema.optional(),\n      multiSpeakerVoiceConfig: z\n        .object({\n          speakerVoiceConfigs: z\n            .array(\n              z\n                .object({\n                  speaker: z.string().describe('Name of the speaker to use'),\n                  voiceConfig: VoiceConfigSchema,\n                })\n                .describe(\n                  'Configuration for a single speaker in a multi speaker setup'\n                )\n                .passthrough()\n            )\n            .describe('Configuration for all the enabled speaker voices'),\n        })\n        .describe('Configuration for multi-speaker setup')\n        .passthrough()\n        .optional(),\n    })\n    .describe('Speech generation config')\n    .passthrough()\n    .optional(),\n  audioFormat: z\n    .object({\n      mimeType: z\n        .union([\n          z.enum(['audio/wav', 'audio/l16', 'audio/mulaw', 'audio/alaw']),\n          // Allows other formats. `string & {}` (rather than z.string()) keeps\n          // the listed ones in TypeScript autocomplete.\n          z.custom<string & {}>((val) => typeof val === 'string'),\n        ])\n        .describe(\n          'Audio encoding. Defaults to audio/wav (with a header) for ' +\n            'non-streamed requests and audio/l16 (raw PCM, no header) for ' +\n            'streamed requests.'\n        )\n        .optional(),\n      sampleRate: z\n        .number()\n        .int()\n        .describe('Sample rate in Hz, for example 24000, 16000 or 8000.')\n        .optional(),\n    })\n    .describe(\n      'Format of the generated audio. Supported by models that use the ' +\n        'Interactions API (for example gemini-3.8-flash-tts).'\n    )\n    .passthrough()\n    .optional(),\n}).passthrough();\nexport type GeminiTtsConfigSchemaType = typeof GeminiTtsConfigSchema;\nexport type GeminiTtsConfig = z.infer<GeminiTtsConfigSchemaType>;\n\nexport const GeminiImageConfigSchema = GeminiConfigSchema.extend({\n  imageConfig: z\n    .object({\n      aspectRatio: z\n        .enum([\n          '1:1',\n          '1:4',\n          '1:8',\n          '2:3',\n          '3:2',\n          '3:4',\n          '4:1',\n          '4:3',\n          '4:5',\n          '5:4',\n          '8:1',\n          '9:16',\n          '16:9',\n          '21:9',\n        ])\n        .optional(),\n      imageSize: z\n        .enum([\n          '256',\n          '256P',\n          '256PX',\n          '512',\n          '512P',\n          '512PX',\n          '1K',\n          '2K',\n          '4K',\n        ])\n        .optional(),\n    })\n    .passthrough()\n    .optional(),\n  google_search: z\n    .object({\n      searchTypes: z\n        .object({\n          webSearch: z.object({}).optional(),\n          imageSearch: z.object({}).optional(),\n        })\n        .optional(),\n    })\n    .describe(\n      'Retrieve public web data for grounding, powered by Google Search.'\n    )\n    .passthrough()\n    .optional(),\n}).passthrough();\nexport type GeminiImageConfigSchemaType = typeof GeminiImageConfigSchema;\nexport type GeminiImageConfig = z.infer<GeminiImageConfigSchemaType>;\n\n/**\n * Config for video generation models such as gemini-omni-1.1-flash.\n * See https://ai.google.dev/gemini-api/docs/omni\n */\nexport const GeminiVideoConfigSchema = GeminiConfigSchema.extend({\n  videoFormat: z\n    .object({\n      aspectRatio: z\n        .union([\n          z.enum(['16:9', '9:16']),\n          // Allows other values. `string & {}` (rather than z.string()) keeps\n          // the listed ones in TypeScript autocomplete.\n          z.custom<string & {}>((val) => typeof val === 'string'),\n        ])\n        .describe(\n          'Aspect ratio of the generated video. Defaults to 16:9 (landscape).'\n        )\n        .optional(),\n      resolution: z\n        .union([\n          z.enum(['360p', '720p', '1080p', '4k']),\n          z.custom<string & {}>((val) => typeof val === 'string'),\n        ])\n        .describe(\n          'Resolution of the generated video. Defaults to 720p. 1080p and ' +\n            '4k are upscaled.'\n        )\n        .optional(),\n      delivery: z\n        .union([\n          z.enum(['uri']),\n          z.custom<string & {}>((val) => typeof val === 'string'),\n        ])\n        .describe(\n          'How the video is returned. By default it is returned inline. ' +\n            '\"uri\" returns a Files API URI instead, which is recommended ' +\n            'for large videos (requires store: true).'\n        )\n        .optional(),\n    })\n    .describe('Format of the generated video.')\n    .passthrough()\n    .optional(),\n  videoConfig: z\n    .object({\n      task: z\n        .union([\n          z.enum([\n            'text_to_video',\n            'image_to_video',\n            'reference_to_video',\n            'edit',\n            'extend',\n          ]),\n          z.custom<string & {}>((val) => typeof val === 'string'),\n        ])\n        .describe(\n          'The kind of generation to perform. If not set, the model infers ' +\n            'it from the prompt and inputs. Setting it adds constraints, so ' +\n            'only use it when prompting alone does not give the intended mode.'\n        )\n        .optional(),\n    })\n    .describe('Video generation settings.')\n    .passthrough()\n    .optional(),\n}).passthrough();\nexport type GeminiVideoConfigSchemaType = typeof GeminiVideoConfigSchema;\nexport type GeminiVideoConfig = z.infer<GeminiVideoConfigSchemaType>;\n\nexport const GemmaConfigSchema = GeminiConfigSchema.extend({\n  // No range check: the accepted range depends on the model, so the value is\n  // sent as is and the server validates it.\n  temperature: z\n    .number()\n    .describe(GenerationCommonConfigDescriptions.temperature)\n    .optional(),\n}).passthrough();\nexport type GemmaConfigSchemaType = typeof GemmaConfigSchema;\nexport type GemmaConfig = z.infer<GemmaConfigSchemaType>;\n\n// This contains all the Gemini config schema types\ntype ConfigSchemaType =\n  | GeminiConfigSchemaType\n  | GeminiTtsConfigSchemaType\n  | GeminiImageConfigSchemaType\n  | GeminiVideoConfigSchemaType\n  | GemmaConfigSchemaType;\ntype ConfigSchema = z.infer<ConfigSchemaType>;\n\nconst modelInteractionsMap = new Map<string, boolean>();\n\nfunction commonRef(\n  name: string,\n  info?: ModelInfo,\n  configSchema: ConfigSchemaType = GeminiConfigSchema,\n  useInteractions: boolean = true\n): ModelReference<ConfigSchemaType> {\n  modelInteractionsMap.set(name, useInteractions);\n\n  return modelRef({\n    name: `googleai/${name}`,\n    configSchema,\n    info: info ?? {\n      supports: {\n        multiturn: true,\n        media: true,\n        tools: true,\n        toolChoice: true,\n        systemRole: true,\n        constrained: 'all',\n        output: ['text', 'json'],\n      },\n    },\n  });\n}\n\nconst GENERIC_MODEL = commonRef('gemini');\nconst GENERIC_TTS_MODEL = commonRef(\n  'gemini-tts',\n  {\n    supports: {\n      multiturn: false,\n      media: false,\n      tools: false,\n      toolChoice: false,\n      systemRole: false,\n      constrained: 'none',\n      output: ['media'],\n    },\n  },\n  GeminiTtsConfigSchema\n);\nconst GENERIC_IMAGE_MODEL = commonRef(\n  'gemini-image',\n  {\n    supports: {\n      multiturn: true,\n      media: true,\n      tools: true,\n      toolChoice: true,\n      systemRole: true,\n      constrained: 'all',\n    },\n  },\n  GeminiImageConfigSchema\n);\n// Per the Omni guide: text, image and video in, video (with audio) out; edits\n// continue a stored interaction. Tools and structured output aren't\n// documented for video generation. The guide says system instructions aren't\n// supported, but they are applied (checked live, Oct 2026).\nconst GENERIC_VIDEO_MODEL = commonRef(\n  'gemini-video',\n  {\n    supports: {\n      multiturn: true,\n      media: true,\n      tools: false,\n      toolChoice: false,\n      systemRole: true,\n      constrained: 'none',\n      output: ['media'],\n    },\n  },\n  GeminiVideoConfigSchema\n);\nconst GENERIC_GEMMA_MODEL = commonRef(\n  'gemma-generic',\n  undefined,\n  GemmaConfigSchema\n);\n\nconst KNOWN_GEMINI_MODELS = {\n  'gemini-pro-latest': commonRef('gemini-pro-latest'),\n  'gemini-flash-latest': commonRef('gemini-flash-latest'),\n  'gemini-flash-lite-latest': commonRef('gemini-flash-lite-latest'),\n  'gemini-4-argon': commonRef('gemini-4-argon'),\n  'gemini-3.8-flash': commonRef('gemini-3.8-flash'),\n  'gemini-3.6-flash': commonRef('gemini-3.6-flash'),\n  'gemini-3.5-flash-lite': commonRef('gemini-3.5-flash-lite'),\n\n  'gemini-3.1-flash-lite': commonRef(\n    'gemini-3.1-flash-lite',\n    undefined,\n    GeminiConfigSchema,\n    false\n  ),\n  'gemini-3.1-pro-preview-customtools': commonRef(\n    'gemini-3.1-pro-preview-customtools',\n    undefined,\n    GeminiConfigSchema,\n    false\n  ),\n  'gemini-3.1-pro-preview': commonRef(\n    'gemini-3.1-pro-preview',\n    undefined,\n    GeminiConfigSchema,\n    false\n  ),\n  'gemini-3-flash-preview': commonRef(\n    'gemini-3-flash-preview',\n    undefined,\n    GeminiConfigSchema,\n    false\n  ),\n};\nexport type KnownGeminiModels = keyof typeof KNOWN_GEMINI_MODELS;\nexport type GeminiModelName = `gemini-${string}`;\nexport function isGeminiModelName(value: string): value is GeminiModelName {\n  return (\n    value.startsWith('gemini-') &&\n    !isTTSModelName(value) &&\n    !isImageModelName(value) &&\n    !isVideoModelName(value)\n  );\n}\n\nconst KNOWN_TTS_MODELS = {\n  'gemini-3.8-flash-tts': commonRef(\n    'gemini-3.8-flash-tts',\n    { ...GENERIC_TTS_MODEL.info },\n    GeminiTtsConfigSchema\n  ),\n  'gemini-3.8-flash-lite-tts': commonRef(\n    'gemini-3.8-flash-lite-tts',\n    { ...GENERIC_TTS_MODEL.info },\n    GeminiTtsConfigSchema\n  ),\n} as const;\nexport type KnownTtsModels = keyof typeof KNOWN_TTS_MODELS;\nexport type TTSModelName = `gemini-${string}-tts${string}`;\nexport function isTTSModelName(value: string): value is TTSModelName {\n  return value.startsWith('gemini-') && value.includes('-tts');\n}\n\nconst KNOWN_IMAGE_MODELS = {\n  // Function calling works, but structured output doesn't: with a schema the\n  // model still returns only an image (checked live, Oct 2026). 'none' makes\n  // Genkit ask for JSON in the prompt instead of sending a schema.\n  'gemini-nano-banana-2.1': commonRef(\n    'gemini-nano-banana-2.1',\n    {\n      ...GENERIC_IMAGE_MODEL.info,\n      supports: { ...GENERIC_IMAGE_MODEL.info?.supports, constrained: 'none' },\n    },\n    GeminiImageConfigSchema\n  ),\n  'gemini-3.1-flash-lite-image': commonRef(\n    'gemini-3.1-flash-lite-image',\n    { ...GENERIC_IMAGE_MODEL.info },\n    GeminiImageConfigSchema\n  ),\n  'gemini-3-pro-image': commonRef(\n    'gemini-3-pro-image',\n    { ...GENERIC_IMAGE_MODEL.info },\n    GeminiImageConfigSchema,\n    false\n  ),\n} as const;\nexport type KnownImageModels = keyof typeof KNOWN_IMAGE_MODELS;\nexport type ImageModelName = `gemini-${string}-image${string}`;\nexport function isImageModelName(value: string): value is ImageModelName {\n  return value.startsWith('gemini-') && value.includes('-image');\n}\n\nconst KNOWN_VIDEO_MODELS = {\n  'gemini-omni-1.1-flash': commonRef(\n    'gemini-omni-1.1-flash',\n    { ...GENERIC_VIDEO_MODEL.info },\n    GeminiVideoConfigSchema\n  ),\n} as const;\nexport type KnownVideoModels = keyof typeof KNOWN_VIDEO_MODELS;\nexport type VideoModelName = `gemini-omni-${string}`;\nexport function isVideoModelName(value: string): value is VideoModelName {\n  return value.startsWith('gemini-omni-');\n}\n\nconst KNOWN_GEMMA_MODELS = {\n  'gemma-4-26b-a4b-it': commonRef(\n    'gemma-4-26b-a4b-it',\n    undefined,\n    GemmaConfigSchema,\n    false\n  ),\n  'gemma-4-31b-it': commonRef(\n    'gemma-4-31b-it',\n    undefined,\n    GemmaConfigSchema,\n    false\n  ),\n} as const;\nexport type KnownGemmaModels = keyof typeof KNOWN_GEMMA_MODELS;\nexport type GemmaModelName = `gemma-${string}`;\nexport function isGemmaModelName(value: string): value is GemmaModelName {\n  return value.startsWith('gemma-');\n}\n\n// Models we no longer suggest, but that still work: they still resolve and\n// are still registered as actions, but aren't in the Known*Models types, so\n// they don't show up in autocomplete. Set `stage` on each one (keeping the\n// default `supports`):\n// - 'deprecated': deprecated by Google, or < 1 month from shutdown.\n// - 'legacy': not deprecated, but no longer offered to new projects.\nconst HIDDEN_MODELS = {\n  // Gemini 2.5: Google limits access to accounts that used it before; new\n  // projects should use newer models.\n  'gemini-2.5-pro': commonRef(\n    'gemini-2.5-pro',\n    { ...GENERIC_MODEL.info, stage: 'legacy' },\n    GeminiConfigSchema,\n    false\n  ),\n  'gemini-2.5-flash': commonRef(\n    'gemini-2.5-flash',\n    { ...GENERIC_MODEL.info, stage: 'legacy' },\n    GeminiConfigSchema,\n    false\n  ),\n  'gemini-2.5-flash-lite': commonRef(\n    'gemini-2.5-flash-lite',\n    { ...GENERIC_MODEL.info, stage: 'legacy' },\n    GeminiConfigSchema,\n    false\n  ),\n  'gemini-2.5-flash-image': commonRef(\n    'gemini-2.5-flash-image',\n    { ...GENERIC_IMAGE_MODEL.info, stage: 'legacy' },\n    GeminiImageConfigSchema,\n    false\n  ),\n\n  // Shut down on Nov 17 2026.\n  'gemini-2.5-flash-preview-tts': commonRef(\n    'gemini-2.5-flash-preview-tts',\n    { ...GENERIC_TTS_MODEL.info, stage: 'deprecated' },\n    GeminiTtsConfigSchema,\n    false\n  ),\n  'gemini-2.5-pro-preview-tts': commonRef(\n    'gemini-2.5-pro-preview-tts',\n    { ...GENERIC_TTS_MODEL.info, stage: 'deprecated' },\n    GeminiTtsConfigSchema,\n    false\n  ),\n  'gemini-3.1-flash-tts-preview': commonRef(\n    'gemini-3.1-flash-tts-preview',\n    { ...GENERIC_TTS_MODEL.info, stage: 'deprecated' },\n    GeminiTtsConfigSchema,\n    false\n  ),\n\n  // Deprecated, not shutting down: the server routes requests for it to\n  // gemini-3.6-flash (per the deprecations page, Oct 2026). Still sent through\n  // generateContent, as before: the routing happens on the server.\n  'gemini-3.5-flash': commonRef(\n    'gemini-3.5-flash',\n    { ...GENERIC_MODEL.info, stage: 'deprecated' },\n    GeminiConfigSchema,\n    false\n  ),\n\n  // Deprecated (no shutdown date yet); replaced by gemini-nano-banana-2.1.\n  'gemini-3.1-flash-image': commonRef(\n    'gemini-3.1-flash-image',\n    { ...GENERIC_IMAGE_MODEL.info, stage: 'deprecated' },\n    GeminiImageConfigSchema,\n    false\n  ),\n} as const;\n\nconst KNOWN_MODELS = {\n  ...KNOWN_GEMINI_MODELS,\n  ...KNOWN_TTS_MODELS,\n  ...KNOWN_IMAGE_MODELS,\n  ...KNOWN_VIDEO_MODELS,\n  ...KNOWN_GEMMA_MODELS,\n};\n\nconst ALL_MODELS = {\n  ...HIDDEN_MODELS,\n  ...KNOWN_MODELS,\n};\n\nexport function model(\n  version: string,\n  config: ConfigSchema = {}\n): ModelReference<ConfigSchemaType> {\n  const name = checkModelName(version);\n\n  if (isKnownKey(name, ALL_MODELS)) {\n    return ALL_MODELS[name].withConfig(config);\n  }\n\n  if (isTTSModelName(name)) {\n    return modelRef({\n      name: `googleai/${name}`,\n      config,\n      configSchema: GeminiTtsConfigSchema,\n      info: { ...GENERIC_TTS_MODEL.info },\n    });\n  }\n\n  if (isImageModelName(name)) {\n    return modelRef({\n      name: `googleai/${name}`,\n      config,\n      configSchema: GeminiImageConfigSchema,\n      info: { ...GENERIC_IMAGE_MODEL.info },\n    });\n  }\n\n  if (isVideoModelName(name)) {\n    return modelRef({\n      name: `googleai/${name}`,\n      config,\n      configSchema: GeminiVideoConfigSchema,\n      info: { ...GENERIC_VIDEO_MODEL.info },\n    });\n  }\n\n  if (isGemmaModelName(name)) {\n    return modelRef({\n      name: `googleai/${name}`,\n      config,\n      configSchema: GemmaConfigSchema,\n      info: { ...GENERIC_GEMMA_MODEL.info },\n    });\n  }\n\n  return modelRef({\n    name: `googleai/${name}`,\n    config,\n    configSchema: GeminiConfigSchema,\n    info: { ...GENERIC_MODEL.info },\n  });\n}\n\n// Takes a full list of models, filters for current Gemini models only\n// and returns a modelActionMetadata for each.\nexport function listActions(models: Model[]): ActionMetadata[] {\n  return (\n    models\n      .filter((m) => m.supportedGenerationMethods.includes('generateContent'))\n      // Filter out deprecated\n      .filter((m) => !m.description || !m.description.includes('deprecated'))\n      .map((m) => {\n        const ref = model(m.name);\n        return modelActionMetadata({\n          name: ref.name,\n          info: ref.info,\n          configSchema: ref.configSchema,\n        });\n      })\n  );\n}\n\nexport function listKnownModels(options?: GoogleAIPluginOptions) {\n  return Object.keys(ALL_MODELS).map((name: string) =>\n    defineModel(name, options)\n  );\n}\n\n/**\n * Defines a new GoogleAI Gemini model.\n */\nexport function defineModel(\n  name: string,\n  pluginOptions?: GoogleAIPluginOptions\n): ModelAction {\n  checkApiKey(pluginOptions?.apiKey);\n  const ref = model(name);\n  const clientOptions: ClientOptions = {\n    apiVersion: pluginOptions?.apiVersion,\n    baseUrl: pluginOptions?.baseUrl,\n    customHeaders: pluginOptions?.customHeaders,\n    experimental_debugTraces: pluginOptions?.experimental_debugTraces,\n  };\n\n  const middleware: ModelMiddleware[] = [];\n  if (ref.info?.supports?.media) {\n    middleware.push(\n      downloadRequestMedia({\n        maxBytes: MAX_INLINE_MEDIA_BYTES,\n        // don't download files that have been uploaded using the Files API\n        // or external URLs supported by the model\n        filter: (part) => {\n          try {\n            const url = new URL(part.media.url);\n            // Allow http/https URLs to pass through\n            if (url.protocol === 'https:' || url.protocol === 'http:') {\n              return false;\n            }\n          } catch {}\n          return true;\n        },\n      })\n    );\n  }\n\n  return pluginModel(\n    {\n      name: ref.name,\n      ...ref.info,\n      configSchema: ref.configSchema,\n      use: middleware,\n    },\n    async (request, { streamingRequested, sendChunk, abortSignal }) => {\n      const clientOpt = calculateRequestOptions(\n        { ...clientOptions, signal: abortSignal },\n        request.config\n      );\n\n      const modelVersion = request.config?.version || extractVersion(ref);\n      const isGemma = isGemmaModelName(modelVersion);\n      const useInteractions = modelInteractionsMap.get(modelVersion) ?? true;\n\n      // Make a copy so that modifying the request will not produce side-effects\n      const messages = request.messages.map((m) => ({ ...m }));\n      if (messages.length === 0) throw new Error('No messages provided.');\n\n      if (isGemma) {\n        // Gemma does not allow previous thoughts\n        messages.forEach((m) => {\n          m.content = m.content.filter(\n            (p) => !p.reasoning && !p.metadata?.thoughtSignature\n          );\n        });\n      }\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      let interactionsSystemInstruction: string | undefined = undefined;\n      const systemMessage = messages.find((m) => m.role === 'system');\n      if (systemMessage) {\n        messages.splice(messages.indexOf(systemMessage), 1);\n        systemInstruction = toGeminiSystemInstruction(systemMessage);\n        if (\n          useInteractions &&\n          systemMessage.content.some((c) => c.text === undefined)\n        ) {\n          // Technically it's not the model itself, but 'useInteractions' or not,\n          // however, useInteractions is determined by which model... so\n          // this makes the most sense without dragging the user into\n          // the nitty gritty of how their stuff is going through the backend.\n          throw new GenkitError({\n            status: 'INVALID_ARGUMENT',\n            message:\n              'System message contains non-text content which is not supported for this model.',\n          });\n        }\n        interactionsSystemInstruction = systemMessage.content\n          .map((c) => c.text)\n          .join('\\n');\n      }\n\n      const tools: Tool[] = [];\n      const interactionsTools: InteractionTool[] = [];\n\n      if (request.tools?.length) {\n        if (useInteractions) {\n          interactionsTools.push(...request.tools.map(toInteractionTool));\n        } else {\n          tools.push({\n            functionDeclarations: request.tools.map(toGeminiTool),\n          });\n        }\n      }\n\n      const requestOptions: ConfigSchema = {\n        ...request.config,\n      };\n\n      const {\n        apiKey: apiKeyFromConfig,\n        safetySettings: safetySettingsFromConfig,\n        codeExecution: codeExecutionFromConfig,\n        version: versionFromConfig,\n        toolConfig: toolConfigConfig,\n        functionCallingConfig,\n        googleSearchRetrieval,\n        google_search,\n        googleSearch,\n        fileSearch,\n        urlContext,\n        tools: toolsFromConfig,\n        retrievalConfig,\n        serviceTier,\n        previousInteractionId: previousInteractionIdFromConfig,\n        store: storeFromConfig,\n        responseModalities: responseModalitiesFromConfig,\n        // Interactions-only: sent as `response_format` below.\n        audioFormat: audioFormatFromConfig,\n        videoFormat: videoFormatFromConfig,\n        ...restOfConfigOptions\n      } = requestOptions;\n\n      if (!useInteractions) {\n        // generateContent rejects unknown generation_config fields with a\n        // 400, and has no equivalent for these (e.g. the older preview TTS\n        // models still use this schema).\n        if (audioFormatFromConfig !== undefined) {\n          warnDroppedConfigField(modelVersion, 'audioFormat');\n        }\n        if (videoFormatFromConfig !== undefined) {\n          warnDroppedConfigField(modelVersion, 'videoFormat');\n        }\n      }\n\n      if (codeExecutionFromConfig) {\n        tools.push({\n          codeExecution:\n            codeExecutionFromConfig === true ? {} : codeExecutionFromConfig,\n        });\n      }\n\n      if (toolsFromConfig) {\n        tools.push(...(toolsFromConfig as any[]));\n      }\n\n      if (googleSearchRetrieval) {\n        tools.push({\n          googleSearch:\n            googleSearchRetrieval === true ? {} : googleSearchRetrieval,\n        } as GoogleSearchRetrievalTool);\n      }\n\n      if (googleSearch || google_search) {\n        tools.push({\n          google_search: google_search || googleSearch,\n        }) as GoogleSearchRetrievalTool;\n      }\n\n      if (fileSearch) {\n        tools.push({\n          fileSearch,\n        });\n      }\n\n      if (urlContext) {\n        tools.push({\n          urlContext: urlContext === true ? {} : urlContext,\n        } as UrlContextTool);\n      }\n\n      if (useInteractions) {\n        // The Gemini API's Interactions endpoint does not accept\n        // `safety_settings` (it returns 400), even though the published\n        // Interactions spec lists the field. The Gemini Enterprise Agent\n        // Platform accepts it, so the vertexAI plugin should map safety\n        // settings rather than copy this guard. Permissive settings can be\n        // dropped safely: per the Gemini API docs, the adjustable safety\n        // filters are Off by default for current Gemini models, so BLOCK_NONE\n        // (and HARM_CATEGORY_UNSPECIFIED entries) never block anything beyond\n        // the default. Built-in protections against core harms always apply.\n        // See https://ai.google.dev/gemini-api/docs/safety-settings\n        //\n        // Blocking thresholds (BLOCK_ONLY_HIGH and stricter) cannot be honored,\n        // so throw rather than silently weaken the requested filtering.\n        const blockingSafetySettings = (safetySettingsFromConfig ?? []).filter(\n          (setting) => !isDefaultSafetySetting(setting)\n        );\n        if (blockingSafetySettings.length > 0) {\n          throw new GenkitError({\n            status: 'INVALID_ARGUMENT',\n            message:\n              `safetySettings with blocking thresholds are not supported for model '${modelVersion}'. ` +\n              'This model applies no additional safety filters by default ' +\n              '(built-in protections against core harms still apply). ' +\n              'Remove the safetySettings or set their thresholds to BLOCK_NONE.',\n            detail: { safetySettings: blockingSafetySettings },\n          });\n        }\n        if (toolConfigConfig) {\n          logger.warn(\n            'toolConfig is not supported for this model with the Interactions API and will be ignored.'\n          );\n        }\n        if (request.candidates && request.candidates > 1) {\n          logger.warn(\n            'Multiple candidates are not supported for this model with the Interactions API; only one candidate will be returned.'\n          );\n        }\n        if (Array.isArray(toolsFromConfig)) {\n          interactionsTools.push(\n            ...toolsFromConfig.map(toInteractionConfigTool)\n          );\n        }\n        if (codeExecutionFromConfig) {\n          interactionsTools.push(\n            toInteractionConfigTool({ codeExecution: codeExecutionFromConfig })\n          );\n        }\n        if (googleSearchRetrieval) {\n          interactionsTools.push(\n            toInteractionConfigTool({ googleSearch: googleSearchRetrieval })\n          );\n        }\n        if (googleSearch || google_search) {\n          const gs = google_search || googleSearch;\n          interactionsTools.push(\n            toInteractionConfigTool({ google_search: gs })\n          );\n        }\n        if (fileSearch) {\n          interactionsTools.push(toInteractionConfigTool({ fileSearch }));\n        }\n        if (urlContext) {\n          interactionsTools.push(toInteractionConfigTool({ urlContext }));\n        }\n        if (retrievalConfig) {\n          // There is no retrieval config on the Interactions path; the user\n          // location is set on the google_maps tool instead.\n          const { latLng, ...unsupportedRetrievalConfig } = retrievalConfig;\n          if (\n            latLng &&\n            !applyLatLngToGoogleMapsTools(interactionsTools, latLng)\n          ) {\n            logger.warn(\n              'retrievalConfig.latLng is only used with the googleMaps tool for this model and will be ignored.'\n            );\n          }\n          const unsupportedKeys = Object.keys(unsupportedRetrievalConfig);\n          if (unsupportedKeys.length > 0) {\n            logger.warn(\n              `retrievalConfig.${unsupportedKeys.join(', retrievalConfig.')} ` +\n                'is not supported for this model with the Interactions API and will be ignored.'\n            );\n          }\n        }\n      }\n\n      let toolConfig: ToolConfig | undefined;\n\n      if (functionCallingConfig) {\n        toolConfig = {\n          functionCallingConfig: {\n            allowedFunctionNames: functionCallingConfig.allowedFunctionNames,\n            mode: toGeminiFunctionModeEnum(functionCallingConfig.mode),\n          },\n        };\n      } else if (request.toolChoice) {\n        toolConfig = {\n          functionCallingConfig: {\n            mode: toGeminiFunctionModeEnum(request.toolChoice),\n          },\n        };\n      }\n\n      if (toolConfigConfig) {\n        // We need it in snake case or it doesn't work\n        if (\n          Object.hasOwnProperty.call(\n            toolConfigConfig,\n            'includeServerSideToolInvocations'\n          )\n        ) {\n          toolConfigConfig['include_server_side_tool_invocations'] =\n            toolConfigConfig['includeServerSideToolInvocations'];\n          delete toolConfigConfig['includeServerSideToolInvocations'];\n        }\n        toolConfig = {\n          ...toolConfig,\n          ...toolConfigConfig,\n        };\n      }\n\n      if (retrievalConfig) {\n        toolConfig = {\n          ...toolConfig,\n          retrievalConfig,\n        };\n      }\n\n      const jsonMode =\n        request.output?.format === 'json' ||\n        request.output?.contentType === 'application/json';\n\n      const sanitizedConfigOptions = {\n        ...removeClientOptionOverrides(restOfConfigOptions),\n      };\n\n      const interactionGenerationConfig: ModelGenerationConfig =\n        toInteractionGenerationConfig(\n          sanitizedConfigOptions,\n          useInteractions\n            ? (field) => warnDroppedConfigField(modelVersion, field)\n            : undefined\n        );\n\n      if (useInteractions) {\n        const toolChoice = toInteractionToolChoice(\n          functionCallingConfig,\n          request.toolChoice\n        );\n        if (toolChoice) {\n          interactionGenerationConfig.tool_choice = toolChoice;\n        }\n      }\n\n      const generationConfig: GenerationConfig = {\n        ...sanitizedConfigOptions,\n        ...(responseModalitiesFromConfig\n          ? { responseModalities: responseModalitiesFromConfig }\n          : {}),\n        candidateCount: request.candidates || undefined,\n        responseMimeType: jsonMode ? 'application/json' : undefined,\n      };\n\n      if (isTTSModelName(modelVersion)) {\n        if (!generationConfig.responseModalities) {\n          generationConfig.responseModalities = ['AUDIO'];\n        }\n      } else if (isImageModelName(modelVersion)) {\n        if (!generationConfig.responseModalities) {\n          generationConfig.responseModalities = ['TEXT', 'IMAGE'];\n        }\n      }\n\n      if (request.output?.constrained && jsonMode) {\n        if (pluginOptions?.legacyResponseSchema) {\n          generationConfig.responseSchema = cleanSchema(request.output.schema);\n        } else {\n          generationConfig.responseJsonSchema = request.output.schema;\n        }\n      }\n\n      const requestApiKey = calculateApiKey(\n        pluginOptions?.apiKey,\n        requestOptions.apiKey\n      );\n\n      if (useInteractions) {\n        const store = storeFromConfig === true || pluginOptions?.store === true;\n        const { messages: newMessages, previousInteractionId } =\n          selectInteractionInput(\n            messages,\n            store,\n            previousInteractionIdFromConfig\n          );\n\n        // Turn-level speech metadata (speaker/style) is only accepted together\n        // with a speech_config; without one the server returns a generic 400\n        // (\"Request contains an invalid argument\"), so explain what to set.\n        const speechConfig = interactionGenerationConfig.speech_config;\n        if (!speechConfig) {\n          const hasSpeechMetadata = newMessages\n            .filter((m) => m.role === 'user')\n            .flatMap((m) => m.content)\n            .some(\n              (p) =>\n                p.text !== undefined && isObject(p.metadata?.speechMetadata)\n            );\n          if (hasSpeechMetadata) {\n            throw new GenkitError({\n              status: 'INVALID_ARGUMENT',\n              message:\n                `speechMetadata (speaker/style) requires a voice for model ` +\n                `'${modelVersion}'. Set ` +\n                'config.speechConfig.voiceConfig.prebuiltVoiceConfig.voiceName ' +\n                '(or multiSpeakerVoiceConfig for multiple speakers).',\n            });\n          }\n        }\n\n        // Multi-speaker TTS requires every non-empty text part to name a\n        // speaker that matches one of the configured speakers. The server's\n        // own error talks about \"text turns\", so explain what to set instead.\n        if (speechConfig && !Array.isArray(speechConfig)) {\n          const speakerNames = speechConfig.speakers\n            .map((s) => s.speaker)\n            .filter((name): name is string => !!name);\n          const textParts = newMessages\n            .filter((m) => m.role === 'user')\n            .flatMap((m) => m.content)\n            .filter((p) => !!p.text?.trim());\n          const invalidTurn = textParts.some((p) => {\n            const speechMetadata = p.metadata?.speechMetadata;\n            return (\n              !isObject(speechMetadata) ||\n              typeof speechMetadata.speaker !== 'string' ||\n              !speakerNames.includes(speechMetadata.speaker)\n            );\n          });\n          if (invalidTurn) {\n            throw new GenkitError({\n              status: 'INVALID_ARGUMENT',\n              message:\n                `Multi-speaker speech for model '${modelVersion}' requires ` +\n                'each turn to be a separate text part with ' +\n                '`metadata: { speechMetadata: { speaker } }` set to one of ' +\n                `the configured speakers (${speakerNames.join(', ')}).`,\n            });\n          }\n        }\n\n        const req: CreateInteractionRequest = {\n          system_instruction: interactionsSystemInstruction,\n          model: modelVersion,\n          tools: interactionsTools.length ? interactionsTools : undefined,\n          generation_config: interactionGenerationConfig,\n          stream: streamingRequested,\n          input: toInteractionSteps(newMessages),\n          service_tier: serviceTier,\n          store,\n        };\n\n        if (jsonMode) {\n          req.response_format = {\n            type: 'text',\n            mime_type: 'application/json',\n          };\n          if (request.output?.constrained) {\n            req.response_format.schema = pluginOptions?.legacyResponseSchema\n              ? cleanSchema(request.output.schema)\n              : request.output.schema;\n          }\n        }\n\n        const audioResponseFormat = toInteractionAudioResponseFormat(\n          audioFormatFromConfig\n        );\n        if (audioResponseFormat) {\n          req.response_format = audioResponseFormat;\n        }\n\n        const videoResponseFormat = toInteractionVideoResponseFormat(\n          videoFormatFromConfig\n        );\n        if (videoResponseFormat) {\n          req.response_format = videoResponseFormat;\n        }\n\n        if (responseModalitiesFromConfig) {\n          req.response_modalities = toInteractionResponseModalities(\n            responseModalitiesFromConfig\n          );\n        } else if (isTTSModelName(modelVersion)) {\n          req.response_modalities = ['audio'];\n        } else if (isImageModelName(modelVersion)) {\n          req.response_modalities = ['text', 'image'];\n        }\n\n        if (\n          previousInteractionId &&\n          typeof previousInteractionId === 'string'\n        ) {\n          req.previous_interaction_id = previousInteractionId;\n        }\n        if (!streamingRequested) {\n          const response = await createInteraction(\n            requestApiKey,\n            req,\n            clientOpt\n          );\n          const out = fromInteractionSync(response);\n          return out;\n        } else {\n          const result = await createInteractionStream(\n            requestApiKey,\n            req,\n            clientOpt\n          );\n          for await (const event of result.stream) {\n            if (event.event_type === 'step.delta') {\n              const chunkParts = fromInteractionDelta(event.delta).map(\n                removeId3FromAudio\n              );\n              if (chunkParts.length > 0) {\n                sendChunk({\n                  index: 0,\n                  content: chunkParts,\n                });\n              }\n            }\n          }\n          const response = await result.response;\n          const out = fromInteractionSync(response);\n          // Streamed audio arrives as many headerless chunks (raw PCM by\n          // default); the final response joins them into one part of the\n          // same format.\n          if (out.message?.content) {\n            out.message.content = mergeStreamedAudio(\n              out.message.content.map(removeId3FromAudio)\n            );\n          }\n          return out;\n        }\n      }\n\n      // `store: false` is already how this model behaves, so only warn when\n      // something would actually be ignored.\n      if (storeFromConfig === true || previousInteractionIdFromConfig) {\n        logger.warn(\n          'store and previousInteractionId are not supported for this model and will be ignored.'\n        );\n      }\n\n      let generateContentRequest: GenerateContentRequest = {\n        systemInstruction,\n        generationConfig,\n        tools: tools.length ? tools : undefined,\n        toolConfig,\n        safetySettings: safetySettingsFromConfig?.filter(\n          (setting) => setting.category !== 'HARM_CATEGORY_UNSPECIFIED'\n        ) as SafetySetting[],\n        contents: messages.map((message) => toGeminiMessage(message, ref)),\n        serviceTier,\n      };\n\n      let response: GenerateContentResponse;\n\n      if (streamingRequested) {\n        const result = await generateContentStream(\n          requestApiKey,\n          modelVersion,\n          generateContentRequest,\n          clientOpt\n        );\n        const chunks: CandidateData[] = [];\n        for await (const item of result.stream) {\n          item.candidates?.forEach((candidate) => {\n            const c = fromGeminiCandidate(candidate, chunks);\n            chunks.push(c);\n            sendChunk({\n              index: c.index,\n              content: c.message.content,\n            });\n          });\n        }\n        response = await result.response;\n      } else {\n        response = await generateContent(\n          requestApiKey,\n          modelVersion,\n          generateContentRequest,\n          clientOpt\n        );\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 = candidates.map((c) => fromGeminiCandidate(c)) || [];\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          thoughtsTokens: response.usageMetadata?.thoughtsTokenCount,\n          totalTokens: response.usageMetadata?.totalTokenCount,\n          cachedContentTokens: response.usageMetadata?.cachedContentTokenCount,\n        },\n      };\n    }\n  );\n}\n\nexport const TEST_ONLY = { KNOWN_MODELS, HIDDEN_MODELS };\n"],"mappings":"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","names":["name","response"]}