UNPKG

@ai-sdk/google

Version:

The **[Google Generative AI provider](https://ai-sdk.dev/providers/ai-sdk-providers/google-generative-ai)** for the [AI SDK](https://ai-sdk.dev/docs) contains language model support for the [Google Generative AI](https://ai.google/discover/generativeai/)

263 lines (248 loc) 8.56 kB
import { lazySchema, zodSchema, type InferSchema, } from '@ai-sdk/provider-utils'; import { z } from 'zod/v4'; /** * Type-only union of Gemini model IDs that the Interactions API accepts via * `model:`. Mirrors `Model` from `googleapis/js-genai` * `src/interactions/resources/interactions.ts`. * * Kept as a separate type from `GoogleModelId` even though most IDs overlap; * the two surfaces (`:generateContent` vs `/interactions`) are independent and * may diverge over time. */ export type GoogleInteractionsModelId = | 'gemini-2.5-computer-use-preview-10-2025' | 'gemini-2.5-flash' | 'gemini-2.5-flash-image' | 'gemini-2.5-flash-lite' | 'gemini-2.5-flash-lite-preview-09-2025' | 'gemini-2.5-flash-native-audio-preview-12-2025' | 'gemini-2.5-flash-preview-09-2025' | 'gemini-2.5-flash-preview-tts' | 'gemini-2.5-pro' | 'gemini-2.5-pro-preview-tts' | 'gemini-3-flash-preview' | 'gemini-3-pro-image-preview' | 'gemini-3-pro-preview' | 'gemini-3.1-pro-preview' | 'gemini-3.1-flash-image-preview' | 'gemini-3.1-flash-lite-preview' | 'gemini-3.1-flash-tts-preview' | 'gemini-3.5-flash' | 'lyria-3-clip-preview' | 'lyria-3-pro-preview' | (string & {}); /** * Provider-options schema for `google.interactions(...)` calls. Read from the * shared `providerOptions.google.*` namespace (per PRD); per-call options that * the AI SDK doesn't natively expose live here. * * All fields are `.nullish()` per the existing google provider convention. */ export const googleInteractionsLanguageModelOptions = lazySchema(() => zodSchema( z.object({ previousInteractionId: z.string().nullish(), store: z.boolean().nullish(), agent: z.string().nullish(), agentConfig: z .union([ z .object({ type: z.literal('dynamic'), }) .loose(), z.object({ type: z.literal('deep-research'), thinkingSummaries: z.enum(['auto', 'none']).nullish(), visualization: z.enum(['off', 'auto']).nullish(), collaborativePlanning: z.boolean().nullish(), }), ]) .nullish(), thinkingLevel: z.enum(['minimal', 'low', 'medium', 'high']).nullish(), thinkingSummaries: z.enum(['auto', 'none']).nullish(), /** * Output-format entries that map directly to the API's `response_format` * array. Use this to request image, audio, or non-JSON text outputs * with full control over `mime_type`, `aspect_ratio`, and `image_size`. * * Entries are sent in order. The AI SDK call-level `responseFormat: { * type: 'json', schema }` still drives JSON-mode and adds a matching * text entry automatically; entries listed here are appended. */ responseFormat: z .array( z.union([ z .object({ type: z.literal('text'), mimeType: z.string().nullish(), schema: z.unknown().nullish(), }) .loose(), z .object({ type: z.literal('image'), mimeType: z.string().nullish(), aspectRatio: z .enum([ '1:1', '2:3', '3:2', '3:4', '4:3', '4:5', '5:4', '9:16', '16:9', '21:9', '1:8', '8:1', '1:4', '4:1', ]) .nullish(), imageSize: z.enum(['1K', '2K', '4K', '512']).nullish(), }) .loose(), z .object({ type: z.literal('audio'), mimeType: z.string().nullish(), }) .loose(), ]), ) .nullish(), /** * @deprecated Use `responseFormat` with a `{ type: 'image', ... }` * entry instead. Retained for backwards compatibility; the SDK * translates it into a matching `response_format` image entry and * emits a warning when set. */ imageConfig: z .object({ aspectRatio: z .enum([ '1:1', '2:3', '3:2', '3:4', '4:3', '4:5', '5:4', '9:16', '16:9', '21:9', '1:8', '8:1', '1:4', '4:1', ]) .nullish(), imageSize: z.enum(['1K', '2K', '4K', '512']).nullish(), }) .nullish(), mediaResolution: z .enum(['low', 'medium', 'high', 'ultra_high']) .nullish(), responseModalities: z .array(z.enum(['text', 'image', 'audio', 'video', 'document'])) .nullish(), serviceTier: z.enum(['flex', 'standard', 'priority']).nullish(), /** * Alternative to AI SDK `system` message. If both are set, the AI SDK * `system` message wins and a warning is emitted. */ systemInstruction: z.string().nullish(), /** * Per-block signature for round-tripping `thought.signature` and * `function_call.signature` blocks. Set by the SDK on output reasoning / * tool-call parts; passed back unchanged on input parts so the API * accepts the prior turn. */ signature: z.string().nullish(), /** * Set by the SDK on output assistant messages. The converter uses it to * decide which messages to drop when compacting under * `previousInteractionId`. */ interactionId: z.string().nullish(), /** * Maximum time, in milliseconds, to poll a background interaction (agent * call) before giving up. Defaults to 30 minutes. Long-running agents * such as deep research can take tens of minutes — increase if needed. */ pollingTimeoutMs: z.number().int().positive().nullish(), /** * Run the interaction in the background. Required for agents whose * server-side workflow cannot complete within a single request/response. * When `true`, the POST returns with a non-terminal status and the SDK * polls `GET /interactions/{id}` until the work completes. Some agents * reject `true`; see the agent's documentation for which mode it * requires. */ background: z.boolean().nullish(), /** * Environment configuration for the agent sandbox. Only applies to agent * calls (`google.interactions({ agent })`); ignored on model-id calls. * * - `"remote"`: provision a fresh sandbox for this call. * - any other string: an existing `environment_id` to reuse. * - object: provision a fresh sandbox and optionally preload `sources` * and/or constrain outbound traffic via `network`. */ environment: z .union([ z.string(), z.object({ type: z.literal('remote'), sources: z .array( z.union([ z.object({ type: z.literal('gcs'), source: z.string(), target: z.string().nullish(), }), z.object({ type: z.literal('repository'), source: z.string(), target: z.string().nullish(), }), z.object({ type: z.literal('inline'), content: z.string(), target: z.string(), }), ]), ) .nullish(), network: z .union([ z.literal('disabled'), z.object({ allowlist: z.array( z.object({ domain: z.string(), transform: z .array(z.record(z.string(), z.string())) .nullish(), }), ), }), ]) .nullish(), }), ]) .nullish(), }), ), ); export type GoogleLanguageModelInteractionsOptions = InferSchema< typeof googleInteractionsLanguageModelOptions >;