@ai-sdk/google 4.0.0-canary.71 → 4.0.0-canary.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +2 -2
- package/dist/index.d.ts +11 -0
- package/dist/index.js +43 -9
- package/dist/index.js.map +1 -1
- package/dist/internal/index.js.map +1 -1
- package/docs/15-google.mdx +23 -0
- package/package.json +2 -2
- package/src/google-image-model-options.ts +12 -0
- package/src/google-image-model.ts +42 -3
- package/src/tool/google-search.ts +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/google-provider.ts","../src/version.ts","../src/google-embedding-model.ts","../src/google-error.ts","../src/google-embedding-model-options.ts","../src/google-language-model.ts","../src/convert-google-usage.ts","../src/convert-json-schema-to-openapi-schema.ts","../src/convert-to-google-messages.ts","../src/get-model-path.ts","../src/google-language-model-options.ts","../src/google-prepare-tools.ts","../src/google-json-accumulator.ts","../src/map-google-finish-reason.ts","../src/tool/code-execution.ts","../src/tool/enterprise-web-search.ts","../src/tool/file-search.ts","../src/tool/google-maps.ts","../src/tool/google-search.ts","../src/tool/url-context.ts","../src/tool/vertex-rag-store.ts","../src/google-tools.ts","../src/google-image-model.ts","../src/google-image-model-options.ts","../src/google-files.ts","../src/google-video-model.ts","../src/google-video-model-options.ts","../src/interactions/google-interactions-language-model.ts","../src/interactions/convert-google-interactions-usage.ts","../src/interactions/extract-google-interactions-sources.ts","../src/interactions/map-google-interactions-finish-reason.ts","../src/interactions/build-google-interactions-stream-transform.ts","../src/interactions/convert-to-google-interactions-input.ts","../src/interactions/google-interactions-api.ts","../src/interactions/google-interactions-language-model-options.ts","../src/interactions/parse-google-interactions-outputs.ts","../src/interactions/poll-google-interactions.ts","../src/interactions/cancel-google-interaction.ts","../src/interactions/prepare-google-interactions-tools.ts","../src/interactions/stream-google-interactions.ts","../src/interactions/synthesize-google-interactions-agent-stream.ts"],"sourcesContent":["import type {\n EmbeddingModelV4,\n Experimental_VideoModelV4,\n FilesV4,\n ImageModelV4,\n LanguageModelV4,\n ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from './version';\nimport { GoogleEmbeddingModel } from './google-embedding-model';\nimport type { GoogleEmbeddingModelId } from './google-embedding-model-options';\nimport { GoogleLanguageModel } from './google-language-model';\nimport type { GoogleModelId } from './google-language-model-options';\nimport { googleTools } from './google-tools';\n\nimport type {\n GoogleImageSettings,\n GoogleImageModelId,\n} from './google-image-settings';\nimport { GoogleImageModel } from './google-image-model';\nimport { GoogleFiles } from './google-files';\nimport { GoogleVideoModel } from './google-video-model';\nimport type { GoogleVideoModelId } from './google-video-settings';\nimport {\n GoogleInteractionsLanguageModel,\n type GoogleInteractionsModelInput,\n} from './interactions/google-interactions-language-model';\nimport type { GoogleInteractionsModelId } from './interactions/google-interactions-language-model-options';\nimport type { GoogleInteractionsAgentName } from './interactions/google-interactions-agent';\n\nexport interface GoogleProvider extends ProviderV4 {\n (modelId: GoogleModelId): LanguageModelV4;\n\n languageModel(modelId: GoogleModelId): LanguageModelV4;\n\n chat(modelId: GoogleModelId): LanguageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n image(\n modelId: GoogleImageModelId,\n settings?: GoogleImageSettings,\n ): ImageModelV4;\n\n /**\n * @deprecated Use `chat()` instead.\n */\n generativeAI(modelId: GoogleModelId): LanguageModelV4;\n\n /**\n * Creates a model for text embeddings.\n */\n embedding(modelId: GoogleEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * Creates a model for text embeddings.\n */\n embeddingModel(modelId: GoogleEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embedding` instead.\n */\n textEmbedding(modelId: GoogleEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: GoogleEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: GoogleVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: GoogleVideoModelId): Experimental_VideoModelV4;\n\n files(): FilesV4;\n\n /**\n * Creates a language model targeting the Gemini Interactions API\n * (`POST /v1beta/interactions`). Pass:\n * - a model ID (string),\n * - `{ agent: <name> }` to use a known Gemini agent preset, or\n * - `{ managedAgent: <name> }` to use a user-defined agent created via\n * the `/v1beta/agents` endpoint.\n */\n interactions(\n modelIdOrAgent:\n | GoogleInteractionsModelId\n | { agent: GoogleInteractionsAgentName }\n | { managedAgent: string },\n ): LanguageModelV4;\n\n tools: typeof googleTools;\n}\n\nexport interface GoogleProviderSettings {\n /**\n * Use a different URL prefix for API calls, e.g. to use proxy servers.\n * The default prefix is `https://generativelanguage.googleapis.com/v1beta`.\n */\n baseURL?: string;\n\n /**\n * API key that is being send using the `x-goog-api-key` header.\n * It defaults to the `GOOGLE_GENERATIVE_AI_API_KEY` environment variable.\n */\n apiKey?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Optional function to generate a unique ID for each request.\n */\n generateId?: () => string;\n\n /**\n * Custom provider name\n * Defaults to 'google.generative-ai'.\n */\n name?: string;\n}\n\n/**\n * Create a Google provider instance.\n */\nexport function createGoogle(\n options: GoogleProviderSettings = {},\n): GoogleProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ??\n 'https://generativelanguage.googleapis.com/v1beta';\n\n const providerName = options.name ?? 'google.generative-ai';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n 'x-goog-api-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'GOOGLE_GENERATIVE_AI_API_KEY',\n description: 'Google Generative AI',\n }),\n ...options.headers,\n },\n `ai-sdk/google/${VERSION}`,\n );\n\n const createChatModel = (modelId: GoogleModelId) =>\n new GoogleLanguageModel(modelId, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n generateId: options.generateId ?? generateId,\n supportedUrls: () => ({\n '*': [\n // Google Generative Language \"files\" endpoint\n // e.g. https://generativelanguage.googleapis.com/v1beta/files/...\n new RegExp(`^${baseURL}/files/.*$`),\n // YouTube URLs (public or unlisted videos)\n new RegExp(\n `^https://(?:www\\\\.)?youtube\\\\.com/watch\\\\?v=[\\\\w-]+(?:&[\\\\w=&.-]*)?$`,\n ),\n new RegExp(`^https://youtu\\\\.be/[\\\\w-]+(?:\\\\?[\\\\w=&.-]*)?$`),\n ],\n }),\n fetch: options.fetch,\n });\n\n const createEmbeddingModel = (modelId: GoogleEmbeddingModelId) =>\n new GoogleEmbeddingModel(modelId, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createImageModel = (\n modelId: GoogleImageModelId,\n settings: GoogleImageSettings = {},\n ) =>\n new GoogleImageModel(modelId, settings, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createFiles = () =>\n new GoogleFiles({\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: GoogleVideoModelId) =>\n new GoogleVideoModel(modelId, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n generateId: options.generateId ?? generateId,\n });\n\n const createInteractionsModel = (\n modelIdOrAgent:\n | GoogleInteractionsModelId\n | { agent: GoogleInteractionsAgentName }\n | { managedAgent: string },\n ) =>\n new GoogleInteractionsLanguageModel(\n modelIdOrAgent as GoogleInteractionsModelInput,\n {\n provider: `${providerName}.interactions`,\n baseURL,\n headers: getHeaders,\n generateId: options.generateId ?? generateId,\n fetch: options.fetch,\n },\n );\n\n const provider = function (modelId: GoogleModelId) {\n if (new.target) {\n throw new Error(\n 'The Google Generative AI model function cannot be called with the new keyword.',\n );\n }\n\n return createChatModel(modelId);\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.generativeAI = createChatModel;\n provider.embedding = createEmbeddingModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbedding = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n provider.video = createVideoModel;\n provider.videoModel = createVideoModel;\n provider.files = createFiles;\n provider.interactions = createInteractionsModel;\n provider.tools = googleTools;\n\n return provider as GoogleProvider;\n}\n\n/**\n * Default Google Generative AI provider instance.\n */\nexport const google = createGoogle();\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import {\n TooManyEmbeddingValuesForCallError,\n type EmbeddingModelV4,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n zodSchema,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\nimport {\n googleEmbeddingModelOptions,\n type GoogleEmbeddingModelId,\n} from './google-embedding-model-options';\ntype GoogleEmbeddingConfig = {\n provider: string;\n baseURL: string;\n headers?: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class GoogleEmbeddingModel implements EmbeddingModelV4 {\n readonly specificationVersion = 'v4';\n readonly modelId: GoogleEmbeddingModelId;\n readonly maxEmbeddingsPerCall = 2048;\n readonly supportsParallelCalls = true;\n\n private readonly config: GoogleEmbeddingConfig;\n\n static [WORKFLOW_SERIALIZE](model: GoogleEmbeddingModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: GoogleEmbeddingConfig;\n }) {\n return new GoogleEmbeddingModel(options.modelId, options.config);\n }\n\n get provider(): string {\n return this.config.provider;\n }\n constructor(modelId: GoogleEmbeddingModelId, config: GoogleEmbeddingConfig) {\n this.modelId = modelId;\n this.config = config;\n }\n\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions,\n }: Parameters<EmbeddingModelV4['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV4['doEmbed']>>\n > {\n // Parse provider options\n const googleOptions = await parseProviderOptions({\n provider: 'google',\n providerOptions,\n schema: googleEmbeddingModelOptions,\n });\n\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values,\n });\n }\n\n const mergedHeaders = combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n headers,\n );\n\n const multimodalContent = googleOptions?.content;\n\n if (\n multimodalContent != null &&\n multimodalContent.length !== values.length\n ) {\n throw new Error(\n `The number of multimodal content entries (${multimodalContent.length}) must match the number of values (${values.length}).`,\n );\n }\n\n // For single embeddings, use the single endpoint\n if (values.length === 1) {\n const valueParts = multimodalContent?.[0];\n const textPart = values[0] ? [{ text: values[0] }] : [];\n const parts =\n valueParts != null\n ? [...textPart, ...valueParts]\n : [{ text: values[0] }];\n\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/models/${this.modelId}:embedContent`,\n headers: mergedHeaders,\n body: {\n model: `models/${this.modelId}`,\n content: {\n parts,\n },\n outputDimensionality: googleOptions?.outputDimensionality,\n taskType: googleOptions?.taskType,\n },\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleGenerativeAISingleEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n warnings: [],\n embeddings: [response.embedding.values],\n usage: undefined,\n response: { headers: responseHeaders, body: rawValue },\n };\n }\n\n // For multiple values, use the batch endpoint\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/models/${this.modelId}:batchEmbedContents`,\n headers: mergedHeaders,\n body: {\n requests: values.map((value, index) => {\n const valueParts = multimodalContent?.[index];\n const textPart = value ? [{ text: value }] : [];\n return {\n model: `models/${this.modelId}`,\n content: {\n role: 'user',\n parts:\n valueParts != null\n ? [...textPart, ...valueParts]\n : [{ text: value }],\n },\n outputDimensionality: googleOptions?.outputDimensionality,\n taskType: googleOptions?.taskType,\n };\n }),\n },\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleGenerativeAITextEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n warnings: [],\n embeddings: response.embeddings.map(item => item.values),\n usage: undefined,\n response: { headers: responseHeaders, body: rawValue },\n };\n }\n}\n\n// minimal version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst googleGenerativeAITextEmbeddingResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n embeddings: z.array(z.object({ values: z.array(z.number()) })),\n }),\n ),\n);\n\n// Schema for single embedding response\nconst googleGenerativeAISingleEmbeddingResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n embedding: z.object({ values: z.array(z.number()) }),\n }),\n ),\n);\n","import {\n createJsonErrorResponseHandler,\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst googleErrorDataSchema = lazySchema(() =>\n zodSchema(\n z.object({\n error: z.object({\n code: z.number().nullable(),\n message: z.string(),\n status: z.string(),\n }),\n }),\n ),\n);\n\nexport type GoogleErrorData = InferSchema<typeof googleErrorDataSchema>;\n\nexport const googleFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: googleErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type GoogleEmbeddingModelId =\n | 'gemini-embedding-001'\n | 'gemini-embedding-2-preview'\n | (string & {});\n\nconst googleEmbeddingContentPartSchema = z.union([\n z.object({ text: z.string() }),\n z.object({\n inlineData: z.object({\n mimeType: z.string(),\n data: z.string(),\n }),\n }),\n z.object({\n fileData: z.object({\n fileUri: z.string(),\n mimeType: z.string(),\n }),\n }),\n]);\n\nexport const googleEmbeddingModelOptions = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Optional. Optional reduced dimension for the output embedding.\n * If set, excessive values in the output embedding are truncated from the end.\n */\n outputDimensionality: z.number().optional(),\n\n /**\n * Optional. Specifies the task type for generating embeddings.\n * Supported task types:\n * - SEMANTIC_SIMILARITY: Optimized for text similarity.\n * - CLASSIFICATION: Optimized for text classification.\n * - CLUSTERING: Optimized for clustering texts based on similarity.\n * - RETRIEVAL_DOCUMENT: Optimized for document retrieval.\n * - RETRIEVAL_QUERY: Optimized for query-based retrieval.\n * - QUESTION_ANSWERING: Optimized for answering questions.\n * - FACT_VERIFICATION: Optimized for verifying factual information.\n * - CODE_RETRIEVAL_QUERY: Optimized for retrieving code blocks based on natural language queries.\n */\n taskType: z\n .enum([\n 'SEMANTIC_SIMILARITY',\n 'CLASSIFICATION',\n 'CLUSTERING',\n 'RETRIEVAL_DOCUMENT',\n 'RETRIEVAL_QUERY',\n 'QUESTION_ANSWERING',\n 'FACT_VERIFICATION',\n 'CODE_RETRIEVAL_QUERY',\n ])\n .optional(),\n\n /**\n * Optional. Per-value multimodal content parts for embedding non-text\n * content (images, video, PDF, audio). Each entry corresponds to the\n * embedding value at the same index and its parts are merged with the\n * text value in the request. Use `null` for entries that are text-only.\n *\n * The array length must match the number of values being embedded. In\n * the case of a single embedding, the array length must be 1.\n */\n content: z\n .array(z.array(googleEmbeddingContentPartSchema).min(1).nullable())\n .optional(),\n }),\n ),\n);\n\nexport type GoogleEmbeddingModelOptions = InferSchema<\n typeof googleEmbeddingModelOptions\n>;\n","import type {\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Content,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4Source,\n LanguageModelV4StreamPart,\n LanguageModelV4StreamResult,\n JSONObject,\n SharedV4ProviderMetadata,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n isCustomReasoning,\n lazySchema,\n mapReasoningToProviderBudget,\n mapReasoningToProviderEffort,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n zodSchema,\n type FetchFunction,\n type InferSchema,\n type ParseResult,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n convertGoogleUsage,\n type GoogleUsageMetadata,\n} from './convert-google-usage';\nimport { convertJSONSchemaToOpenAPISchema } from './convert-json-schema-to-openapi-schema';\nimport { convertToGoogleMessages } from './convert-to-google-messages';\nimport { getModelPath } from './get-model-path';\nimport { googleFailedResponseHandler } from './google-error';\nimport {\n googleLanguageModelOptions,\n type GoogleLanguageModelOptions,\n type GoogleModelId,\n} from './google-language-model-options';\nimport type { GoogleProviderMetadata } from './google-prompt';\nimport { prepareTools } from './google-prepare-tools';\nimport {\n GoogleJSONAccumulator,\n type PartialArg,\n} from './google-json-accumulator';\nimport { mapGoogleFinishReason } from './map-google-finish-reason';\n\ntype GoogleConfig = {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n generateId: () => string;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV4['supportedUrls'];\n};\n\nexport class GoogleLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n\n readonly modelId: GoogleModelId;\n\n private readonly config: GoogleConfig;\n private readonly generateId: () => string;\n\n static [WORKFLOW_SERIALIZE](model: GoogleLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: GoogleConfig;\n }) {\n return new GoogleLanguageModel(options.modelId, options.config);\n }\n\n constructor(modelId: GoogleModelId, config: GoogleConfig) {\n this.modelId = modelId;\n this.config = config;\n this.generateId = config.generateId ?? generateId;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls() {\n return this.config.supportedUrls?.() ?? {};\n }\n\n private async getArgs(\n {\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n tools,\n toolChoice,\n reasoning,\n providerOptions,\n }: LanguageModelV4CallOptions,\n { isStreaming = false }: { isStreaming?: boolean } = {},\n ) {\n const warnings: SharedV4Warning[] = [];\n\n // Names to look up in providerOptions and to write into providerMetadata.\n // For the Vertex provider we read both the new `googleVertex` key and the\n // legacy `vertex` key (new takes precedence) and write under both for\n // backward compatibility. For other Google providers we use just `google`.\n const providerOptionsNames: readonly string[] =\n this.config.provider.includes('vertex')\n ? (['googleVertex', 'vertex'] as const)\n : (['google'] as const);\n\n let googleOptions: GoogleLanguageModelOptions | undefined;\n for (const name of providerOptionsNames) {\n googleOptions = await parseProviderOptions({\n provider: name,\n providerOptions,\n schema: googleLanguageModelOptions,\n });\n if (googleOptions != null) break;\n }\n\n // Cross-namespace fallback: a Vertex provider may receive options under\n // the `google` key (e.g. via the AI Gateway).\n if (googleOptions == null && !providerOptionsNames.includes('google')) {\n googleOptions = await parseProviderOptions({\n provider: 'google',\n providerOptions,\n schema: googleLanguageModelOptions,\n });\n }\n\n // Add warning if Vertex rag tools are used with a non-Vertex Google provider\n const isVertexProvider = this.config.provider.startsWith('google.vertex.');\n\n if (\n tools?.some(\n tool =>\n tool.type === 'provider' && tool.id === 'google.vertex_rag_store',\n ) &&\n !isVertexProvider\n ) {\n warnings.push({\n type: 'other',\n message:\n \"The 'vertex_rag_store' tool is only supported with the Google Vertex provider \" +\n 'and might not be supported or could behave unexpectedly with the current Google provider ' +\n `(${this.config.provider}).`,\n });\n }\n\n if (googleOptions?.streamFunctionCallArguments && !isVertexProvider) {\n warnings.push({\n type: 'other',\n message:\n \"'streamFunctionCallArguments' is only supported on the Vertex AI API \" +\n 'and will be ignored with the current Google provider ' +\n `(${this.config.provider}). See https://docs.cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling#streaming-fc`,\n });\n }\n\n if (googleOptions?.serviceTier && isVertexProvider) {\n warnings.push({\n type: 'other',\n message:\n \"'serviceTier' is a Gemini API option and is not supported on Vertex AI. \" +\n \"Use 'sharedRequestType' (and optionally 'requestType') instead. See \" +\n 'https://docs.cloud.google.com/vertex-ai/generative-ai/docs/priority-paygo',\n });\n }\n if (\n (googleOptions?.sharedRequestType || googleOptions?.requestType) &&\n !isVertexProvider\n ) {\n warnings.push({\n type: 'other',\n message:\n \"'sharedRequestType' and 'requestType' are Vertex AI options and \" +\n `are ignored with the current Google provider (${this.config.provider}).`,\n });\n }\n\n const vertexPaygoHeaders: Record<string, string> | undefined =\n isVertexProvider &&\n (googleOptions?.sharedRequestType || googleOptions?.requestType)\n ? {\n ...(googleOptions.sharedRequestType && {\n 'X-Vertex-AI-LLM-Shared-Request-Type':\n googleOptions.sharedRequestType,\n }),\n ...(googleOptions.requestType && {\n 'X-Vertex-AI-LLM-Request-Type': googleOptions.requestType,\n }),\n }\n : undefined;\n const bodyServiceTier = isVertexProvider\n ? undefined\n : googleOptions?.serviceTier;\n\n const isGemmaModel = this.modelId.toLowerCase().startsWith('gemma-');\n const supportsFunctionResponseParts = this.modelId.startsWith('gemini-3');\n\n const { contents, systemInstruction } = convertToGoogleMessages(prompt, {\n isGemmaModel,\n providerOptionsNames,\n supportsFunctionResponseParts,\n });\n\n const {\n tools: googleTools,\n toolConfig: googleToolConfig,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n modelId: this.modelId,\n isVertexProvider,\n });\n\n const resolvedThinking = resolveThinkingConfig({\n reasoning,\n modelId: this.modelId,\n warnings,\n });\n const thinkingConfig =\n googleOptions?.thinkingConfig || resolvedThinking\n ? { ...resolvedThinking, ...googleOptions?.thinkingConfig }\n : undefined;\n\n const streamFunctionCallArguments =\n isStreaming && isVertexProvider\n ? (googleOptions?.streamFunctionCallArguments ?? false)\n : undefined;\n\n const toolConfig =\n googleToolConfig ||\n streamFunctionCallArguments ||\n googleOptions?.retrievalConfig\n ? {\n ...googleToolConfig,\n ...(streamFunctionCallArguments && {\n functionCallingConfig: {\n ...googleToolConfig?.functionCallingConfig,\n streamFunctionCallArguments: true as const,\n },\n }),\n ...(googleOptions?.retrievalConfig && {\n retrievalConfig: googleOptions.retrievalConfig,\n }),\n }\n : undefined;\n\n return {\n args: {\n generationConfig: {\n // standardized settings:\n maxOutputTokens,\n temperature,\n topK,\n topP,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n seed,\n\n // response format:\n responseMimeType:\n responseFormat?.type === 'json' ? 'application/json' : undefined,\n responseSchema:\n responseFormat?.type === 'json' &&\n responseFormat.schema != null &&\n // Google GenAI does not support all OpenAPI Schema features,\n // so this is needed as an escape hatch:\n // TODO convert into provider option\n (googleOptions?.structuredOutputs ?? true)\n ? convertJSONSchemaToOpenAPISchema(responseFormat.schema)\n : undefined,\n ...(googleOptions?.audioTimestamp && {\n audioTimestamp: googleOptions.audioTimestamp,\n }),\n\n // provider options:\n responseModalities: googleOptions?.responseModalities,\n thinkingConfig,\n ...(googleOptions?.mediaResolution && {\n mediaResolution: googleOptions.mediaResolution,\n }),\n ...(googleOptions?.imageConfig && {\n imageConfig: googleOptions.imageConfig,\n }),\n },\n contents,\n systemInstruction: isGemmaModel ? undefined : systemInstruction,\n safetySettings: googleOptions?.safetySettings,\n tools: googleTools,\n toolConfig,\n cachedContent: googleOptions?.cachedContent,\n labels: googleOptions?.labels,\n serviceTier: bodyServiceTier,\n },\n warnings: [...warnings, ...toolWarnings],\n providerOptionsNames,\n extraHeaders: vertexPaygoHeaders,\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings, providerOptionsNames, extraHeaders } =\n await this.getArgs(options);\n const wrapProviderMetadata = (payload: Record<string, unknown>) =>\n Object.fromEntries(\n providerOptionsNames.map(name => [name, payload]),\n ) as SharedV4ProviderMetadata;\n\n const mergedHeaders = combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n extraHeaders,\n );\n\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/${getModelPath(\n this.modelId,\n )}:generateContent`,\n headers: mergedHeaders,\n body: args,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(responseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const candidate = response.candidates[0];\n const content: Array<LanguageModelV4Content> = [];\n\n // map ordered parts to content:\n const parts = candidate.content?.parts ?? [];\n\n const usageMetadata = response.usageMetadata;\n\n // Associates a code execution result with its preceding call.\n let lastCodeExecutionToolCallId: string | undefined;\n // Associates a server-side tool response with its preceding call (tool combination).\n let lastServerToolCallId: string | undefined;\n\n // Build content array from all parts\n for (const part of parts) {\n if ('executableCode' in part && part.executableCode?.code) {\n const toolCallId = this.config.generateId();\n lastCodeExecutionToolCallId = toolCallId;\n\n content.push({\n type: 'tool-call',\n toolCallId,\n toolName: 'code_execution',\n input: JSON.stringify(part.executableCode),\n providerExecuted: true,\n });\n } else if ('codeExecutionResult' in part && part.codeExecutionResult) {\n content.push({\n type: 'tool-result',\n // Assumes a result directly follows its corresponding call part.\n toolCallId: lastCodeExecutionToolCallId!,\n toolName: 'code_execution',\n result: {\n outcome: part.codeExecutionResult.outcome,\n output: part.codeExecutionResult.output ?? '',\n },\n });\n // Clear the ID after use to avoid accidental reuse.\n lastCodeExecutionToolCallId = undefined;\n } else if ('text' in part && part.text != null) {\n const thoughtSignatureMetadata = part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined;\n\n if (part.text.length === 0) {\n if (thoughtSignatureMetadata != null && content.length > 0) {\n const lastContent = content[content.length - 1];\n lastContent.providerMetadata = thoughtSignatureMetadata;\n }\n } else {\n content.push({\n type: part.thought === true ? 'reasoning' : 'text',\n text: part.text,\n providerMetadata: thoughtSignatureMetadata,\n });\n }\n } else if ('functionCall' in part && part.functionCall.name != null) {\n content.push({\n type: 'tool-call' as const,\n toolCallId: part.functionCall.id ?? this.config.generateId(),\n toolName: part.functionCall.name,\n input: JSON.stringify(part.functionCall.args ?? {}),\n providerMetadata: part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined,\n });\n } else if ('inlineData' in part) {\n const hasThought = part.thought === true;\n const hasThoughtSignature = !!part.thoughtSignature;\n content.push({\n type: hasThought ? 'reasoning-file' : 'file',\n data: { type: 'data', data: part.inlineData.data },\n mediaType: part.inlineData.mimeType,\n providerMetadata: hasThoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined,\n });\n } else if ('toolCall' in part && part.toolCall) {\n const toolCallId = part.toolCall.id ?? this.config.generateId();\n lastServerToolCallId = toolCallId;\n content.push({\n type: 'tool-call',\n toolCallId,\n toolName: `server:${part.toolCall.toolType}`,\n input: JSON.stringify(part.toolCall.args ?? {}),\n providerExecuted: true,\n dynamic: true,\n providerMetadata: part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n })\n : wrapProviderMetadata({\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n }),\n });\n } else if ('toolResponse' in part && part.toolResponse) {\n const responseToolCallId =\n lastServerToolCallId ??\n part.toolResponse.id ??\n this.config.generateId();\n content.push({\n type: 'tool-result',\n toolCallId: responseToolCallId,\n toolName: `server:${part.toolResponse.toolType}`,\n result: (part.toolResponse.response ?? {}) as JSONObject,\n providerMetadata: part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n })\n : wrapProviderMetadata({\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n }),\n });\n lastServerToolCallId = undefined;\n }\n }\n\n const sources =\n extractSources({\n groundingMetadata: candidate.groundingMetadata,\n generateId: this.config.generateId,\n }) ?? [];\n for (const source of sources) {\n content.push(source);\n }\n\n return {\n content,\n finishReason: {\n unified: mapGoogleFinishReason({\n finishReason: candidate.finishReason,\n // Only count client-executed tool calls for finish reason determination.\n hasToolCalls: content.some(\n part => part.type === 'tool-call' && !part.providerExecuted,\n ),\n }),\n raw: candidate.finishReason ?? undefined,\n },\n usage: convertGoogleUsage(usageMetadata),\n warnings,\n providerMetadata: wrapProviderMetadata({\n promptFeedback: response.promptFeedback ?? null,\n groundingMetadata: candidate.groundingMetadata ?? null,\n urlContextMetadata: candidate.urlContextMetadata ?? null,\n safetyRatings: candidate.safetyRatings ?? null,\n usageMetadata: usageMetadata ?? null,\n finishMessage: candidate.finishMessage ?? null,\n serviceTier: usageMetadata?.serviceTier ?? null,\n } satisfies GoogleProviderMetadata),\n request: { body: args },\n response: {\n // TODO timestamp, model id, id\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings, providerOptionsNames, extraHeaders } =\n await this.getArgs(options, { isStreaming: true });\n const wrapProviderMetadata = (payload: Record<string, unknown>) =>\n Object.fromEntries(\n providerOptionsNames.map(name => [name, payload]),\n ) as SharedV4ProviderMetadata;\n\n const headers = combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n extraHeaders,\n );\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/${getModelPath(\n this.modelId,\n )}:streamGenerateContent?alt=sse`,\n headers,\n body: args,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(chunkSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let finishReason: LanguageModelV4FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage: GoogleUsageMetadata | undefined = undefined;\n let providerMetadata: SharedV4ProviderMetadata | undefined = undefined;\n let lastGroundingMetadata: GroundingMetadataSchema | null = null;\n let lastUrlContextMetadata: UrlContextMetadataSchema | null = null;\n\n const generateId = this.config.generateId;\n let hasToolCalls = false;\n\n // Track active blocks to group consecutive parts of same type\n let currentTextBlockId: string | null = null;\n let currentReasoningBlockId: string | null = null;\n let blockCounter = 0;\n\n // Track emitted sources to prevent duplicates\n const emittedSourceUrls = new Set<string>();\n // Associates a code execution result with its preceding call.\n let lastCodeExecutionToolCallId: string | undefined;\n // Associates a server-side tool response with its preceding call (tool combination).\n let lastServerToolCallId: string | undefined;\n\n const activeStreamingToolCalls: Array<{\n toolCallId: string;\n toolName: string;\n accumulator: GoogleJSONAccumulator;\n providerMetadata?: SharedV4ProviderMetadata;\n }> = [];\n\n const finishActiveStreamingToolCall = (\n controller: TransformStreamDefaultController<LanguageModelV4StreamPart>,\n ) => {\n const active = activeStreamingToolCalls.pop();\n if (active == null) {\n return;\n }\n\n const { finalJSON, closingDelta } = active.accumulator.finalize();\n\n if (closingDelta.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: active.toolCallId,\n delta: closingDelta,\n providerMetadata: active.providerMetadata,\n });\n }\n\n controller.enqueue({\n type: 'tool-input-end',\n id: active.toolCallId,\n providerMetadata: active.providerMetadata,\n });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId: active.toolCallId,\n toolName: active.toolName,\n input: finalJSON,\n providerMetadata: active.providerMetadata,\n });\n\n hasToolCalls = true;\n };\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<ChunkSchema>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n if (!chunk.success) {\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n const usageMetadata = value.usageMetadata;\n\n if (usageMetadata != null) {\n usage = usageMetadata;\n }\n\n const candidate = value.candidates?.[0];\n\n // sometimes the API returns an empty candidates array\n if (candidate == null) {\n return;\n }\n\n const content = candidate.content;\n\n if (candidate.groundingMetadata != null) {\n lastGroundingMetadata = candidate.groundingMetadata;\n }\n if (candidate.urlContextMetadata != null) {\n lastUrlContextMetadata = candidate.urlContextMetadata;\n }\n\n const sources = extractSources({\n groundingMetadata: candidate.groundingMetadata,\n generateId,\n });\n if (sources != null) {\n for (const source of sources) {\n if (\n source.sourceType === 'url' &&\n !emittedSourceUrls.has(source.url)\n ) {\n emittedSourceUrls.add(source.url);\n controller.enqueue(source);\n }\n }\n }\n\n // Process tool call's parts before determining finishReason to ensure hasToolCalls is properly set\n if (content != null) {\n // Process all parts in a single loop to preserve original order\n const parts = content.parts ?? [];\n for (const part of parts) {\n if ('executableCode' in part && part.executableCode?.code) {\n const toolCallId = generateId();\n lastCodeExecutionToolCallId = toolCallId;\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName: 'code_execution',\n input: JSON.stringify(part.executableCode),\n providerExecuted: true,\n });\n } else if (\n 'codeExecutionResult' in part &&\n part.codeExecutionResult\n ) {\n // Assumes a result directly follows its corresponding call part.\n const toolCallId = lastCodeExecutionToolCallId;\n\n if (toolCallId) {\n controller.enqueue({\n type: 'tool-result',\n toolCallId,\n toolName: 'code_execution',\n result: {\n outcome: part.codeExecutionResult.outcome,\n output: part.codeExecutionResult.output ?? '',\n },\n });\n // Clear the ID after use.\n lastCodeExecutionToolCallId = undefined;\n }\n } else if ('text' in part && part.text != null) {\n const thoughtSignatureMetadata = part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined;\n\n if (part.text.length === 0) {\n if (\n thoughtSignatureMetadata != null &&\n currentTextBlockId !== null\n ) {\n controller.enqueue({\n type: 'text-delta',\n id: currentTextBlockId,\n delta: '',\n providerMetadata: thoughtSignatureMetadata,\n });\n }\n } else if (part.thought === true) {\n // End any active text block before starting reasoning\n if (currentTextBlockId !== null) {\n controller.enqueue({\n type: 'text-end',\n id: currentTextBlockId,\n });\n currentTextBlockId = null;\n }\n\n // Start new reasoning block if not already active\n if (currentReasoningBlockId === null) {\n currentReasoningBlockId = String(blockCounter++);\n controller.enqueue({\n type: 'reasoning-start',\n id: currentReasoningBlockId,\n providerMetadata: thoughtSignatureMetadata,\n });\n }\n\n controller.enqueue({\n type: 'reasoning-delta',\n id: currentReasoningBlockId,\n delta: part.text,\n providerMetadata: thoughtSignatureMetadata,\n });\n } else {\n if (currentReasoningBlockId !== null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: currentReasoningBlockId,\n });\n currentReasoningBlockId = null;\n }\n\n if (currentTextBlockId === null) {\n currentTextBlockId = String(blockCounter++);\n controller.enqueue({\n type: 'text-start',\n id: currentTextBlockId,\n providerMetadata: thoughtSignatureMetadata,\n });\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: currentTextBlockId,\n delta: part.text,\n providerMetadata: thoughtSignatureMetadata,\n });\n }\n } else if ('inlineData' in part) {\n // End any active text or reasoning block before starting file output.\n // Relevant for multimodal output models.\n if (currentTextBlockId !== null) {\n controller.enqueue({\n type: 'text-end',\n id: currentTextBlockId,\n });\n currentTextBlockId = null;\n }\n if (currentReasoningBlockId !== null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: currentReasoningBlockId,\n });\n currentReasoningBlockId = null;\n }\n\n const hasThought = part.thought === true;\n const hasThoughtSignature = !!part.thoughtSignature;\n const fileMeta = hasThoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined;\n controller.enqueue({\n type: hasThought ? 'reasoning-file' : 'file',\n mediaType: part.inlineData.mimeType,\n data: { type: 'data', data: part.inlineData.data },\n providerMetadata: fileMeta,\n });\n } else if ('toolCall' in part && part.toolCall) {\n const toolCallId = part.toolCall.id ?? generateId();\n lastServerToolCallId = toolCallId;\n const serverMeta = wrapProviderMetadata({\n ...(part.thoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName: `server:${part.toolCall.toolType}`,\n input: JSON.stringify(part.toolCall.args ?? {}),\n providerExecuted: true,\n dynamic: true,\n providerMetadata: serverMeta,\n });\n } else if ('toolResponse' in part && part.toolResponse) {\n const responseToolCallId =\n lastServerToolCallId ??\n part.toolResponse.id ??\n generateId();\n const serverMeta = wrapProviderMetadata({\n ...(part.thoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n });\n\n controller.enqueue({\n type: 'tool-result',\n toolCallId: responseToolCallId,\n toolName: `server:${part.toolResponse.toolType}`,\n result: (part.toolResponse.response ?? {}) as JSONObject,\n providerMetadata: serverMeta,\n });\n lastServerToolCallId = undefined;\n }\n }\n\n // Handle streaming and complete function calls\n for (const part of parts) {\n if (!('functionCall' in part)) continue;\n\n const providerMeta = part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined;\n\n const isStreamingChunk =\n part.functionCall.partialArgs != null ||\n (part.functionCall.name != null &&\n part.functionCall.willContinue === true);\n const isTerminalChunk =\n part.functionCall.name == null &&\n part.functionCall.args == null &&\n part.functionCall.partialArgs == null &&\n part.functionCall.willContinue == null;\n const isCompleteCall =\n part.functionCall.name != null &&\n part.functionCall.args != null &&\n part.functionCall.partialArgs == null;\n // Single-chunk no-args call: `{ name: 'X' }` with no `args`,\n // `partialArgs`, or `willContinue`. Carries `thoughtSignature`.\n const isNoArgsCompleteCall =\n part.functionCall.name != null &&\n part.functionCall.args == null &&\n part.functionCall.partialArgs == null &&\n part.functionCall.willContinue !== true;\n\n if (isStreamingChunk) {\n if (part.functionCall.name != null) {\n const toolCallId = part.functionCall.id ?? generateId();\n const accumulator = new GoogleJSONAccumulator();\n activeStreamingToolCalls.push({\n toolCallId,\n toolName: part.functionCall.name,\n accumulator,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallId,\n toolName: part.functionCall.name,\n providerMetadata: providerMeta,\n });\n\n if (part.functionCall.partialArgs != null) {\n const partialArgs = part.functionCall\n .partialArgs as PartialArg[];\n const { textDelta } =\n accumulator.processPartialArgs(partialArgs);\n if (textDelta.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCallId,\n delta: textDelta,\n providerMetadata: providerMeta,\n });\n }\n if (\n part.functionCall.willContinue !== true &&\n partialArgs.every(arg => arg.willContinue !== true)\n ) {\n finishActiveStreamingToolCall(controller);\n }\n }\n } else if (\n part.functionCall.partialArgs != null &&\n activeStreamingToolCalls.length > 0\n ) {\n const active =\n activeStreamingToolCalls[\n activeStreamingToolCalls.length - 1\n ];\n const partialArgs = part.functionCall\n .partialArgs as PartialArg[];\n const { textDelta } =\n active.accumulator.processPartialArgs(partialArgs);\n if (textDelta.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: active.toolCallId,\n delta: textDelta,\n providerMetadata: providerMeta,\n });\n }\n if (\n part.functionCall.willContinue !== true &&\n partialArgs.every(arg => arg.willContinue !== true)\n ) {\n finishActiveStreamingToolCall(controller);\n }\n }\n } else if (\n isTerminalChunk &&\n activeStreamingToolCalls.length > 0\n ) {\n finishActiveStreamingToolCall(controller);\n } else if (isCompleteCall) {\n const toolCallId = part.functionCall.id ?? generateId();\n const toolName = part.functionCall.name!;\n const args =\n typeof part.functionCall.args === 'string'\n ? part.functionCall.args\n : JSON.stringify(part.functionCall.args ?? {});\n\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallId,\n toolName,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCallId,\n delta: args,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-input-end',\n id: toolCallId,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName,\n input: args,\n providerMetadata: providerMeta,\n });\n\n hasToolCalls = true;\n } else if (isNoArgsCompleteCall) {\n const toolCallId = part.functionCall.id ?? generateId();\n const toolName = part.functionCall.name!;\n\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallId,\n toolName,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-input-end',\n id: toolCallId,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName,\n input: '{}',\n providerMetadata: providerMeta,\n });\n\n hasToolCalls = true;\n }\n }\n }\n\n if (candidate.finishReason != null) {\n finishReason = {\n unified: mapGoogleFinishReason({\n finishReason: candidate.finishReason,\n hasToolCalls,\n }),\n raw: candidate.finishReason,\n };\n\n providerMetadata = wrapProviderMetadata({\n promptFeedback: value.promptFeedback ?? null,\n groundingMetadata: lastGroundingMetadata,\n urlContextMetadata: lastUrlContextMetadata,\n safetyRatings: candidate.safetyRatings ?? null,\n usageMetadata: usageMetadata ?? null,\n finishMessage: candidate.finishMessage ?? null,\n serviceTier: usage?.serviceTier ?? null,\n } satisfies GoogleProviderMetadata);\n }\n },\n\n flush(controller) {\n if (currentTextBlockId !== null) {\n controller.enqueue({\n type: 'text-end',\n id: currentTextBlockId,\n });\n }\n if (currentReasoningBlockId !== null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: currentReasoningBlockId,\n });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertGoogleUsage(usage),\n providerMetadata,\n });\n },\n }),\n ),\n response: { headers: responseHeaders },\n request: { body: args },\n };\n }\n}\n\nfunction isGemini3Model(modelId: string): boolean {\n return /gemini-3[\\.\\-]/i.test(modelId) || /gemini-3$/i.test(modelId);\n}\n\nfunction getMaxOutputTokensForGemini25Model(): number {\n return 65536;\n}\n\nfunction getMaxThinkingTokensForGemini25Model(modelId: string): number {\n const id = modelId.toLowerCase();\n if (id.includes('2.5-pro') || id.includes('gemini-3-pro-image')) {\n return 32768;\n }\n return 24576;\n}\n\ntype GoogleThinkingConfig = NonNullable<\n InferSchema<typeof googleLanguageModelOptions>['thinkingConfig']\n>;\n\nfunction resolveThinkingConfig({\n reasoning,\n modelId,\n warnings,\n}: {\n reasoning: LanguageModelV4CallOptions['reasoning'];\n modelId: string;\n warnings: SharedV4Warning[];\n}): Omit<GoogleThinkingConfig, 'includeThoughts'> | undefined {\n if (!isCustomReasoning(reasoning)) {\n return undefined;\n }\n\n if (isGemini3Model(modelId) && !modelId.includes('gemini-3-pro-image')) {\n return resolveGemini3ThinkingConfig({ reasoning, warnings });\n }\n\n return resolveGemini25ThinkingConfig({ reasoning, modelId, warnings });\n}\n\nfunction resolveGemini3ThinkingConfig({\n reasoning,\n warnings,\n}: {\n reasoning: Exclude<\n LanguageModelV4CallOptions['reasoning'],\n 'provider-default' | undefined\n >;\n warnings: SharedV4Warning[];\n}): Pick<GoogleThinkingConfig, 'thinkingLevel'> | undefined {\n if (reasoning === 'none') {\n // It's not possible to fully disable thinking with Gemini 3.\n return { thinkingLevel: 'minimal' };\n }\n\n const thinkingLevel = mapReasoningToProviderEffort({\n reasoning,\n effortMap: {\n minimal: 'minimal',\n low: 'low',\n medium: 'medium',\n high: 'high',\n xhigh: 'high',\n },\n warnings,\n });\n\n if (thinkingLevel == null) {\n return undefined;\n }\n\n return { thinkingLevel };\n}\n\nfunction resolveGemini25ThinkingConfig({\n reasoning,\n modelId,\n warnings,\n}: {\n reasoning: Exclude<\n LanguageModelV4CallOptions['reasoning'],\n 'provider-default' | undefined\n >;\n modelId: string;\n warnings: SharedV4Warning[];\n}): Pick<GoogleThinkingConfig, 'thinkingBudget'> | undefined {\n if (reasoning === 'none') {\n return { thinkingBudget: 0 };\n }\n\n const thinkingBudget = mapReasoningToProviderBudget({\n reasoning,\n maxOutputTokens: getMaxOutputTokensForGemini25Model(),\n maxReasoningBudget: getMaxThinkingTokensForGemini25Model(modelId),\n minReasoningBudget: 0,\n warnings,\n });\n if (thinkingBudget == null) {\n return undefined;\n }\n return { thinkingBudget };\n}\n\nfunction extractSources({\n groundingMetadata,\n generateId,\n}: {\n groundingMetadata: GroundingMetadataSchema | undefined | null;\n generateId: () => string;\n}): undefined | LanguageModelV4Source[] {\n if (!groundingMetadata?.groundingChunks) {\n return undefined;\n }\n\n const sources: LanguageModelV4Source[] = [];\n\n for (const chunk of groundingMetadata.groundingChunks) {\n if (chunk.web != null) {\n // Handle web chunks as URL sources\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: chunk.web.uri,\n title: chunk.web.title ?? undefined,\n });\n } else if (chunk.image != null) {\n // Handle image chunks as image sources\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n // Google requires attribution to the source URI, not the actual image URI.\n // TODO: add another type in v7 to allow both the image and source URL to be included separately\n url: chunk.image.sourceUri,\n title: chunk.image.title ?? undefined,\n });\n } else if (chunk.retrievedContext != null) {\n // Handle retrievedContext chunks from RAG operations\n const uri = chunk.retrievedContext.uri;\n const fileSearchStore = chunk.retrievedContext.fileSearchStore;\n\n if (uri && (uri.startsWith('http://') || uri.startsWith('https://'))) {\n // Old format: Google Search with HTTP/HTTPS URL\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: uri,\n title: chunk.retrievedContext.title ?? undefined,\n });\n } else if (uri) {\n // Old format: Document with file path (gs://, etc.)\n const title = chunk.retrievedContext.title ?? 'Unknown Document';\n let mediaType = 'application/octet-stream';\n let filename: string | undefined = undefined;\n\n if (uri.endsWith('.pdf')) {\n mediaType = 'application/pdf';\n filename = uri.split('/').pop();\n } else if (uri.endsWith('.txt')) {\n mediaType = 'text/plain';\n filename = uri.split('/').pop();\n } else if (uri.endsWith('.docx')) {\n mediaType =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n filename = uri.split('/').pop();\n } else if (uri.endsWith('.doc')) {\n mediaType = 'application/msword';\n filename = uri.split('/').pop();\n } else if (uri.match(/\\.(md|markdown)$/)) {\n mediaType = 'text/markdown';\n filename = uri.split('/').pop();\n } else {\n filename = uri.split('/').pop();\n }\n\n sources.push({\n type: 'source',\n sourceType: 'document',\n id: generateId(),\n mediaType,\n title,\n filename,\n });\n } else if (fileSearchStore) {\n // New format: File Search with fileSearchStore (no uri)\n const title = chunk.retrievedContext.title ?? 'Unknown Document';\n sources.push({\n type: 'source',\n sourceType: 'document',\n id: generateId(),\n mediaType: 'application/octet-stream',\n title,\n filename: fileSearchStore.split('/').pop(),\n });\n }\n } else if (chunk.maps != null) {\n if (chunk.maps.uri) {\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: chunk.maps.uri,\n title: chunk.maps.title ?? undefined,\n });\n }\n }\n }\n\n return sources.length > 0 ? sources : undefined;\n}\n\nexport const getGroundingMetadataSchema = () =>\n z.object({\n webSearchQueries: z.array(z.string()).nullish(),\n imageSearchQueries: z.array(z.string()).nullish(),\n retrievalQueries: z.array(z.string()).nullish(),\n searchEntryPoint: z.object({ renderedContent: z.string() }).nullish(),\n groundingChunks: z\n .array(\n z.object({\n web: z\n .object({ uri: z.string(), title: z.string().nullish() })\n .nullish(),\n image: z\n .object({\n sourceUri: z.string(),\n imageUri: z.string(),\n title: z.string().nullish(),\n domain: z.string().nullish(),\n })\n .nullish(),\n retrievedContext: z\n .object({\n uri: z.string().nullish(),\n title: z.string().nullish(),\n text: z.string().nullish(),\n fileSearchStore: z.string().nullish(),\n })\n .nullish(),\n maps: z\n .object({\n uri: z.string().nullish(),\n title: z.string().nullish(),\n text: z.string().nullish(),\n placeId: z.string().nullish(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n groundingSupports: z\n .array(\n z.object({\n segment: z\n .object({\n startIndex: z.number().nullish(),\n endIndex: z.number().nullish(),\n text: z.string().nullish(),\n })\n .nullish(),\n segment_text: z.string().nullish(),\n groundingChunkIndices: z.array(z.number()).nullish(),\n supportChunkIndices: z.array(z.number()).nullish(),\n confidenceScores: z.array(z.number()).nullish(),\n confidenceScore: z.array(z.number()).nullish(),\n }),\n )\n .nullish(),\n retrievalMetadata: z\n .union([\n z.object({\n webDynamicRetrievalScore: z.number(),\n }),\n z.object({}),\n ])\n .nullish(),\n });\n\nconst partialArgSchema = z.object({\n jsonPath: z.string(),\n stringValue: z.string().nullish(),\n numberValue: z.number().nullish(),\n boolValue: z.boolean().nullish(),\n nullValue: z.unknown().nullish(),\n willContinue: z.boolean().nullish(),\n});\n\nconst getContentSchema = () =>\n z.object({\n parts: z\n .array(\n z.union([\n // note: order matters since text can be fully empty\n z.object({\n functionCall: z.object({\n id: z.string().nullish(),\n name: z.string().nullish(),\n args: z.unknown().nullish(),\n partialArgs: z.array(partialArgSchema).nullish(),\n willContinue: z.boolean().nullish(),\n }),\n thoughtSignature: z.string().nullish(),\n }),\n z.object({\n inlineData: z.object({\n mimeType: z.string(),\n data: z.string(),\n }),\n thought: z.boolean().nullish(),\n thoughtSignature: z.string().nullish(),\n }),\n z.object({\n toolCall: z.object({\n toolType: z.string(),\n args: z.unknown().nullish(),\n id: z.string(),\n }),\n thoughtSignature: z.string().nullish(),\n }),\n z.object({\n toolResponse: z.object({\n toolType: z.string(),\n response: z.unknown().nullish(),\n id: z.string(),\n }),\n thoughtSignature: z.string().nullish(),\n }),\n z.object({\n executableCode: z\n .object({\n language: z.string(),\n code: z.string(),\n })\n .nullish(),\n codeExecutionResult: z\n .object({\n outcome: z.string(),\n output: z.string().nullish(),\n })\n .nullish(),\n text: z.string().nullish(),\n thought: z.boolean().nullish(),\n thoughtSignature: z.string().nullish(),\n }),\n ]),\n )\n .nullish(),\n });\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/configure-safety-filters\nconst getSafetyRatingSchema = () =>\n z.object({\n category: z.string().nullish(),\n probability: z.string().nullish(),\n probabilityScore: z.number().nullish(),\n severity: z.string().nullish(),\n severityScore: z.number().nullish(),\n blocked: z.boolean().nullish(),\n });\n\nconst tokenDetailsSchema = z\n .array(\n z.object({\n modality: z.string(),\n tokenCount: z.number(),\n }),\n )\n .nullish();\n\nconst usageSchema = z.object({\n cachedContentTokenCount: z.number().nullish(),\n thoughtsTokenCount: z.number().nullish(),\n promptTokenCount: z.number().nullish(),\n candidatesTokenCount: z.number().nullish(),\n totalTokenCount: z.number().nullish(),\n // https://cloud.google.com/vertex-ai/generative-ai/docs/reference/rest/v1/GenerateContentResponse#TrafficType\n trafficType: z.string().nullish(),\n serviceTier: z.string().nullish(),\n // https://ai.google.dev/api/generate-content#Modality\n promptTokensDetails: tokenDetailsSchema,\n candidatesTokensDetails: tokenDetailsSchema,\n});\n\n// https://ai.google.dev/api/generate-content#UrlRetrievalMetadata\nexport const getUrlContextMetadataSchema = () =>\n z.object({\n urlMetadata: z\n .array(\n z.object({\n retrievedUrl: z.string(),\n urlRetrievalStatus: z.string(),\n }),\n )\n .nullish(),\n });\n\nconst responseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n candidates: z.array(\n z.object({\n content: getContentSchema().nullish().or(z.object({}).strict()),\n finishReason: z.string().nullish(),\n finishMessage: z.string().nullish(),\n safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n groundingMetadata: getGroundingMetadataSchema().nullish(),\n urlContextMetadata: getUrlContextMetadataSchema().nullish(),\n }),\n ),\n usageMetadata: usageSchema.nullish(),\n promptFeedback: z\n .object({\n blockReason: z.string().nullish(),\n safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n })\n .nullish(),\n }),\n ),\n);\n\nexport type GroundingMetadataSchema = NonNullable<\n InferSchema<typeof responseSchema>['candidates'][number]['groundingMetadata']\n>;\n\nexport type UrlContextMetadataSchema = NonNullable<\n InferSchema<typeof responseSchema>['candidates'][number]['urlContextMetadata']\n>;\n\nexport type SafetyRatingSchema = NonNullable<\n InferSchema<typeof responseSchema>['candidates'][number]['safetyRatings']\n>[number];\n\nexport type PromptFeedbackSchema = NonNullable<\n InferSchema<typeof responseSchema>['promptFeedback']\n>;\n\nexport type UsageMetadataSchema = NonNullable<\n InferSchema<typeof responseSchema>['usageMetadata']\n>;\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst chunkSchema = lazySchema(() =>\n zodSchema(\n z.object({\n candidates: z\n .array(\n z.object({\n content: getContentSchema().nullish(),\n finishReason: z.string().nullish(),\n finishMessage: z.string().nullish(),\n safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n groundingMetadata: getGroundingMetadataSchema().nullish(),\n urlContextMetadata: getUrlContextMetadataSchema().nullish(),\n }),\n )\n .nullish(),\n usageMetadata: usageSchema.nullish(),\n promptFeedback: z\n .object({\n blockReason: z.string().nullish(),\n safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n })\n .nullish(),\n }),\n ),\n);\n\ntype ChunkSchema = InferSchema<typeof chunkSchema>;\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\n\nexport type GoogleTokenDetail = {\n modality: string;\n tokenCount: number;\n};\n\nexport type GoogleUsageMetadata = {\n promptTokenCount?: number | null;\n candidatesTokenCount?: number | null;\n totalTokenCount?: number | null;\n cachedContentTokenCount?: number | null;\n thoughtsTokenCount?: number | null;\n trafficType?: string | null;\n serviceTier?: string | null;\n promptTokensDetails?: GoogleTokenDetail[] | null;\n candidatesTokensDetails?: GoogleTokenDetail[] | null;\n};\n\nexport function convertGoogleUsage(\n usage: GoogleUsageMetadata | undefined | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n }\n\n const promptTokens = usage.promptTokenCount ?? 0;\n const candidatesTokens = usage.candidatesTokenCount ?? 0;\n const cachedContentTokens = usage.cachedContentTokenCount ?? 0;\n const thoughtsTokens = usage.thoughtsTokenCount ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cachedContentTokens,\n cacheRead: cachedContentTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: candidatesTokens + thoughtsTokens,\n text: candidatesTokens,\n reasoning: thoughtsTokens,\n },\n raw: usage,\n };\n}\n","import type { JSONSchema7Definition } from '@ai-sdk/provider';\n\n/**\n * Converts JSON Schema 7 to OpenAPI Schema 3.0\n */\nexport function convertJSONSchemaToOpenAPISchema(\n jsonSchema: JSONSchema7Definition | undefined,\n isRoot = true,\n): unknown {\n // Handle empty object schemas: undefined at root, preserved when nested\n if (jsonSchema == null) {\n return undefined;\n }\n\n if (isEmptyObjectSchema(jsonSchema)) {\n if (isRoot) {\n return undefined;\n }\n\n if (typeof jsonSchema === 'object' && jsonSchema.description) {\n return { type: 'object', description: jsonSchema.description };\n }\n return { type: 'object' };\n }\n\n if (typeof jsonSchema === 'boolean') {\n return { type: 'boolean', properties: {} };\n }\n\n const {\n type,\n description,\n required,\n properties,\n items,\n allOf,\n anyOf,\n oneOf,\n format,\n const: constValue,\n minLength,\n enum: enumValues,\n } = jsonSchema;\n\n const result: Record<string, unknown> = {};\n\n if (description) result.description = description;\n if (required) result.required = required;\n if (format) result.format = format;\n\n if (constValue !== undefined) {\n result.enum = [constValue];\n }\n\n // Handle type\n if (type) {\n if (Array.isArray(type)) {\n const hasNull = type.includes('null');\n const nonNullTypes = type.filter(t => t !== 'null');\n\n if (nonNullTypes.length === 0) {\n // Only null type\n result.type = 'null';\n } else {\n // One or more non-null types: always use anyOf\n result.anyOf = nonNullTypes.map(t => ({ type: t }));\n if (hasNull) {\n result.nullable = true;\n }\n }\n } else {\n result.type = type;\n }\n }\n\n // Handle enum\n if (enumValues !== undefined) {\n result.enum = enumValues;\n }\n\n if (properties != null) {\n result.properties = Object.entries(properties).reduce(\n (acc, [key, value]) => {\n acc[key] = convertJSONSchemaToOpenAPISchema(value, false);\n return acc;\n },\n {} as Record<string, unknown>,\n );\n }\n\n if (items) {\n result.items = Array.isArray(items)\n ? items.map(item => convertJSONSchemaToOpenAPISchema(item, false))\n : convertJSONSchemaToOpenAPISchema(items, false);\n }\n\n if (allOf) {\n result.allOf = allOf.map(item =>\n convertJSONSchemaToOpenAPISchema(item, false),\n );\n }\n if (anyOf) {\n // Handle cases where anyOf includes a null type\n if (\n anyOf.some(\n schema => typeof schema === 'object' && schema?.type === 'null',\n )\n ) {\n const nonNullSchemas = anyOf.filter(\n schema => !(typeof schema === 'object' && schema?.type === 'null'),\n );\n\n if (nonNullSchemas.length === 1) {\n // If there's only one non-null schema, convert it and make it nullable\n const converted = convertJSONSchemaToOpenAPISchema(\n nonNullSchemas[0],\n false,\n );\n if (typeof converted === 'object') {\n result.nullable = true;\n Object.assign(result, converted);\n }\n } else {\n // If there are multiple non-null schemas, keep them in anyOf\n result.anyOf = nonNullSchemas.map(item =>\n convertJSONSchemaToOpenAPISchema(item, false),\n );\n result.nullable = true;\n }\n } else {\n result.anyOf = anyOf.map(item =>\n convertJSONSchemaToOpenAPISchema(item, false),\n );\n }\n }\n if (oneOf) {\n result.oneOf = oneOf.map(item =>\n convertJSONSchemaToOpenAPISchema(item, false),\n );\n }\n\n if (minLength !== undefined) {\n result.minLength = minLength;\n }\n\n return result;\n}\n\nfunction isEmptyObjectSchema(jsonSchema: JSONSchema7Definition): boolean {\n return (\n jsonSchema != null &&\n typeof jsonSchema === 'object' &&\n jsonSchema.type === 'object' &&\n (jsonSchema.properties == null ||\n Object.keys(jsonSchema.properties).length === 0) &&\n !jsonSchema.additionalProperties\n );\n}\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4Prompt,\n type LanguageModelV4ToolResultOutput,\n} from '@ai-sdk/provider';\nimport {\n convertToBase64,\n getTopLevelMediaType,\n isFullMediaType,\n resolveFullMediaType,\n resolveProviderReference,\n} from '@ai-sdk/provider-utils';\nimport type {\n GoogleContent,\n GoogleContentPart,\n GoogleFunctionResponsePart,\n GooglePrompt,\n} from './google-prompt';\n\nconst dataUrlRegex = /^data:([^;,]+);base64,(.+)$/s;\n\nfunction parseBase64DataUrl(\n value: string,\n): { mediaType: string; data: string } | undefined {\n const match = dataUrlRegex.exec(value);\n if (match == null) {\n return undefined;\n }\n\n return {\n mediaType: match[1],\n data: match[2],\n };\n}\n\nfunction convertUrlToolResultPart(\n url: string,\n): GoogleFunctionResponsePart | undefined {\n // Per https://ai.google.dev/api/caching#FunctionResponsePart, only inline data is supported.\n // https://docs.cloud.google.com/vertex-ai/generative-ai/docs/model-reference/function-calling#functionresponsepart suggests that this\n // may be different for Vertex, but this needs to be confirmed and further tested for both APIs.\n const parsedDataUrl = parseBase64DataUrl(url);\n if (parsedDataUrl == null) {\n return undefined;\n }\n\n return {\n inlineData: {\n mimeType: parsedDataUrl.mediaType,\n data: parsedDataUrl.data,\n },\n };\n}\n\n/*\n * Appends tool result content parts to the message using the functionResponse\n * format with support for multimodal parts (e.g. inline images/files alongside\n * text). This format is supported by Gemini 3+ models.\n */\nfunction appendToolResultParts(\n parts: GoogleContentPart[],\n toolName: string,\n outputValue: Extract<\n LanguageModelV4ToolResultOutput,\n { type: 'content' }\n >['value'],\n toolCallId?: string,\n): void {\n const functionResponseParts: GoogleFunctionResponsePart[] = [];\n const responseTextParts: string[] = [];\n\n for (const contentPart of outputValue) {\n switch (contentPart.type) {\n case 'text': {\n responseTextParts.push(contentPart.text);\n break;\n }\n case 'file': {\n if (contentPart.data.type === 'data') {\n functionResponseParts.push({\n inlineData: {\n mimeType: resolveFullMediaType({ part: contentPart }),\n data: convertToBase64(contentPart.data.data),\n },\n });\n } else if (contentPart.data.type === 'url') {\n const functionResponsePart = convertUrlToolResultPart(\n contentPart.data.url.toString(),\n );\n\n if (functionResponsePart != null) {\n functionResponseParts.push(functionResponsePart);\n } else {\n responseTextParts.push(JSON.stringify(contentPart));\n }\n } else {\n responseTextParts.push(JSON.stringify(contentPart));\n }\n break;\n }\n default: {\n responseTextParts.push(JSON.stringify(contentPart));\n break;\n }\n }\n }\n\n parts.push({\n functionResponse: {\n ...(toolCallId != null ? { id: toolCallId } : {}),\n name: toolName,\n response: {\n name: toolName,\n content:\n responseTextParts.length > 0\n ? responseTextParts.join('\\n')\n : 'Tool executed successfully.',\n },\n ...(functionResponseParts.length > 0\n ? { parts: functionResponseParts }\n : {}),\n },\n });\n}\n\n/*\n * Appends tool result content parts using a legacy format for pre-Gemini 3\n * models that do not support multimodal parts within functionResponse. Instead,\n * non-text content like images is sent as separate top-level inlineData parts.\n */\nfunction appendLegacyToolResultParts(\n parts: GoogleContentPart[],\n toolName: string,\n outputValue: Extract<\n LanguageModelV4ToolResultOutput,\n { type: 'content' }\n >['value'],\n toolCallId?: string,\n): void {\n for (const contentPart of outputValue) {\n switch (contentPart.type) {\n case 'text':\n parts.push({\n functionResponse: {\n ...(toolCallId != null ? { id: toolCallId } : {}),\n name: toolName,\n response: {\n name: toolName,\n content: contentPart.text,\n },\n },\n });\n break;\n case 'file': {\n if (\n contentPart.data.type === 'data' &&\n getTopLevelMediaType(contentPart.mediaType) === 'image'\n ) {\n parts.push(\n {\n inlineData: {\n mimeType: resolveFullMediaType({ part: contentPart }),\n data: convertToBase64(contentPart.data.data),\n },\n },\n {\n text: 'Tool executed successfully and returned this image as a response',\n },\n );\n } else {\n parts.push({ text: JSON.stringify(contentPart) });\n }\n break;\n }\n default:\n parts.push({ text: JSON.stringify(contentPart) });\n break;\n }\n }\n}\n\nexport function convertToGoogleMessages(\n prompt: LanguageModelV4Prompt,\n options?: {\n isGemmaModel?: boolean;\n /**\n * Names to look up under `providerOptions` when reading per-part metadata\n * (e.g. thought signatures). Tried in order; first match wins. For the\n * Vertex provider this is `['googleVertex', 'vertex']` (new key first,\n * legacy key as fallback) and for the Google provider it is `['google']`.\n */\n providerOptionsNames?: readonly string[];\n supportsFunctionResponseParts?: boolean;\n },\n): GooglePrompt {\n const systemInstructionParts: Array<{ text: string }> = [];\n const contents: Array<GoogleContent> = [];\n let systemMessagesAllowed = true;\n const isGemmaModel = options?.isGemmaModel ?? false;\n const providerOptionsNames = options?.providerOptionsNames ?? ['google'];\n const isVertexLike = !providerOptionsNames.includes('google');\n const supportsFunctionResponseParts =\n options?.supportsFunctionResponseParts ?? true;\n\n const readProviderOpts = (part: {\n providerOptions?: Record<string, unknown> | undefined;\n }): Record<string, unknown> | undefined => {\n for (const name of providerOptionsNames) {\n const v = part.providerOptions?.[name];\n if (v != null) return v as Record<string, unknown>;\n }\n // Cross-namespace fallback (gateway interop): Vertex providers may receive\n // metadata under `google`, and the Google provider may receive metadata\n // under `googleVertex`/`vertex`.\n if (isVertexLike) {\n return part.providerOptions?.google as\n | Record<string, unknown>\n | undefined;\n }\n return (part.providerOptions?.googleVertex ??\n part.providerOptions?.vertex) as Record<string, unknown> | undefined;\n };\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n if (!systemMessagesAllowed) {\n throw new UnsupportedFunctionalityError({\n functionality:\n 'system messages are only supported at the beginning of the conversation',\n });\n }\n\n systemInstructionParts.push({ text: content });\n break;\n }\n\n case 'user': {\n systemMessagesAllowed = false;\n\n const parts: GoogleContentPart[] = [];\n\n for (const part of content) {\n switch (part.type) {\n case 'text': {\n parts.push({ text: part.text });\n break;\n }\n\n case 'file': {\n switch (part.data.type) {\n case 'url': {\n parts.push({\n fileData: {\n mimeType: resolveFullMediaType({ part }),\n fileUri: part.data.url.toString(),\n },\n });\n break;\n }\n case 'reference': {\n if (isVertexLike) {\n throw new UnsupportedFunctionalityError({\n functionality: 'file parts with provider references',\n });\n }\n\n parts.push({\n fileData: {\n mimeType: resolveFullMediaType({ part }),\n fileUri: resolveProviderReference({\n reference: part.data.reference,\n provider: 'google',\n }),\n },\n });\n break;\n }\n case 'text': {\n parts.push({\n inlineData: {\n mimeType: isFullMediaType(part.mediaType)\n ? part.mediaType\n : 'text/plain',\n data: convertToBase64(\n new TextEncoder().encode(part.data.text),\n ),\n },\n });\n break;\n }\n case 'data': {\n parts.push({\n inlineData: {\n mimeType: resolveFullMediaType({ part }),\n data: convertToBase64(part.data.data),\n },\n });\n break;\n }\n }\n\n break;\n }\n }\n }\n\n contents.push({ role: 'user', parts });\n break;\n }\n\n case 'assistant': {\n systemMessagesAllowed = false;\n\n contents.push({\n role: 'model',\n parts: content\n .map(part => {\n const providerOpts = readProviderOpts(part);\n const thoughtSignature =\n providerOpts?.thoughtSignature != null\n ? String(providerOpts.thoughtSignature)\n : undefined;\n\n switch (part.type) {\n case 'text': {\n return part.text.length === 0\n ? undefined\n : {\n text: part.text,\n thoughtSignature,\n };\n }\n\n case 'reasoning': {\n return part.text.length === 0\n ? undefined\n : {\n text: part.text,\n thought: true,\n thoughtSignature,\n };\n }\n\n case 'reasoning-file': {\n switch (part.data.type) {\n case 'url': {\n throw new UnsupportedFunctionalityError({\n functionality:\n 'File data URLs in assistant messages are not supported',\n });\n }\n case 'data': {\n return {\n inlineData: {\n mimeType: part.mediaType,\n data: convertToBase64(part.data.data),\n },\n thought: true,\n thoughtSignature,\n };\n }\n }\n break;\n }\n\n case 'file': {\n switch (part.data.type) {\n case 'url': {\n throw new UnsupportedFunctionalityError({\n functionality:\n 'File data URLs in assistant messages are not supported',\n });\n }\n case 'reference': {\n if (isVertexLike) {\n throw new UnsupportedFunctionalityError({\n functionality: 'file parts with provider references',\n });\n }\n\n return {\n fileData: {\n mimeType: part.mediaType,\n fileUri: resolveProviderReference({\n reference: part.data.reference,\n provider: 'google',\n }),\n },\n ...(providerOpts?.thought === true\n ? { thought: true }\n : {}),\n thoughtSignature,\n };\n }\n case 'text': {\n return {\n inlineData: {\n mimeType: isFullMediaType(part.mediaType)\n ? part.mediaType\n : 'text/plain',\n data: convertToBase64(\n new TextEncoder().encode(part.data.text),\n ),\n },\n ...(providerOpts?.thought === true\n ? { thought: true }\n : {}),\n thoughtSignature,\n };\n }\n case 'data': {\n return {\n inlineData: {\n mimeType: part.mediaType,\n data: convertToBase64(part.data.data),\n },\n ...(providerOpts?.thought === true\n ? { thought: true }\n : {}),\n thoughtSignature,\n };\n }\n }\n break;\n }\n\n case 'tool-call': {\n const serverToolCallId =\n providerOpts?.serverToolCallId != null\n ? String(providerOpts.serverToolCallId)\n : undefined;\n const serverToolType =\n providerOpts?.serverToolType != null\n ? String(providerOpts.serverToolType)\n : undefined;\n\n if (serverToolCallId && serverToolType) {\n return {\n toolCall: {\n toolType: serverToolType,\n args:\n typeof part.input === 'string'\n ? JSON.parse(part.input)\n : part.input,\n id: serverToolCallId,\n },\n thoughtSignature,\n };\n }\n\n return {\n functionCall: {\n ...(part.toolCallId != null\n ? { id: part.toolCallId }\n : {}),\n name: part.toolName,\n args: part.input,\n },\n thoughtSignature,\n };\n }\n\n case 'tool-result': {\n const serverToolCallId =\n providerOpts?.serverToolCallId != null\n ? String(providerOpts.serverToolCallId)\n : undefined;\n const serverToolType =\n providerOpts?.serverToolType != null\n ? String(providerOpts.serverToolType)\n : undefined;\n\n if (serverToolCallId && serverToolType) {\n return {\n toolResponse: {\n toolType: serverToolType,\n response:\n part.output.type === 'json' ? part.output.value : {},\n id: serverToolCallId,\n },\n thoughtSignature,\n };\n }\n\n return undefined;\n }\n }\n })\n .filter(part => part !== undefined),\n });\n\n break;\n }\n\n case 'tool': {\n systemMessagesAllowed = false;\n\n const parts: GoogleContentPart[] = [];\n\n for (const part of content) {\n if (part.type === 'tool-approval-response') {\n continue;\n }\n\n const partProviderOpts = readProviderOpts(part);\n const serverToolCallId =\n partProviderOpts?.serverToolCallId != null\n ? String(partProviderOpts.serverToolCallId)\n : undefined;\n const serverToolType =\n partProviderOpts?.serverToolType != null\n ? String(partProviderOpts.serverToolType)\n : undefined;\n\n if (serverToolCallId && serverToolType) {\n const serverThoughtSignature =\n partProviderOpts?.thoughtSignature != null\n ? String(partProviderOpts.thoughtSignature)\n : undefined;\n\n if (contents.length > 0) {\n const lastContent = contents[contents.length - 1];\n if (lastContent.role === 'model') {\n lastContent.parts.push({\n toolResponse: {\n toolType: serverToolType,\n response:\n part.output.type === 'json' ? part.output.value : {},\n id: serverToolCallId,\n },\n thoughtSignature: serverThoughtSignature,\n });\n continue;\n }\n }\n }\n\n const output = part.output;\n\n if (output.type === 'content') {\n if (supportsFunctionResponseParts) {\n appendToolResultParts(\n parts,\n part.toolName,\n output.value,\n part.toolCallId,\n );\n } else {\n appendLegacyToolResultParts(\n parts,\n part.toolName,\n output.value,\n part.toolCallId,\n );\n }\n } else {\n parts.push({\n functionResponse: {\n ...(part.toolCallId != null ? { id: part.toolCallId } : {}),\n name: part.toolName,\n response: {\n name: part.toolName,\n content:\n output.type === 'execution-denied'\n ? (output.reason ?? 'Tool call execution denied.')\n : output.value,\n },\n },\n });\n }\n }\n\n contents.push({\n role: 'user',\n parts,\n });\n break;\n }\n }\n }\n\n if (\n isGemmaModel &&\n systemInstructionParts.length > 0 &&\n contents.length > 0 &&\n contents[0].role === 'user'\n ) {\n const systemText = systemInstructionParts\n .map(part => part.text)\n .join('\\n\\n');\n\n contents[0].parts.unshift({ text: systemText + '\\n\\n' });\n }\n\n return {\n systemInstruction:\n systemInstructionParts.length > 0 && !isGemmaModel\n ? { parts: systemInstructionParts }\n : undefined,\n contents,\n };\n}\n","export function getModelPath(modelId: string): string {\n return modelId.includes('/') ? modelId : `models/${modelId}`;\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type GoogleModelId =\n // Stable models\n // https://ai.google.dev/gemini-api/docs/models/gemini\n | 'gemini-2.0-flash'\n | 'gemini-2.0-flash-001'\n | 'gemini-2.0-flash-lite'\n | 'gemini-2.0-flash-lite-001'\n | 'gemini-2.5-pro'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-flash-image'\n | 'gemini-2.5-flash-lite'\n | 'gemini-2.5-flash-preview-tts'\n | 'gemini-2.5-pro-preview-tts'\n | 'gemini-2.5-flash-native-audio-latest'\n | 'gemini-2.5-flash-native-audio-preview-09-2025'\n | 'gemini-2.5-flash-native-audio-preview-12-2025'\n | 'gemini-2.5-computer-use-preview-10-2025'\n | 'gemini-3-pro-preview'\n | 'gemini-3-pro-image-preview'\n | 'gemini-3-flash-preview'\n | 'gemini-3.1-pro-preview'\n | 'gemini-3.1-pro-preview-customtools'\n | 'gemini-3.1-flash-image-preview'\n | 'gemini-3.1-flash-lite-preview'\n | 'gemini-3.1-flash-tts-preview'\n | 'gemini-3.5-flash'\n // latest version\n // https://ai.google.dev/gemini-api/docs/models#latest\n | 'gemini-pro-latest'\n | 'gemini-flash-latest'\n | 'gemini-flash-lite-latest'\n | 'deep-research-pro-preview-12-2025'\n | 'nano-banana-pro-preview'\n | 'aqa'\n // Experimental models\n // https://ai.google.dev/gemini-api/docs/models/experimental-models\n | 'gemini-robotics-er-1.5-preview'\n | 'gemma-3-1b-it'\n | 'gemma-3-4b-it'\n | 'gemma-3n-e4b-it'\n | 'gemma-3n-e2b-it'\n | 'gemma-3-12b-it'\n | 'gemma-3-27b-it'\n | (string & {});\n\nexport const googleLanguageModelOptions = lazySchema(() =>\n zodSchema(\n z.object({\n responseModalities: z.array(z.enum(['TEXT', 'IMAGE'])).optional(),\n\n thinkingConfig: z\n .object({\n thinkingBudget: z.number().optional(),\n includeThoughts: z.boolean().optional(),\n // https://ai.google.dev/gemini-api/docs/gemini-3?thinking=high#thinking_level\n thinkingLevel: z\n .enum(['minimal', 'low', 'medium', 'high'])\n .optional(),\n })\n .optional(),\n\n /**\n * Optional.\n * The name of the cached content used as context to serve the prediction.\n * Format: cachedContents/{cachedContent}\n */\n cachedContent: z.string().optional(),\n\n /**\n * Optional. Enable structured output. Default is true.\n *\n * This is useful when the JSON Schema contains elements that are\n * not supported by the OpenAPI schema version that\n * Google uses. You can use this to disable\n * structured outputs if you need to.\n */\n structuredOutputs: z.boolean().optional(),\n\n /**\n * Optional. A list of unique safety settings for blocking unsafe content.\n */\n safetySettings: z\n .array(\n z.object({\n category: z.enum([\n 'HARM_CATEGORY_UNSPECIFIED',\n 'HARM_CATEGORY_HATE_SPEECH',\n 'HARM_CATEGORY_DANGEROUS_CONTENT',\n 'HARM_CATEGORY_HARASSMENT',\n 'HARM_CATEGORY_SEXUALLY_EXPLICIT',\n 'HARM_CATEGORY_CIVIC_INTEGRITY',\n ]),\n threshold: z.enum([\n 'HARM_BLOCK_THRESHOLD_UNSPECIFIED',\n 'BLOCK_LOW_AND_ABOVE',\n 'BLOCK_MEDIUM_AND_ABOVE',\n 'BLOCK_ONLY_HIGH',\n 'BLOCK_NONE',\n 'OFF',\n ]),\n }),\n )\n .optional(),\n\n threshold: z\n .enum([\n 'HARM_BLOCK_THRESHOLD_UNSPECIFIED',\n 'BLOCK_LOW_AND_ABOVE',\n 'BLOCK_MEDIUM_AND_ABOVE',\n 'BLOCK_ONLY_HIGH',\n 'BLOCK_NONE',\n 'OFF',\n ])\n .optional(),\n\n /**\n * Optional. Enables timestamp understanding for audio-only files.\n *\n * https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/audio-understanding\n */\n audioTimestamp: z.boolean().optional(),\n\n /**\n * Optional. Defines labels used in billing reports. Available on Vertex AI only.\n *\n * https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/add-labels-to-api-calls\n */\n labels: z.record(z.string(), z.string()).optional(),\n\n /**\n * Optional. If specified, the media resolution specified will be used.\n *\n * https://ai.google.dev/api/generate-content#MediaResolution\n */\n mediaResolution: z\n .enum([\n 'MEDIA_RESOLUTION_UNSPECIFIED',\n 'MEDIA_RESOLUTION_LOW',\n 'MEDIA_RESOLUTION_MEDIUM',\n 'MEDIA_RESOLUTION_HIGH',\n ])\n .optional(),\n\n /**\n * Optional. Configures the image generation aspect ratio for Gemini models.\n *\n * https://ai.google.dev/gemini-api/docs/image-generation#aspect_ratios\n */\n imageConfig: z\n .object({\n aspectRatio: z\n .enum([\n '1:1',\n '2:3',\n '3:2',\n '3:4',\n '4:3',\n '4:5',\n '5:4',\n '9:16',\n '16:9',\n '21:9',\n '1:8',\n '8:1',\n '1:4',\n '4:1',\n ])\n .optional(),\n imageSize: z.enum(['1K', '2K', '4K', '512']).optional(),\n })\n .optional(),\n\n /**\n * Optional. Configuration for grounding retrieval.\n * Used to provide location context for Google Maps and Google Search grounding.\n *\n * https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-maps\n */\n retrievalConfig: z\n .object({\n latLng: z\n .object({\n latitude: z.number(),\n longitude: z.number(),\n })\n .optional(),\n })\n .optional(),\n\n /**\n * Optional. When set to true, function call arguments will be streamed\n * incrementally via partialArgs in streaming responses. Only supported\n * on the Vertex AI API (not the Gemini API) and only for Gemini 3+\n * models.\n *\n * @default false\n *\n * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling#streaming-fc\n */\n streamFunctionCallArguments: z.boolean().optional(),\n\n /**\n * Optional. The service tier to use for the request. Sent as the\n * `serviceTier` body field. Gemini API only.\n */\n serviceTier: z.enum(['standard', 'flex', 'priority']).optional(),\n\n /**\n * Optional. Vertex AI only. Sent as the\n * `X-Vertex-AI-LLM-Shared-Request-Type` request header to select a\n * shared (PayGo) tier. With Provisioned Throughput allocated and\n * `requestType` unset, the request falls back to this tier only if\n * PT capacity is exhausted.\n *\n * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/priority-paygo\n * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/flex-paygo\n */\n sharedRequestType: z.enum(['priority', 'flex', 'standard']).optional(),\n\n /**\n * Optional. Vertex AI only. Sent as the `X-Vertex-AI-LLM-Request-Type`\n * request header. Set to `'shared'` together with `sharedRequestType`\n * to bypass Provisioned Throughput entirely.\n *\n * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/priority-paygo\n */\n requestType: z.enum(['shared']).optional(),\n }),\n ),\n);\n\nexport type GoogleLanguageModelOptions = InferSchema<\n typeof googleLanguageModelOptions\n>;\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4CallOptions,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport { convertJSONSchemaToOpenAPISchema } from './convert-json-schema-to-openapi-schema';\nimport type { GoogleModelId } from './google-language-model-options';\n\nexport function prepareTools({\n tools,\n toolChoice,\n modelId,\n isVertexProvider = false,\n}: {\n tools: LanguageModelV4CallOptions['tools'];\n toolChoice?: LanguageModelV4CallOptions['toolChoice'];\n modelId: GoogleModelId;\n isVertexProvider?: boolean;\n}): {\n tools:\n | Array<\n | {\n functionDeclarations: Array<{\n name: string;\n description: string;\n parameters: unknown;\n }>;\n }\n | Record<string, any>\n >\n | undefined;\n toolConfig:\n | undefined\n | {\n functionCallingConfig?: {\n mode: 'AUTO' | 'NONE' | 'ANY' | 'VALIDATED';\n allowedFunctionNames?: string[];\n streamFunctionCallArguments?: boolean;\n };\n includeServerSideToolInvocations?: boolean;\n };\n toolWarnings: SharedV4Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV4Warning[] = [];\n\n const isLatest = (\n [\n 'gemini-flash-latest',\n 'gemini-flash-lite-latest',\n 'gemini-pro-latest',\n ] as const satisfies GoogleModelId[]\n ).some(id => id === modelId);\n const isGemini2orNewer =\n modelId.includes('gemini-2') ||\n modelId.includes('gemini-3') ||\n modelId.includes('nano-banana') ||\n isLatest;\n const isGemini3orNewer = modelId.includes('gemini-3');\n const supportsFileSearch =\n modelId.includes('gemini-2.5') || modelId.includes('gemini-3');\n\n if (tools == null) {\n return { tools: undefined, toolConfig: undefined, toolWarnings };\n }\n\n // Check for mixed tool types and add warnings\n const hasFunctionTools = tools.some(tool => tool.type === 'function');\n const hasProviderTools = tools.some(tool => tool.type === 'provider');\n\n if (hasFunctionTools && hasProviderTools && !isGemini3orNewer) {\n toolWarnings.push({\n type: 'unsupported',\n feature: `combination of function and provider-defined tools`,\n });\n }\n\n if (hasProviderTools) {\n const googleTools: any[] = [];\n\n const ProviderTools = tools.filter(tool => tool.type === 'provider');\n ProviderTools.forEach(tool => {\n switch (tool.id) {\n case 'google.google_search':\n if (isGemini2orNewer) {\n googleTools.push({ googleSearch: { ...tool.args } });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details: 'Google Search requires Gemini 2.0 or newer.',\n });\n }\n break;\n case 'google.enterprise_web_search':\n if (isGemini2orNewer) {\n googleTools.push({ enterpriseWebSearch: {} });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details: 'Enterprise Web Search requires Gemini 2.0 or newer.',\n });\n }\n break;\n case 'google.url_context':\n if (isGemini2orNewer) {\n googleTools.push({ urlContext: {} });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details:\n 'The URL context tool is not supported with other Gemini models than Gemini 2.',\n });\n }\n break;\n case 'google.code_execution':\n if (isGemini2orNewer) {\n googleTools.push({ codeExecution: {} });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details:\n 'The code execution tool is not supported with other Gemini models than Gemini 2.',\n });\n }\n break;\n case 'google.file_search':\n if (supportsFileSearch) {\n googleTools.push({ fileSearch: { ...tool.args } });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details:\n 'The file search tool is only supported with Gemini 2.5 models and Gemini 3 models.',\n });\n }\n break;\n case 'google.vertex_rag_store':\n if (isGemini2orNewer) {\n googleTools.push({\n retrieval: {\n vertex_rag_store: {\n rag_resources: {\n rag_corpus: tool.args.ragCorpus,\n },\n similarity_top_k: tool.args.topK as number | undefined,\n },\n },\n });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details:\n 'The RAG store tool is not supported with other Gemini models than Gemini 2.',\n });\n }\n break;\n case 'google.google_maps':\n if (isGemini2orNewer) {\n googleTools.push({ googleMaps: {} });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details:\n 'The Google Maps grounding tool is not supported with Gemini models other than Gemini 2 or newer.',\n });\n }\n break;\n default:\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n });\n break;\n }\n });\n\n if (hasFunctionTools && isGemini3orNewer && googleTools.length > 0) {\n const functionDeclarations: Array<{\n name: string;\n description: string;\n parameters: unknown;\n }> = [];\n for (const tool of tools) {\n if (tool.type === 'function') {\n functionDeclarations.push({\n name: tool.name,\n description: tool.description ?? '',\n parameters: convertJSONSchemaToOpenAPISchema(tool.inputSchema),\n });\n }\n }\n\n const combinedToolConfig: {\n functionCallingConfig: {\n mode: 'VALIDATED' | 'ANY' | 'NONE';\n allowedFunctionNames?: string[];\n };\n includeServerSideToolInvocations?: true;\n } = {\n functionCallingConfig: { mode: 'VALIDATED' },\n ...(!isVertexProvider && {\n includeServerSideToolInvocations: true,\n }),\n };\n\n if (toolChoice != null) {\n switch (toolChoice.type) {\n case 'auto':\n break;\n case 'none':\n combinedToolConfig.functionCallingConfig = { mode: 'NONE' };\n break;\n case 'required':\n combinedToolConfig.functionCallingConfig = { mode: 'ANY' };\n break;\n case 'tool':\n combinedToolConfig.functionCallingConfig = {\n mode: 'ANY',\n allowedFunctionNames: [toolChoice.toolName],\n };\n break;\n }\n }\n\n return {\n tools: [...googleTools, { functionDeclarations }],\n toolConfig: combinedToolConfig,\n toolWarnings,\n };\n }\n\n return {\n tools: googleTools.length > 0 ? googleTools : undefined,\n toolConfig: undefined,\n toolWarnings,\n };\n }\n\n const functionDeclarations = [];\n let hasStrictTools = false;\n for (const tool of tools) {\n switch (tool.type) {\n case 'function':\n functionDeclarations.push({\n name: tool.name,\n description: tool.description ?? '',\n parameters: convertJSONSchemaToOpenAPISchema(tool.inputSchema),\n });\n if (tool.strict === true) {\n hasStrictTools = true;\n }\n break;\n default:\n toolWarnings.push({\n type: 'unsupported',\n feature: `function tool ${tool.name}`,\n });\n break;\n }\n }\n\n if (toolChoice == null) {\n return {\n tools: [{ functionDeclarations }],\n toolConfig: hasStrictTools\n ? { functionCallingConfig: { mode: 'VALIDATED' } }\n : undefined,\n toolWarnings,\n };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n return {\n tools: [{ functionDeclarations }],\n toolConfig: {\n functionCallingConfig: {\n mode: hasStrictTools ? 'VALIDATED' : 'AUTO',\n },\n },\n toolWarnings,\n };\n case 'none':\n return {\n tools: [{ functionDeclarations }],\n toolConfig: { functionCallingConfig: { mode: 'NONE' } },\n toolWarnings,\n };\n case 'required':\n return {\n tools: [{ functionDeclarations }],\n toolConfig: {\n functionCallingConfig: {\n mode: hasStrictTools ? 'VALIDATED' : 'ANY',\n },\n },\n toolWarnings,\n };\n case 'tool':\n return {\n tools: [{ functionDeclarations }],\n toolConfig: {\n functionCallingConfig: {\n mode: hasStrictTools ? 'VALIDATED' : 'ANY',\n allowedFunctionNames: [toolChoice.toolName],\n },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n","export type PartialArg = {\n jsonPath: string;\n stringValue?: string | null;\n numberValue?: number | null;\n boolValue?: boolean | null;\n nullValue?: unknown;\n willContinue?: boolean | null;\n};\n\ntype PathSegment = string | number;\n\ntype StackEntry = {\n segment: PathSegment;\n isArray: boolean;\n childCount: number;\n};\n\n/**\n * Incrementally builds a JSON object from Google's streaming `partialArgs`\n * chunks emitted during tool-call function calling. Tracks both the structured\n * object and a running JSON text representation so callers can emit text deltas\n * that, when concatenated, form valid nested JSON matching JSON.stringify output.\n *\n * Input: [{jsonPath:\"$.location\",stringValue:\"Boston\"}]\n * Output: '{\"location\":\"Boston\"', then finalize() → closingDelta='}'\n */\nexport class GoogleJSONAccumulator {\n private accumulatedArgs: Record<string, unknown> = {};\n private jsonText = '';\n\n /**\n * Stack representing the currently \"open\" containers in the JSON output.\n * Entry 0 is always the root `{` object once the first value is written.\n */\n private pathStack: StackEntry[] = [];\n\n /**\n * Whether a string value is currently \"open\" (willContinue was true),\n * meaning the closing quote has not yet been emitted.\n */\n private stringOpen = false;\n\n /**\n * Input: [{jsonPath:\"$.brightness\",numberValue:50}]\n * Output: { currentJSON:{brightness:50}, textDelta:'{\"brightness\":50' }\n */\n processPartialArgs(partialArgs: PartialArg[]): {\n currentJSON: Record<string, unknown>;\n textDelta: string;\n } {\n let delta = '';\n\n for (const arg of partialArgs) {\n const rawPath = arg.jsonPath.replace(/^\\$\\./, '');\n if (!rawPath) continue;\n\n const segments = parsePath(rawPath);\n\n const existingValue = getNestedValue(this.accumulatedArgs, segments);\n const isStringContinuation =\n arg.stringValue != null && existingValue !== undefined;\n\n if (isStringContinuation) {\n const escaped = JSON.stringify(arg.stringValue).slice(1, -1);\n setNestedValue(\n this.accumulatedArgs,\n segments,\n (existingValue as string) + arg.stringValue,\n );\n delta += escaped;\n continue;\n }\n\n const resolved = resolvePartialArgValue(arg);\n if (resolved == null) continue;\n\n setNestedValue(this.accumulatedArgs, segments, resolved.value);\n delta += this.emitNavigationTo(segments, arg, resolved.json);\n }\n\n this.jsonText += delta;\n\n return {\n currentJSON: this.accumulatedArgs,\n textDelta: delta,\n };\n }\n\n /**\n * Input: jsonText='{\"brightness\":50', accumulatedArgs={brightness:50}\n * Output: { finalJSON:'{\"brightness\":50}', closingDelta:'}' }\n */\n finalize(): { finalJSON: string; closingDelta: string } {\n const finalArgs = JSON.stringify(this.accumulatedArgs);\n const closingDelta = finalArgs.slice(this.jsonText.length);\n return { finalJSON: finalArgs, closingDelta };\n }\n\n /**\n * Input: pathStack=[] (first call) or pathStack=[root,...] (subsequent calls)\n * Output: '{' (first call) or '' (subsequent calls)\n */\n private ensureRoot(): string {\n if (this.pathStack.length === 0) {\n this.pathStack.push({ segment: '', isArray: false, childCount: 0 });\n return '{';\n }\n return '';\n }\n\n /**\n * Emits the JSON text fragment needed to navigate from the current open\n * path to the new leaf at `targetSegments`, then writes the value.\n *\n * Input: targetSegments=[\"recipe\",\"name\"], arg={jsonPath:\"$.recipe.name\",stringValue:\"Lasagna\"}, valueJson='\"Lasagna\"'\n * Output: '{\"recipe\":{\"name\":\"Lasagna\"'\n */\n private emitNavigationTo(\n targetSegments: PathSegment[],\n arg: PartialArg,\n valueJson: string,\n ): string {\n let fragment = '';\n\n if (this.stringOpen) {\n fragment += '\"';\n this.stringOpen = false;\n }\n\n fragment += this.ensureRoot();\n\n const targetContainerSegments = targetSegments.slice(0, -1);\n const leafSegment = targetSegments[targetSegments.length - 1];\n\n const commonDepth = this.findCommonStackDepth(targetContainerSegments);\n\n fragment += this.closeDownTo(commonDepth);\n fragment += this.openDownTo(targetContainerSegments, leafSegment);\n fragment += this.emitLeaf(leafSegment, arg, valueJson);\n\n return fragment;\n }\n\n /**\n * Returns the stack depth to preserve when navigating to a new target\n * container path. Always >= 1 (the root is never popped).\n *\n * Input: stack=[root,\"recipe\",\"ingredients\",0], target=[\"recipe\",\"ingredients\",1]\n * Output: 3 (keep root+\"recipe\"+\"ingredients\")\n */\n private findCommonStackDepth(targetContainer: PathSegment[]): number {\n const maxDepth = Math.min(\n this.pathStack.length - 1,\n targetContainer.length,\n );\n let common = 0;\n for (let i = 0; i < maxDepth; i++) {\n if (this.pathStack[i + 1].segment === targetContainer[i]) {\n common++;\n } else {\n break;\n }\n }\n return common + 1;\n }\n\n /**\n * Closes containers from the current stack depth back down to `targetDepth`.\n *\n * Input: this.pathStack=[root,\"recipe\",\"ingredients\",0], targetDepth=3\n * Output: '}'\n */\n private closeDownTo(targetDepth: number): string {\n let fragment = '';\n while (this.pathStack.length > targetDepth) {\n const entry = this.pathStack.pop()!;\n fragment += entry.isArray ? ']' : '}';\n }\n return fragment;\n }\n\n /**\n * Opens containers from the current stack depth down to the full target\n * container path, emitting opening `{`, `[`, keys, and commas as needed.\n * `leafSegment` is used to determine if the innermost container is an array.\n *\n * Input: this.pathStack=[root], targetContainer=[\"recipe\",\"ingredients\"], leafSegment=0\n * Output: '\"recipe\":{\"ingredients\":['\n */\n private openDownTo(\n targetContainer: PathSegment[],\n leafSegment: PathSegment,\n ): string {\n let fragment = '';\n\n const startIdx = this.pathStack.length - 1;\n\n for (let i = startIdx; i < targetContainer.length; i++) {\n const seg = targetContainer[i];\n const parentEntry = this.pathStack[this.pathStack.length - 1];\n\n if (parentEntry.childCount > 0) {\n fragment += ',';\n }\n parentEntry.childCount++;\n\n if (typeof seg === 'string') {\n fragment += `${JSON.stringify(seg)}:`;\n }\n\n const childSeg =\n i + 1 < targetContainer.length ? targetContainer[i + 1] : leafSegment;\n const isArray = typeof childSeg === 'number';\n\n fragment += isArray ? '[' : '{';\n\n this.pathStack.push({ segment: seg, isArray, childCount: 0 });\n }\n\n return fragment;\n }\n\n /**\n * Emits the comma, key, and value for a leaf entry in the current container.\n *\n * Input: leafSegment=\"name\", arg={stringValue:\"Lasagna\"}, valueJson='\"Lasagna\"'\n * Output: '\"name\":\"Lasagna\"' (or ',\"name\":\"Lasagna\"' if container.childCount > 0)\n */\n private emitLeaf(\n leafSegment: PathSegment,\n arg: PartialArg,\n valueJson: string,\n ): string {\n let fragment = '';\n const container = this.pathStack[this.pathStack.length - 1];\n\n if (container.childCount > 0) {\n fragment += ',';\n }\n container.childCount++;\n\n if (typeof leafSegment === 'string') {\n fragment += `${JSON.stringify(leafSegment)}:`;\n }\n\n if (arg.stringValue != null && arg.willContinue) {\n fragment += valueJson.slice(0, -1);\n this.stringOpen = true;\n } else {\n fragment += valueJson;\n }\n\n return fragment;\n }\n}\n\n/**\n * Splits a dotted/bracketed JSON path like `recipe.ingredients[0].name` into segments.\n *\n * Input: \"recipe.ingredients[0].name\"\n * Output: [\"recipe\", \"ingredients\", 0, \"name\"]\n */\nfunction parsePath(rawPath: string): Array<string | number> {\n const segments: Array<string | number> = [];\n for (const part of rawPath.split('.')) {\n const bracketIdx = part.indexOf('[');\n if (bracketIdx === -1) {\n segments.push(part);\n } else {\n if (bracketIdx > 0) segments.push(part.slice(0, bracketIdx));\n for (const m of part.matchAll(/\\[(\\d+)\\]/g)) {\n segments.push(parseInt(m[1], 10));\n }\n }\n }\n return segments;\n}\n\n/**\n * Traverses a nested object along the given path segments and returns the leaf value.\n *\n * Input: ({recipe:{name:\"Lasagna\"}}, [\"recipe\",\"name\"])\n * Output: \"Lasagna\"\n */\nfunction getNestedValue(\n obj: Record<string, unknown>,\n segments: Array<string | number>,\n): unknown {\n let current: unknown = obj;\n for (const seg of segments) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string | number, unknown>)[seg];\n }\n return current;\n}\n\n/**\n * Sets a value at a nested path, creating intermediate objects or arrays as needed.\n *\n * Input: obj={}, segments=[\"recipe\",\"ingredients\",0,\"name\"], value=\"Noodles\"\n * Output: {recipe:{ingredients:[{name:\"Noodles\"}]}}\n */\nfunction setNestedValue(\n obj: Record<string, unknown>,\n segments: Array<string | number>,\n value: unknown,\n): void {\n let current: Record<string | number, unknown> = obj;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n const nextSeg = segments[i + 1];\n if (current[seg] == null) {\n current[seg] = typeof nextSeg === 'number' ? [] : {};\n }\n current = current[seg] as Record<string | number, unknown>;\n }\n current[segments[segments.length - 1]] = value;\n}\n\n/**\n * Extracts the first non-null typed value from a partial arg and returns it with its JSON representation.\n *\n * Input: arg={stringValue:\"Boston\"} or arg={numberValue:50}\n * Output: {value:\"Boston\", json:'\"Boston\"'} or {value:50, json:'50'}\n */\nfunction resolvePartialArgValue(arg: {\n stringValue?: string | null;\n numberValue?: number | null;\n boolValue?: boolean | null;\n nullValue?: unknown;\n}): { value: unknown; json: string } | undefined {\n const value = arg.stringValue ?? arg.numberValue ?? arg.boolValue;\n if (value != null) return { value, json: JSON.stringify(value) };\n if ('nullValue' in arg) return { value: null, json: 'null' };\n return undefined;\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapGoogleFinishReason({\n finishReason,\n hasToolCalls,\n}: {\n finishReason: string | null | undefined;\n hasToolCalls: boolean;\n}): LanguageModelV4FinishReason['unified'] {\n switch (finishReason) {\n case 'STOP':\n return hasToolCalls ? 'tool-calls' : 'stop';\n case 'MAX_TOKENS':\n return 'length';\n case 'IMAGE_SAFETY':\n case 'RECITATION':\n case 'SAFETY':\n case 'BLOCKLIST':\n case 'PROHIBITED_CONTENT':\n case 'SPII':\n return 'content-filter';\n case 'MALFORMED_FUNCTION_CALL':\n return 'error';\n case 'FINISH_REASON_UNSPECIFIED':\n case 'OTHER':\n default:\n return 'other';\n }\n}\n","import { createProviderExecutedToolFactory } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * A tool that enables the model to generate and run Python code.\n *\n * @note Ensure the selected model supports Code Execution.\n * Multi-tool usage with the code execution tool is typically compatible with Gemini >=2 models.\n *\n * @see https://ai.google.dev/gemini-api/docs/code-execution (Google AI)\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/code-execution-api (Vertex AI)\n */\nexport const codeExecution = createProviderExecutedToolFactory<\n {\n language: string;\n code: string;\n },\n {\n outcome: string;\n output: string;\n },\n {}\n>({\n id: 'google.code_execution',\n inputSchema: z.object({\n language: z.string().describe('The programming language of the code.'),\n code: z.string().describe('The code to be executed.'),\n }),\n outputSchema: z.object({\n outcome: z\n .string()\n .describe('The outcome of the execution (e.g., \"OUTCOME_OK\").'),\n output: z.string().describe('The output from the code execution.'),\n }),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/web-grounding-enterprise\n\nexport const enterpriseWebSearch = createProviderExecutedToolFactory<\n {\n // Enterprise Web Search does not have any input schema\n },\n {\n // Enterprise Web Search does not have any output parameters\n },\n {\n // Enterprise Web Search does not have any configuration options\n }\n>({\n id: 'google.enterprise_web_search',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/** Tool to retrieve knowledge from the File Search Stores. */\nconst fileSearchArgsBaseSchema = z\n .object({\n /** The names of the file_search_stores to retrieve from.\n * Example: `fileSearchStores/my-file-search-store-123`\n */\n fileSearchStoreNames: z\n .array(z.string())\n .describe(\n 'The names of the file_search_stores to retrieve from. Example: `fileSearchStores/my-file-search-store-123`',\n ),\n /** The number of file search retrieval chunks to retrieve. */\n topK: z\n .number()\n .int()\n .positive()\n .describe('The number of file search retrieval chunks to retrieve.')\n .optional(),\n\n /** Metadata filter to apply to the file search retrieval documents.\n * See https://google.aip.dev/160 for the syntax of the filter expression.\n */\n metadataFilter: z\n .string()\n .describe(\n 'Metadata filter to apply to the file search retrieval documents. See https://google.aip.dev/160 for the syntax of the filter expression.',\n )\n .optional(),\n })\n .passthrough();\n\nexport type GoogleFileSearchToolArgs = z.infer<typeof fileSearchArgsBaseSchema>;\n\nexport const fileSearch = createProviderExecutedToolFactory<\n {},\n {},\n GoogleFileSearchToolArgs\n>({\n id: 'google.file_search',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://ai.google.dev/gemini-api/docs/maps-grounding\n// https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-maps\n\nexport const googleMaps = createProviderExecutedToolFactory<{}, {}, {}>({\n id: 'google.google_maps',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://ai.google.dev/gemini-api/docs/google-search\n// https://ai.google.dev/api/generate-content#GroundingSupport\n// https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-search\n\nconst googleSearchToolArgsBaseSchema = z\n .object({\n searchTypes: z\n .object({\n webSearch: z.object({}).optional(),\n imageSearch: z.object({}).optional(),\n })\n .optional(),\n\n timeRangeFilter: z\n .object({\n startTime: z.string(),\n endTime: z.string(),\n })\n .optional(),\n })\n .passthrough();\n\nexport type GoogleSearchToolArgs = z.infer<\n typeof googleSearchToolArgsBaseSchema\n>;\n\nexport const googleSearch = createProviderExecutedToolFactory<\n {},\n {},\n GoogleSearchToolArgs\n>({\n id: 'google.google_search',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const urlContext = createProviderExecutedToolFactory<\n {\n // Url context does not have any input schema, it will directly use the url from the prompt\n },\n {},\n {}\n>({\n id: 'google.url_context',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/rag-engine/use-vertexai-search#generate-content-using-gemini-api\n// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/rag-output-explained\n\n/**\n * A tool that enables the model to perform RAG searches against a Vertex RAG Store.\n *\n * @note Only works with Vertex Gemini models.\n */\nexport const vertexRagStore = createProviderExecutedToolFactory<\n {},\n {},\n {\n /**\n * RagCorpus resource names, eg: projects/{project}/locations/{location}/ragCorpora/{rag_corpus}\n */\n ragCorpus: string;\n\n /**\n * The number of top contexts to retrieve.\n */\n topK?: number;\n }\n>({\n id: 'google.vertex_rag_store',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import { codeExecution } from './tool/code-execution';\nimport { enterpriseWebSearch } from './tool/enterprise-web-search';\nimport { fileSearch } from './tool/file-search';\nimport { googleMaps } from './tool/google-maps';\nimport { googleSearch } from './tool/google-search';\nimport { urlContext } from './tool/url-context';\nimport { vertexRagStore } from './tool/vertex-rag-store';\n\nexport const googleTools = {\n /**\n * Creates a Google search tool that gives Google direct access to real-time web content.\n * Must have name \"google_search\".\n */\n googleSearch,\n\n /**\n * Creates an Enterprise Web Search tool for grounding responses using a compliance-focused web index.\n * Designed for highly-regulated industries (finance, healthcare, public sector).\n * Does not log customer data and supports VPC service controls.\n * Must have name \"enterprise_web_search\".\n *\n * @note Only available on Vertex AI. Requires Gemini 2.0 or newer.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/web-grounding-enterprise\n */\n enterpriseWebSearch,\n\n /**\n * Creates a Google Maps grounding tool that gives the model access to Google Maps data.\n * Must have name \"google_maps\".\n *\n * @see https://ai.google.dev/gemini-api/docs/maps-grounding\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-maps\n */\n googleMaps,\n\n /**\n * Creates a URL context tool that gives Google direct access to real-time web content.\n * Must have name \"url_context\".\n */\n urlContext,\n\n /**\n * Enables Retrieval Augmented Generation (RAG) via the Gemini File Search tool.\n * Must have name \"file_search\".\n *\n * @param fileSearchStoreNames - Fully-qualified File Search store resource names.\n * @param metadataFilter - Optional filter expression to restrict the files that can be retrieved.\n * @param topK - Optional result limit for the number of chunks returned from File Search.\n *\n * @see https://ai.google.dev/gemini-api/docs/file-search\n */\n fileSearch,\n /**\n * A tool that enables the model to generate and run Python code.\n * Must have name \"code_execution\".\n *\n * @note Ensure the selected model supports Code Execution.\n * Multi-tool usage with the code execution tool is typically compatible with Gemini >=2 models.\n *\n * @see https://ai.google.dev/gemini-api/docs/code-execution (Google AI)\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/code-execution-api (Vertex AI)\n */\n codeExecution,\n\n /**\n * Creates a Vertex RAG Store tool that enables the model to perform RAG searches against a Vertex RAG Store.\n * Must have name \"vertex_rag_store\".\n */\n vertexRagStore,\n};\n","import type {\n ImageModelV4,\n LanguageModelV4Prompt,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertToBase64,\n createJsonResponseHandler,\n generateId as defaultGenerateId,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n zodSchema,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\nimport { googleImageModelOptionsSchema } from './google-image-model-options';\nimport type {\n GoogleImageModelId,\n GoogleImageSettings,\n} from './google-image-settings';\nimport { GoogleLanguageModel } from './google-language-model';\nimport type { GoogleLanguageModelOptions } from './google-language-model-options';\n\ninterface GoogleImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n generateId?: () => string;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class GoogleImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n\n static [WORKFLOW_SERIALIZE](model: GoogleImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: GoogleImageModelConfig;\n }) {\n return new GoogleImageModel(options.modelId, {}, options.config);\n }\n\n get maxImagesPerCall(): number {\n if (this.settings.maxImagesPerCall != null) {\n return this.settings.maxImagesPerCall;\n }\n // https://docs.cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/2-5-flash-image\n if (isGeminiModel(this.modelId)) {\n return 10;\n }\n // https://ai.google.dev/gemini-api/docs/imagen#imagen-model\n return 4;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: GoogleImageModelId,\n private readonly settings: GoogleImageSettings,\n private readonly config: GoogleImageModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<ImageModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>> {\n // Gemini image models use the language model API internally\n if (isGeminiModel(this.modelId)) {\n return this.doGenerateGemini(options);\n }\n return this.doGenerateImagen(options);\n }\n\n private async doGenerateImagen(\n options: Parameters<ImageModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>> {\n const {\n prompt,\n n = 1,\n size,\n aspectRatio = '1:1',\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n } = options;\n const warnings: Array<SharedV4Warning> = [];\n\n // Imagen API endpoints do not support image editing\n if (files != null && files.length > 0) {\n throw new Error(\n 'Google Gemini API does not support image editing with Imagen models. ' +\n 'Use Google Vertex AI (@ai-sdk/google-vertex) for image editing capabilities.',\n );\n }\n\n if (mask != null) {\n throw new Error(\n 'Google Gemini API does not support image editing with masks. ' +\n 'Use Google Vertex AI (@ai-sdk/google-vertex) for image editing capabilities.',\n );\n }\n\n if (size != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'This model does not support the `size` option. Use `aspectRatio` instead.',\n });\n }\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details:\n 'This model does not support the `seed` option through this provider.',\n });\n }\n\n const googleOptions = await parseProviderOptions({\n provider: 'google',\n providerOptions,\n schema: googleImageModelOptionsSchema,\n });\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n const parameters: Record<string, unknown> = {\n sampleCount: n,\n };\n\n if (aspectRatio != null) {\n parameters.aspectRatio = aspectRatio;\n }\n\n if (googleOptions) {\n Object.assign(parameters, googleOptions);\n }\n\n const body = {\n instances: [{ prompt }],\n parameters,\n };\n\n const { responseHeaders, value: response } = await postJsonToApi<{\n predictions: Array<{ bytesBase64Encoded: string }>;\n }>({\n url: `${this.config.baseURL}/models/${this.modelId}:predict`,\n headers: combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n headers,\n ),\n body,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n return {\n images: response.predictions.map(\n (p: { bytesBase64Encoded: string }) => p.bytesBase64Encoded,\n ),\n warnings,\n providerMetadata: {\n google: {\n images: response.predictions.map(() => ({\n // Add any prediction-specific metadata here\n })),\n },\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n private async doGenerateGemini(\n options: Parameters<ImageModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>> {\n const {\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n } = options;\n const warnings: Array<SharedV4Warning> = [];\n\n // Gemini does not support mask-based inpainting\n if (mask != null) {\n throw new Error(\n 'Gemini image models do not support mask-based image editing.',\n );\n }\n\n // Gemini does not support generating multiple images per call via n parameter\n if (n != null && n > 1) {\n throw new Error(\n 'Gemini image models do not support generating a set number of images per call. Use n=1 or omit the n parameter.',\n );\n }\n\n if (size != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'This model does not support the `size` option. Use `aspectRatio` instead.',\n });\n }\n\n const userContent: Array<\n | { type: 'text'; text: string }\n | {\n type: 'file';\n data:\n | { type: 'data'; data: string | Uint8Array }\n | { type: 'url'; url: URL };\n mediaType: string;\n }\n > = [];\n\n if (prompt != null) {\n userContent.push({ type: 'text', text: prompt });\n }\n\n if (files != null && files.length > 0) {\n for (const file of files) {\n if (file.type === 'url') {\n userContent.push({\n type: 'file',\n data: { type: 'url', url: new URL(file.url) },\n mediaType: 'image/*',\n });\n } else {\n userContent.push({\n type: 'file',\n data: {\n type: 'data',\n data:\n typeof file.data === 'string'\n ? file.data\n : new Uint8Array(file.data),\n },\n mediaType: file.mediaType,\n });\n }\n }\n }\n\n const languageModelPrompt: LanguageModelV4Prompt = [\n { role: 'user', content: userContent },\n ];\n\n // Instantiate language model\n const languageModel = new GoogleLanguageModel(this.modelId, {\n provider: this.config.provider,\n baseURL: this.config.baseURL,\n headers: this.config.headers ?? {},\n fetch: this.config.fetch,\n generateId: this.config.generateId ?? defaultGenerateId,\n });\n\n // Call language model with image-only response modality\n const result = await languageModel.doGenerate({\n prompt: languageModelPrompt,\n seed,\n providerOptions: {\n google: {\n responseModalities: ['IMAGE'],\n imageConfig: aspectRatio\n ? {\n aspectRatio: aspectRatio as NonNullable<\n GoogleLanguageModelOptions['imageConfig']\n >['aspectRatio'],\n }\n : undefined,\n ...((providerOptions?.google as Omit<\n GoogleLanguageModelOptions,\n 'responseModalities' | 'imageConfig'\n >) ?? {}),\n } satisfies GoogleLanguageModelOptions,\n },\n headers,\n abortSignal,\n });\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n const images: string[] = [];\n for (const part of result.content) {\n if (\n part.type === 'file' &&\n part.mediaType.startsWith('image/') &&\n part.data.type === 'data'\n ) {\n images.push(convertToBase64(part.data.data));\n }\n }\n\n return {\n images,\n warnings,\n providerMetadata: {\n google: {\n images: images.map(() => ({})),\n },\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: result.response?.headers,\n },\n usage: result.usage\n ? {\n inputTokens: result.usage.inputTokens.total,\n outputTokens: result.usage.outputTokens.total,\n totalTokens:\n (result.usage.inputTokens.total ?? 0) +\n (result.usage.outputTokens.total ?? 0),\n }\n : undefined,\n };\n }\n}\n\nfunction isGeminiModel(modelId: string): boolean {\n return modelId.startsWith('gemini-');\n}\n\n// minimal version of the schema\nconst googleImageResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n predictions: z\n .array(z.object({ bytesBase64Encoded: z.string() }))\n .default([]),\n }),\n ),\n);\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// Note: For the initial GA launch of Imagen 3, safety filters are not configurable.\n// https://ai.google.dev/gemini-api/docs/imagen#imagen-model\nexport const googleImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n personGeneration: z\n .enum(['dont_allow', 'allow_adult', 'allow_all'])\n .nullish(),\n aspectRatio: z.enum(['1:1', '3:4', '4:3', '9:16', '16:9']).nullish(),\n }),\n ),\n);\n\nexport type GoogleImageModelOptions = InferSchema<\n typeof googleImageModelOptionsSchema\n>;\n","import {\n AISDKError,\n type FilesV4,\n type FilesV4UploadFileCallOptions,\n type FilesV4UploadFileResult,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertInlineFileDataToUint8Array,\n createJsonResponseHandler,\n delay,\n lazySchema,\n parseProviderOptions,\n zodSchema,\n getFromApi,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\n\nexport type GoogleFilesUploadOptions = {\n displayName?: string | null;\n pollIntervalMs?: number | null;\n pollTimeoutMs?: number | null;\n\n [key: string]: unknown;\n};\n\ninterface GoogleFilesConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n}\n\nexport class GoogleFiles implements FilesV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(private readonly config: GoogleFilesConfig) {}\n\n async uploadFile(\n options: FilesV4UploadFileCallOptions,\n ): Promise<FilesV4UploadFileResult> {\n const googleOptions = (await parseProviderOptions({\n provider: 'google',\n providerOptions: options.providerOptions,\n schema: googleFilesUploadOptionsSchema,\n })) as GoogleFilesUploadOptions | undefined;\n\n const resolvedHeaders = this.config.headers();\n const fetchFn = this.config.fetch ?? globalThis.fetch;\n\n const warnings: Array<SharedV4Warning> = [];\n if (options.filename != null) {\n warnings.push({ type: 'unsupported', feature: 'filename' });\n }\n\n const fileBytes = convertInlineFileDataToUint8Array(options.data);\n\n const mediaType = options.mediaType;\n const displayName = googleOptions?.displayName;\n\n const baseOrigin = this.config.baseURL.replace(/\\/v1beta$/, '');\n\n const initResponse = await fetchFn(`${baseOrigin}/upload/v1beta/files`, {\n method: 'POST',\n headers: {\n ...resolvedHeaders,\n 'X-Goog-Upload-Protocol': 'resumable',\n 'X-Goog-Upload-Command': 'start',\n 'X-Goog-Upload-Header-Content-Length': String(fileBytes.length),\n 'X-Goog-Upload-Header-Content-Type': mediaType,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n file: {\n ...(displayName != null ? { display_name: displayName } : {}),\n },\n }),\n });\n\n if (!initResponse.ok) {\n const errorBody = await initResponse.text();\n throw new AISDKError({\n name: 'GOOGLE_FILES_UPLOAD_ERROR',\n message: `Failed to initiate resumable upload: ${initResponse.status} ${errorBody}`,\n });\n }\n\n const uploadUrl = initResponse.headers.get('x-goog-upload-url');\n if (!uploadUrl) {\n throw new AISDKError({\n name: 'GOOGLE_FILES_UPLOAD_ERROR',\n message: 'No upload URL returned from initiation request',\n });\n }\n\n const uploadResponse = await fetchFn(uploadUrl, {\n method: 'POST',\n headers: {\n 'Content-Length': String(fileBytes.length),\n 'X-Goog-Upload-Offset': '0',\n 'X-Goog-Upload-Command': 'upload, finalize',\n },\n body: fileBytes,\n });\n\n if (!uploadResponse.ok) {\n const errorBody = await uploadResponse.text();\n throw new AISDKError({\n name: 'GOOGLE_FILES_UPLOAD_ERROR',\n message: `Failed to upload file data: ${uploadResponse.status} ${errorBody}`,\n });\n }\n\n const uploadResult = (await uploadResponse.json()) as {\n file: GoogleFileResource;\n };\n\n let file = uploadResult.file;\n\n const pollIntervalMs = googleOptions?.pollIntervalMs ?? 2000;\n const pollTimeoutMs = googleOptions?.pollTimeoutMs ?? 300000;\n const startTime = Date.now();\n\n while (file.state === 'PROCESSING') {\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'GOOGLE_FILES_UPLOAD_TIMEOUT',\n message: `File processing timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n await delay(pollIntervalMs);\n\n const { value: fileStatus } = await getFromApi({\n url: `${this.config.baseURL}/${file.name}`,\n headers: combineHeaders(resolvedHeaders),\n successfulResponseHandler: createJsonResponseHandler(\n googleFileResponseSchema,\n ),\n failedResponseHandler: googleFailedResponseHandler,\n fetch: this.config.fetch,\n });\n\n file = fileStatus;\n }\n\n if (file.state === 'FAILED') {\n throw new AISDKError({\n name: 'GOOGLE_FILES_UPLOAD_FAILED',\n message: `File processing failed for ${file.name}`,\n });\n }\n\n return {\n warnings,\n providerReference: { google: file.uri },\n mediaType: file.mimeType ?? options.mediaType,\n providerMetadata: {\n google: {\n name: file.name,\n displayName: file.displayName,\n mimeType: file.mimeType,\n sizeBytes: file.sizeBytes,\n state: file.state,\n uri: file.uri,\n ...(file.createTime != null ? { createTime: file.createTime } : {}),\n ...(file.updateTime != null ? { updateTime: file.updateTime } : {}),\n ...(file.expirationTime != null\n ? { expirationTime: file.expirationTime }\n : {}),\n ...(file.sha256Hash != null ? { sha256Hash: file.sha256Hash } : {}),\n },\n },\n };\n }\n}\n\ntype GoogleFileResource = {\n name: string;\n displayName?: string | null;\n mimeType: string;\n sizeBytes?: string | null;\n createTime?: string | null;\n updateTime?: string | null;\n expirationTime?: string | null;\n sha256Hash?: string | null;\n uri: string;\n state: string;\n};\n\nconst googleFileResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n name: z.string(),\n displayName: z.string().nullish(),\n mimeType: z.string(),\n sizeBytes: z.string().nullish(),\n createTime: z.string().nullish(),\n updateTime: z.string().nullish(),\n expirationTime: z.string().nullish(),\n sha256Hash: z.string().nullish(),\n uri: z.string(),\n state: z.string(),\n }),\n ),\n);\n\nconst googleFilesUploadOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n displayName: z.string().nullish(),\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n })\n .passthrough(),\n ),\n);\n","import {\n AISDKError,\n type Experimental_VideoModelV4,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\nimport {\n googleVideoModelOptionsSchema,\n type GoogleVideoModelOptions,\n} from './google-video-model-options';\nimport type { GoogleVideoModelId } from './google-video-settings';\n\ninterface GoogleVideoModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n generateId?: () => string;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class GoogleVideoModel implements Experimental_VideoModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n get maxVideosPerCall(): number {\n // Google supports multiple videos via sampleCount\n return 4;\n }\n\n constructor(\n readonly modelId: GoogleVideoModelId,\n private readonly config: GoogleVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV4['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV4Warning[] = [];\n\n const googleOptions = (await parseProviderOptions({\n provider: 'google',\n providerOptions: options.providerOptions,\n schema: googleVideoModelOptionsSchema,\n })) as GoogleVideoModelOptions | undefined;\n\n const instances: Array<Record<string, unknown>> = [{}];\n const instance = instances[0];\n\n if (options.prompt != null) {\n instance.prompt = options.prompt;\n }\n\n // Handle image-to-video: convert image to base64\n if (options.image != null) {\n if (options.image.type === 'url') {\n warnings.push({\n type: 'unsupported',\n feature: 'URL-based image input',\n details:\n 'Google Generative AI video models require base64-encoded images. URL will be ignored.',\n });\n } else {\n const base64Data =\n typeof options.image.data === 'string'\n ? options.image.data\n : convertUint8ArrayToBase64(options.image.data);\n\n instance.image = {\n inlineData: {\n mimeType: options.image.mediaType || 'image/png',\n data: base64Data,\n },\n };\n }\n }\n\n if (googleOptions?.referenceImages != null) {\n instance.referenceImages = googleOptions.referenceImages.map(refImg => {\n if (refImg.bytesBase64Encoded) {\n return {\n inlineData: {\n mimeType: 'image/png',\n data: refImg.bytesBase64Encoded,\n },\n };\n } else if (refImg.gcsUri) {\n return {\n gcsUri: refImg.gcsUri,\n };\n }\n return refImg;\n });\n }\n\n const parameters: Record<string, unknown> = {\n sampleCount: options.n,\n };\n\n if (options.aspectRatio) {\n parameters.aspectRatio = options.aspectRatio;\n }\n\n if (options.resolution) {\n const resolutionMap: Record<string, string> = {\n '1280x720': '720p',\n '1920x1080': '1080p',\n '3840x2160': '4k',\n };\n parameters.resolution =\n resolutionMap[options.resolution] || options.resolution;\n }\n\n if (options.duration) {\n parameters.durationSeconds = options.duration;\n }\n\n if (options.seed) {\n parameters.seed = options.seed;\n }\n\n if (googleOptions != null) {\n const opts = googleOptions as GoogleVideoModelOptions;\n\n if (\n opts.personGeneration !== undefined &&\n opts.personGeneration !== null\n ) {\n parameters.personGeneration = opts.personGeneration;\n }\n if (opts.negativePrompt !== undefined && opts.negativePrompt !== null) {\n parameters.negativePrompt = opts.negativePrompt;\n }\n\n for (const [key, value] of Object.entries(opts)) {\n if (\n ![\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'personGeneration',\n 'negativePrompt',\n 'referenceImages',\n ].includes(key)\n ) {\n parameters[key] = value;\n }\n }\n }\n\n const { value: operation } = await postJsonToApi({\n url: `${this.config.baseURL}/models/${this.modelId}:predictLongRunning`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body: {\n instances,\n parameters,\n },\n successfulResponseHandler: createJsonResponseHandler(\n googleOperationSchema,\n ),\n failedResponseHandler: googleFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const operationName = operation.name;\n if (!operationName) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_ERROR',\n message: 'No operation name returned from API',\n });\n }\n\n const pollIntervalMs = googleOptions?.pollIntervalMs ?? 10000; // 10 seconds (per Google docs)\n const pollTimeoutMs = googleOptions?.pollTimeoutMs ?? 600000; // 10 minutes\n\n const startTime = Date.now();\n let finalOperation = operation;\n let responseHeaders: Record<string, string> | undefined;\n\n while (!finalOperation.done) {\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_TIMEOUT',\n message: `Video generation timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n await delay(pollIntervalMs);\n\n if (options.abortSignal?.aborted) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_ABORTED',\n message: 'Video generation request was aborted',\n });\n }\n\n const { value: statusOperation, responseHeaders: pollHeaders } =\n await getFromApi({\n url: `${this.config.baseURL}/${operationName}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n googleOperationSchema,\n ),\n failedResponseHandler: googleFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n finalOperation = statusOperation;\n responseHeaders = pollHeaders;\n }\n\n if (finalOperation.error) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_FAILED',\n message: `Video generation failed: ${finalOperation.error.message}`,\n });\n }\n\n const response = finalOperation.response;\n if (\n !response?.generateVideoResponse?.generatedSamples ||\n response.generateVideoResponse.generatedSamples.length === 0\n ) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_ERROR',\n message: `No videos in response. Response: ${JSON.stringify(finalOperation)}`,\n });\n }\n\n const videos: Array<{ type: 'url'; url: string; mediaType: string }> = [];\n const videoMetadata: Array<{ uri: string }> = [];\n\n // Get API key from headers to append to download URLs\n const resolvedHeaders = await resolve(this.config.headers);\n const apiKey = resolvedHeaders?.['x-goog-api-key'];\n\n for (const generatedSample of response.generateVideoResponse\n .generatedSamples) {\n if (generatedSample.video?.uri) {\n // Append API key to URL for authentication during download\n const urlWithAuth = apiKey\n ? `${generatedSample.video.uri}${generatedSample.video.uri.includes('?') ? '&' : '?'}key=${apiKey}`\n : generatedSample.video.uri;\n\n videos.push({\n type: 'url',\n url: urlWithAuth,\n mediaType: 'video/mp4',\n });\n videoMetadata.push({\n uri: generatedSample.video.uri,\n });\n }\n }\n\n if (videos.length === 0) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_ERROR',\n message: 'No valid videos in response',\n });\n }\n\n return {\n videos,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n google: {\n videos: videoMetadata,\n },\n },\n };\n }\n}\n\nconst googleOperationSchema = z.object({\n name: z.string().nullish(),\n done: z.boolean().nullish(),\n error: z\n .object({\n code: z.number().nullish(),\n message: z.string(),\n status: z.string().nullish(),\n })\n .nullish(),\n response: z\n .object({\n generateVideoResponse: z\n .object({\n generatedSamples: z\n .array(\n z.object({\n video: z\n .object({\n uri: z.string().nullish(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n })\n .nullish(),\n })\n .nullish(),\n});\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type GoogleVideoModelOptions = {\n // Polling configuration\n pollIntervalMs?: number | null;\n pollTimeoutMs?: number | null;\n\n // Video generation options\n personGeneration?: 'dont_allow' | 'allow_adult' | 'allow_all' | null;\n negativePrompt?: string | null;\n\n // Reference images (for style/asset reference)\n referenceImages?: Array<{\n bytesBase64Encoded?: string;\n gcsUri?: string;\n }> | null;\n\n [key: string]: unknown; // For passthrough\n};\n\nexport const googleVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n personGeneration: z\n .enum(['dont_allow', 'allow_adult', 'allow_all'])\n .nullish(),\n negativePrompt: z.string().nullish(),\n referenceImages: z\n .array(\n z.object({\n bytesBase64Encoded: z.string().nullish(),\n gcsUri: z.string().nullish(),\n }),\n )\n .nullish(),\n })\n .passthrough(),\n ),\n);\n","import type {\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamResult,\n SharedV4ProviderMetadata,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId as defaultGenerateId,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { googleFailedResponseHandler } from '../google-error';\nimport { buildGoogleInteractionsStreamTransform } from './build-google-interactions-stream-transform';\nimport { convertGoogleInteractionsUsage } from './convert-google-interactions-usage';\nimport { convertToGoogleInteractionsInput } from './convert-to-google-interactions-input';\nimport {\n googleInteractionsEventSchema,\n googleInteractionsResponseSchema,\n} from './google-interactions-api';\nimport {\n googleInteractionsLanguageModelOptions,\n type GoogleInteractionsModelId,\n} from './google-interactions-language-model-options';\nimport type {\n GoogleInteractionsAgentConfig,\n GoogleInteractionsEnvironmentSource,\n GoogleInteractionsGenerationConfig,\n GoogleInteractionsNetworkAllowlistEntry,\n GoogleInteractionsNetworkConfig,\n GoogleInteractionsRequestBody,\n GoogleInteractionsResponseFormatEntry,\n GoogleInteractionsTool,\n GoogleInteractionsToolChoice,\n} from './google-interactions-prompt';\nimport { mapGoogleInteractionsFinishReason } from './map-google-interactions-finish-reason';\nimport { parseGoogleInteractionsOutputs } from './parse-google-interactions-outputs';\nimport {\n isTerminalStatus,\n pollGoogleInteractionUntilTerminal,\n} from './poll-google-interactions';\nimport { prepareGoogleInteractionsTools } from './prepare-google-interactions-tools';\nimport { streamGoogleInteractionEvents } from './stream-google-interactions';\nimport { synthesizeGoogleInteractionsAgentStream } from './synthesize-google-interactions-agent-stream';\n\nexport type GoogleInteractionsConfig = {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n generateId: () => string;\n supportedUrls?: () => LanguageModelV4['supportedUrls'];\n};\n\nexport type GoogleInteractionsModelInput =\n | GoogleInteractionsModelId\n | { agent: string }\n | { managedAgent: string };\n\nexport class GoogleInteractionsLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n\n readonly modelId: string;\n\n /**\n * Optional agent name. When provided, the request body sends `agent:` instead\n * of `model:` and rejects `tools` / `generation_config` (warned, not thrown).\n */\n readonly agent: string | undefined;\n\n private readonly config: GoogleInteractionsConfig;\n\n static [WORKFLOW_SERIALIZE](model: GoogleInteractionsLanguageModel) {\n return {\n ...serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n }),\n agent: model.agent,\n };\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n agent?: string;\n config: GoogleInteractionsConfig;\n }) {\n return new GoogleInteractionsLanguageModel(\n options.agent != null ? { agent: options.agent } : options.modelId,\n options.config,\n );\n }\n\n constructor(\n modelOrAgent: GoogleInteractionsModelInput,\n config: GoogleInteractionsConfig,\n ) {\n if (typeof modelOrAgent === 'string') {\n this.modelId = modelOrAgent;\n this.agent = undefined;\n } else if ('managedAgent' in modelOrAgent) {\n this.modelId = modelOrAgent.managedAgent;\n this.agent = modelOrAgent.managedAgent;\n } else {\n this.modelId = modelOrAgent.agent;\n this.agent = modelOrAgent.agent;\n }\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls() {\n if (this.config.supportedUrls) {\n return this.config.supportedUrls();\n }\n return {\n 'image/*': [/^https?:\\/\\/.+/],\n 'application/pdf': [/^https?:\\/\\/.+/],\n 'audio/*': [/^https?:\\/\\/.+/],\n 'video/*': [\n /^https?:\\/\\/(www\\.)?youtube\\.com\\/watch\\?v=.+/,\n /^https?:\\/\\/youtu\\.be\\/.+/,\n /^gs:\\/\\/.+/,\n ],\n };\n }\n\n private async getArgs(options: LanguageModelV4CallOptions) {\n const warnings: Array<SharedV4Warning> = [];\n\n const opts = await parseProviderOptions({\n provider: 'google',\n providerOptions: options.providerOptions,\n schema: googleInteractionsLanguageModelOptions,\n });\n\n const isAgent = this.agent != null;\n\n const hasTools = options.tools != null && options.tools.length > 0;\n\n let toolsForBody: Array<GoogleInteractionsTool> | undefined;\n let toolChoiceForBody: GoogleInteractionsToolChoice | undefined;\n\n if (hasTools && isAgent) {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: tools are not supported when an agent is set; tools will be omitted from the request body.',\n });\n } else if (hasTools) {\n const prepared = prepareGoogleInteractionsTools({\n tools: options.tools,\n toolChoice: options.toolChoice,\n });\n toolsForBody = prepared.tools;\n toolChoiceForBody = prepared.toolChoice;\n warnings.push(...prepared.toolWarnings);\n }\n\n /*\n * `response_format` is a polymorphic array of entries. Three sources\n * contribute, in order:\n *\n * 1. AI SDK call-level `responseFormat: { type: 'json', schema }` →\n * `{ type: 'text', mime_type: 'application/json', schema }`.\n * 2. `providerOptions.google.responseFormat` (primary path) — entries\n * are appended verbatim with camelCase → snake_case translation.\n * 3. `providerOptions.google.imageConfig` (deprecated fallback) — only\n * contributes if no `{type:'image'}` entry was already provided via\n * sources 1 or 2; emits a deprecation warning when used.\n *\n * Agent calls cannot send `generation_config` and (per the API) cannot\n * combine with structured output — emit a warning and drop the field.\n */\n const responseFormatEntries: Array<GoogleInteractionsResponseFormatEntry> =\n [];\n if (options.responseFormat?.type === 'json') {\n if (isAgent) {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: structured output (responseFormat) is not supported when an agent is set; responseFormat will be ignored.',\n });\n } else {\n const entry: GoogleInteractionsResponseFormatEntry = {\n type: 'text',\n mime_type: 'application/json',\n ...(options.responseFormat.schema != null\n ? { schema: options.responseFormat.schema }\n : {}),\n };\n responseFormatEntries.push(entry);\n }\n }\n\n if (opts?.responseFormat != null) {\n for (const entry of opts.responseFormat) {\n if (entry.type === 'text') {\n responseFormatEntries.push(\n pruneUndefined({\n type: 'text' as const,\n mime_type: entry.mimeType ?? undefined,\n schema: entry.schema ?? undefined,\n }),\n );\n } else if (entry.type === 'image') {\n responseFormatEntries.push(\n pruneUndefined({\n type: 'image' as const,\n mime_type: entry.mimeType ?? undefined,\n aspect_ratio: entry.aspectRatio ?? undefined,\n image_size: entry.imageSize ?? undefined,\n }),\n );\n } else if (entry.type === 'audio') {\n responseFormatEntries.push(\n pruneUndefined({\n type: 'audio' as const,\n mime_type: entry.mimeType ?? undefined,\n }),\n );\n }\n }\n }\n\n const {\n input,\n systemInstruction: convertedSystemInstruction,\n warnings: convWarnings,\n } = convertToGoogleInteractionsInput({\n prompt: options.prompt,\n previousInteractionId: opts?.previousInteractionId ?? undefined,\n store: opts?.store ?? undefined,\n mediaResolution: opts?.mediaResolution ?? undefined,\n });\n\n warnings.push(...convWarnings);\n\n let systemInstruction = convertedSystemInstruction;\n const optionSystemInstruction = opts?.systemInstruction ?? undefined;\n if (systemInstruction != null && optionSystemInstruction != null) {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: both AI SDK system message and providerOptions.google.systemInstruction were set; using the AI SDK system message.',\n });\n } else if (systemInstruction == null && optionSystemInstruction != null) {\n systemInstruction = optionSystemInstruction;\n }\n\n /*\n * The Interactions API splits per-call config into `generation_config`\n * (model branch) and `agent_config` (agent branch); the two are mutually\n * exclusive. The AI SDK call-level generation params and the thinking /\n * imageConfig provider options flow into `generation_config`.\n *\n * When an agent is set, none of these fields are accepted by the API.\n * Emit a single `LanguageModelV4CallWarning` listing the dropped field\n * names and continue (do not throw); the agent-only `agent_config`\n * field supersedes them.\n */\n let generationConfig: GoogleInteractionsGenerationConfig | undefined;\n if (isAgent) {\n const droppedFields: Array<string> = [];\n if (options.temperature != null) droppedFields.push('temperature');\n if (options.topP != null) droppedFields.push('topP');\n if (options.seed != null) droppedFields.push('seed');\n if (options.stopSequences != null && options.stopSequences.length > 0) {\n droppedFields.push('stopSequences');\n }\n if (options.maxOutputTokens != null)\n droppedFields.push('maxOutputTokens');\n if (opts?.thinkingLevel != null) droppedFields.push('thinkingLevel');\n if (opts?.thinkingSummaries != null) {\n droppedFields.push('thinkingSummaries');\n }\n if (opts?.imageConfig != null) droppedFields.push('imageConfig');\n if (droppedFields.length > 0) {\n warnings.push({\n type: 'other',\n message: `google.interactions: ${droppedFields.join(', ')} ${droppedFields.length === 1 ? 'is' : 'are'} not supported when an agent is set; use providerOptions.google.agentConfig instead. Dropped from the request body.`,\n });\n }\n generationConfig = undefined;\n } else {\n generationConfig = pruneUndefined({\n temperature: options.temperature ?? undefined,\n top_p: options.topP ?? undefined,\n seed: options.seed ?? undefined,\n stop_sequences:\n options.stopSequences != null && options.stopSequences.length > 0\n ? options.stopSequences\n : undefined,\n max_output_tokens: options.maxOutputTokens ?? undefined,\n thinking_level: opts?.thinkingLevel ?? undefined,\n thinking_summaries: opts?.thinkingSummaries ?? undefined,\n tool_choice: toolChoiceForBody,\n });\n\n /*\n * Deprecated fallback path: `imageConfig` contributes an image entry\n * only when none was supplied via `responseFormat`. A warning is\n * always emitted when `imageConfig` is set so callers migrate to the\n * `responseFormat` shape.\n */\n if (opts?.imageConfig != null) {\n const alreadyHasImageEntry = responseFormatEntries.some(\n entry => entry.type === 'image',\n );\n warnings.push({\n type: 'other',\n message: alreadyHasImageEntry\n ? 'google.interactions: providerOptions.google.imageConfig is deprecated and was ignored because providerOptions.google.responseFormat already supplies an image entry. Use responseFormat exclusively.'\n : 'google.interactions: providerOptions.google.imageConfig is deprecated. Use providerOptions.google.responseFormat with a { type: \"image\", ... } entry instead.',\n });\n if (!alreadyHasImageEntry) {\n responseFormatEntries.push({\n type: 'image',\n mime_type: 'image/png',\n ...(opts.imageConfig.aspectRatio != null\n ? { aspect_ratio: opts.imageConfig.aspectRatio }\n : {}),\n ...(opts.imageConfig.imageSize != null\n ? { image_size: opts.imageConfig.imageSize }\n : {}),\n });\n }\n }\n }\n\n let agentConfig: GoogleInteractionsAgentConfig | undefined;\n if (isAgent && opts?.agentConfig != null) {\n const ac = opts.agentConfig;\n if (ac.type === 'deep-research') {\n agentConfig = pruneUndefined({\n type: 'deep-research',\n thinking_summaries: ac.thinkingSummaries ?? undefined,\n visualization: ac.visualization ?? undefined,\n collaborative_planning: ac.collaborativePlanning ?? undefined,\n }) as GoogleInteractionsAgentConfig;\n } else if (ac.type === 'dynamic') {\n agentConfig = { type: 'dynamic' };\n }\n }\n\n let environment: GoogleInteractionsRequestBody['environment'];\n if (opts?.environment != null) {\n if (!isAgent) {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: environment is only supported when an agent is set; environment will be omitted from the request body.',\n });\n } else if (typeof opts.environment === 'string') {\n environment = opts.environment;\n } else {\n const env = opts.environment;\n const sources: Array<GoogleInteractionsEnvironmentSource> | undefined =\n env.sources?.map(s => {\n if (s.type === 'inline') {\n return {\n type: 'inline' as const,\n content: s.content,\n target: s.target,\n };\n }\n return pruneUndefined({\n type: s.type,\n source: s.source,\n target: s.target ?? undefined,\n }) as GoogleInteractionsEnvironmentSource;\n });\n let network: GoogleInteractionsNetworkConfig | undefined;\n if (env.network === 'disabled') {\n network = 'disabled';\n } else if (env.network != null) {\n network = {\n allowlist: env.network.allowlist.map(entry =>\n pruneUndefined({\n domain: entry.domain,\n transform: entry.transform ?? undefined,\n }),\n ) as Array<GoogleInteractionsNetworkAllowlistEntry>,\n };\n }\n environment = pruneUndefined({\n type: 'remote' as const,\n sources: sources != null && sources.length > 0 ? sources : undefined,\n network,\n });\n }\n }\n\n /*\n * `background` is opt-in via `providerOptions.google.background`. Some\n * agents require it because their server-side workflow cannot complete\n * within a single request; others reject it. When `background: true`, the\n * POST returns a non-terminal status and the SDK polls\n * `GET /interactions/{id}` until the work completes.\n */\n const args: GoogleInteractionsRequestBody = pruneUndefined({\n ...(isAgent ? { agent: this.agent } : { model: this.modelId }),\n input,\n system_instruction: systemInstruction,\n tools: toolsForBody,\n response_format:\n responseFormatEntries.length > 0 ? responseFormatEntries : undefined,\n response_modalities:\n opts?.responseModalities != null\n ? (opts.responseModalities as Array<\n 'text' | 'image' | 'audio' | 'video' | 'document'\n >)\n : undefined,\n previous_interaction_id: opts?.previousInteractionId ?? undefined,\n service_tier: opts?.serviceTier ?? undefined,\n store: opts?.store ?? undefined,\n generation_config:\n generationConfig != null && Object.keys(generationConfig).length > 0\n ? generationConfig\n : undefined,\n agent_config: agentConfig,\n environment,\n background: opts?.background ?? undefined,\n });\n\n return {\n args,\n warnings,\n isAgent,\n isBackground: opts?.background === true,\n pollingTimeoutMs: opts?.pollingTimeoutMs ?? undefined,\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings, isAgent, pollingTimeoutMs } =\n await this.getArgs(options);\n\n const url = `${this.config.baseURL}/interactions`;\n\n const mergedHeaders = combineHeaders(\n INTERACTIONS_API_REVISION_HEADER,\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n );\n\n const postResult = await postJsonToApi({\n url,\n headers: mergedHeaders,\n body: args,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleInteractionsResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let {\n responseHeaders,\n value: response,\n rawValue: rawResponse,\n } = postResult;\n\n /*\n * Agent calls may return a non-terminal status (`in_progress` /\n * `requires_action`) when invoked with `background: true`. Poll\n * `GET /interactions/{id}` until terminal so the user-facing surface\n * matches a synchronous call.\n */\n if (isAgent && !isTerminalStatus(response.status)) {\n const polled = await pollGoogleInteractionUntilTerminal({\n baseURL: this.config.baseURL,\n interactionId: response.id,\n headers: mergedHeaders,\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n timeoutMs: pollingTimeoutMs,\n });\n response = polled.response;\n rawResponse = polled.rawResponse;\n responseHeaders = polled.responseHeaders ?? responseHeaders;\n }\n\n /*\n * `response.id` is omitted when `store: false` (fully stateless mode), and\n * the stream surface returns `id: \"\"` (empty string) for the same case.\n * Normalize both to `undefined` so downstream stamping does not pollute\n * provider metadata with an empty/missing identifier.\n */\n const interactionId =\n typeof response.id === 'string' && response.id.length > 0\n ? response.id\n : undefined;\n\n const { content, hasFunctionCall } = parseGoogleInteractionsOutputs({\n steps: response.steps ?? null,\n generateId: this.config.generateId ?? defaultGenerateId,\n interactionId,\n });\n\n const finishReason: LanguageModelV4FinishReason = {\n unified: mapGoogleInteractionsFinishReason({\n status: response.status,\n hasFunctionCall,\n }),\n raw: response.status,\n };\n\n /*\n * Service tier divergence vs. `:generateContent`:\n *\n * `google-language-model.ts` reads the applied service tier from the\n * `x-gemini-service-tier` HTTP response header (see commit 1adfb76d2d).\n * The Interactions API does NOT surface that header; it returns the\n * applied tier in the response body as `service_tier` on the top-level\n * Interaction object (and on `interaction.complete.interaction` for\n * streaming). The `responseHeaders` parameter is also checked as a\n * defensive fallback in case the API later adds the header.\n */\n const serviceTier =\n response.service_tier ??\n responseHeaders?.['x-gemini-service-tier'] ??\n undefined;\n\n /*\n * `response.id` is omitted when `store: false` (fully stateless mode), so\n * `interactionId` is only surfaced when the API actually returned one.\n */\n const providerMetadata: SharedV4ProviderMetadata = {\n google: {\n ...(interactionId != null ? { interactionId } : {}),\n ...(serviceTier != null ? { serviceTier } : {}),\n },\n };\n\n let timestamp: Date | undefined;\n if (typeof response.created === 'string') {\n const parsed = new Date(response.created);\n if (!Number.isNaN(parsed.getTime())) {\n timestamp = parsed;\n }\n }\n\n return {\n content,\n finishReason,\n usage: convertGoogleInteractionsUsage(response.usage),\n warnings,\n providerMetadata,\n request: { body: args },\n response: {\n headers: responseHeaders,\n body: rawResponse,\n ...(interactionId != null ? { id: interactionId } : {}),\n ...(timestamp ? { timestamp } : {}),\n modelId: response.model ?? undefined,\n },\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings, isBackground, pollingTimeoutMs } =\n await this.getArgs(options);\n\n const url = `${this.config.baseURL}/interactions`;\n\n const mergedHeaders = combineHeaders(\n INTERACTIONS_API_REVISION_HEADER,\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n );\n\n /*\n * `background: true` is incompatible with `stream: true` on POST. Drive\n * background calls via POST background -> GET stream (with terminal-status\n * short-circuit). The user-facing stream surface stays identical --\n * text-start / text-delta / text-end / finish parts are emitted in the\n * same order as a true SSE response.\n */\n if (isBackground) {\n return this.doStreamBackground({\n args,\n warnings,\n url,\n mergedHeaders,\n options,\n pollingTimeoutMs,\n });\n }\n\n const body = { ...args, stream: true };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url,\n headers: mergedHeaders,\n body,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n googleInteractionsEventSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n /*\n * Google's API surfaces the applied service tier in the\n * `x-gemini-service-tier` HTTP response header, not in the response body.\n * Mirror the canonical pattern from `google-language-model.ts` (commit\n * 1adfb76d2d) and pipe it through the stream transformer so the `finish`\n * part's `providerMetadata.google.serviceTier` is sourced from the header.\n */\n const headerServiceTier = responseHeaders?.['x-gemini-service-tier'];\n\n const transform = buildGoogleInteractionsStreamTransform({\n warnings,\n generateId: this.config.generateId ?? defaultGenerateId,\n includeRawChunks: options.includeRawChunks,\n serviceTier: headerServiceTier,\n });\n\n return {\n stream: response.pipeThrough(transform),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n\n /*\n * Drive the streaming surface for agent calls. Agents require\n * `background: true`, which is incompatible with `stream: true` on POST.\n *\n * Approach:\n * 1. POST `/interactions` with `background: true`. The response includes\n * the interaction id and an initial (usually non-terminal) status.\n * 2. If the POST status is already terminal (rare), synthesize a stream\n * from the polled outputs and we're done.\n * 3. Otherwise open `GET /interactions/{id}?stream=true` and pipe the\n * SSE events through `buildGoogleInteractionsStreamTransform` so the\n * consumer receives text deltas / thinking summaries / tool events as\n * they happen instead of all at once at the end.\n *\n * The SSE connection can drop while the agent idles between events\n * (`UND_ERR_BODY_TIMEOUT`); `streamGoogleInteractionEvents` handles the\n * reconnect-with-`last_event_id` loop transparently.\n */\n private async doStreamBackground({\n args,\n warnings,\n url,\n mergedHeaders,\n options,\n pollingTimeoutMs,\n }: {\n args: GoogleInteractionsRequestBody;\n warnings: Array<SharedV4Warning>;\n url: string;\n mergedHeaders: Record<string, string | undefined>;\n options: LanguageModelV4CallOptions;\n pollingTimeoutMs: number | undefined;\n }): Promise<LanguageModelV4StreamResult> {\n const postResult = await postJsonToApi({\n url,\n headers: mergedHeaders,\n body: args,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleInteractionsResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { responseHeaders: postHeaders, value: postResponse } = postResult;\n const interactionId = postResponse.id;\n\n if (interactionId == null || interactionId.length === 0) {\n throw new Error(\n 'google.interactions: background POST response did not include an interaction id; cannot stream the result.',\n );\n }\n\n const headerServiceTier = postHeaders?.['x-gemini-service-tier'];\n\n /*\n * If the POST already returned a terminal status (e.g. cached, immediate\n * failure, or `incomplete`), there is nothing to stream from the GET --\n * synthesize directly from the response so the caller still gets a\n * complete stream.\n */\n if (isTerminalStatus(postResponse.status)) {\n const synthesized = synthesizeGoogleInteractionsAgentStream({\n response: postResponse,\n warnings,\n generateId: this.config.generateId ?? defaultGenerateId,\n includeRawChunks: options.includeRawChunks,\n headerServiceTier,\n });\n return {\n stream: synthesized,\n request: { body: args },\n response: { headers: postHeaders },\n };\n }\n\n /*\n * `pollingTimeoutMs` is unused on the live-SSE path -- there's no poll\n * loop to time out -- but we surface it as the per-attempt timeout for\n * the AbortSignal-driven cancel that the caller already controls. Future\n * iterations may use it as a backstop if the SSE+resume loop spins\n * indefinitely.\n */\n void pollingTimeoutMs;\n\n const events = streamGoogleInteractionEvents({\n baseURL: this.config.baseURL,\n interactionId,\n headers: mergedHeaders,\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const transform = buildGoogleInteractionsStreamTransform({\n warnings,\n generateId: this.config.generateId ?? defaultGenerateId,\n includeRawChunks: options.includeRawChunks,\n serviceTier: headerServiceTier,\n });\n\n return {\n stream: events.pipeThrough(transform),\n request: { body: args },\n response: { headers: postHeaders },\n };\n }\n}\n\n/*\n * Pins the Interactions API revision the SDK targets. Sent on every request\n * the model issues so model-id calls, agent calls, polling, SSE reconnects,\n * and cancellation all hit the same schema.\n */\nconst INTERACTIONS_API_REVISION_HEADER: Record<string, string> = {\n 'Api-Revision': '2026-05-20',\n};\n\nfunction pruneUndefined<T extends Record<string, unknown>>(obj: T): T {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n result[key] = value;\n }\n return result as T;\n}\n","import type { JSONObject, LanguageModelV4Usage } from '@ai-sdk/provider';\nimport type { GoogleInteractionsUsage } from './google-interactions-api';\n\nexport function convertGoogleInteractionsUsage(\n usage: GoogleInteractionsUsage | undefined | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n }\n\n const totalInput = usage.total_input_tokens ?? 0;\n const totalOutput = usage.total_output_tokens ?? 0;\n const totalThought = usage.total_thought_tokens ?? 0;\n const totalCached = usage.total_cached_tokens ?? 0;\n\n return {\n inputTokens: {\n total: usage.total_input_tokens ?? undefined,\n noCache:\n usage.total_input_tokens == null ? undefined : totalInput - totalCached,\n cacheRead: usage.total_cached_tokens ?? undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total:\n usage.total_output_tokens == null && usage.total_thought_tokens == null\n ? undefined\n : totalOutput + totalThought,\n text: usage.total_output_tokens ?? undefined,\n reasoning: usage.total_thought_tokens ?? undefined,\n },\n raw: usage as unknown as JSONObject,\n };\n}\n","import type { LanguageModelV4Source } from '@ai-sdk/provider';\nimport type {\n GoogleInteractionsAnnotation,\n GoogleInteractionsBuiltinToolResultContent,\n GoogleInteractionsFileCitation,\n GoogleInteractionsGoogleMapsResultContent,\n GoogleInteractionsGoogleSearchResultContent,\n GoogleInteractionsPlaceCitation,\n GoogleInteractionsURLCitation,\n GoogleInteractionsURLContextResultContent,\n} from './google-interactions-prompt';\n\nconst KNOWN_DOC_EXTENSIONS: Record<string, string> = {\n pdf: 'application/pdf',\n txt: 'text/plain',\n md: 'text/markdown',\n markdown: 'text/markdown',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n};\n\nfunction inferDocMediaType(uriOrName: string): string {\n const lower = uriOrName.toLowerCase();\n for (const [ext, media] of Object.entries(KNOWN_DOC_EXTENSIONS)) {\n if (lower.endsWith(`.${ext}`)) return media;\n }\n return 'application/octet-stream';\n}\n\nfunction basename(uriOrName: string): string | undefined {\n const parts = uriOrName.split('/');\n const last = parts[parts.length - 1];\n return last && last.length > 0 ? last : undefined;\n}\n\n/**\n * Maps a single text-block annotation (`url_citation` / `file_citation` /\n * `place_citation`) onto a `LanguageModelV4Source`. Returns `undefined` when\n * the annotation lacks the minimum payload to form a source (e.g. a URL\n * citation without a `url`).\n */\nexport function annotationToSource({\n annotation,\n generateId,\n}: {\n annotation: GoogleInteractionsAnnotation | { type: string };\n generateId: () => string;\n}): LanguageModelV4Source | undefined {\n switch (annotation.type) {\n case 'url_citation': {\n const a = annotation as GoogleInteractionsURLCitation;\n if (a.url == null || a.url.length === 0) return undefined;\n return {\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: a.url,\n ...(a.title != null ? { title: a.title } : {}),\n };\n }\n case 'file_citation': {\n const a = annotation as GoogleInteractionsFileCitation;\n const uri = a.url ?? a.document_uri ?? a.file_name;\n if (uri == null || uri.length === 0) return undefined;\n if (uri.startsWith('http://') || uri.startsWith('https://')) {\n return {\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: uri,\n ...(a.file_name != null ? { title: a.file_name } : {}),\n };\n }\n const filename = a.file_name ?? basename(uri);\n const mediaType = inferDocMediaType(uri);\n return {\n type: 'source',\n sourceType: 'document',\n id: generateId(),\n mediaType,\n title: a.file_name ?? filename ?? uri,\n ...(filename != null ? { filename } : {}),\n };\n }\n case 'place_citation': {\n const a = annotation as GoogleInteractionsPlaceCitation;\n if (a.url == null || a.url.length === 0) return undefined;\n return {\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: a.url,\n ...(a.name != null ? { title: a.name } : {}),\n };\n }\n default:\n return undefined;\n }\n}\n\n/**\n * Maps a built-in tool *result* content block to zero or more\n * `LanguageModelV4Source` parts. The Interactions API exposes grounding\n * sources both inline (via `text_annotation` deltas) and via tool-result\n * content blocks; the latter is what this function consumes.\n *\n * Supported result kinds:\n * - `url_context_result` -> URL sources for each fetched URL with `status: 'success'`\n * - `google_search_result` -> URL sources (when `url` is present), search-suggestion\n * entries are skipped (they are HTML widgets, not citations)\n * - `google_maps_result` -> URL sources for each place with a `url`\n * - `file_search_result` -> document sources (best-effort -- `result[]` is loosely typed)\n */\nexport function builtinToolResultToSources({\n block,\n generateId,\n}: {\n block: GoogleInteractionsBuiltinToolResultContent;\n generateId: () => string;\n}): Array<LanguageModelV4Source> {\n const sources: Array<LanguageModelV4Source> = [];\n\n switch (block.type) {\n case 'url_context_result': {\n const result =\n (block as GoogleInteractionsURLContextResultContent).result ?? [];\n for (const entry of result) {\n if (entry?.url == null || entry.url.length === 0) continue;\n if (entry.status != null && entry.status !== 'success') continue;\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: entry.url,\n });\n }\n break;\n }\n case 'google_search_result': {\n const result =\n (block as GoogleInteractionsGoogleSearchResultContent).result ?? [];\n for (const entry of result) {\n const url = entry?.url;\n if (url == null || url.length === 0) continue;\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url,\n ...(entry.title != null ? { title: entry.title } : {}),\n });\n }\n break;\n }\n case 'google_maps_result': {\n const result =\n (block as GoogleInteractionsGoogleMapsResultContent).result ?? [];\n for (const entry of result) {\n for (const place of entry.places ?? []) {\n if (place.url == null || place.url.length === 0) continue;\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: place.url,\n ...(place.name != null ? { title: place.name } : {}),\n });\n }\n }\n break;\n }\n case 'file_search_result': {\n const result = (block as { result?: Array<unknown> }).result ?? [];\n for (const raw of result) {\n if (raw == null || typeof raw !== 'object') continue;\n const entry = raw as {\n file_name?: string;\n document_uri?: string;\n url?: string;\n title?: string;\n };\n const uri = entry.url ?? entry.document_uri ?? entry.file_name;\n if (uri == null || uri.length === 0) continue;\n if (uri.startsWith('http://') || uri.startsWith('https://')) {\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: uri,\n ...(entry.title != null ? { title: entry.title } : {}),\n });\n continue;\n }\n const filename = entry.file_name ?? basename(uri);\n const mediaType = inferDocMediaType(uri);\n sources.push({\n type: 'source',\n sourceType: 'document',\n id: generateId(),\n mediaType,\n title: entry.title ?? entry.file_name ?? filename ?? uri,\n ...(filename != null ? { filename } : {}),\n });\n }\n break;\n }\n default:\n break;\n }\n\n return sources;\n}\n\n/**\n * Given a list of annotations attached to a single `text` content block,\n * returns the corresponding `LanguageModelV4Source` parts (de-duplicated by\n * URL/filename to avoid double-counting when the same citation reappears\n * across deltas).\n */\nexport function annotationsToSources({\n annotations,\n generateId,\n}: {\n annotations:\n | Array<GoogleInteractionsAnnotation | { type: string }>\n | null\n | undefined;\n generateId: () => string;\n}): Array<LanguageModelV4Source> {\n if (annotations == null) return [];\n const seen = new Set<string>();\n const sources: Array<LanguageModelV4Source> = [];\n for (const annotation of annotations) {\n const source = annotationToSource({ annotation, generateId });\n if (source == null) continue;\n const key =\n source.sourceType === 'url'\n ? `url:${source.url}`\n : `doc:${source.filename ?? source.title}`;\n if (seen.has(key)) continue;\n seen.add(key);\n sources.push(source);\n }\n return sources;\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\nimport type { GoogleInteractionsStatus } from './google-interactions-prompt';\n\n/*\n * `tool-calls` is selected when the response includes a client-side function\n * call. The API itself signals this via `requires_action`, but\n * `completed + hasFunctionCall` also occurs in practice.\n */\nexport function mapGoogleInteractionsFinishReason({\n status,\n hasFunctionCall,\n}: {\n status: GoogleInteractionsStatus | string | null | undefined;\n hasFunctionCall: boolean;\n}): LanguageModelV4FinishReason['unified'] {\n switch (status) {\n case 'completed':\n return hasFunctionCall ? 'tool-calls' : 'stop';\n case 'requires_action':\n return 'tool-calls';\n case 'failed':\n return 'error';\n case 'incomplete':\n return 'length';\n case 'cancelled':\n return 'other';\n case 'in_progress':\n default:\n return 'other';\n }\n}\n","import type {\n JSONValue,\n LanguageModelV4FinishReason,\n LanguageModelV4Source,\n LanguageModelV4StreamPart,\n SharedV4ProviderMetadata,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport type { ParseResult } from '@ai-sdk/provider-utils';\nimport type {\n GoogleInteractionsEvent,\n GoogleInteractionsUsage,\n} from './google-interactions-api';\nimport { convertGoogleInteractionsUsage } from './convert-google-interactions-usage';\nimport {\n annotationsToSources,\n builtinToolResultToSources,\n} from './extract-google-interactions-sources';\nimport { mapGoogleInteractionsFinishReason } from './map-google-interactions-finish-reason';\nimport type {\n GoogleInteractionsAnnotation,\n GoogleInteractionsBuiltinToolResultContent,\n GoogleInteractionsStatus,\n} from './google-interactions-prompt';\n\nconst BUILTIN_TOOL_CALL_TYPES = new Set([\n 'google_search_call',\n 'code_execution_call',\n 'url_context_call',\n 'file_search_call',\n 'google_maps_call',\n 'mcp_server_tool_call',\n]);\n\nconst BUILTIN_TOOL_RESULT_TYPES = new Set([\n 'google_search_result',\n 'code_execution_result',\n 'url_context_result',\n 'file_search_result',\n 'google_maps_result',\n 'mcp_server_tool_result',\n]);\n\nfunction builtinToolNameFromCallType(type: string): string {\n return type.replace(/_call$/, '');\n}\n\nfunction builtinToolNameFromResultType(type: string): string {\n return type.replace(/_result$/, '');\n}\n\ntype OpenBlockState =\n | { kind: 'text'; id: string; emittedSourceKeys: Set<string> }\n | {\n kind: 'reasoning';\n id: string;\n signature?: string;\n }\n | {\n kind: 'image';\n id: string;\n data?: string;\n mimeType?: string;\n uri?: string;\n }\n | {\n kind: 'function_call';\n id: string;\n toolCallId: string;\n toolName: string;\n /**\n * Accumulator for partial JSON arguments. Arguments stream as a\n * sequence of `arguments_delta` substrings on `step.delta`; each one is\n * appended verbatim and surfaced as a `tool-input-delta`. On\n * `step.stop` the accumulated string is parsed to recover the full\n * arguments object for the final `tool-call` event.\n */\n argumentsAccum: string;\n signature?: string;\n }\n | {\n kind: 'builtin_tool_call';\n id: string;\n blockType: string;\n toolCallId: string;\n toolName: string;\n arguments: Record<string, unknown>;\n callEmitted: boolean;\n }\n | {\n kind: 'builtin_tool_result';\n id: string;\n blockType: string;\n callId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n resultEmitted: boolean;\n }\n /**\n * A `model_output` step whose inner content-block kind has not yet been\n * disambiguated. `step.start` may arrive bare (`{type: 'model_output'}`,\n * no content payload); the first `step.delta` reveals whether the block\n * is text or image. The block opens in this transitional state and swaps\n * to `text` / `image` on the first matching delta.\n */\n | { kind: 'pending_model_output'; id: string }\n | { kind: 'unknown'; id: string };\n\n/**\n * Builds a `TransformStream<ParseResult<GoogleInteractionsEvent>, LanguageModelV4StreamPart>`\n * over the Interactions API SSE event stream.\n *\n * Surfaces text + thought (reasoning), function_call, image, built-in tool\n * call/result steps, and `text_annotation` -> `source` parts.\n */\nexport function buildGoogleInteractionsStreamTransform({\n warnings,\n generateId,\n includeRawChunks,\n serviceTier: headerServiceTier,\n}: {\n warnings: Array<SharedV4Warning>;\n generateId: () => string;\n includeRawChunks?: boolean;\n /**\n * Defensive fallback for service tier read from the `x-gemini-service-tier`\n * HTTP response header. The Interactions API surfaces the applied tier in\n * the `interaction.completed` event body (see `service_tier` below); this\n * parameter exists so we still surface a tier if the API later starts\n * sending the header.\n */\n serviceTier?: string;\n}): TransformStream<\n ParseResult<GoogleInteractionsEvent>,\n LanguageModelV4StreamPart\n> {\n let interactionId: string | undefined;\n let usage: GoogleInteractionsUsage | undefined;\n let serviceTier: string | undefined = headerServiceTier;\n let finishStatus: GoogleInteractionsStatus | string | undefined;\n let hasFunctionCall = false;\n\n /*\n * Per-index open step slots. The Interactions API frames concurrent steps\n * (e.g. text alongside thought) by `index`; we track each open slot\n * independently so a text delta at index N never collides with a thought\n * delta at index M.\n */\n const openBlocks = new Map<number, OpenBlockState>();\n\n /*\n * De-duplicate sources across the whole stream. Citations often re-appear\n * across multiple `text_annotation` deltas as the model's text grows;\n * surface each unique URL once.\n */\n const emittedSourceKeys = new Set<string>();\n\n function sourceKey(source: LanguageModelV4Source): string {\n return source.sourceType === 'url'\n ? `url:${source.url}`\n : `doc:${source.filename ?? source.title}`;\n }\n\n return new TransformStream<\n ParseResult<GoogleInteractionsEvent>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n if (includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n if (!chunk.success) {\n finishStatus = 'failed';\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n const eventType = (value as { event_type?: string }).event_type;\n\n switch (eventType) {\n case 'interaction.created': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'interaction.created' }\n >;\n const interaction = event.interaction;\n /*\n * The Interactions API returns `id: \"\"` (empty string) on streaming\n * events when running with `store: false` — there is no server-side\n * record. Treat empty string the same as missing so providerMetadata\n * stays clean.\n */\n interactionId =\n interaction?.id != null && interaction.id.length > 0\n ? interaction.id\n : undefined;\n\n const created = (interaction as { created?: string } | undefined)\n ?.created;\n let timestamp: Date | undefined;\n if (typeof created === 'string') {\n const parsed = new Date(created);\n if (!Number.isNaN(parsed.getTime())) {\n timestamp = parsed;\n }\n }\n\n controller.enqueue({\n type: 'response-metadata',\n ...(interactionId != null ? { id: interactionId } : {}),\n modelId: (interaction as { model?: string } | undefined)?.model,\n ...(timestamp ? { timestamp } : {}),\n });\n break;\n }\n\n case 'step.start': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'step.start' }\n >;\n const step = event.step as\n | {\n type?: string;\n id?: string;\n call_id?: string;\n name?: string;\n arguments?: Record<string, unknown>;\n signature?: string;\n summary?: Array<{ type?: string; text?: string }>;\n result?: unknown;\n is_error?: boolean;\n content?: Array<{\n type?: string;\n text?: string;\n data?: string;\n mime_type?: string;\n uri?: string;\n annotations?: Array<GoogleInteractionsAnnotation>;\n }>;\n }\n | undefined;\n const index = event.index;\n const blockId = `${interactionId ?? 'interaction'}:${index}`;\n const stepType = step?.type;\n\n if (stepType === 'model_output') {\n /*\n * `step.start` for a `model_output` step often carries only the\n * type discriminator — content/image payloads then arrive on\n * subsequent `step.delta` events. Open in a transitional\n * `pending_model_output` state; the first delta promotes it to\n * either `text` (and emits `text-start`) or `image`.\n *\n * `step.content[0]` may also arrive populated as a hint; when\n * present, promote eagerly.\n */\n const initial = step?.content?.[0] as\n | {\n type?: string;\n text?: string;\n data?: string;\n mime_type?: string;\n uri?: string;\n annotations?: Array<GoogleInteractionsAnnotation>;\n }\n | undefined;\n if (initial?.type === 'text') {\n openBlocks.set(index, {\n kind: 'text',\n id: blockId,\n emittedSourceKeys: new Set<string>(),\n });\n controller.enqueue({ type: 'text-start', id: blockId });\n\n const initialSources = annotationsToSources({\n annotations: initial.annotations,\n generateId,\n });\n for (const source of initialSources) {\n const key = sourceKey(source);\n if (emittedSourceKeys.has(key)) continue;\n emittedSourceKeys.add(key);\n controller.enqueue(source);\n }\n } else if (initial?.type === 'image') {\n openBlocks.set(index, {\n kind: 'image',\n id: blockId,\n ...(initial.data != null ? { data: initial.data } : {}),\n ...(initial.mime_type != null\n ? { mimeType: initial.mime_type }\n : {}),\n ...(initial.uri != null ? { uri: initial.uri } : {}),\n });\n } else {\n openBlocks.set(index, {\n kind: 'pending_model_output',\n id: blockId,\n });\n }\n } else if (stepType === 'thought') {\n const signature = step?.signature;\n openBlocks.set(index, {\n kind: 'reasoning',\n id: blockId,\n ...(signature != null ? { signature } : {}),\n });\n controller.enqueue({ type: 'reasoning-start', id: blockId });\n /*\n * A `thought` step's initial `summary[]` may already contain text\n * items on `step.start` — emit those as reasoning deltas so the\n * consumer's reasoning buffer is up to date before any delta\n * arrives.\n */\n if (Array.isArray(step?.summary)) {\n for (const item of step.summary) {\n if (item?.type === 'text' && typeof item.text === 'string') {\n controller.enqueue({\n type: 'reasoning-delta',\n id: blockId,\n delta: item.text,\n });\n }\n }\n }\n } else if (stepType === 'function_call') {\n const toolCallId = step?.id ?? blockId;\n const toolName = step?.name ?? 'unknown';\n hasFunctionCall = true;\n const state: Extract<OpenBlockState, { kind: 'function_call' }> = {\n kind: 'function_call',\n id: blockId,\n toolCallId,\n toolName,\n argumentsAccum: '',\n ...(step?.signature != null ? { signature: step.signature } : {}),\n };\n openBlocks.set(index, state);\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallId,\n toolName,\n });\n } else if (\n stepType != null &&\n BUILTIN_TOOL_CALL_TYPES.has(stepType)\n ) {\n const toolName =\n stepType === 'mcp_server_tool_call'\n ? (step?.name ?? 'mcp_server_tool')\n : builtinToolNameFromCallType(stepType);\n const toolCallId = step?.id ?? blockId;\n const state: Extract<\n OpenBlockState,\n { kind: 'builtin_tool_call' }\n > = {\n kind: 'builtin_tool_call',\n id: blockId,\n blockType: stepType,\n toolCallId,\n toolName,\n arguments: step?.arguments ?? {},\n callEmitted: false,\n };\n openBlocks.set(index, state);\n } else if (\n stepType != null &&\n BUILTIN_TOOL_RESULT_TYPES.has(stepType)\n ) {\n const toolName =\n stepType === 'mcp_server_tool_result'\n ? (step?.name ?? 'mcp_server_tool')\n : builtinToolNameFromResultType(stepType);\n const callId = step?.call_id ?? blockId;\n const state: Extract<\n OpenBlockState,\n { kind: 'builtin_tool_result' }\n > = {\n kind: 'builtin_tool_result',\n id: blockId,\n blockType: stepType,\n callId,\n toolName,\n result: step?.result ?? null,\n ...(step?.is_error != null ? { isError: step.is_error } : {}),\n resultEmitted: false,\n };\n openBlocks.set(index, state);\n } else {\n openBlocks.set(index, { kind: 'unknown', id: blockId });\n }\n break;\n }\n\n case 'step.delta': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'step.delta' }\n >;\n let open = openBlocks.get(event.index);\n if (open == null) break;\n\n const dtype = (event.delta as { type?: string } | undefined)?.type;\n\n /*\n * Promote a pending model_output block to `text` on the first\n * text-shaped delta. Image deltas are emitted inline below — a\n * model_output step can interleave text and image deltas, so the\n * text \"open block\" stays in place across image emissions instead\n * of being swapped for an image state.\n */\n if (open.kind === 'pending_model_output') {\n if (\n dtype === 'text' ||\n dtype === 'text_annotation' ||\n dtype === 'text_annotation_delta'\n ) {\n const promoted: Extract<OpenBlockState, { kind: 'text' }> = {\n kind: 'text',\n id: open.id,\n emittedSourceKeys: new Set<string>(),\n };\n openBlocks.set(event.index, promoted);\n open = promoted;\n controller.enqueue({ type: 'text-start', id: promoted.id });\n }\n }\n\n /*\n * Image deltas inside `model_output` carry the full payload in a\n * single chunk (no per-byte streaming). Emit the `file` part as\n * soon as the delta arrives so it surfaces regardless of whether\n * a text block is currently open at the same index.\n */\n if (\n dtype === 'image' &&\n (open.kind === 'pending_model_output' ||\n open.kind === 'text' ||\n open.kind === 'image')\n ) {\n const img = event.delta as\n | { data?: string; mime_type?: string; uri?: string }\n | undefined;\n const google: Record<string, string> = {};\n if (interactionId != null) google.interactionId = interactionId;\n const providerMetadata =\n Object.keys(google).length > 0 ? { google } : undefined;\n if (img?.data != null && img.data.length > 0) {\n controller.enqueue({\n type: 'file',\n mediaType: img.mime_type ?? 'image/png',\n data: { type: 'data', data: img.data },\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n } else if (img?.uri != null && img.uri.length > 0) {\n controller.enqueue({\n type: 'file',\n mediaType: img.mime_type ?? 'image/png',\n data: { type: 'url', url: new URL(img.uri) },\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n }\n // The file part was emitted inline; clear any data on an\n // eagerly-promoted image OpenBlockState so the `step.stop`\n // handler does not emit a duplicate.\n if (open.kind === 'image') {\n open.data = undefined;\n open.uri = undefined;\n }\n break;\n }\n\n const delta = event.delta as\n | {\n type?: string;\n text?: string;\n signature?: string;\n content?: { type?: string; text?: string };\n id?: string;\n /*\n * `arguments` carries different shapes per delta kind:\n * - `type: 'arguments_delta'` → `string` (partial JSON)\n * - `type: '<builtin>_tool_call'` → `Record<string, unknown>`\n * The branch handler reads it with the matching type.\n */\n arguments?: Record<string, unknown> | string;\n annotations?: Array<GoogleInteractionsAnnotation>;\n call_id?: string;\n result?: unknown;\n is_error?: boolean;\n data?: string;\n mime_type?: string;\n uri?: string;\n name?: string;\n }\n | undefined;\n\n if (open.kind === 'text' && delta?.type === 'text') {\n const text = delta.text ?? '';\n if (text.length > 0) {\n controller.enqueue({\n type: 'text-delta',\n id: open.id,\n delta: text,\n });\n }\n } else if (\n open.kind === 'text' &&\n (delta?.type === 'text_annotation' ||\n delta?.type === 'text_annotation_delta')\n ) {\n const sources = annotationsToSources({\n annotations: delta.annotations,\n generateId,\n });\n for (const source of sources) {\n const key = sourceKey(source);\n if (emittedSourceKeys.has(key)) continue;\n emittedSourceKeys.add(key);\n open.emittedSourceKeys.add(key);\n controller.enqueue(source);\n }\n } else if (open.kind === 'image' && delta?.type === 'image') {\n if (delta.data != null) open.data = delta.data;\n if (delta.mime_type != null) open.mimeType = delta.mime_type;\n if (delta.uri != null) open.uri = delta.uri;\n } else if (open.kind === 'reasoning') {\n if (delta?.type === 'thought_summary') {\n const item = delta.content;\n if (item?.type === 'text' && typeof item.text === 'string') {\n controller.enqueue({\n type: 'reasoning-delta',\n id: open.id,\n delta: item.text,\n });\n }\n } else if (delta?.type === 'thought_signature') {\n const signature = delta.signature;\n if (signature != null) {\n open.signature = signature;\n }\n }\n } else if (\n open.kind === 'function_call' &&\n delta?.type === 'arguments_delta'\n ) {\n /*\n * Partial JSON arguments arrive as `arguments_delta` events.\n * The partial JSON string lives in `delta.arguments` (a string,\n * not the parsed object — the `arguments_delta` name applies to\n * the discriminator only). Append to the accumulator and surface\n * each chunk as a `tool-input-delta`; the full arguments object\n * is emitted at `step.stop`.\n */\n const slice =\n typeof delta.arguments === 'string' ? delta.arguments : '';\n if (slice.length > 0) {\n open.argumentsAccum += slice;\n controller.enqueue({\n type: 'tool-input-delta',\n id: open.toolCallId,\n delta: slice,\n });\n }\n if (delta.id != null) {\n open.toolCallId = delta.id;\n }\n if (delta.signature != null) {\n open.signature = delta.signature;\n }\n hasFunctionCall = true;\n } else if (\n open.kind === 'builtin_tool_call' &&\n delta?.type === open.blockType\n ) {\n if (delta.id != null) open.toolCallId = delta.id;\n if (\n delta.arguments != null &&\n typeof delta.arguments === 'object'\n ) {\n open.arguments = delta.arguments;\n }\n if (\n delta.name != null &&\n open.blockType === 'mcp_server_tool_call'\n ) {\n open.toolName = delta.name;\n }\n } else if (\n open.kind === 'builtin_tool_result' &&\n delta?.type === open.blockType\n ) {\n if (delta.call_id != null) open.callId = delta.call_id;\n if (delta.result !== undefined) open.result = delta.result;\n if (delta.is_error != null) open.isError = delta.is_error;\n if (\n delta.name != null &&\n open.blockType === 'mcp_server_tool_result'\n ) {\n open.toolName = delta.name;\n }\n }\n break;\n }\n\n case 'step.stop': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'step.stop' }\n >;\n const open = openBlocks.get(event.index);\n if (open == null) break;\n\n if (open.kind === 'text') {\n const textProviderMetadata =\n interactionId != null ? { google: { interactionId } } : undefined;\n controller.enqueue({\n type: 'text-end',\n id: open.id,\n ...(textProviderMetadata\n ? { providerMetadata: textProviderMetadata }\n : {}),\n });\n } else if (open.kind === 'reasoning') {\n const google: Record<string, string> = {};\n if (open.signature != null) google.signature = open.signature;\n if (interactionId != null) google.interactionId = interactionId;\n const providerMetadata =\n Object.keys(google).length > 0 ? { google } : undefined;\n controller.enqueue({\n type: 'reasoning-end',\n id: open.id,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n } else if (open.kind === 'image') {\n const google: Record<string, string> = {};\n if (interactionId != null) google.interactionId = interactionId;\n const providerMetadata =\n Object.keys(google).length > 0 ? { google } : undefined;\n if (open.data != null && open.data.length > 0) {\n controller.enqueue({\n type: 'file',\n mediaType: open.mimeType ?? 'image/png',\n data: { type: 'data', data: open.data },\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n } else if (open.uri != null && open.uri.length > 0) {\n controller.enqueue({\n type: 'file',\n mediaType: open.mimeType ?? 'image/png',\n data: { type: 'url', url: new URL(open.uri) },\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n }\n } else if (open.kind === 'function_call') {\n const accumulated =\n open.argumentsAccum.length > 0 ? open.argumentsAccum : '{}';\n controller.enqueue({\n type: 'tool-input-end',\n id: open.toolCallId,\n });\n const google: Record<string, string> = {};\n if (open.signature != null) google.signature = open.signature;\n if (interactionId != null) google.interactionId = interactionId;\n const providerMetadata =\n Object.keys(google).length > 0 ? { google } : undefined;\n controller.enqueue({\n type: 'tool-call',\n toolCallId: open.toolCallId,\n toolName: open.toolName,\n input: accumulated,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n } else if (open.kind === 'builtin_tool_call' && !open.callEmitted) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: open.toolCallId,\n toolName: open.toolName,\n input: JSON.stringify(open.arguments ?? {}),\n providerExecuted: true,\n });\n open.callEmitted = true;\n } else if (\n open.kind === 'builtin_tool_result' &&\n !open.resultEmitted\n ) {\n controller.enqueue({\n type: 'tool-result',\n toolCallId: open.callId,\n toolName: open.toolName,\n result: (open.result ?? null) as NonNullable<JSONValue>,\n });\n open.resultEmitted = true;\n\n const sources = builtinToolResultToSources({\n block: {\n type: open.blockType,\n call_id: open.callId,\n result: open.result,\n } as unknown as GoogleInteractionsBuiltinToolResultContent,\n generateId,\n });\n for (const source of sources) {\n const key = sourceKey(source);\n if (emittedSourceKeys.has(key)) continue;\n emittedSourceKeys.add(key);\n controller.enqueue(source);\n }\n }\n openBlocks.delete(event.index);\n break;\n }\n\n case 'interaction.status_update':\n case 'interaction.in_progress':\n case 'interaction.requires_action': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n {\n event_type:\n | 'interaction.status_update'\n | 'interaction.in_progress'\n | 'interaction.requires_action';\n }\n >;\n if (event.status != null) {\n finishStatus = event.status;\n } else if (eventType === 'interaction.requires_action') {\n finishStatus = 'requires_action';\n } else {\n finishStatus = 'in_progress';\n }\n break;\n }\n\n case 'interaction.completed': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'interaction.completed' }\n >;\n const interaction = event.interaction as {\n id?: string;\n status?: GoogleInteractionsStatus;\n usage?: GoogleInteractionsUsage;\n service_tier?: string;\n };\n if (interaction?.id != null && interaction.id.length > 0) {\n interactionId = interaction.id;\n }\n if (interaction?.status != null) {\n finishStatus = interaction.status;\n }\n if (interaction?.usage != null) {\n usage = interaction.usage;\n }\n /*\n * The Interactions API surfaces the applied service tier on\n * `interaction.completed.interaction.service_tier` (NOT on the\n * `x-gemini-service-tier` HTTP header that `:generateContent`\n * uses). Body wins over header fallback.\n */\n if (interaction?.service_tier != null) {\n serviceTier = interaction.service_tier;\n }\n break;\n }\n\n case 'error': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'error' }\n >;\n finishStatus = 'failed';\n const errorPayload = event.error ?? {\n message: 'Unknown interaction error',\n };\n controller.enqueue({ type: 'error', error: errorPayload });\n break;\n }\n\n default:\n break;\n }\n },\n\n flush(controller) {\n const finishReason: LanguageModelV4FinishReason = {\n unified: mapGoogleInteractionsFinishReason({\n status: finishStatus,\n hasFunctionCall,\n }),\n raw: finishStatus,\n };\n\n const providerMetadata: SharedV4ProviderMetadata = {\n google: {\n ...(interactionId != null ? { interactionId } : {}),\n ...(serviceTier != null ? { serviceTier } : {}),\n },\n };\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertGoogleInteractionsUsage(usage),\n providerMetadata,\n });\n },\n });\n}\n","import type {\n LanguageModelV4FilePart,\n LanguageModelV4Prompt,\n LanguageModelV4ToolResultOutput,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n convertToBase64,\n getTopLevelMediaType,\n isFullMediaType,\n resolveFullMediaType,\n resolveProviderReference,\n} from '@ai-sdk/provider-utils';\nimport type {\n GoogleInteractionsContent,\n GoogleInteractionsContentBlock,\n GoogleInteractionsFunctionResultContent,\n GoogleInteractionsImageContent,\n GoogleInteractionsInput,\n GoogleInteractionsStep,\n GoogleInteractionsTextContent,\n} from './google-interactions-prompt';\n\nexport type GoogleInteractionsMediaResolution =\n | 'low'\n | 'medium'\n | 'high'\n | 'ultra_high';\n\nexport type ConvertToGoogleInteractionsInputResult = {\n input: GoogleInteractionsInput;\n systemInstruction: string | undefined;\n warnings: Array<SharedV4Warning>;\n};\n\n/**\n * Converts an AI SDK `LanguageModelV4Prompt` into the Gemini Interactions\n * request shape (`{ input: Array<Step>, system_instruction }`).\n *\n * Prior assistant content round-trips as discrete steps:\n * - text / image content → `model_output` step with a single `content` array\n * - reasoning → `thought` step (`signature` + `summary`)\n * - tool-call → `function_call` step\n * User turns (and tool-result turns from the previous round) are sent as\n * `user_input` steps whose `content[]` holds the user's parts (text, files,\n * and — for tool-result turns — `function_result` blocks).\n *\n * Handles text parts, file parts (image / audio / document / video, all four\n * `data.type` shapes), tool-call/tool-result round-tripping, per-step\n * `signature` round-tripping, and statefulness compaction (drop assistant/tool\n * turns whose `providerOptions.google.interactionId === previousInteractionId`).\n */\nexport function convertToGoogleInteractionsInput({\n prompt,\n previousInteractionId,\n store,\n mediaResolution,\n}: {\n prompt: LanguageModelV4Prompt;\n previousInteractionId?: string;\n store?: boolean;\n mediaResolution?: GoogleInteractionsMediaResolution;\n}): ConvertToGoogleInteractionsInputResult {\n const warnings: Array<SharedV4Warning> = [];\n\n /*\n * Behavior matrix for compaction:\n *\n * - `previousInteractionId` set + `store !== false` → compact history (drop\n * assistant/tool turns whose `providerMetadata.google.interactionId`\n * matches), emit `previous_interaction_id`.\n * - `previousInteractionId` set + `store === false` → emit warning\n * (incoherent combo), still send full history (NO compaction).\n * - `store === false`, no `previousInteractionId` → no compaction.\n * - Default → no compaction.\n */\n const incoherentCombo = previousInteractionId != null && store === false;\n const shouldCompact = previousInteractionId != null && store !== false;\n if (incoherentCombo) {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: providerOptions.google.previousInteractionId was set together with store: false. These are incoherent (the prior interaction cannot be referenced when nothing was stored on the server); the full history will be sent and previous_interaction_id will still be emitted.',\n });\n }\n\n const compactedPrompt = shouldCompact\n ? compactPromptForPreviousInteraction({\n prompt,\n previousInteractionId,\n })\n : prompt;\n\n const systemTexts: Array<string> = [];\n const steps: Array<GoogleInteractionsStep> = [];\n\n for (const message of compactedPrompt) {\n switch (message.role) {\n case 'system': {\n systemTexts.push(message.content);\n break;\n }\n case 'user': {\n const content: Array<GoogleInteractionsContentBlock> = [];\n for (const part of message.content) {\n if (part.type === 'text') {\n content.push({ type: 'text', text: part.text });\n } else if (part.type === 'file') {\n const fileBlock = convertFilePartToContent({\n part,\n warnings,\n mediaResolution,\n });\n if (fileBlock != null) {\n content.push(fileBlock);\n }\n }\n }\n const merged = mergeAdjacentTextContent(content);\n if (merged.length > 0) {\n steps.push({ type: 'user_input', content: merged });\n }\n break;\n }\n case 'assistant': {\n /*\n * Prior assistant content fans out into one step per logical block.\n * Adjacent text/image content blocks are coalesced into a single\n * `model_output` step (matching how the API emits them on output);\n * reasoning and tool-calls each become their own step.\n */\n let pendingModelOutput: Array<GoogleInteractionsContentBlock> = [];\n const flushModelOutput = () => {\n if (pendingModelOutput.length > 0) {\n steps.push({ type: 'model_output', content: pendingModelOutput });\n pendingModelOutput = [];\n }\n };\n\n for (const part of message.content) {\n if (part.type === 'text') {\n pendingModelOutput.push({ type: 'text', text: part.text });\n } else if (part.type === 'reasoning') {\n flushModelOutput();\n const signature = part.providerOptions?.google?.signature as\n | string\n | undefined;\n steps.push({\n type: 'thought',\n ...(signature != null ? { signature } : {}),\n summary:\n part.text.length > 0\n ? [{ type: 'text', text: part.text }]\n : undefined,\n });\n } else if (part.type === 'file') {\n const fileBlock = convertFilePartToContent({\n part,\n warnings,\n mediaResolution,\n });\n if (fileBlock != null) {\n pendingModelOutput.push(fileBlock);\n }\n } else if (part.type === 'tool-call') {\n flushModelOutput();\n const signature = part.providerOptions?.google?.signature as\n | string\n | undefined;\n const args =\n typeof part.input === 'string'\n ? safeParseToolArgs(part.input)\n : ((part.input ?? {}) as Record<string, unknown>);\n steps.push({\n type: 'function_call',\n id: part.toolCallId,\n name: part.toolName,\n arguments: args,\n ...(signature != null ? { signature } : {}),\n });\n } else {\n warnings.push({\n type: 'other',\n message: `google.interactions: unsupported assistant content part type \"${part.type}\"; part dropped.`,\n });\n }\n }\n flushModelOutput();\n break;\n }\n case 'tool': {\n /*\n * Tool-result messages are emitted as a `user_input` step whose\n * content holds one `function_result` block per tool-result part.\n * `function_result` remains a content-block type (it sits inside\n * a step), not a top-level step type.\n */\n const content: Array<GoogleInteractionsContentBlock> = [];\n for (const part of message.content) {\n if (part.type !== 'tool-result') {\n warnings.push({\n type: 'other',\n message: `google.interactions: unsupported tool message part type \"${part.type}\"; part dropped.`,\n });\n continue;\n }\n const block = convertToolResultPart({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: part.output,\n signature: part.providerOptions?.google?.signature as\n | string\n | undefined,\n warnings,\n });\n content.push(block);\n }\n if (content.length > 0) {\n steps.push({ type: 'user_input', content });\n }\n break;\n }\n }\n }\n\n const systemInstruction =\n systemTexts.length > 0 ? systemTexts.join('\\n\\n') : undefined;\n\n return { input: steps, systemInstruction, warnings };\n}\n\n/**\n * Maps a single AI SDK `LanguageModelV4FilePart` to a Gemini Interactions\n * content block (`image` / `audio` / `document` / `video`).\n */\nfunction convertFilePartToContent({\n part,\n warnings,\n mediaResolution,\n}: {\n part: LanguageModelV4FilePart;\n warnings: Array<SharedV4Warning>;\n mediaResolution?: GoogleInteractionsMediaResolution;\n}): GoogleInteractionsContent | undefined {\n if (part.data.type === 'text') {\n return {\n type: 'text',\n text: part.data.text,\n };\n }\n\n const topLevel = getTopLevelMediaType(part.mediaType);\n let kind: 'image' | 'audio' | 'video' | 'document' | undefined;\n switch (topLevel) {\n case 'image':\n kind = 'image';\n break;\n case 'audio':\n kind = 'audio';\n break;\n case 'video':\n kind = 'video';\n break;\n case 'application':\n kind = 'document';\n break;\n default:\n kind = undefined;\n }\n\n if (kind == null) {\n warnings.push({\n type: 'other',\n message: `google.interactions: unsupported file media type \"${part.mediaType}\"; part dropped.`,\n });\n return undefined;\n }\n\n const resolutionField =\n mediaResolution != null && (kind === 'image' || kind === 'video')\n ? { resolution: mediaResolution }\n : {};\n\n switch (part.data.type) {\n case 'data': {\n const mimeType = resolveFullMediaType({ part });\n return {\n type: kind,\n data: convertToBase64(part.data.data),\n mime_type: mimeType,\n ...resolutionField,\n };\n }\n case 'url': {\n return {\n type: kind,\n uri: part.data.url.toString(),\n ...(isFullMediaType(part.mediaType)\n ? { mime_type: part.mediaType }\n : {}),\n ...resolutionField,\n };\n }\n case 'reference': {\n const uri = resolveProviderReference({\n reference: part.data.reference,\n provider: 'google',\n });\n return {\n type: kind,\n uri,\n ...(isFullMediaType(part.mediaType)\n ? { mime_type: part.mediaType }\n : {}),\n ...resolutionField,\n };\n }\n }\n}\n\n/*\n * Drops assistant messages that were part of the linked interaction\n * (`previousInteractionId`). Tool-result turns whose tool-call counterpart\n * was dropped are also pruned to keep the message stream well-formed.\n */\nfunction compactPromptForPreviousInteraction({\n prompt,\n previousInteractionId,\n}: {\n prompt: LanguageModelV4Prompt;\n previousInteractionId: string;\n}): LanguageModelV4Prompt {\n const out: LanguageModelV4Prompt = [];\n const droppedToolCallIds = new Set<string>();\n\n for (const message of prompt) {\n if (message.role === 'assistant') {\n const matchesLinkedInteraction = message.content.some(part => {\n const partInteractionId = (\n part as { providerOptions?: { google?: { interactionId?: string } } }\n ).providerOptions?.google?.interactionId;\n return partInteractionId === previousInteractionId;\n });\n if (matchesLinkedInteraction) {\n for (const part of message.content) {\n if (part.type === 'tool-call') {\n droppedToolCallIds.add(part.toolCallId);\n }\n }\n continue;\n }\n out.push(message);\n continue;\n }\n if (message.role === 'tool') {\n const remaining = message.content.filter(part => {\n if (part.type !== 'tool-result') {\n return true;\n }\n return !droppedToolCallIds.has(part.toolCallId);\n });\n if (remaining.length === 0) {\n continue;\n }\n out.push({\n ...message,\n content: remaining as typeof message.content,\n });\n continue;\n }\n out.push(message);\n }\n\n return out;\n}\n\nfunction safeParseToolArgs(input: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(input);\n if (\n parsed != null &&\n typeof parsed === 'object' &&\n !Array.isArray(parsed)\n ) {\n return parsed as Record<string, unknown>;\n }\n return { value: parsed };\n } catch {\n return { value: input };\n }\n}\n\nfunction convertToolResultPart({\n toolCallId,\n toolName,\n output,\n signature,\n warnings,\n}: {\n toolCallId: string;\n toolName: string;\n output: LanguageModelV4ToolResultOutput;\n signature: string | undefined;\n warnings: Array<SharedV4Warning>;\n}): GoogleInteractionsFunctionResultContent {\n const base = {\n type: 'function_result' as const,\n call_id: toolCallId,\n name: toolName,\n ...(signature != null ? { signature } : {}),\n };\n\n switch (output.type) {\n case 'text':\n return { ...base, result: output.value };\n case 'json':\n return { ...base, result: JSON.stringify(output.value) };\n case 'error-text':\n return { ...base, is_error: true, result: output.value };\n case 'error-json':\n return { ...base, is_error: true, result: JSON.stringify(output.value) };\n case 'execution-denied':\n return {\n ...base,\n is_error: true,\n result: output.reason ?? 'Tool execution denied by user.',\n };\n case 'content': {\n const blocks: Array<\n GoogleInteractionsTextContent | GoogleInteractionsImageContent\n > = [];\n for (const item of output.value) {\n if (item.type === 'text') {\n blocks.push({ type: 'text', text: item.text });\n } else if (item.type === 'file') {\n const topLevel = getTopLevelMediaType(item.mediaType);\n if (topLevel !== 'image') {\n warnings.push({\n type: 'other',\n message: `google.interactions: tool-result file with mediaType \"${item.mediaType}\" is not supported (Interactions \\`function_result.result\\` accepts only text and image content); part dropped.`,\n });\n continue;\n }\n const imageBlock = filePartToImageBlock({ part: item, warnings });\n if (imageBlock != null) {\n blocks.push(imageBlock);\n }\n } else {\n warnings.push({\n type: 'other',\n message: `google.interactions: tool-result content part type \"${(item as { type: string }).type}\" is not supported; part dropped.`,\n });\n }\n }\n return { ...base, result: blocks };\n }\n }\n}\n\nfunction filePartToImageBlock({\n part,\n warnings,\n}: {\n part: {\n type: 'file';\n mediaType: string;\n data:\n | { type: 'data'; data: Uint8Array | string }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string };\n filename?: string;\n };\n warnings: Array<SharedV4Warning>;\n}): GoogleInteractionsImageContent | undefined {\n switch (part.data.type) {\n case 'data': {\n const mimeType = isFullMediaType(part.mediaType)\n ? part.mediaType\n : resolveFullMediaType({\n part: {\n type: 'file',\n mediaType: part.mediaType,\n data: part.data,\n } as LanguageModelV4FilePart,\n });\n return {\n type: 'image',\n data: convertToBase64(part.data.data),\n mime_type: mimeType,\n };\n }\n case 'url':\n return {\n type: 'image',\n uri: part.data.url.toString(),\n ...(isFullMediaType(part.mediaType)\n ? { mime_type: part.mediaType }\n : {}),\n };\n case 'reference': {\n const uri = resolveProviderReference({\n reference: part.data.reference,\n provider: 'google',\n });\n return {\n type: 'image',\n uri,\n ...(isFullMediaType(part.mediaType)\n ? { mime_type: part.mediaType }\n : {}),\n };\n }\n case 'text': {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: tool-result image part with `data.type === \"text\"` is not representable as an image; part dropped.',\n });\n return undefined;\n }\n }\n}\n\n/*\n * Collapses runs of adjacent text content blocks within a single user step\n * into one combined text block, separated by a blank line. Text blocks\n * carrying `annotations` are left untouched (annotations are tied to specific\n * text spans).\n */\nfunction mergeAdjacentTextContent(\n content: Array<GoogleInteractionsContentBlock>,\n): Array<GoogleInteractionsContentBlock> {\n if (content.length < 2) {\n return content;\n }\n const result: Array<GoogleInteractionsContentBlock> = [];\n for (const block of content) {\n const last = result[result.length - 1];\n if (\n block.type === 'text' &&\n last != null &&\n last.type === 'text' &&\n (last as GoogleInteractionsTextContent).annotations == null &&\n (block as GoogleInteractionsTextContent).annotations == null\n ) {\n const merged: GoogleInteractionsTextContent = {\n type: 'text',\n text: `${(last as GoogleInteractionsTextContent).text}\\n\\n${(block as GoogleInteractionsTextContent).text}`,\n };\n result[result.length - 1] = merged;\n continue;\n }\n result.push(block);\n }\n return result;\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/*\n * Zod schemas for the Gemini Interactions API wire format.\n *\n * Helpers are defined as factories (invoked only inside the exported\n * `lazySchema(() => ...)` callbacks) so no `z.object(...)` / `z.union(...)`\n * runs at module import. Schemas are intentionally narrow on the fields the\n * SDK consumes and lenient (`loose()` / `unknown`) on the rest, so subsequent\n * additions can widen without breaking the basic path.\n */\n\nconst tokenByModalitySchema = () =>\n z\n .object({\n modality: z.string().nullish(),\n tokens: z.number().nullish(),\n })\n .loose();\n\nconst usageSchema = () =>\n z\n .object({\n total_input_tokens: z.number().nullish(),\n total_output_tokens: z.number().nullish(),\n total_thought_tokens: z.number().nullish(),\n total_cached_tokens: z.number().nullish(),\n total_tool_use_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n input_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n output_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n cached_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n tool_use_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n grounding_tool_count: z\n .array(\n z\n .object({\n type: z.string().nullish(),\n count: z.number().nullish(),\n })\n .loose(),\n )\n .nullish(),\n })\n .loose();\n\nexport type GoogleInteractionsUsage = z.infer<ReturnType<typeof usageSchema>>;\n\nconst interactionStatusSchema = () =>\n z.enum([\n 'in_progress',\n 'requires_action',\n 'completed',\n 'failed',\n 'cancelled',\n 'incomplete',\n ]);\n\nconst annotationSchema = () => {\n const urlCitation = z\n .object({\n type: z.literal('url_citation'),\n url: z.string().nullish(),\n title: z.string().nullish(),\n start_index: z.number().nullish(),\n end_index: z.number().nullish(),\n })\n .loose();\n\n const fileCitation = z\n .object({\n type: z.literal('file_citation'),\n file_name: z.string().nullish(),\n document_uri: z.string().nullish(),\n url: z.string().nullish(),\n page_number: z.number().nullish(),\n media_id: z.string().nullish(),\n start_index: z.number().nullish(),\n end_index: z.number().nullish(),\n custom_metadata: z.record(z.string(), z.unknown()).nullish(),\n })\n .loose();\n\n const placeCitation = z\n .object({\n type: z.literal('place_citation'),\n name: z.string().nullish(),\n url: z.string().nullish(),\n place_id: z.string().nullish(),\n start_index: z.number().nullish(),\n end_index: z.number().nullish(),\n })\n .loose();\n\n return z.union([\n urlCitation,\n fileCitation,\n placeCitation,\n z.object({ type: z.string() }).loose(),\n ]);\n};\n\nconst thoughtSummaryItemSchema = () =>\n z\n .object({\n type: z.string(),\n text: z.string().nullish(),\n data: z.string().nullish(),\n mime_type: z.string().nullish(),\n })\n .loose();\n\n/*\n * Content block schemas — these populate the `content` array of a\n * `model_output` step. Function calls, thoughts, and built-in tool\n * call/result blocks are top-level step types (see `stepSchema` below), not\n * content blocks.\n */\nconst contentBlockSchema = () => {\n const textContent = z\n .object({\n type: z.literal('text'),\n text: z.string(),\n annotations: z.array(annotationSchema()).nullish(),\n })\n .loose();\n\n const imageContent = z\n .object({\n type: z.literal('image'),\n data: z.string().nullish(),\n mime_type: z.string().nullish(),\n resolution: z.enum(['low', 'medium', 'high', 'ultra_high']).nullish(),\n uri: z.string().nullish(),\n })\n .loose();\n\n return z.union([\n textContent,\n imageContent,\n z.object({ type: z.string() }).loose(),\n ]);\n};\n\nexport type GoogleInteractionsContentBlock = z.infer<\n ReturnType<typeof contentBlockSchema>\n>;\n\nconst BUILTIN_TOOL_CALL_STEP_TYPES = [\n 'google_search_call',\n 'code_execution_call',\n 'url_context_call',\n 'file_search_call',\n 'google_maps_call',\n 'mcp_server_tool_call',\n] as const;\n\nconst BUILTIN_TOOL_RESULT_STEP_TYPES = [\n 'google_search_result',\n 'code_execution_result',\n 'url_context_result',\n 'file_search_result',\n 'google_maps_result',\n 'mcp_server_tool_result',\n] as const;\n\n/*\n * Step schema union — elements of `response.steps[]` and the `step` field on\n * `step.start` SSE events.\n *\n * - `user_input` echoes a turn the client sent; only appears on\n * `GET /interactions/{id}` (the full timeline). The SDK skips it.\n * - `model_output` wraps the model's text/image content in `step.content[]`.\n * - `function_call`, `thought`, and the built-in `*_call`/`*_result` steps\n * carry their payload directly on the step (no `content` indirection).\n */\nconst stepSchema = () => {\n const userInputStep = z\n .object({\n type: z.literal('user_input'),\n content: z.array(contentBlockSchema()).nullish(),\n })\n .loose();\n\n const modelOutputStep = z\n .object({\n type: z.literal('model_output'),\n content: z.array(contentBlockSchema()).nullish(),\n })\n .loose();\n\n const functionCallStep = z\n .object({\n type: z.literal('function_call'),\n id: z.string(),\n name: z.string(),\n arguments: z.record(z.string(), z.unknown()).nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n const thoughtStep = z\n .object({\n type: z.literal('thought'),\n signature: z.string().nullish(),\n summary: z.array(thoughtSummaryItemSchema()).nullish(),\n })\n .loose();\n\n const builtinToolCallStep = z\n .object({\n type: z.enum(BUILTIN_TOOL_CALL_STEP_TYPES),\n id: z.string(),\n arguments: z.record(z.string(), z.unknown()).nullish(),\n name: z.string().nullish(),\n server_name: z.string().nullish(),\n search_type: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n const builtinToolResultStep = z\n .object({\n type: z.enum(BUILTIN_TOOL_RESULT_STEP_TYPES),\n call_id: z.string(),\n result: z.unknown().nullish(),\n is_error: z.boolean().nullish(),\n name: z.string().nullish(),\n server_name: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n return z.union([\n userInputStep,\n modelOutputStep,\n functionCallStep,\n thoughtStep,\n builtinToolCallStep,\n builtinToolResultStep,\n z.object({ type: z.string() }).loose(),\n ]);\n};\n\nexport type GoogleInteractionsStep = z.infer<ReturnType<typeof stepSchema>>;\n\nexport const googleInteractionsResponseSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n /*\n * `id` is omitted from the response body when `store: false` (fully\n * stateless mode) — there is no server-side interaction record for the\n * client to reference. `nullish` lets the schema accept that shape.\n */\n id: z.string().nullish(),\n created: z.string().nullish(),\n updated: z.string().nullish(),\n status: interactionStatusSchema(),\n model: z.string().nullish(),\n agent: z.string().nullish(),\n steps: z.array(stepSchema()).nullish(),\n usage: usageSchema().nullish(),\n service_tier: z.string().nullish(),\n previous_interaction_id: z.string().nullish(),\n response_modalities: z.array(z.string()).nullish(),\n })\n .loose(),\n ),\n);\n\nexport type GoogleInteractionsResponse = InferSchema<\n typeof googleInteractionsResponseSchema\n>;\n\nexport const googleInteractionsEventSchema = lazySchema(() =>\n zodSchema(\n (() => {\n const status = interactionStatusSchema();\n const annotation = annotationSchema();\n const thoughtSummaryItem = thoughtSummaryItemSchema();\n\n const interactionCreatedEvent = z\n .object({\n event_type: z.literal('interaction.created'),\n event_id: z.string().nullish(),\n interaction: z\n .object({\n /*\n * `id` is omitted when `store: false` (fully stateless mode);\n * see the matching note on `googleInteractionsResponseSchema.id`.\n */\n id: z.string().nullish(),\n created: z.string().nullish(),\n model: z.string().nullish(),\n agent: z.string().nullish(),\n status: status.nullish(),\n })\n .loose(),\n })\n .loose();\n\n /*\n * `step.start` carries the discriminated step shape under `step`. For\n * `function_call` steps the `name` is included here; for `thought`\n * steps the initial `signature` and `summary` arrive here when set.\n */\n const stepStartEvent = z\n .object({\n event_type: z.literal('step.start'),\n event_id: z.string().nullish(),\n index: z.number(),\n step: stepSchema(),\n })\n .loose();\n\n const stepDeltaText = z\n .object({\n type: z.literal('text'),\n text: z.string(),\n })\n .loose();\n\n const stepDeltaThoughtSummary = z\n .object({\n type: z.literal('thought_summary'),\n content: thoughtSummaryItem.nullish(),\n })\n .loose();\n\n const stepDeltaThoughtSignature = z\n .object({\n type: z.literal('thought_signature'),\n signature: z.string().nullish(),\n })\n .loose();\n\n /*\n * `function_call` step deltas stream the JSON arguments as a partial\n * string. Wire shape:\n * { type: 'arguments_delta', arguments: '<partial-json-string>' }\n * The partial JSON lives in `arguments` (a string), not in a separate\n * `arguments_delta` field — the discriminator name is the only place\n * `arguments_delta` appears. Consumers accumulate the substrings and\n * parse on `step.stop`.\n */\n const stepDeltaArgumentsDelta = z\n .object({\n type: z.literal('arguments_delta'),\n arguments: z.string().nullish(),\n id: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n /*\n * URL/file/place-citation deltas. The discriminator is\n * `text_annotation_delta` (matching the `_delta` suffix used by\n * `arguments_delta`); `text_annotation` is also accepted as an alias.\n */\n const stepDeltaTextAnnotation = z\n .object({\n type: z.enum(['text_annotation_delta', 'text_annotation']),\n annotations: z.array(annotation).nullish(),\n })\n .loose();\n\n /*\n * `image` deltas carry the entire payload per delta (`data` base64 +\n * `mime_type`, or `uri`) — there is no per-byte streaming.\n */\n const stepDeltaImage = z\n .object({\n type: z.literal('image'),\n data: z.string().nullish(),\n mime_type: z.string().nullish(),\n resolution: z.enum(['low', 'medium', 'high', 'ultra_high']).nullish(),\n uri: z.string().nullish(),\n })\n .loose();\n\n /*\n * Built-in tool call/result step deltas mirror the shape of their step\n * counterparts (full payload per delta — there is no per-token\n * streaming of arguments). Result deltas carry the populated `result`\n * payload.\n */\n const stepDeltaBuiltinToolCall = z\n .object({\n type: z.enum(BUILTIN_TOOL_CALL_STEP_TYPES),\n id: z.string().nullish(),\n arguments: z.record(z.string(), z.unknown()).nullish(),\n name: z.string().nullish(),\n server_name: z.string().nullish(),\n search_type: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n const stepDeltaBuiltinToolResult = z\n .object({\n type: z.enum(BUILTIN_TOOL_RESULT_STEP_TYPES),\n call_id: z.string().nullish(),\n result: z.unknown().nullish(),\n is_error: z.boolean().nullish(),\n name: z.string().nullish(),\n server_name: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n const stepDeltaUnknown = z.object({ type: z.string() }).loose();\n\n const stepDeltaUnion = z.union([\n stepDeltaText,\n stepDeltaImage,\n stepDeltaThoughtSummary,\n stepDeltaThoughtSignature,\n stepDeltaArgumentsDelta,\n stepDeltaTextAnnotation,\n stepDeltaBuiltinToolCall,\n stepDeltaBuiltinToolResult,\n stepDeltaUnknown,\n ]);\n\n const stepDeltaEvent = z\n .object({\n event_type: z.literal('step.delta'),\n event_id: z.string().nullish(),\n index: z.number(),\n delta: stepDeltaUnion,\n })\n .loose();\n\n const stepStopEvent = z\n .object({\n event_type: z.literal('step.stop'),\n event_id: z.string().nullish(),\n index: z.number(),\n })\n .loose();\n\n /*\n * Status-transition events. The API emits `interaction.status_update`\n * for in-progress and requires-action transitions; the more specific\n * `interaction.in_progress` and `interaction.requires_action` shapes\n * are accepted so all three route through the same handler.\n */\n const interactionStatusUpdateEvent = z\n .object({\n event_type: z.literal('interaction.status_update'),\n event_id: z.string().nullish(),\n interaction_id: z.string().nullish(),\n status: status.nullish(),\n })\n .loose();\n\n const interactionInProgressEvent = z\n .object({\n event_type: z.literal('interaction.in_progress'),\n event_id: z.string().nullish(),\n interaction_id: z.string().nullish(),\n status: status.nullish(),\n })\n .loose();\n\n const interactionRequiresActionEvent = z\n .object({\n event_type: z.literal('interaction.requires_action'),\n event_id: z.string().nullish(),\n interaction_id: z.string().nullish(),\n status: status.nullish(),\n })\n .loose();\n\n const interactionCompletedEvent = z\n .object({\n event_type: z.literal('interaction.completed'),\n event_id: z.string().nullish(),\n interaction: z\n .object({\n id: z.string().nullish(),\n status: status.nullish(),\n usage: usageSchema().nullish(),\n service_tier: z.string().nullish(),\n })\n .loose(),\n })\n .loose();\n\n const errorEvent = z\n .object({\n event_type: z.literal('error'),\n event_id: z.string().nullish(),\n error: z\n .object({\n code: z.string().nullish(),\n message: z.string().nullish(),\n })\n .loose()\n .nullish(),\n })\n .loose();\n\n const unknownEvent = z.object({ event_type: z.string() }).loose();\n\n return z.union([\n interactionCreatedEvent,\n stepStartEvent,\n stepDeltaEvent,\n stepStopEvent,\n interactionStatusUpdateEvent,\n interactionInProgressEvent,\n interactionRequiresActionEvent,\n interactionCompletedEvent,\n errorEvent,\n unknownEvent,\n ]);\n })(),\n ),\n);\n\nexport type GoogleInteractionsEvent = InferSchema<\n typeof googleInteractionsEventSchema\n>;\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Type-only union of Gemini model IDs that the Interactions API accepts via\n * `model:`. Mirrors `Model` from `googleapis/js-genai`\n * `src/interactions/resources/interactions.ts`.\n *\n * Kept as a separate type from `GoogleModelId` even though most IDs overlap;\n * the two surfaces (`:generateContent` vs `/interactions`) are independent and\n * may diverge over time.\n */\nexport type GoogleInteractionsModelId =\n | 'gemini-2.5-computer-use-preview-10-2025'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-flash-image'\n | 'gemini-2.5-flash-lite'\n | 'gemini-2.5-flash-lite-preview-09-2025'\n | 'gemini-2.5-flash-native-audio-preview-12-2025'\n | 'gemini-2.5-flash-preview-09-2025'\n | 'gemini-2.5-flash-preview-tts'\n | 'gemini-2.5-pro'\n | 'gemini-2.5-pro-preview-tts'\n | 'gemini-3-flash-preview'\n | 'gemini-3-pro-image-preview'\n | 'gemini-3-pro-preview'\n | 'gemini-3.1-pro-preview'\n | 'gemini-3.1-flash-image-preview'\n | 'gemini-3.1-flash-lite-preview'\n | 'gemini-3.1-flash-tts-preview'\n | 'gemini-3.5-flash'\n | 'lyria-3-clip-preview'\n | 'lyria-3-pro-preview'\n | (string & {});\n\n/**\n * Provider-options schema for `google.interactions(...)` calls. Read from the\n * shared `providerOptions.google.*` namespace (per PRD); per-call options that\n * the AI SDK doesn't natively expose live here.\n *\n * All fields are `.nullish()` per the existing google provider convention.\n */\nexport const googleInteractionsLanguageModelOptions = lazySchema(() =>\n zodSchema(\n z.object({\n previousInteractionId: z.string().nullish(),\n store: z.boolean().nullish(),\n\n agent: z.string().nullish(),\n agentConfig: z\n .union([\n z\n .object({\n type: z.literal('dynamic'),\n })\n .loose(),\n z.object({\n type: z.literal('deep-research'),\n thinkingSummaries: z.enum(['auto', 'none']).nullish(),\n visualization: z.enum(['off', 'auto']).nullish(),\n collaborativePlanning: z.boolean().nullish(),\n }),\n ])\n .nullish(),\n\n thinkingLevel: z.enum(['minimal', 'low', 'medium', 'high']).nullish(),\n thinkingSummaries: z.enum(['auto', 'none']).nullish(),\n\n /**\n * Output-format entries that map directly to the API's `response_format`\n * array. Use this to request image, audio, or non-JSON text outputs\n * with full control over `mime_type`, `aspect_ratio`, and `image_size`.\n *\n * Entries are sent in order. The AI SDK call-level `responseFormat: {\n * type: 'json', schema }` still drives JSON-mode and adds a matching\n * text entry automatically; entries listed here are appended.\n */\n responseFormat: z\n .array(\n z.union([\n z\n .object({\n type: z.literal('text'),\n mimeType: z.string().nullish(),\n schema: z.unknown().nullish(),\n })\n .loose(),\n z\n .object({\n type: z.literal('image'),\n mimeType: z.string().nullish(),\n aspectRatio: z\n .enum([\n '1:1',\n '2:3',\n '3:2',\n '3:4',\n '4:3',\n '4:5',\n '5:4',\n '9:16',\n '16:9',\n '21:9',\n '1:8',\n '8:1',\n '1:4',\n '4:1',\n ])\n .nullish(),\n imageSize: z.enum(['1K', '2K', '4K', '512']).nullish(),\n })\n .loose(),\n z\n .object({\n type: z.literal('audio'),\n mimeType: z.string().nullish(),\n })\n .loose(),\n ]),\n )\n .nullish(),\n\n /**\n * @deprecated Use `responseFormat` with a `{ type: 'image', ... }`\n * entry instead. Retained for backwards compatibility; the SDK\n * translates it into a matching `response_format` image entry and\n * emits a warning when set.\n */\n imageConfig: z\n .object({\n aspectRatio: z\n .enum([\n '1:1',\n '2:3',\n '3:2',\n '3:4',\n '4:3',\n '4:5',\n '5:4',\n '9:16',\n '16:9',\n '21:9',\n '1:8',\n '8:1',\n '1:4',\n '4:1',\n ])\n .nullish(),\n imageSize: z.enum(['1K', '2K', '4K', '512']).nullish(),\n })\n .nullish(),\n mediaResolution: z\n .enum(['low', 'medium', 'high', 'ultra_high'])\n .nullish(),\n\n responseModalities: z\n .array(z.enum(['text', 'image', 'audio', 'video', 'document']))\n .nullish(),\n serviceTier: z.enum(['flex', 'standard', 'priority']).nullish(),\n\n /**\n * Alternative to AI SDK `system` message. If both are set, the AI SDK\n * `system` message wins and a warning is emitted.\n */\n systemInstruction: z.string().nullish(),\n\n /**\n * Per-block signature for round-tripping `thought.signature` and\n * `function_call.signature` blocks. Set by the SDK on output reasoning /\n * tool-call parts; passed back unchanged on input parts so the API\n * accepts the prior turn.\n */\n signature: z.string().nullish(),\n\n /**\n * Set by the SDK on output assistant messages. The converter uses it to\n * decide which messages to drop when compacting under\n * `previousInteractionId`.\n */\n interactionId: z.string().nullish(),\n\n /**\n * Maximum time, in milliseconds, to poll a background interaction (agent\n * call) before giving up. Defaults to 30 minutes. Long-running agents\n * such as deep research can take tens of minutes — increase if needed.\n */\n pollingTimeoutMs: z.number().int().positive().nullish(),\n\n /**\n * Run the interaction in the background. Required for agents whose\n * server-side workflow cannot complete within a single request/response.\n * When `true`, the POST returns with a non-terminal status and the SDK\n * polls `GET /interactions/{id}` until the work completes. Some agents\n * reject `true`; see the agent's documentation for which mode it\n * requires.\n */\n background: z.boolean().nullish(),\n\n /**\n * Environment configuration for the agent sandbox. Only applies to agent\n * calls (`google.interactions({ agent })`); ignored on model-id calls.\n *\n * - `\"remote\"`: provision a fresh sandbox for this call.\n * - any other string: an existing `environment_id` to reuse.\n * - object: provision a fresh sandbox and optionally preload `sources`\n * and/or constrain outbound traffic via `network`.\n */\n environment: z\n .union([\n z.string(),\n z.object({\n type: z.literal('remote'),\n sources: z\n .array(\n z.union([\n z.object({\n type: z.literal('gcs'),\n source: z.string(),\n target: z.string().nullish(),\n }),\n z.object({\n type: z.literal('repository'),\n source: z.string(),\n target: z.string().nullish(),\n }),\n z.object({\n type: z.literal('inline'),\n content: z.string(),\n target: z.string(),\n }),\n ]),\n )\n .nullish(),\n network: z\n .union([\n z.literal('disabled'),\n z.object({\n allowlist: z.array(\n z.object({\n domain: z.string(),\n transform: z\n .array(z.record(z.string(), z.string()))\n .nullish(),\n }),\n ),\n }),\n ])\n .nullish(),\n }),\n ])\n .nullish(),\n }),\n ),\n);\n\nexport type GoogleLanguageModelInteractionsOptions = InferSchema<\n typeof googleInteractionsLanguageModelOptions\n>;\n","import type { JSONValue, LanguageModelV4Content } from '@ai-sdk/provider';\nimport type { GoogleInteractionsStep } from './google-interactions-api';\nimport {\n annotationsToSources,\n builtinToolResultToSources,\n} from './extract-google-interactions-sources';\nimport type {\n GoogleInteractionsAnnotation,\n GoogleInteractionsBuiltinToolResultContent,\n} from './google-interactions-prompt';\n\nexport type ParseGoogleInteractionsOutputsResult = {\n content: Array<LanguageModelV4Content>;\n hasFunctionCall: boolean;\n};\n\n/*\n * Builds a `providerMetadata.google` payload for an output part so the\n * Interactions converter on the next turn can read both the per-step\n * `signature` (round-trip) and the parent `interactionId` (history compaction\n * under `previousInteractionId`).\n */\nfunction googleProviderMetadata({\n signature,\n interactionId,\n}: {\n signature?: string | null;\n interactionId?: string;\n}): { providerMetadata: { google: Record<string, string> } } | object {\n const google: Record<string, string> = {};\n if (signature != null) {\n google.signature = signature;\n }\n if (interactionId != null) {\n google.interactionId = interactionId;\n }\n return Object.keys(google).length > 0 ? { providerMetadata: { google } } : {};\n}\n\nconst BUILTIN_TOOL_CALL_TYPES = new Set([\n 'google_search_call',\n 'code_execution_call',\n 'url_context_call',\n 'file_search_call',\n 'google_maps_call',\n 'mcp_server_tool_call',\n]);\n\nconst BUILTIN_TOOL_RESULT_TYPES = new Set([\n 'google_search_result',\n 'code_execution_result',\n 'url_context_result',\n 'file_search_result',\n 'google_maps_result',\n 'mcp_server_tool_result',\n]);\n\nfunction builtinToolNameFromCallType(type: string): string {\n return type.replace(/_call$/, '');\n}\n\nfunction builtinToolNameFromResultType(type: string): string {\n return type.replace(/_result$/, '');\n}\n\n/**\n * Walks the `steps[]` array of an Interactions response and emits AI SDK\n * `LanguageModelV4Content[]`. Surfaces:\n *\n * - `model_output` steps: iterates `step.content[]` for `text` (with\n * annotations → source parts) and `image` content blocks.\n * - `thought` steps: emits a single `reasoning` part from `summary[*]`.\n * - `function_call` steps: emits a `tool-call` part directly.\n * - Built-in tool `*_call` / `*_result` steps (Google Search, Code Execution,\n * URL Context, File Search, Google Maps, MCP Server): emits\n * `tool-call`/`tool-result` parts with `providerExecuted: true`.\n * - `user_input` steps are skipped (they echo the client's input).\n */\nexport function parseGoogleInteractionsOutputs({\n steps,\n generateId,\n interactionId,\n}: {\n steps: Array<GoogleInteractionsStep> | null | undefined;\n generateId: () => string;\n /**\n * Top-level `Interaction.id` on the response. Stamped onto each output\n * part's `providerMetadata.google.interactionId` so the converter can drop\n * matching assistant turns when `previousInteractionId` is used on the\n * next turn (compaction).\n */\n interactionId?: string;\n}): ParseGoogleInteractionsOutputsResult {\n const content: Array<LanguageModelV4Content> = [];\n let hasFunctionCall = false;\n\n if (steps == null) {\n return { content, hasFunctionCall };\n }\n\n for (const step of steps) {\n if (step == null || typeof step !== 'object') continue;\n const type = (step as { type?: string }).type;\n if (typeof type !== 'string') continue;\n\n switch (type) {\n case 'user_input': {\n break;\n }\n case 'model_output': {\n const blocks =\n (step as { content?: Array<{ type?: string; [k: string]: unknown }> })\n .content ?? [];\n for (const block of blocks) {\n if (block == null || typeof block !== 'object') continue;\n const blockType = block.type;\n if (blockType === 'text') {\n const text = (block as { text?: string }).text ?? '';\n const annotations = (\n block as {\n annotations?: Array<GoogleInteractionsAnnotation>;\n }\n ).annotations;\n content.push({\n type: 'text',\n text,\n ...googleProviderMetadata({ interactionId }),\n });\n const sources = annotationsToSources({ annotations, generateId });\n for (const source of sources) {\n content.push(source);\n }\n } else if (blockType === 'image') {\n const image = block as {\n data?: string;\n mime_type?: string;\n uri?: string;\n };\n if (image.data != null && image.data.length > 0) {\n content.push({\n type: 'file',\n mediaType: image.mime_type ?? 'image/png',\n data: { type: 'data', data: image.data },\n ...googleProviderMetadata({ interactionId }),\n });\n } else if (image.uri != null && image.uri.length > 0) {\n content.push({\n type: 'file',\n mediaType: image.mime_type ?? 'image/png',\n data: { type: 'url', url: new URL(image.uri) },\n ...googleProviderMetadata({ interactionId }),\n });\n }\n }\n }\n break;\n }\n case 'thought': {\n const thought = step as {\n signature?: string;\n summary?: Array<{ type: string; text?: string }>;\n };\n const summary = Array.isArray(thought.summary) ? thought.summary : [];\n const text = summary\n .filter(\n item => item?.type === 'text' && typeof item.text === 'string',\n )\n .map(item => item.text as string)\n .join('\\n');\n content.push({\n type: 'reasoning',\n text,\n ...googleProviderMetadata({\n signature: thought.signature,\n interactionId,\n }),\n });\n break;\n }\n case 'function_call': {\n hasFunctionCall = true;\n const call = step as {\n id: string;\n name: string;\n arguments?: Record<string, unknown> | null;\n signature?: string | null;\n };\n content.push({\n type: 'tool-call',\n toolCallId: call.id,\n toolName: call.name,\n input: JSON.stringify(call.arguments ?? {}),\n ...googleProviderMetadata({\n signature: call.signature,\n interactionId,\n }),\n });\n break;\n }\n default: {\n if (BUILTIN_TOOL_CALL_TYPES.has(type)) {\n const call = step as {\n id?: string;\n arguments?: Record<string, unknown>;\n name?: string;\n server_name?: string;\n };\n const toolName =\n type === 'mcp_server_tool_call'\n ? (call.name ?? 'mcp_server_tool')\n : builtinToolNameFromCallType(type);\n const input = JSON.stringify(call.arguments ?? {});\n content.push({\n type: 'tool-call',\n toolCallId: call.id ?? generateId(),\n toolName,\n input,\n providerExecuted: true,\n });\n } else if (BUILTIN_TOOL_RESULT_TYPES.has(type)) {\n const result = step as {\n call_id?: string;\n result?: unknown;\n is_error?: boolean;\n name?: string;\n };\n const toolName =\n type === 'mcp_server_tool_result'\n ? (result.name ?? 'mcp_server_tool')\n : builtinToolNameFromResultType(type);\n content.push({\n type: 'tool-result',\n toolCallId: result.call_id ?? generateId(),\n toolName,\n result: (result.result ?? null) as NonNullable<JSONValue>,\n });\n const sources = builtinToolResultToSources({\n block:\n step as unknown as GoogleInteractionsBuiltinToolResultContent,\n generateId,\n });\n for (const source of sources) {\n content.push(source);\n }\n }\n break;\n }\n }\n }\n\n return { content, hasFunctionCall };\n}\n","import {\n createJsonResponseHandler,\n delay,\n getFromApi,\n isAbortError,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { googleFailedResponseHandler } from '../google-error';\nimport { cancelGoogleInteraction } from './cancel-google-interaction';\nimport {\n googleInteractionsResponseSchema,\n type GoogleInteractionsResponse,\n} from './google-interactions-api';\nimport type { GoogleInteractionsStatus } from './google-interactions-prompt';\n\nconst TERMINAL_STATUSES: ReadonlySet<GoogleInteractionsStatus | string> =\n new Set(['completed', 'failed', 'cancelled', 'incomplete']);\n\nexport function isTerminalStatus(\n status: GoogleInteractionsStatus | string | null | undefined,\n): boolean {\n return status != null && TERMINAL_STATUSES.has(status);\n}\n\n/*\n * Default polling cadence for background interactions. Starts at 1 s, doubles\n * each tick up to a 10 s ceiling, and gives up after 30 minutes -- agent runs\n * such as deep research can take tens of minutes server-side, so we err on\n * the long side rather than truncate a real run. Override per-call via\n * `providerOptions.google.pollingTimeoutMs`.\n */\nconst DEFAULT_INITIAL_DELAY_MS = 1000;\nconst DEFAULT_MAX_DELAY_MS = 10000;\nconst DEFAULT_TIMEOUT_MS = 30 * 60 * 1000;\n\nexport type PollGoogleInteractionResult = {\n response: GoogleInteractionsResponse;\n rawResponse: unknown;\n responseHeaders: Record<string, string> | undefined;\n};\n\n/**\n * Polls `GET {baseURL}/interactions/{id}` until the response status is\n * terminal (`completed` / `failed` / `cancelled` / `incomplete`). Throws if\n * the polling loop exceeds `timeoutMs`, the response has no `id` to poll on,\n * or the abort signal fires.\n */\nexport async function pollGoogleInteractionUntilTerminal({\n baseURL,\n interactionId,\n headers,\n fetch,\n abortSignal,\n initialDelayMs = DEFAULT_INITIAL_DELAY_MS,\n maxDelayMs = DEFAULT_MAX_DELAY_MS,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n}: {\n baseURL: string;\n interactionId: string | null | undefined;\n headers: Record<string, string | undefined>;\n fetch?: FetchFunction;\n abortSignal?: AbortSignal;\n initialDelayMs?: number;\n maxDelayMs?: number;\n timeoutMs?: number;\n}): Promise<PollGoogleInteractionResult> {\n if (interactionId == null || interactionId.length === 0) {\n throw new Error(\n 'google.interactions: cannot poll a background interaction without an id. ' +\n 'The POST response did not include an interaction id.',\n );\n }\n\n const startedAt = Date.now();\n let nextDelayMs = initialDelayMs;\n const url = `${baseURL}/interactions/${encodeURIComponent(interactionId)}`;\n\n /*\n * When the caller aborts, fire a best-effort `POST /interactions/{id}/cancel`\n * so the run stops billing on Google's side. Wrap every exit path that's\n * triggered by an abort -- the explicit `abortSignal.aborted` check, the\n * AbortError thrown by `delay()`, and any AbortError thrown by `getFromApi`.\n */\n const cancelOnServer = () =>\n cancelGoogleInteraction({ baseURL, interactionId, headers, fetch });\n\n try {\n while (true) {\n if (abortSignal?.aborted) {\n await cancelOnServer();\n throw new DOMException('Polling was aborted', 'AbortError');\n }\n\n if (Date.now() - startedAt > timeoutMs) {\n throw new Error(\n `google.interactions: timed out polling interaction ${interactionId} after ${timeoutMs}ms.`,\n );\n }\n\n await delay(nextDelayMs, { abortSignal });\n\n const {\n value: response,\n rawValue: rawResponse,\n responseHeaders,\n } = await getFromApi({\n url,\n headers,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleInteractionsResponseSchema,\n ),\n abortSignal,\n fetch,\n });\n\n if (isTerminalStatus(response.status)) {\n return { response, rawResponse, responseHeaders };\n }\n\n nextDelayMs = Math.min(nextDelayMs * 2, maxDelayMs);\n }\n } catch (error) {\n if (isAbortError(error)) {\n await cancelOnServer();\n }\n throw error;\n }\n}\n","import {\n combineHeaders,\n getRuntimeEnvironmentUserAgent,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\n\nconst getOriginalFetch = () => globalThis.fetch;\n\n/**\n * Best-effort `POST /interactions/{id}/cancel` to stop a background interaction\n * on Google's side after the caller has aborted locally. Errors and non-2xx\n * responses are swallowed so a cancel failure cannot mask the original abort.\n *\n * Skips the request entirely if `interactionId` is missing/empty -- e.g. when\n * the interaction was created with `store: false` and the API did not return an\n * id.\n */\nexport async function cancelGoogleInteraction({\n baseURL,\n interactionId,\n headers,\n fetch = getOriginalFetch(),\n}: {\n baseURL: string;\n interactionId: string | null | undefined;\n headers: Record<string, string | undefined>;\n fetch?: FetchFunction;\n}): Promise<void> {\n if (interactionId == null || interactionId.length === 0) {\n return;\n }\n\n const url = `${baseURL}/interactions/${encodeURIComponent(interactionId)}/cancel`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: withUserAgentSuffix(\n combineHeaders({ 'Content-Type': 'application/json' }, headers),\n getRuntimeEnvironmentUserAgent(),\n ),\n body: '{}',\n });\n\n /*\n * Drain the body so undici/Node can return the connection to the pool.\n * Errors (e.g. non-2xx, network failure) are intentionally ignored: this\n * is a best-effort cleanup and must not throw past the caller, which is\n * already handling an aborted/failed run.\n */\n try {\n await response.text();\n } catch {\n // ignore\n }\n } catch {\n // ignore -- cancel is best-effort\n }\n}\n","import type {\n LanguageModelV4CallOptions,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport type {\n GoogleInteractionsTool,\n GoogleInteractionsToolChoice,\n} from './google-interactions-prompt';\n\nexport type PrepareGoogleInteractionsToolsResult = {\n tools: Array<GoogleInteractionsTool> | undefined;\n toolChoice: GoogleInteractionsToolChoice | undefined;\n toolWarnings: Array<SharedV4Warning>;\n};\n\n/**\n * Maps AI SDK tool definitions and `toolChoice` onto the Gemini Interactions\n * `tools[]` and `tool_choice` request fields.\n *\n * AI SDK function tools (`{ type: 'function', name, description, inputSchema }`)\n * map to Interactions `{ type: 'function', name, description, parameters }`,\n * with `parameters` passed through as plain JSON Schema (per\n * `googleapis/js-genai` `samples/interactions_tool_call_with_functions.ts` and\n * `src/interactions/resources/interactions.ts` `Function.parameters: unknown`).\n *\n * Provider-defined tools (`{ type: 'provider', id: 'google.<name>', args }`)\n * map to the discriminated `Tool` union. The full set of\n * provider-defined tool ids supported here:\n *\n * - `google.google_search` -> `{ type: 'google_search', search_types? }`\n * - `google.code_execution` -> `{ type: 'code_execution' }`\n * - `google.url_context` -> `{ type: 'url_context' }`\n * - `google.file_search` -> `{ type: 'file_search', file_search_store_names?, top_k?, metadata_filter? }`\n * - `google.google_maps` -> `{ type: 'google_maps', latitude?, longitude?, enable_widget? }`\n * - `google.computer_use` -> `{ type: 'computer_use', environment?, excludedPredefinedFunctions? }`\n * - `google.mcp_server` -> `{ type: 'mcp_server', name?, url?, headers?, allowed_tools? }`\n * - `google.retrieval` -> `{ type: 'retrieval', retrieval_types?, vertex_ai_search_config? }`\n *\n * `toolChoice` shapes:\n * - `'auto'` -> `'auto'`\n * - `'required'` -> `'any'`\n * - `'none'` -> `'none'`\n * - `{ type: 'tool', toolName }` -> `{ allowed_tools: { mode: 'validated', tools: [name] } }`\n * (Interactions `AllowedTools.tools` is an `Array<string>` of function\n * names, not tool descriptors -- see `src/interactions/resources/interactions.ts`\n * line ~151).\n */\nexport function prepareGoogleInteractionsTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV4CallOptions['tools'];\n toolChoice?: LanguageModelV4CallOptions['toolChoice'];\n}): PrepareGoogleInteractionsToolsResult {\n const toolWarnings: Array<SharedV4Warning> = [];\n\n const normalized = tools?.length ? tools : undefined;\n\n if (normalized == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const interactionsTools: Array<GoogleInteractionsTool> = [];\n\n for (const tool of normalized) {\n if (tool.type === 'function') {\n interactionsTools.push({\n type: 'function',\n name: tool.name,\n description: tool.description ?? '',\n parameters: tool.inputSchema,\n });\n continue;\n }\n\n if (tool.type === 'provider') {\n const args = (tool.args ?? {}) as Record<string, unknown>;\n switch (tool.id) {\n case 'google.google_search': {\n const searchTypesArg = args.searchTypes as\n | { webSearch?: unknown; imageSearch?: unknown }\n | undefined;\n let search_types:\n | Array<'web_search' | 'image_search' | 'enterprise_web_search'>\n | undefined;\n if (searchTypesArg != null && typeof searchTypesArg === 'object') {\n const list: Array<\n 'web_search' | 'image_search' | 'enterprise_web_search'\n > = [];\n if (searchTypesArg.webSearch != null) list.push('web_search');\n if (searchTypesArg.imageSearch != null) list.push('image_search');\n if (list.length > 0) {\n search_types = list;\n }\n }\n interactionsTools.push({\n type: 'google_search',\n ...(search_types != null ? { search_types } : {}),\n });\n break;\n }\n case 'google.code_execution': {\n interactionsTools.push({ type: 'code_execution' });\n break;\n }\n case 'google.url_context': {\n interactionsTools.push({ type: 'url_context' });\n break;\n }\n case 'google.file_search': {\n interactionsTools.push({\n type: 'file_search',\n ...(args.fileSearchStoreNames != null\n ? {\n file_search_store_names:\n args.fileSearchStoreNames as Array<string>,\n }\n : {}),\n ...(args.topK != null ? { top_k: args.topK as number } : {}),\n ...(args.metadataFilter != null\n ? { metadata_filter: args.metadataFilter as string }\n : {}),\n });\n break;\n }\n case 'google.google_maps': {\n interactionsTools.push({\n type: 'google_maps',\n ...(args.latitude != null\n ? { latitude: args.latitude as number }\n : {}),\n ...(args.longitude != null\n ? { longitude: args.longitude as number }\n : {}),\n ...(args.enableWidget != null\n ? { enable_widget: args.enableWidget as boolean }\n : {}),\n });\n break;\n }\n case 'google.computer_use': {\n interactionsTools.push({\n type: 'computer_use',\n environment:\n (args.environment as 'browser' | undefined) ?? 'browser',\n ...(args.excludedPredefinedFunctions != null\n ? {\n excludedPredefinedFunctions:\n args.excludedPredefinedFunctions as Array<string>,\n }\n : {}),\n });\n break;\n }\n case 'google.mcp_server': {\n interactionsTools.push({\n type: 'mcp_server',\n ...(args.name != null ? { name: args.name as string } : {}),\n ...(args.url != null ? { url: args.url as string } : {}),\n ...(args.headers != null\n ? { headers: args.headers as Record<string, string> }\n : {}),\n ...(args.allowedTools != null\n ? { allowed_tools: args.allowedTools as Array<unknown> }\n : {}),\n });\n break;\n }\n case 'google.retrieval': {\n const vertexAiSearchConfig =\n (args.vertexAiSearchConfig as\n | { datastores?: Array<string>; engine?: string }\n | undefined) ?? undefined;\n interactionsTools.push({\n type: 'retrieval',\n ...(args.retrievalTypes != null\n ? {\n retrieval_types:\n args.retrievalTypes as Array<'vertex_ai_search'>,\n }\n : { retrieval_types: ['vertex_ai_search'] }),\n ...(vertexAiSearchConfig != null\n ? { vertex_ai_search_config: vertexAiSearchConfig }\n : {}),\n });\n break;\n }\n default: {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details: `provider-defined tool ${tool.id} is not supported by google.interactions; tool dropped.`,\n });\n break;\n }\n }\n continue;\n }\n\n toolWarnings.push({\n type: 'unsupported',\n feature: `tool of type ${(tool as { type: string }).type}`,\n details:\n 'Only function tools and google.* provider-defined tools are supported by google.interactions; tool dropped.',\n });\n }\n\n /*\n * `tool_choice` on the Interactions API governs function calling only -- the\n * API rejects requests with `tool_choice` set when no `function` tools are\n * present (`{\"error\":{\"message\":\"Function calling config is set without\n * function_declarations.\"}}`). Drop `tool_choice` when the resolved tool\n * list is empty or contains no function tools.\n */\n const hasFunctionTool = interactionsTools.some(t => t.type === 'function');\n\n let mappedToolChoice: GoogleInteractionsToolChoice | undefined;\n if (toolChoice != null && hasFunctionTool) {\n switch (toolChoice.type) {\n case 'auto':\n mappedToolChoice = 'auto';\n break;\n case 'required':\n mappedToolChoice = 'any';\n break;\n case 'none':\n mappedToolChoice = 'none';\n break;\n case 'tool':\n mappedToolChoice = {\n allowed_tools: {\n mode: 'validated',\n tools: [toolChoice.toolName],\n },\n };\n break;\n }\n }\n\n return {\n tools: interactionsTools.length > 0 ? interactionsTools : undefined,\n toolChoice: mappedToolChoice,\n toolWarnings,\n };\n}\n","import {\n createEventSourceResponseHandler,\n delay,\n getFromApi,\n isAbortError,\n type FetchFunction,\n type ParseResult,\n} from '@ai-sdk/provider-utils';\nimport { googleFailedResponseHandler } from '../google-error';\nimport { cancelGoogleInteraction } from './cancel-google-interaction';\nimport {\n googleInteractionsEventSchema,\n type GoogleInteractionsEvent,\n} from './google-interactions-api';\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_DELAY_MS = 500;\n\n/**\n * Connects to `GET {baseURL}/interactions/{id}?stream=true` and surfaces the\n * server-sent events as a `ReadableStream<ParseResult<GoogleInteractionsEvent>>`\n * so the existing `buildGoogleInteractionsStreamTransform` can consume them\n * unchanged.\n *\n * The connection can drop mid-run: long-running agents idle for long\n * stretches between SSE events and undici's default body timeout terminates\n * the request with `UND_ERR_BODY_TIMEOUT`. We track the last seen `event_id`\n * and reconnect with `?last_event_id=<id>` on any unexpected end. After\n * `maxRetries` consecutive failures the stream errors out so the caller can\n * decide whether to fall back to polling.\n *\n * The stream completes cleanly when an `interaction.complete` event with a\n * terminal status arrives, or when an `error` event arrives.\n */\nexport function streamGoogleInteractionEvents({\n baseURL,\n interactionId,\n headers,\n fetch,\n abortSignal,\n maxRetries = DEFAULT_MAX_RETRIES,\n retryDelayMs = DEFAULT_RETRY_DELAY_MS,\n}: {\n baseURL: string;\n interactionId: string;\n headers: Record<string, string | undefined>;\n fetch?: FetchFunction;\n abortSignal?: AbortSignal;\n maxRetries?: number;\n retryDelayMs?: number;\n}): ReadableStream<ParseResult<GoogleInteractionsEvent>> {\n if (interactionId.length === 0) {\n throw new Error(\n 'google.interactions: cannot stream a background interaction without an id.',\n );\n }\n\n const eventSourceHeaders = {\n ...headers,\n accept: 'text/event-stream',\n };\n\n let lastEventId: string | undefined;\n let complete = false;\n let attempt = 0;\n let receivedAnyEventThisAttempt = false;\n let currentReader:\n | ReadableStreamDefaultReader<ParseResult<GoogleInteractionsEvent>>\n | undefined;\n\n /*\n * Forwards `cancel()` from the consumer (and the upstream `abortSignal`) to\n * any in-flight `getFromApi` or `delay` so the loop unblocks immediately\n * instead of waiting for the next iteration to notice a flag.\n */\n const internalAbort = new AbortController();\n const upstreamAbortHandler = () => internalAbort.abort();\n if (abortSignal != null) {\n if (abortSignal.aborted) {\n internalAbort.abort();\n } else {\n abortSignal.addEventListener('abort', upstreamAbortHandler, {\n once: true,\n });\n }\n }\n const effectiveSignal = internalAbort.signal;\n\n function buildUrl(): string {\n const base = `${baseURL}/interactions/${encodeURIComponent(interactionId)}`;\n const params = new URLSearchParams({ stream: 'true' });\n if (lastEventId != null) {\n params.set('last_event_id', lastEventId);\n }\n return `${base}?${params.toString()}`;\n }\n\n async function openReader() {\n const { value: stream } = await getFromApi({\n url: buildUrl(),\n headers: eventSourceHeaders,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n googleInteractionsEventSchema,\n ),\n abortSignal: effectiveSignal,\n fetch,\n });\n return stream.getReader();\n }\n\n return new ReadableStream<ParseResult<GoogleInteractionsEvent>>({\n async start(controller) {\n try {\n while (!complete && !effectiveSignal.aborted) {\n if (currentReader == null) {\n try {\n currentReader = await openReader();\n receivedAnyEventThisAttempt = false;\n } catch (error) {\n if (isAbortError(error) || effectiveSignal.aborted) {\n controller.error(error);\n return;\n }\n attempt++;\n if (attempt >= maxRetries) {\n controller.error(error);\n return;\n }\n await delay(retryDelayMs * attempt, {\n abortSignal: effectiveSignal,\n });\n continue;\n }\n }\n\n try {\n const { done, value } = await currentReader.read();\n if (done) {\n /*\n * Underlying stream ended. If we already saw the terminal event\n * we exit cleanly; otherwise this is an unexpected disconnect\n * and we'll reconnect with `last_event_id`.\n *\n * If the connection closed without producing any events at all\n * this attempt, count it as a failed attempt -- otherwise an\n * empty/misbehaving server response would loop forever.\n */\n currentReader = undefined;\n if (complete) break;\n if (!receivedAnyEventThisAttempt) {\n attempt++;\n if (attempt >= maxRetries) {\n controller.error(\n new Error(\n 'google.interactions: SSE stream closed without producing any events.',\n ),\n );\n return;\n }\n await delay(retryDelayMs * attempt, {\n abortSignal: effectiveSignal,\n });\n } else {\n attempt = 0;\n }\n continue;\n }\n\n receivedAnyEventThisAttempt = true;\n\n if (value.success) {\n const ev = value.value as {\n event_id?: string;\n event_type?: string;\n };\n if (typeof ev.event_id === 'string' && ev.event_id.length > 0) {\n lastEventId = ev.event_id;\n }\n if (\n ev.event_type === 'interaction.completed' ||\n ev.event_type === 'error'\n ) {\n complete = true;\n }\n }\n\n controller.enqueue(value);\n } catch (error) {\n if (isAbortError(error) || effectiveSignal.aborted) {\n controller.error(error);\n return;\n }\n currentReader = undefined;\n attempt++;\n if (attempt >= maxRetries) {\n controller.error(error);\n return;\n }\n await delay(retryDelayMs * attempt, {\n abortSignal: effectiveSignal,\n });\n }\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n } finally {\n if (abortSignal != null) {\n abortSignal.removeEventListener('abort', upstreamAbortHandler);\n }\n currentReader?.cancel().catch(() => {});\n currentReader = undefined;\n\n /*\n * If we're exiting because the caller aborted (or the consumer\n * cancelled the stream) before the agent finished, fire\n * `POST /interactions/{id}/cancel` so the run stops billing on\n * Google's side. Skipped when `complete` is set -- the agent already\n * reported terminal status via `interaction.complete` / `error`.\n */\n if (effectiveSignal.aborted && !complete) {\n await cancelGoogleInteraction({\n baseURL,\n interactionId,\n headers,\n fetch,\n });\n }\n }\n },\n\n cancel() {\n internalAbort.abort();\n currentReader?.cancel().catch(() => {});\n currentReader = undefined;\n },\n });\n}\n","import type {\n LanguageModelV4FinishReason,\n LanguageModelV4StreamPart,\n SharedV4ProviderMetadata,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport { convertGoogleInteractionsUsage } from './convert-google-interactions-usage';\nimport { type GoogleInteractionsResponse } from './google-interactions-api';\nimport { mapGoogleInteractionsFinishReason } from './map-google-interactions-finish-reason';\nimport { parseGoogleInteractionsOutputs } from './parse-google-interactions-outputs';\n\n/**\n * Synthesizes a `LanguageModelV4StreamPart` stream from a fully-resolved\n * Interaction response (i.e. the `response` returned after polling a\n * `background: true` agent call to a terminal status).\n *\n * Agent calls cannot use SSE (`stream: true` is incompatible with\n * `background: true`), so we deterministically replay the polled outputs as a\n * stream sequence in the same order/shape `buildGoogleInteractionsStreamTransform`\n * would produce. Each text/reasoning block is emitted as a single delta — the\n * server has already produced the whole block by the time we synthesize.\n */\nexport function synthesizeGoogleInteractionsAgentStream({\n response,\n warnings,\n generateId,\n includeRawChunks,\n headerServiceTier,\n}: {\n response: GoogleInteractionsResponse;\n warnings: Array<SharedV4Warning>;\n generateId: () => string;\n includeRawChunks?: boolean;\n headerServiceTier?: string;\n}): ReadableStream<LanguageModelV4StreamPart> {\n return new ReadableStream<LanguageModelV4StreamPart>({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n\n const interactionId =\n typeof response.id === 'string' && response.id.length > 0\n ? response.id\n : undefined;\n\n let timestamp: Date | undefined;\n const created = response.created;\n if (typeof created === 'string') {\n const parsed = new Date(created);\n if (!Number.isNaN(parsed.getTime())) {\n timestamp = parsed;\n }\n }\n\n controller.enqueue({\n type: 'response-metadata',\n ...(interactionId != null ? { id: interactionId } : {}),\n modelId: response.model ?? undefined,\n ...(timestamp ? { timestamp } : {}),\n });\n\n if (includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: response });\n }\n\n const { content, hasFunctionCall } = parseGoogleInteractionsOutputs({\n steps: response.steps ?? null,\n generateId,\n interactionId,\n });\n\n let blockCounter = 0;\n const nextBlockId = () => `${interactionId ?? 'agent'}:${blockCounter++}`;\n\n for (const part of content) {\n switch (part.type) {\n case 'text': {\n const id = nextBlockId();\n const providerMetadata = part.providerMetadata;\n controller.enqueue({ type: 'text-start', id });\n if (part.text.length > 0) {\n controller.enqueue({ type: 'text-delta', id, delta: part.text });\n }\n controller.enqueue({\n type: 'text-end',\n id,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n break;\n }\n case 'reasoning': {\n const id = nextBlockId();\n const providerMetadata = part.providerMetadata;\n controller.enqueue({ type: 'reasoning-start', id });\n if (part.text.length > 0) {\n controller.enqueue({\n type: 'reasoning-delta',\n id,\n delta: part.text,\n });\n }\n controller.enqueue({\n type: 'reasoning-end',\n id,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n break;\n }\n case 'tool-call': {\n const providerMetadata = part.providerMetadata;\n controller.enqueue({\n type: 'tool-input-start',\n id: part.toolCallId,\n toolName: part.toolName,\n ...(part.providerExecuted\n ? { providerExecuted: part.providerExecuted }\n : {}),\n });\n controller.enqueue({\n type: 'tool-input-delta',\n id: part.toolCallId,\n delta: part.input,\n });\n controller.enqueue({\n type: 'tool-input-end',\n id: part.toolCallId,\n });\n controller.enqueue({\n type: 'tool-call',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...(part.providerExecuted\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n break;\n }\n case 'tool-result': {\n controller.enqueue({\n type: 'tool-result',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n });\n break;\n }\n case 'source':\n case 'file': {\n controller.enqueue(part);\n break;\n }\n default:\n break;\n }\n }\n\n const serviceTier = response.service_tier ?? headerServiceTier;\n\n const finishReason: LanguageModelV4FinishReason = {\n unified: mapGoogleInteractionsFinishReason({\n status: response.status,\n hasFunctionCall,\n }),\n raw: response.status,\n };\n\n const providerMetadata: SharedV4ProviderMetadata = {\n google: {\n ...(interactionId != null ? { interactionId } : {}),\n ...(serviceTier != null ? { serviceTier } : {}),\n },\n };\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertGoogleInteractionsUsage(response.usage),\n providerMetadata,\n });\n\n controller.close();\n },\n });\n}\n"],"mappings":"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","names":["generateId","withUserAgentSuffix","lazySchema","zodSchema","z","lazySchema","zodSchema","z","responseHeaders","response","rawValue","lazySchema","zodSchema","z","combineHeaders","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","resolve","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","zodSchema","z","_a","_b","_c","_d","lazySchema","zodSchema","z","UnsupportedFunctionalityError","googleTools","functionDeclarations","UnsupportedFunctionalityError","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","googleTools","combineHeaders","resolve","postJsonToApi","createJsonResponseHandler","generateId","args","z","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","combineHeaders","convertToBase64","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","resolve","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","zodSchema","z","lazySchema","zodSchema","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","postJsonToApi","combineHeaders","resolve","createJsonResponseHandler","convertToBase64","lazySchema","zodSchema","z","combineHeaders","createJsonResponseHandler","lazySchema","parseProviderOptions","zodSchema","z","parseProviderOptions","combineHeaders","createJsonResponseHandler","lazySchema","zodSchema","z","AISDKError","combineHeaders","createJsonResponseHandler","delay","getFromApi","parseProviderOptions","postJsonToApi","resolve","z","lazySchema","zodSchema","z","parseProviderOptions","postJsonToApi","combineHeaders","resolve","createJsonResponseHandler","AISDKError","delay","getFromApi","z","combineHeaders","createEventSourceResponseHandler","createJsonResponseHandler","defaultGenerateId","parseProviderOptions","postJsonToApi","resolve","serializeModelOptions","WORKFLOW_DESERIALIZE","WORKFLOW_SERIALIZE","generateId","generateId","google","convertToBase64","getTopLevelMediaType","isFullMediaType","resolveFullMediaType","resolveProviderReference","lazySchema","zodSchema","z","usageSchema","lazySchema","zodSchema","z","google","BUILTIN_TOOL_CALL_TYPES","BUILTIN_TOOL_RESULT_TYPES","builtinToolNameFromCallType","builtinToolNameFromResultType","generateId","createJsonResponseHandler","delay","getFromApi","combineHeaders","delay","getFromApi","createJsonResponseHandler","createEventSourceResponseHandler","delay","getFromApi","isAbortError","getFromApi","createEventSourceResponseHandler","isAbortError","delay","generateId","providerMetadata","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","_a","combineHeaders","resolve","postJsonToApi","createJsonResponseHandler","defaultGenerateId","createEventSourceResponseHandler","withUserAgentSuffix","_a","generateId"]}
|
|
1
|
+
{"version":3,"sources":["../src/google-provider.ts","../src/version.ts","../src/google-embedding-model.ts","../src/google-error.ts","../src/google-embedding-model-options.ts","../src/google-language-model.ts","../src/convert-google-usage.ts","../src/convert-json-schema-to-openapi-schema.ts","../src/convert-to-google-messages.ts","../src/get-model-path.ts","../src/google-language-model-options.ts","../src/google-prepare-tools.ts","../src/google-json-accumulator.ts","../src/map-google-finish-reason.ts","../src/tool/code-execution.ts","../src/tool/enterprise-web-search.ts","../src/tool/file-search.ts","../src/tool/google-maps.ts","../src/tool/google-search.ts","../src/tool/url-context.ts","../src/tool/vertex-rag-store.ts","../src/google-tools.ts","../src/google-image-model.ts","../src/google-image-model-options.ts","../src/google-files.ts","../src/google-video-model.ts","../src/google-video-model-options.ts","../src/interactions/google-interactions-language-model.ts","../src/interactions/convert-google-interactions-usage.ts","../src/interactions/extract-google-interactions-sources.ts","../src/interactions/map-google-interactions-finish-reason.ts","../src/interactions/build-google-interactions-stream-transform.ts","../src/interactions/convert-to-google-interactions-input.ts","../src/interactions/google-interactions-api.ts","../src/interactions/google-interactions-language-model-options.ts","../src/interactions/parse-google-interactions-outputs.ts","../src/interactions/poll-google-interactions.ts","../src/interactions/cancel-google-interaction.ts","../src/interactions/prepare-google-interactions-tools.ts","../src/interactions/stream-google-interactions.ts","../src/interactions/synthesize-google-interactions-agent-stream.ts"],"sourcesContent":["import type {\n EmbeddingModelV4,\n Experimental_VideoModelV4,\n FilesV4,\n ImageModelV4,\n LanguageModelV4,\n ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n generateId,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from './version';\nimport { GoogleEmbeddingModel } from './google-embedding-model';\nimport type { GoogleEmbeddingModelId } from './google-embedding-model-options';\nimport { GoogleLanguageModel } from './google-language-model';\nimport type { GoogleModelId } from './google-language-model-options';\nimport { googleTools } from './google-tools';\n\nimport type {\n GoogleImageSettings,\n GoogleImageModelId,\n} from './google-image-settings';\nimport { GoogleImageModel } from './google-image-model';\nimport { GoogleFiles } from './google-files';\nimport { GoogleVideoModel } from './google-video-model';\nimport type { GoogleVideoModelId } from './google-video-settings';\nimport {\n GoogleInteractionsLanguageModel,\n type GoogleInteractionsModelInput,\n} from './interactions/google-interactions-language-model';\nimport type { GoogleInteractionsModelId } from './interactions/google-interactions-language-model-options';\nimport type { GoogleInteractionsAgentName } from './interactions/google-interactions-agent';\n\nexport interface GoogleProvider extends ProviderV4 {\n (modelId: GoogleModelId): LanguageModelV4;\n\n languageModel(modelId: GoogleModelId): LanguageModelV4;\n\n chat(modelId: GoogleModelId): LanguageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n image(\n modelId: GoogleImageModelId,\n settings?: GoogleImageSettings,\n ): ImageModelV4;\n\n /**\n * @deprecated Use `chat()` instead.\n */\n generativeAI(modelId: GoogleModelId): LanguageModelV4;\n\n /**\n * Creates a model for text embeddings.\n */\n embedding(modelId: GoogleEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * Creates a model for text embeddings.\n */\n embeddingModel(modelId: GoogleEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embedding` instead.\n */\n textEmbedding(modelId: GoogleEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: GoogleEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: GoogleVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: GoogleVideoModelId): Experimental_VideoModelV4;\n\n files(): FilesV4;\n\n /**\n * Creates a language model targeting the Gemini Interactions API\n * (`POST /v1beta/interactions`). Pass:\n * - a model ID (string),\n * - `{ agent: <name> }` to use a known Gemini agent preset, or\n * - `{ managedAgent: <name> }` to use a user-defined agent created via\n * the `/v1beta/agents` endpoint.\n */\n interactions(\n modelIdOrAgent:\n | GoogleInteractionsModelId\n | { agent: GoogleInteractionsAgentName }\n | { managedAgent: string },\n ): LanguageModelV4;\n\n tools: typeof googleTools;\n}\n\nexport interface GoogleProviderSettings {\n /**\n * Use a different URL prefix for API calls, e.g. to use proxy servers.\n * The default prefix is `https://generativelanguage.googleapis.com/v1beta`.\n */\n baseURL?: string;\n\n /**\n * API key that is being send using the `x-goog-api-key` header.\n * It defaults to the `GOOGLE_GENERATIVE_AI_API_KEY` environment variable.\n */\n apiKey?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Optional function to generate a unique ID for each request.\n */\n generateId?: () => string;\n\n /**\n * Custom provider name\n * Defaults to 'google.generative-ai'.\n */\n name?: string;\n}\n\n/**\n * Create a Google provider instance.\n */\nexport function createGoogle(\n options: GoogleProviderSettings = {},\n): GoogleProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ??\n 'https://generativelanguage.googleapis.com/v1beta';\n\n const providerName = options.name ?? 'google.generative-ai';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n 'x-goog-api-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'GOOGLE_GENERATIVE_AI_API_KEY',\n description: 'Google Generative AI',\n }),\n ...options.headers,\n },\n `ai-sdk/google/${VERSION}`,\n );\n\n const createChatModel = (modelId: GoogleModelId) =>\n new GoogleLanguageModel(modelId, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n generateId: options.generateId ?? generateId,\n supportedUrls: () => ({\n '*': [\n // Google Generative Language \"files\" endpoint\n // e.g. https://generativelanguage.googleapis.com/v1beta/files/...\n new RegExp(`^${baseURL}/files/.*$`),\n // YouTube URLs (public or unlisted videos)\n new RegExp(\n `^https://(?:www\\\\.)?youtube\\\\.com/watch\\\\?v=[\\\\w-]+(?:&[\\\\w=&.-]*)?$`,\n ),\n new RegExp(`^https://youtu\\\\.be/[\\\\w-]+(?:\\\\?[\\\\w=&.-]*)?$`),\n ],\n }),\n fetch: options.fetch,\n });\n\n const createEmbeddingModel = (modelId: GoogleEmbeddingModelId) =>\n new GoogleEmbeddingModel(modelId, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createImageModel = (\n modelId: GoogleImageModelId,\n settings: GoogleImageSettings = {},\n ) =>\n new GoogleImageModel(modelId, settings, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createFiles = () =>\n new GoogleFiles({\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: GoogleVideoModelId) =>\n new GoogleVideoModel(modelId, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n generateId: options.generateId ?? generateId,\n });\n\n const createInteractionsModel = (\n modelIdOrAgent:\n | GoogleInteractionsModelId\n | { agent: GoogleInteractionsAgentName }\n | { managedAgent: string },\n ) =>\n new GoogleInteractionsLanguageModel(\n modelIdOrAgent as GoogleInteractionsModelInput,\n {\n provider: `${providerName}.interactions`,\n baseURL,\n headers: getHeaders,\n generateId: options.generateId ?? generateId,\n fetch: options.fetch,\n },\n );\n\n const provider = function (modelId: GoogleModelId) {\n if (new.target) {\n throw new Error(\n 'The Google Generative AI model function cannot be called with the new keyword.',\n );\n }\n\n return createChatModel(modelId);\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.generativeAI = createChatModel;\n provider.embedding = createEmbeddingModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbedding = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n provider.video = createVideoModel;\n provider.videoModel = createVideoModel;\n provider.files = createFiles;\n provider.interactions = createInteractionsModel;\n provider.tools = googleTools;\n\n return provider as GoogleProvider;\n}\n\n/**\n * Default Google Generative AI provider instance.\n */\nexport const google = createGoogle();\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import {\n TooManyEmbeddingValuesForCallError,\n type EmbeddingModelV4,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n zodSchema,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\nimport {\n googleEmbeddingModelOptions,\n type GoogleEmbeddingModelId,\n} from './google-embedding-model-options';\ntype GoogleEmbeddingConfig = {\n provider: string;\n baseURL: string;\n headers?: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class GoogleEmbeddingModel implements EmbeddingModelV4 {\n readonly specificationVersion = 'v4';\n readonly modelId: GoogleEmbeddingModelId;\n readonly maxEmbeddingsPerCall = 2048;\n readonly supportsParallelCalls = true;\n\n private readonly config: GoogleEmbeddingConfig;\n\n static [WORKFLOW_SERIALIZE](model: GoogleEmbeddingModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: GoogleEmbeddingConfig;\n }) {\n return new GoogleEmbeddingModel(options.modelId, options.config);\n }\n\n get provider(): string {\n return this.config.provider;\n }\n constructor(modelId: GoogleEmbeddingModelId, config: GoogleEmbeddingConfig) {\n this.modelId = modelId;\n this.config = config;\n }\n\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions,\n }: Parameters<EmbeddingModelV4['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV4['doEmbed']>>\n > {\n // Parse provider options\n const googleOptions = await parseProviderOptions({\n provider: 'google',\n providerOptions,\n schema: googleEmbeddingModelOptions,\n });\n\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values,\n });\n }\n\n const mergedHeaders = combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n headers,\n );\n\n const multimodalContent = googleOptions?.content;\n\n if (\n multimodalContent != null &&\n multimodalContent.length !== values.length\n ) {\n throw new Error(\n `The number of multimodal content entries (${multimodalContent.length}) must match the number of values (${values.length}).`,\n );\n }\n\n // For single embeddings, use the single endpoint\n if (values.length === 1) {\n const valueParts = multimodalContent?.[0];\n const textPart = values[0] ? [{ text: values[0] }] : [];\n const parts =\n valueParts != null\n ? [...textPart, ...valueParts]\n : [{ text: values[0] }];\n\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/models/${this.modelId}:embedContent`,\n headers: mergedHeaders,\n body: {\n model: `models/${this.modelId}`,\n content: {\n parts,\n },\n outputDimensionality: googleOptions?.outputDimensionality,\n taskType: googleOptions?.taskType,\n },\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleGenerativeAISingleEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n warnings: [],\n embeddings: [response.embedding.values],\n usage: undefined,\n response: { headers: responseHeaders, body: rawValue },\n };\n }\n\n // For multiple values, use the batch endpoint\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/models/${this.modelId}:batchEmbedContents`,\n headers: mergedHeaders,\n body: {\n requests: values.map((value, index) => {\n const valueParts = multimodalContent?.[index];\n const textPart = value ? [{ text: value }] : [];\n return {\n model: `models/${this.modelId}`,\n content: {\n role: 'user',\n parts:\n valueParts != null\n ? [...textPart, ...valueParts]\n : [{ text: value }],\n },\n outputDimensionality: googleOptions?.outputDimensionality,\n taskType: googleOptions?.taskType,\n };\n }),\n },\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleGenerativeAITextEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n warnings: [],\n embeddings: response.embeddings.map(item => item.values),\n usage: undefined,\n response: { headers: responseHeaders, body: rawValue },\n };\n }\n}\n\n// minimal version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst googleGenerativeAITextEmbeddingResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n embeddings: z.array(z.object({ values: z.array(z.number()) })),\n }),\n ),\n);\n\n// Schema for single embedding response\nconst googleGenerativeAISingleEmbeddingResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n embedding: z.object({ values: z.array(z.number()) }),\n }),\n ),\n);\n","import {\n createJsonErrorResponseHandler,\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst googleErrorDataSchema = lazySchema(() =>\n zodSchema(\n z.object({\n error: z.object({\n code: z.number().nullable(),\n message: z.string(),\n status: z.string(),\n }),\n }),\n ),\n);\n\nexport type GoogleErrorData = InferSchema<typeof googleErrorDataSchema>;\n\nexport const googleFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: googleErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type GoogleEmbeddingModelId =\n | 'gemini-embedding-001'\n | 'gemini-embedding-2-preview'\n | (string & {});\n\nconst googleEmbeddingContentPartSchema = z.union([\n z.object({ text: z.string() }),\n z.object({\n inlineData: z.object({\n mimeType: z.string(),\n data: z.string(),\n }),\n }),\n z.object({\n fileData: z.object({\n fileUri: z.string(),\n mimeType: z.string(),\n }),\n }),\n]);\n\nexport const googleEmbeddingModelOptions = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Optional. Optional reduced dimension for the output embedding.\n * If set, excessive values in the output embedding are truncated from the end.\n */\n outputDimensionality: z.number().optional(),\n\n /**\n * Optional. Specifies the task type for generating embeddings.\n * Supported task types:\n * - SEMANTIC_SIMILARITY: Optimized for text similarity.\n * - CLASSIFICATION: Optimized for text classification.\n * - CLUSTERING: Optimized for clustering texts based on similarity.\n * - RETRIEVAL_DOCUMENT: Optimized for document retrieval.\n * - RETRIEVAL_QUERY: Optimized for query-based retrieval.\n * - QUESTION_ANSWERING: Optimized for answering questions.\n * - FACT_VERIFICATION: Optimized for verifying factual information.\n * - CODE_RETRIEVAL_QUERY: Optimized for retrieving code blocks based on natural language queries.\n */\n taskType: z\n .enum([\n 'SEMANTIC_SIMILARITY',\n 'CLASSIFICATION',\n 'CLUSTERING',\n 'RETRIEVAL_DOCUMENT',\n 'RETRIEVAL_QUERY',\n 'QUESTION_ANSWERING',\n 'FACT_VERIFICATION',\n 'CODE_RETRIEVAL_QUERY',\n ])\n .optional(),\n\n /**\n * Optional. Per-value multimodal content parts for embedding non-text\n * content (images, video, PDF, audio). Each entry corresponds to the\n * embedding value at the same index and its parts are merged with the\n * text value in the request. Use `null` for entries that are text-only.\n *\n * The array length must match the number of values being embedded. In\n * the case of a single embedding, the array length must be 1.\n */\n content: z\n .array(z.array(googleEmbeddingContentPartSchema).min(1).nullable())\n .optional(),\n }),\n ),\n);\n\nexport type GoogleEmbeddingModelOptions = InferSchema<\n typeof googleEmbeddingModelOptions\n>;\n","import type {\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Content,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4Source,\n LanguageModelV4StreamPart,\n LanguageModelV4StreamResult,\n JSONObject,\n SharedV4ProviderMetadata,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n isCustomReasoning,\n lazySchema,\n mapReasoningToProviderBudget,\n mapReasoningToProviderEffort,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n zodSchema,\n type FetchFunction,\n type InferSchema,\n type ParseResult,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n convertGoogleUsage,\n type GoogleUsageMetadata,\n} from './convert-google-usage';\nimport { convertJSONSchemaToOpenAPISchema } from './convert-json-schema-to-openapi-schema';\nimport { convertToGoogleMessages } from './convert-to-google-messages';\nimport { getModelPath } from './get-model-path';\nimport { googleFailedResponseHandler } from './google-error';\nimport {\n googleLanguageModelOptions,\n type GoogleLanguageModelOptions,\n type GoogleModelId,\n} from './google-language-model-options';\nimport type { GoogleProviderMetadata } from './google-prompt';\nimport { prepareTools } from './google-prepare-tools';\nimport {\n GoogleJSONAccumulator,\n type PartialArg,\n} from './google-json-accumulator';\nimport { mapGoogleFinishReason } from './map-google-finish-reason';\n\ntype GoogleConfig = {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n generateId: () => string;\n\n /**\n * The supported URLs for the model.\n */\n supportedUrls?: () => LanguageModelV4['supportedUrls'];\n};\n\nexport class GoogleLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n\n readonly modelId: GoogleModelId;\n\n private readonly config: GoogleConfig;\n private readonly generateId: () => string;\n\n static [WORKFLOW_SERIALIZE](model: GoogleLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: GoogleConfig;\n }) {\n return new GoogleLanguageModel(options.modelId, options.config);\n }\n\n constructor(modelId: GoogleModelId, config: GoogleConfig) {\n this.modelId = modelId;\n this.config = config;\n this.generateId = config.generateId ?? generateId;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls() {\n return this.config.supportedUrls?.() ?? {};\n }\n\n private async getArgs(\n {\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n tools,\n toolChoice,\n reasoning,\n providerOptions,\n }: LanguageModelV4CallOptions,\n { isStreaming = false }: { isStreaming?: boolean } = {},\n ) {\n const warnings: SharedV4Warning[] = [];\n\n // Names to look up in providerOptions and to write into providerMetadata.\n // For the Vertex provider we read both the new `googleVertex` key and the\n // legacy `vertex` key (new takes precedence) and write under both for\n // backward compatibility. For other Google providers we use just `google`.\n const providerOptionsNames: readonly string[] =\n this.config.provider.includes('vertex')\n ? (['googleVertex', 'vertex'] as const)\n : (['google'] as const);\n\n let googleOptions: GoogleLanguageModelOptions | undefined;\n for (const name of providerOptionsNames) {\n googleOptions = await parseProviderOptions({\n provider: name,\n providerOptions,\n schema: googleLanguageModelOptions,\n });\n if (googleOptions != null) break;\n }\n\n // Cross-namespace fallback: a Vertex provider may receive options under\n // the `google` key (e.g. via the AI Gateway).\n if (googleOptions == null && !providerOptionsNames.includes('google')) {\n googleOptions = await parseProviderOptions({\n provider: 'google',\n providerOptions,\n schema: googleLanguageModelOptions,\n });\n }\n\n // Add warning if Vertex rag tools are used with a non-Vertex Google provider\n const isVertexProvider = this.config.provider.startsWith('google.vertex.');\n\n if (\n tools?.some(\n tool =>\n tool.type === 'provider' && tool.id === 'google.vertex_rag_store',\n ) &&\n !isVertexProvider\n ) {\n warnings.push({\n type: 'other',\n message:\n \"The 'vertex_rag_store' tool is only supported with the Google Vertex provider \" +\n 'and might not be supported or could behave unexpectedly with the current Google provider ' +\n `(${this.config.provider}).`,\n });\n }\n\n if (googleOptions?.streamFunctionCallArguments && !isVertexProvider) {\n warnings.push({\n type: 'other',\n message:\n \"'streamFunctionCallArguments' is only supported on the Vertex AI API \" +\n 'and will be ignored with the current Google provider ' +\n `(${this.config.provider}). See https://docs.cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling#streaming-fc`,\n });\n }\n\n if (googleOptions?.serviceTier && isVertexProvider) {\n warnings.push({\n type: 'other',\n message:\n \"'serviceTier' is a Gemini API option and is not supported on Vertex AI. \" +\n \"Use 'sharedRequestType' (and optionally 'requestType') instead. See \" +\n 'https://docs.cloud.google.com/vertex-ai/generative-ai/docs/priority-paygo',\n });\n }\n if (\n (googleOptions?.sharedRequestType || googleOptions?.requestType) &&\n !isVertexProvider\n ) {\n warnings.push({\n type: 'other',\n message:\n \"'sharedRequestType' and 'requestType' are Vertex AI options and \" +\n `are ignored with the current Google provider (${this.config.provider}).`,\n });\n }\n\n const vertexPaygoHeaders: Record<string, string> | undefined =\n isVertexProvider &&\n (googleOptions?.sharedRequestType || googleOptions?.requestType)\n ? {\n ...(googleOptions.sharedRequestType && {\n 'X-Vertex-AI-LLM-Shared-Request-Type':\n googleOptions.sharedRequestType,\n }),\n ...(googleOptions.requestType && {\n 'X-Vertex-AI-LLM-Request-Type': googleOptions.requestType,\n }),\n }\n : undefined;\n const bodyServiceTier = isVertexProvider\n ? undefined\n : googleOptions?.serviceTier;\n\n const isGemmaModel = this.modelId.toLowerCase().startsWith('gemma-');\n const supportsFunctionResponseParts = this.modelId.startsWith('gemini-3');\n\n const { contents, systemInstruction } = convertToGoogleMessages(prompt, {\n isGemmaModel,\n providerOptionsNames,\n supportsFunctionResponseParts,\n });\n\n const {\n tools: googleTools,\n toolConfig: googleToolConfig,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n modelId: this.modelId,\n isVertexProvider,\n });\n\n const resolvedThinking = resolveThinkingConfig({\n reasoning,\n modelId: this.modelId,\n warnings,\n });\n const thinkingConfig =\n googleOptions?.thinkingConfig || resolvedThinking\n ? { ...resolvedThinking, ...googleOptions?.thinkingConfig }\n : undefined;\n\n const streamFunctionCallArguments =\n isStreaming && isVertexProvider\n ? (googleOptions?.streamFunctionCallArguments ?? false)\n : undefined;\n\n const toolConfig =\n googleToolConfig ||\n streamFunctionCallArguments ||\n googleOptions?.retrievalConfig\n ? {\n ...googleToolConfig,\n ...(streamFunctionCallArguments && {\n functionCallingConfig: {\n ...googleToolConfig?.functionCallingConfig,\n streamFunctionCallArguments: true as const,\n },\n }),\n ...(googleOptions?.retrievalConfig && {\n retrievalConfig: googleOptions.retrievalConfig,\n }),\n }\n : undefined;\n\n return {\n args: {\n generationConfig: {\n // standardized settings:\n maxOutputTokens,\n temperature,\n topK,\n topP,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n seed,\n\n // response format:\n responseMimeType:\n responseFormat?.type === 'json' ? 'application/json' : undefined,\n responseSchema:\n responseFormat?.type === 'json' &&\n responseFormat.schema != null &&\n // Google GenAI does not support all OpenAPI Schema features,\n // so this is needed as an escape hatch:\n // TODO convert into provider option\n (googleOptions?.structuredOutputs ?? true)\n ? convertJSONSchemaToOpenAPISchema(responseFormat.schema)\n : undefined,\n ...(googleOptions?.audioTimestamp && {\n audioTimestamp: googleOptions.audioTimestamp,\n }),\n\n // provider options:\n responseModalities: googleOptions?.responseModalities,\n thinkingConfig,\n ...(googleOptions?.mediaResolution && {\n mediaResolution: googleOptions.mediaResolution,\n }),\n ...(googleOptions?.imageConfig && {\n imageConfig: googleOptions.imageConfig,\n }),\n },\n contents,\n systemInstruction: isGemmaModel ? undefined : systemInstruction,\n safetySettings: googleOptions?.safetySettings,\n tools: googleTools,\n toolConfig,\n cachedContent: googleOptions?.cachedContent,\n labels: googleOptions?.labels,\n serviceTier: bodyServiceTier,\n },\n warnings: [...warnings, ...toolWarnings],\n providerOptionsNames,\n extraHeaders: vertexPaygoHeaders,\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings, providerOptionsNames, extraHeaders } =\n await this.getArgs(options);\n const wrapProviderMetadata = (payload: Record<string, unknown>) =>\n Object.fromEntries(\n providerOptionsNames.map(name => [name, payload]),\n ) as SharedV4ProviderMetadata;\n\n const mergedHeaders = combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n extraHeaders,\n );\n\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/${getModelPath(\n this.modelId,\n )}:generateContent`,\n headers: mergedHeaders,\n body: args,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(responseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const candidate = response.candidates[0];\n const content: Array<LanguageModelV4Content> = [];\n\n // map ordered parts to content:\n const parts = candidate.content?.parts ?? [];\n\n const usageMetadata = response.usageMetadata;\n\n // Associates a code execution result with its preceding call.\n let lastCodeExecutionToolCallId: string | undefined;\n // Associates a server-side tool response with its preceding call (tool combination).\n let lastServerToolCallId: string | undefined;\n\n // Build content array from all parts\n for (const part of parts) {\n if ('executableCode' in part && part.executableCode?.code) {\n const toolCallId = this.config.generateId();\n lastCodeExecutionToolCallId = toolCallId;\n\n content.push({\n type: 'tool-call',\n toolCallId,\n toolName: 'code_execution',\n input: JSON.stringify(part.executableCode),\n providerExecuted: true,\n });\n } else if ('codeExecutionResult' in part && part.codeExecutionResult) {\n content.push({\n type: 'tool-result',\n // Assumes a result directly follows its corresponding call part.\n toolCallId: lastCodeExecutionToolCallId!,\n toolName: 'code_execution',\n result: {\n outcome: part.codeExecutionResult.outcome,\n output: part.codeExecutionResult.output ?? '',\n },\n });\n // Clear the ID after use to avoid accidental reuse.\n lastCodeExecutionToolCallId = undefined;\n } else if ('text' in part && part.text != null) {\n const thoughtSignatureMetadata = part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined;\n\n if (part.text.length === 0) {\n if (thoughtSignatureMetadata != null && content.length > 0) {\n const lastContent = content[content.length - 1];\n lastContent.providerMetadata = thoughtSignatureMetadata;\n }\n } else {\n content.push({\n type: part.thought === true ? 'reasoning' : 'text',\n text: part.text,\n providerMetadata: thoughtSignatureMetadata,\n });\n }\n } else if ('functionCall' in part && part.functionCall.name != null) {\n content.push({\n type: 'tool-call' as const,\n toolCallId: part.functionCall.id ?? this.config.generateId(),\n toolName: part.functionCall.name,\n input: JSON.stringify(part.functionCall.args ?? {}),\n providerMetadata: part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined,\n });\n } else if ('inlineData' in part) {\n const hasThought = part.thought === true;\n const hasThoughtSignature = !!part.thoughtSignature;\n content.push({\n type: hasThought ? 'reasoning-file' : 'file',\n data: { type: 'data', data: part.inlineData.data },\n mediaType: part.inlineData.mimeType,\n providerMetadata: hasThoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined,\n });\n } else if ('toolCall' in part && part.toolCall) {\n const toolCallId = part.toolCall.id ?? this.config.generateId();\n lastServerToolCallId = toolCallId;\n content.push({\n type: 'tool-call',\n toolCallId,\n toolName: `server:${part.toolCall.toolType}`,\n input: JSON.stringify(part.toolCall.args ?? {}),\n providerExecuted: true,\n dynamic: true,\n providerMetadata: part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n })\n : wrapProviderMetadata({\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n }),\n });\n } else if ('toolResponse' in part && part.toolResponse) {\n const responseToolCallId =\n lastServerToolCallId ??\n part.toolResponse.id ??\n this.config.generateId();\n content.push({\n type: 'tool-result',\n toolCallId: responseToolCallId,\n toolName: `server:${part.toolResponse.toolType}`,\n result: (part.toolResponse.response ?? {}) as JSONObject,\n providerMetadata: part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n })\n : wrapProviderMetadata({\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n }),\n });\n lastServerToolCallId = undefined;\n }\n }\n\n const sources =\n extractSources({\n groundingMetadata: candidate.groundingMetadata,\n generateId: this.config.generateId,\n }) ?? [];\n for (const source of sources) {\n content.push(source);\n }\n\n return {\n content,\n finishReason: {\n unified: mapGoogleFinishReason({\n finishReason: candidate.finishReason,\n // Only count client-executed tool calls for finish reason determination.\n hasToolCalls: content.some(\n part => part.type === 'tool-call' && !part.providerExecuted,\n ),\n }),\n raw: candidate.finishReason ?? undefined,\n },\n usage: convertGoogleUsage(usageMetadata),\n warnings,\n providerMetadata: wrapProviderMetadata({\n promptFeedback: response.promptFeedback ?? null,\n groundingMetadata: candidate.groundingMetadata ?? null,\n urlContextMetadata: candidate.urlContextMetadata ?? null,\n safetyRatings: candidate.safetyRatings ?? null,\n usageMetadata: usageMetadata ?? null,\n finishMessage: candidate.finishMessage ?? null,\n serviceTier: usageMetadata?.serviceTier ?? null,\n } satisfies GoogleProviderMetadata),\n request: { body: args },\n response: {\n // TODO timestamp, model id, id\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings, providerOptionsNames, extraHeaders } =\n await this.getArgs(options, { isStreaming: true });\n const wrapProviderMetadata = (payload: Record<string, unknown>) =>\n Object.fromEntries(\n providerOptionsNames.map(name => [name, payload]),\n ) as SharedV4ProviderMetadata;\n\n const headers = combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n extraHeaders,\n );\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/${getModelPath(\n this.modelId,\n )}:streamGenerateContent?alt=sse`,\n headers,\n body: args,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(chunkSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let finishReason: LanguageModelV4FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage: GoogleUsageMetadata | undefined = undefined;\n let providerMetadata: SharedV4ProviderMetadata | undefined = undefined;\n let lastGroundingMetadata: GroundingMetadataSchema | null = null;\n let lastUrlContextMetadata: UrlContextMetadataSchema | null = null;\n\n const generateId = this.config.generateId;\n let hasToolCalls = false;\n\n // Track active blocks to group consecutive parts of same type\n let currentTextBlockId: string | null = null;\n let currentReasoningBlockId: string | null = null;\n let blockCounter = 0;\n\n // Track emitted sources to prevent duplicates\n const emittedSourceUrls = new Set<string>();\n // Associates a code execution result with its preceding call.\n let lastCodeExecutionToolCallId: string | undefined;\n // Associates a server-side tool response with its preceding call (tool combination).\n let lastServerToolCallId: string | undefined;\n\n const activeStreamingToolCalls: Array<{\n toolCallId: string;\n toolName: string;\n accumulator: GoogleJSONAccumulator;\n providerMetadata?: SharedV4ProviderMetadata;\n }> = [];\n\n const finishActiveStreamingToolCall = (\n controller: TransformStreamDefaultController<LanguageModelV4StreamPart>,\n ) => {\n const active = activeStreamingToolCalls.pop();\n if (active == null) {\n return;\n }\n\n const { finalJSON, closingDelta } = active.accumulator.finalize();\n\n if (closingDelta.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: active.toolCallId,\n delta: closingDelta,\n providerMetadata: active.providerMetadata,\n });\n }\n\n controller.enqueue({\n type: 'tool-input-end',\n id: active.toolCallId,\n providerMetadata: active.providerMetadata,\n });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId: active.toolCallId,\n toolName: active.toolName,\n input: finalJSON,\n providerMetadata: active.providerMetadata,\n });\n\n hasToolCalls = true;\n };\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<ChunkSchema>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n if (!chunk.success) {\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n const usageMetadata = value.usageMetadata;\n\n if (usageMetadata != null) {\n usage = usageMetadata;\n }\n\n const candidate = value.candidates?.[0];\n\n // sometimes the API returns an empty candidates array\n if (candidate == null) {\n return;\n }\n\n const content = candidate.content;\n\n if (candidate.groundingMetadata != null) {\n lastGroundingMetadata = candidate.groundingMetadata;\n }\n if (candidate.urlContextMetadata != null) {\n lastUrlContextMetadata = candidate.urlContextMetadata;\n }\n\n const sources = extractSources({\n groundingMetadata: candidate.groundingMetadata,\n generateId,\n });\n if (sources != null) {\n for (const source of sources) {\n if (\n source.sourceType === 'url' &&\n !emittedSourceUrls.has(source.url)\n ) {\n emittedSourceUrls.add(source.url);\n controller.enqueue(source);\n }\n }\n }\n\n // Process tool call's parts before determining finishReason to ensure hasToolCalls is properly set\n if (content != null) {\n // Process all parts in a single loop to preserve original order\n const parts = content.parts ?? [];\n for (const part of parts) {\n if ('executableCode' in part && part.executableCode?.code) {\n const toolCallId = generateId();\n lastCodeExecutionToolCallId = toolCallId;\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName: 'code_execution',\n input: JSON.stringify(part.executableCode),\n providerExecuted: true,\n });\n } else if (\n 'codeExecutionResult' in part &&\n part.codeExecutionResult\n ) {\n // Assumes a result directly follows its corresponding call part.\n const toolCallId = lastCodeExecutionToolCallId;\n\n if (toolCallId) {\n controller.enqueue({\n type: 'tool-result',\n toolCallId,\n toolName: 'code_execution',\n result: {\n outcome: part.codeExecutionResult.outcome,\n output: part.codeExecutionResult.output ?? '',\n },\n });\n // Clear the ID after use.\n lastCodeExecutionToolCallId = undefined;\n }\n } else if ('text' in part && part.text != null) {\n const thoughtSignatureMetadata = part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined;\n\n if (part.text.length === 0) {\n if (\n thoughtSignatureMetadata != null &&\n currentTextBlockId !== null\n ) {\n controller.enqueue({\n type: 'text-delta',\n id: currentTextBlockId,\n delta: '',\n providerMetadata: thoughtSignatureMetadata,\n });\n }\n } else if (part.thought === true) {\n // End any active text block before starting reasoning\n if (currentTextBlockId !== null) {\n controller.enqueue({\n type: 'text-end',\n id: currentTextBlockId,\n });\n currentTextBlockId = null;\n }\n\n // Start new reasoning block if not already active\n if (currentReasoningBlockId === null) {\n currentReasoningBlockId = String(blockCounter++);\n controller.enqueue({\n type: 'reasoning-start',\n id: currentReasoningBlockId,\n providerMetadata: thoughtSignatureMetadata,\n });\n }\n\n controller.enqueue({\n type: 'reasoning-delta',\n id: currentReasoningBlockId,\n delta: part.text,\n providerMetadata: thoughtSignatureMetadata,\n });\n } else {\n if (currentReasoningBlockId !== null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: currentReasoningBlockId,\n });\n currentReasoningBlockId = null;\n }\n\n if (currentTextBlockId === null) {\n currentTextBlockId = String(blockCounter++);\n controller.enqueue({\n type: 'text-start',\n id: currentTextBlockId,\n providerMetadata: thoughtSignatureMetadata,\n });\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: currentTextBlockId,\n delta: part.text,\n providerMetadata: thoughtSignatureMetadata,\n });\n }\n } else if ('inlineData' in part) {\n // End any active text or reasoning block before starting file output.\n // Relevant for multimodal output models.\n if (currentTextBlockId !== null) {\n controller.enqueue({\n type: 'text-end',\n id: currentTextBlockId,\n });\n currentTextBlockId = null;\n }\n if (currentReasoningBlockId !== null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: currentReasoningBlockId,\n });\n currentReasoningBlockId = null;\n }\n\n const hasThought = part.thought === true;\n const hasThoughtSignature = !!part.thoughtSignature;\n const fileMeta = hasThoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined;\n controller.enqueue({\n type: hasThought ? 'reasoning-file' : 'file',\n mediaType: part.inlineData.mimeType,\n data: { type: 'data', data: part.inlineData.data },\n providerMetadata: fileMeta,\n });\n } else if ('toolCall' in part && part.toolCall) {\n const toolCallId = part.toolCall.id ?? generateId();\n lastServerToolCallId = toolCallId;\n const serverMeta = wrapProviderMetadata({\n ...(part.thoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName: `server:${part.toolCall.toolType}`,\n input: JSON.stringify(part.toolCall.args ?? {}),\n providerExecuted: true,\n dynamic: true,\n providerMetadata: serverMeta,\n });\n } else if ('toolResponse' in part && part.toolResponse) {\n const responseToolCallId =\n lastServerToolCallId ??\n part.toolResponse.id ??\n generateId();\n const serverMeta = wrapProviderMetadata({\n ...(part.thoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n });\n\n controller.enqueue({\n type: 'tool-result',\n toolCallId: responseToolCallId,\n toolName: `server:${part.toolResponse.toolType}`,\n result: (part.toolResponse.response ?? {}) as JSONObject,\n providerMetadata: serverMeta,\n });\n lastServerToolCallId = undefined;\n }\n }\n\n // Handle streaming and complete function calls\n for (const part of parts) {\n if (!('functionCall' in part)) continue;\n\n const providerMeta = part.thoughtSignature\n ? wrapProviderMetadata({\n thoughtSignature: part.thoughtSignature,\n })\n : undefined;\n\n const isStreamingChunk =\n part.functionCall.partialArgs != null ||\n (part.functionCall.name != null &&\n part.functionCall.willContinue === true);\n const isTerminalChunk =\n part.functionCall.name == null &&\n part.functionCall.args == null &&\n part.functionCall.partialArgs == null &&\n part.functionCall.willContinue == null;\n const isCompleteCall =\n part.functionCall.name != null &&\n part.functionCall.args != null &&\n part.functionCall.partialArgs == null;\n // Single-chunk no-args call: `{ name: 'X' }` with no `args`,\n // `partialArgs`, or `willContinue`. Carries `thoughtSignature`.\n const isNoArgsCompleteCall =\n part.functionCall.name != null &&\n part.functionCall.args == null &&\n part.functionCall.partialArgs == null &&\n part.functionCall.willContinue !== true;\n\n if (isStreamingChunk) {\n if (part.functionCall.name != null) {\n const toolCallId = part.functionCall.id ?? generateId();\n const accumulator = new GoogleJSONAccumulator();\n activeStreamingToolCalls.push({\n toolCallId,\n toolName: part.functionCall.name,\n accumulator,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallId,\n toolName: part.functionCall.name,\n providerMetadata: providerMeta,\n });\n\n if (part.functionCall.partialArgs != null) {\n const partialArgs = part.functionCall\n .partialArgs as PartialArg[];\n const { textDelta } =\n accumulator.processPartialArgs(partialArgs);\n if (textDelta.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCallId,\n delta: textDelta,\n providerMetadata: providerMeta,\n });\n }\n if (\n part.functionCall.willContinue !== true &&\n partialArgs.every(arg => arg.willContinue !== true)\n ) {\n finishActiveStreamingToolCall(controller);\n }\n }\n } else if (\n part.functionCall.partialArgs != null &&\n activeStreamingToolCalls.length > 0\n ) {\n const active =\n activeStreamingToolCalls[\n activeStreamingToolCalls.length - 1\n ];\n const partialArgs = part.functionCall\n .partialArgs as PartialArg[];\n const { textDelta } =\n active.accumulator.processPartialArgs(partialArgs);\n if (textDelta.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: active.toolCallId,\n delta: textDelta,\n providerMetadata: providerMeta,\n });\n }\n if (\n part.functionCall.willContinue !== true &&\n partialArgs.every(arg => arg.willContinue !== true)\n ) {\n finishActiveStreamingToolCall(controller);\n }\n }\n } else if (\n isTerminalChunk &&\n activeStreamingToolCalls.length > 0\n ) {\n finishActiveStreamingToolCall(controller);\n } else if (isCompleteCall) {\n const toolCallId = part.functionCall.id ?? generateId();\n const toolName = part.functionCall.name!;\n const args =\n typeof part.functionCall.args === 'string'\n ? part.functionCall.args\n : JSON.stringify(part.functionCall.args ?? {});\n\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallId,\n toolName,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCallId,\n delta: args,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-input-end',\n id: toolCallId,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName,\n input: args,\n providerMetadata: providerMeta,\n });\n\n hasToolCalls = true;\n } else if (isNoArgsCompleteCall) {\n const toolCallId = part.functionCall.id ?? generateId();\n const toolName = part.functionCall.name!;\n\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallId,\n toolName,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-input-end',\n id: toolCallId,\n providerMetadata: providerMeta,\n });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId,\n toolName,\n input: '{}',\n providerMetadata: providerMeta,\n });\n\n hasToolCalls = true;\n }\n }\n }\n\n if (candidate.finishReason != null) {\n finishReason = {\n unified: mapGoogleFinishReason({\n finishReason: candidate.finishReason,\n hasToolCalls,\n }),\n raw: candidate.finishReason,\n };\n\n providerMetadata = wrapProviderMetadata({\n promptFeedback: value.promptFeedback ?? null,\n groundingMetadata: lastGroundingMetadata,\n urlContextMetadata: lastUrlContextMetadata,\n safetyRatings: candidate.safetyRatings ?? null,\n usageMetadata: usageMetadata ?? null,\n finishMessage: candidate.finishMessage ?? null,\n serviceTier: usage?.serviceTier ?? null,\n } satisfies GoogleProviderMetadata);\n }\n },\n\n flush(controller) {\n if (currentTextBlockId !== null) {\n controller.enqueue({\n type: 'text-end',\n id: currentTextBlockId,\n });\n }\n if (currentReasoningBlockId !== null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: currentReasoningBlockId,\n });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertGoogleUsage(usage),\n providerMetadata,\n });\n },\n }),\n ),\n response: { headers: responseHeaders },\n request: { body: args },\n };\n }\n}\n\nfunction isGemini3Model(modelId: string): boolean {\n return /gemini-3[\\.\\-]/i.test(modelId) || /gemini-3$/i.test(modelId);\n}\n\nfunction getMaxOutputTokensForGemini25Model(): number {\n return 65536;\n}\n\nfunction getMaxThinkingTokensForGemini25Model(modelId: string): number {\n const id = modelId.toLowerCase();\n if (id.includes('2.5-pro') || id.includes('gemini-3-pro-image')) {\n return 32768;\n }\n return 24576;\n}\n\ntype GoogleThinkingConfig = NonNullable<\n InferSchema<typeof googleLanguageModelOptions>['thinkingConfig']\n>;\n\nfunction resolveThinkingConfig({\n reasoning,\n modelId,\n warnings,\n}: {\n reasoning: LanguageModelV4CallOptions['reasoning'];\n modelId: string;\n warnings: SharedV4Warning[];\n}): Omit<GoogleThinkingConfig, 'includeThoughts'> | undefined {\n if (!isCustomReasoning(reasoning)) {\n return undefined;\n }\n\n if (isGemini3Model(modelId) && !modelId.includes('gemini-3-pro-image')) {\n return resolveGemini3ThinkingConfig({ reasoning, warnings });\n }\n\n return resolveGemini25ThinkingConfig({ reasoning, modelId, warnings });\n}\n\nfunction resolveGemini3ThinkingConfig({\n reasoning,\n warnings,\n}: {\n reasoning: Exclude<\n LanguageModelV4CallOptions['reasoning'],\n 'provider-default' | undefined\n >;\n warnings: SharedV4Warning[];\n}): Pick<GoogleThinkingConfig, 'thinkingLevel'> | undefined {\n if (reasoning === 'none') {\n // It's not possible to fully disable thinking with Gemini 3.\n return { thinkingLevel: 'minimal' };\n }\n\n const thinkingLevel = mapReasoningToProviderEffort({\n reasoning,\n effortMap: {\n minimal: 'minimal',\n low: 'low',\n medium: 'medium',\n high: 'high',\n xhigh: 'high',\n },\n warnings,\n });\n\n if (thinkingLevel == null) {\n return undefined;\n }\n\n return { thinkingLevel };\n}\n\nfunction resolveGemini25ThinkingConfig({\n reasoning,\n modelId,\n warnings,\n}: {\n reasoning: Exclude<\n LanguageModelV4CallOptions['reasoning'],\n 'provider-default' | undefined\n >;\n modelId: string;\n warnings: SharedV4Warning[];\n}): Pick<GoogleThinkingConfig, 'thinkingBudget'> | undefined {\n if (reasoning === 'none') {\n return { thinkingBudget: 0 };\n }\n\n const thinkingBudget = mapReasoningToProviderBudget({\n reasoning,\n maxOutputTokens: getMaxOutputTokensForGemini25Model(),\n maxReasoningBudget: getMaxThinkingTokensForGemini25Model(modelId),\n minReasoningBudget: 0,\n warnings,\n });\n if (thinkingBudget == null) {\n return undefined;\n }\n return { thinkingBudget };\n}\n\nfunction extractSources({\n groundingMetadata,\n generateId,\n}: {\n groundingMetadata: GroundingMetadataSchema | undefined | null;\n generateId: () => string;\n}): undefined | LanguageModelV4Source[] {\n if (!groundingMetadata?.groundingChunks) {\n return undefined;\n }\n\n const sources: LanguageModelV4Source[] = [];\n\n for (const chunk of groundingMetadata.groundingChunks) {\n if (chunk.web != null) {\n // Handle web chunks as URL sources\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: chunk.web.uri,\n title: chunk.web.title ?? undefined,\n });\n } else if (chunk.image != null) {\n // Handle image chunks as image sources\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n // Google requires attribution to the source URI, not the actual image URI.\n // TODO: add another type in v7 to allow both the image and source URL to be included separately\n url: chunk.image.sourceUri,\n title: chunk.image.title ?? undefined,\n });\n } else if (chunk.retrievedContext != null) {\n // Handle retrievedContext chunks from RAG operations\n const uri = chunk.retrievedContext.uri;\n const fileSearchStore = chunk.retrievedContext.fileSearchStore;\n\n if (uri && (uri.startsWith('http://') || uri.startsWith('https://'))) {\n // Old format: Google Search with HTTP/HTTPS URL\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: uri,\n title: chunk.retrievedContext.title ?? undefined,\n });\n } else if (uri) {\n // Old format: Document with file path (gs://, etc.)\n const title = chunk.retrievedContext.title ?? 'Unknown Document';\n let mediaType = 'application/octet-stream';\n let filename: string | undefined = undefined;\n\n if (uri.endsWith('.pdf')) {\n mediaType = 'application/pdf';\n filename = uri.split('/').pop();\n } else if (uri.endsWith('.txt')) {\n mediaType = 'text/plain';\n filename = uri.split('/').pop();\n } else if (uri.endsWith('.docx')) {\n mediaType =\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n filename = uri.split('/').pop();\n } else if (uri.endsWith('.doc')) {\n mediaType = 'application/msword';\n filename = uri.split('/').pop();\n } else if (uri.match(/\\.(md|markdown)$/)) {\n mediaType = 'text/markdown';\n filename = uri.split('/').pop();\n } else {\n filename = uri.split('/').pop();\n }\n\n sources.push({\n type: 'source',\n sourceType: 'document',\n id: generateId(),\n mediaType,\n title,\n filename,\n });\n } else if (fileSearchStore) {\n // New format: File Search with fileSearchStore (no uri)\n const title = chunk.retrievedContext.title ?? 'Unknown Document';\n sources.push({\n type: 'source',\n sourceType: 'document',\n id: generateId(),\n mediaType: 'application/octet-stream',\n title,\n filename: fileSearchStore.split('/').pop(),\n });\n }\n } else if (chunk.maps != null) {\n if (chunk.maps.uri) {\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: chunk.maps.uri,\n title: chunk.maps.title ?? undefined,\n });\n }\n }\n }\n\n return sources.length > 0 ? sources : undefined;\n}\n\nexport const getGroundingMetadataSchema = () =>\n z.object({\n webSearchQueries: z.array(z.string()).nullish(),\n imageSearchQueries: z.array(z.string()).nullish(),\n retrievalQueries: z.array(z.string()).nullish(),\n searchEntryPoint: z.object({ renderedContent: z.string() }).nullish(),\n groundingChunks: z\n .array(\n z.object({\n web: z\n .object({ uri: z.string(), title: z.string().nullish() })\n .nullish(),\n image: z\n .object({\n sourceUri: z.string(),\n imageUri: z.string(),\n title: z.string().nullish(),\n domain: z.string().nullish(),\n })\n .nullish(),\n retrievedContext: z\n .object({\n uri: z.string().nullish(),\n title: z.string().nullish(),\n text: z.string().nullish(),\n fileSearchStore: z.string().nullish(),\n })\n .nullish(),\n maps: z\n .object({\n uri: z.string().nullish(),\n title: z.string().nullish(),\n text: z.string().nullish(),\n placeId: z.string().nullish(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n groundingSupports: z\n .array(\n z.object({\n segment: z\n .object({\n startIndex: z.number().nullish(),\n endIndex: z.number().nullish(),\n text: z.string().nullish(),\n })\n .nullish(),\n segment_text: z.string().nullish(),\n groundingChunkIndices: z.array(z.number()).nullish(),\n supportChunkIndices: z.array(z.number()).nullish(),\n confidenceScores: z.array(z.number()).nullish(),\n confidenceScore: z.array(z.number()).nullish(),\n }),\n )\n .nullish(),\n retrievalMetadata: z\n .union([\n z.object({\n webDynamicRetrievalScore: z.number(),\n }),\n z.object({}),\n ])\n .nullish(),\n });\n\nconst partialArgSchema = z.object({\n jsonPath: z.string(),\n stringValue: z.string().nullish(),\n numberValue: z.number().nullish(),\n boolValue: z.boolean().nullish(),\n nullValue: z.unknown().nullish(),\n willContinue: z.boolean().nullish(),\n});\n\nconst getContentSchema = () =>\n z.object({\n parts: z\n .array(\n z.union([\n // note: order matters since text can be fully empty\n z.object({\n functionCall: z.object({\n id: z.string().nullish(),\n name: z.string().nullish(),\n args: z.unknown().nullish(),\n partialArgs: z.array(partialArgSchema).nullish(),\n willContinue: z.boolean().nullish(),\n }),\n thoughtSignature: z.string().nullish(),\n }),\n z.object({\n inlineData: z.object({\n mimeType: z.string(),\n data: z.string(),\n }),\n thought: z.boolean().nullish(),\n thoughtSignature: z.string().nullish(),\n }),\n z.object({\n toolCall: z.object({\n toolType: z.string(),\n args: z.unknown().nullish(),\n id: z.string(),\n }),\n thoughtSignature: z.string().nullish(),\n }),\n z.object({\n toolResponse: z.object({\n toolType: z.string(),\n response: z.unknown().nullish(),\n id: z.string(),\n }),\n thoughtSignature: z.string().nullish(),\n }),\n z.object({\n executableCode: z\n .object({\n language: z.string(),\n code: z.string(),\n })\n .nullish(),\n codeExecutionResult: z\n .object({\n outcome: z.string(),\n output: z.string().nullish(),\n })\n .nullish(),\n text: z.string().nullish(),\n thought: z.boolean().nullish(),\n thoughtSignature: z.string().nullish(),\n }),\n ]),\n )\n .nullish(),\n });\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/configure-safety-filters\nconst getSafetyRatingSchema = () =>\n z.object({\n category: z.string().nullish(),\n probability: z.string().nullish(),\n probabilityScore: z.number().nullish(),\n severity: z.string().nullish(),\n severityScore: z.number().nullish(),\n blocked: z.boolean().nullish(),\n });\n\nconst tokenDetailsSchema = z\n .array(\n z.object({\n modality: z.string(),\n tokenCount: z.number(),\n }),\n )\n .nullish();\n\nconst usageSchema = z.object({\n cachedContentTokenCount: z.number().nullish(),\n thoughtsTokenCount: z.number().nullish(),\n promptTokenCount: z.number().nullish(),\n candidatesTokenCount: z.number().nullish(),\n totalTokenCount: z.number().nullish(),\n // https://cloud.google.com/vertex-ai/generative-ai/docs/reference/rest/v1/GenerateContentResponse#TrafficType\n trafficType: z.string().nullish(),\n serviceTier: z.string().nullish(),\n // https://ai.google.dev/api/generate-content#Modality\n promptTokensDetails: tokenDetailsSchema,\n candidatesTokensDetails: tokenDetailsSchema,\n});\n\n// https://ai.google.dev/api/generate-content#UrlRetrievalMetadata\nexport const getUrlContextMetadataSchema = () =>\n z.object({\n urlMetadata: z\n .array(\n z.object({\n retrievedUrl: z.string(),\n urlRetrievalStatus: z.string(),\n }),\n )\n .nullish(),\n });\n\nconst responseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n candidates: z.array(\n z.object({\n content: getContentSchema().nullish().or(z.object({}).strict()),\n finishReason: z.string().nullish(),\n finishMessage: z.string().nullish(),\n safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n groundingMetadata: getGroundingMetadataSchema().nullish(),\n urlContextMetadata: getUrlContextMetadataSchema().nullish(),\n }),\n ),\n usageMetadata: usageSchema.nullish(),\n promptFeedback: z\n .object({\n blockReason: z.string().nullish(),\n safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n })\n .nullish(),\n }),\n ),\n);\n\nexport type GroundingMetadataSchema = NonNullable<\n InferSchema<typeof responseSchema>['candidates'][number]['groundingMetadata']\n>;\n\nexport type UrlContextMetadataSchema = NonNullable<\n InferSchema<typeof responseSchema>['candidates'][number]['urlContextMetadata']\n>;\n\nexport type SafetyRatingSchema = NonNullable<\n InferSchema<typeof responseSchema>['candidates'][number]['safetyRatings']\n>[number];\n\nexport type PromptFeedbackSchema = NonNullable<\n InferSchema<typeof responseSchema>['promptFeedback']\n>;\n\nexport type UsageMetadataSchema = NonNullable<\n InferSchema<typeof responseSchema>['usageMetadata']\n>;\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst chunkSchema = lazySchema(() =>\n zodSchema(\n z.object({\n candidates: z\n .array(\n z.object({\n content: getContentSchema().nullish(),\n finishReason: z.string().nullish(),\n finishMessage: z.string().nullish(),\n safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n groundingMetadata: getGroundingMetadataSchema().nullish(),\n urlContextMetadata: getUrlContextMetadataSchema().nullish(),\n }),\n )\n .nullish(),\n usageMetadata: usageSchema.nullish(),\n promptFeedback: z\n .object({\n blockReason: z.string().nullish(),\n safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n })\n .nullish(),\n }),\n ),\n);\n\ntype ChunkSchema = InferSchema<typeof chunkSchema>;\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\n\nexport type GoogleTokenDetail = {\n modality: string;\n tokenCount: number;\n};\n\nexport type GoogleUsageMetadata = {\n promptTokenCount?: number | null;\n candidatesTokenCount?: number | null;\n totalTokenCount?: number | null;\n cachedContentTokenCount?: number | null;\n thoughtsTokenCount?: number | null;\n trafficType?: string | null;\n serviceTier?: string | null;\n promptTokensDetails?: GoogleTokenDetail[] | null;\n candidatesTokensDetails?: GoogleTokenDetail[] | null;\n};\n\nexport function convertGoogleUsage(\n usage: GoogleUsageMetadata | undefined | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n }\n\n const promptTokens = usage.promptTokenCount ?? 0;\n const candidatesTokens = usage.candidatesTokenCount ?? 0;\n const cachedContentTokens = usage.cachedContentTokenCount ?? 0;\n const thoughtsTokens = usage.thoughtsTokenCount ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cachedContentTokens,\n cacheRead: cachedContentTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: candidatesTokens + thoughtsTokens,\n text: candidatesTokens,\n reasoning: thoughtsTokens,\n },\n raw: usage,\n };\n}\n","import type { JSONSchema7Definition } from '@ai-sdk/provider';\n\n/**\n * Converts JSON Schema 7 to OpenAPI Schema 3.0\n */\nexport function convertJSONSchemaToOpenAPISchema(\n jsonSchema: JSONSchema7Definition | undefined,\n isRoot = true,\n): unknown {\n // Handle empty object schemas: undefined at root, preserved when nested\n if (jsonSchema == null) {\n return undefined;\n }\n\n if (isEmptyObjectSchema(jsonSchema)) {\n if (isRoot) {\n return undefined;\n }\n\n if (typeof jsonSchema === 'object' && jsonSchema.description) {\n return { type: 'object', description: jsonSchema.description };\n }\n return { type: 'object' };\n }\n\n if (typeof jsonSchema === 'boolean') {\n return { type: 'boolean', properties: {} };\n }\n\n const {\n type,\n description,\n required,\n properties,\n items,\n allOf,\n anyOf,\n oneOf,\n format,\n const: constValue,\n minLength,\n enum: enumValues,\n } = jsonSchema;\n\n const result: Record<string, unknown> = {};\n\n if (description) result.description = description;\n if (required) result.required = required;\n if (format) result.format = format;\n\n if (constValue !== undefined) {\n result.enum = [constValue];\n }\n\n // Handle type\n if (type) {\n if (Array.isArray(type)) {\n const hasNull = type.includes('null');\n const nonNullTypes = type.filter(t => t !== 'null');\n\n if (nonNullTypes.length === 0) {\n // Only null type\n result.type = 'null';\n } else {\n // One or more non-null types: always use anyOf\n result.anyOf = nonNullTypes.map(t => ({ type: t }));\n if (hasNull) {\n result.nullable = true;\n }\n }\n } else {\n result.type = type;\n }\n }\n\n // Handle enum\n if (enumValues !== undefined) {\n result.enum = enumValues;\n }\n\n if (properties != null) {\n result.properties = Object.entries(properties).reduce(\n (acc, [key, value]) => {\n acc[key] = convertJSONSchemaToOpenAPISchema(value, false);\n return acc;\n },\n {} as Record<string, unknown>,\n );\n }\n\n if (items) {\n result.items = Array.isArray(items)\n ? items.map(item => convertJSONSchemaToOpenAPISchema(item, false))\n : convertJSONSchemaToOpenAPISchema(items, false);\n }\n\n if (allOf) {\n result.allOf = allOf.map(item =>\n convertJSONSchemaToOpenAPISchema(item, false),\n );\n }\n if (anyOf) {\n // Handle cases where anyOf includes a null type\n if (\n anyOf.some(\n schema => typeof schema === 'object' && schema?.type === 'null',\n )\n ) {\n const nonNullSchemas = anyOf.filter(\n schema => !(typeof schema === 'object' && schema?.type === 'null'),\n );\n\n if (nonNullSchemas.length === 1) {\n // If there's only one non-null schema, convert it and make it nullable\n const converted = convertJSONSchemaToOpenAPISchema(\n nonNullSchemas[0],\n false,\n );\n if (typeof converted === 'object') {\n result.nullable = true;\n Object.assign(result, converted);\n }\n } else {\n // If there are multiple non-null schemas, keep them in anyOf\n result.anyOf = nonNullSchemas.map(item =>\n convertJSONSchemaToOpenAPISchema(item, false),\n );\n result.nullable = true;\n }\n } else {\n result.anyOf = anyOf.map(item =>\n convertJSONSchemaToOpenAPISchema(item, false),\n );\n }\n }\n if (oneOf) {\n result.oneOf = oneOf.map(item =>\n convertJSONSchemaToOpenAPISchema(item, false),\n );\n }\n\n if (minLength !== undefined) {\n result.minLength = minLength;\n }\n\n return result;\n}\n\nfunction isEmptyObjectSchema(jsonSchema: JSONSchema7Definition): boolean {\n return (\n jsonSchema != null &&\n typeof jsonSchema === 'object' &&\n jsonSchema.type === 'object' &&\n (jsonSchema.properties == null ||\n Object.keys(jsonSchema.properties).length === 0) &&\n !jsonSchema.additionalProperties\n );\n}\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4Prompt,\n type LanguageModelV4ToolResultOutput,\n} from '@ai-sdk/provider';\nimport {\n convertToBase64,\n getTopLevelMediaType,\n isFullMediaType,\n resolveFullMediaType,\n resolveProviderReference,\n} from '@ai-sdk/provider-utils';\nimport type {\n GoogleContent,\n GoogleContentPart,\n GoogleFunctionResponsePart,\n GooglePrompt,\n} from './google-prompt';\n\nconst dataUrlRegex = /^data:([^;,]+);base64,(.+)$/s;\n\nfunction parseBase64DataUrl(\n value: string,\n): { mediaType: string; data: string } | undefined {\n const match = dataUrlRegex.exec(value);\n if (match == null) {\n return undefined;\n }\n\n return {\n mediaType: match[1],\n data: match[2],\n };\n}\n\nfunction convertUrlToolResultPart(\n url: string,\n): GoogleFunctionResponsePart | undefined {\n // Per https://ai.google.dev/api/caching#FunctionResponsePart, only inline data is supported.\n // https://docs.cloud.google.com/vertex-ai/generative-ai/docs/model-reference/function-calling#functionresponsepart suggests that this\n // may be different for Vertex, but this needs to be confirmed and further tested for both APIs.\n const parsedDataUrl = parseBase64DataUrl(url);\n if (parsedDataUrl == null) {\n return undefined;\n }\n\n return {\n inlineData: {\n mimeType: parsedDataUrl.mediaType,\n data: parsedDataUrl.data,\n },\n };\n}\n\n/*\n * Appends tool result content parts to the message using the functionResponse\n * format with support for multimodal parts (e.g. inline images/files alongside\n * text). This format is supported by Gemini 3+ models.\n */\nfunction appendToolResultParts(\n parts: GoogleContentPart[],\n toolName: string,\n outputValue: Extract<\n LanguageModelV4ToolResultOutput,\n { type: 'content' }\n >['value'],\n toolCallId?: string,\n): void {\n const functionResponseParts: GoogleFunctionResponsePart[] = [];\n const responseTextParts: string[] = [];\n\n for (const contentPart of outputValue) {\n switch (contentPart.type) {\n case 'text': {\n responseTextParts.push(contentPart.text);\n break;\n }\n case 'file': {\n if (contentPart.data.type === 'data') {\n functionResponseParts.push({\n inlineData: {\n mimeType: resolveFullMediaType({ part: contentPart }),\n data: convertToBase64(contentPart.data.data),\n },\n });\n } else if (contentPart.data.type === 'url') {\n const functionResponsePart = convertUrlToolResultPart(\n contentPart.data.url.toString(),\n );\n\n if (functionResponsePart != null) {\n functionResponseParts.push(functionResponsePart);\n } else {\n responseTextParts.push(JSON.stringify(contentPart));\n }\n } else {\n responseTextParts.push(JSON.stringify(contentPart));\n }\n break;\n }\n default: {\n responseTextParts.push(JSON.stringify(contentPart));\n break;\n }\n }\n }\n\n parts.push({\n functionResponse: {\n ...(toolCallId != null ? { id: toolCallId } : {}),\n name: toolName,\n response: {\n name: toolName,\n content:\n responseTextParts.length > 0\n ? responseTextParts.join('\\n')\n : 'Tool executed successfully.',\n },\n ...(functionResponseParts.length > 0\n ? { parts: functionResponseParts }\n : {}),\n },\n });\n}\n\n/*\n * Appends tool result content parts using a legacy format for pre-Gemini 3\n * models that do not support multimodal parts within functionResponse. Instead,\n * non-text content like images is sent as separate top-level inlineData parts.\n */\nfunction appendLegacyToolResultParts(\n parts: GoogleContentPart[],\n toolName: string,\n outputValue: Extract<\n LanguageModelV4ToolResultOutput,\n { type: 'content' }\n >['value'],\n toolCallId?: string,\n): void {\n for (const contentPart of outputValue) {\n switch (contentPart.type) {\n case 'text':\n parts.push({\n functionResponse: {\n ...(toolCallId != null ? { id: toolCallId } : {}),\n name: toolName,\n response: {\n name: toolName,\n content: contentPart.text,\n },\n },\n });\n break;\n case 'file': {\n if (\n contentPart.data.type === 'data' &&\n getTopLevelMediaType(contentPart.mediaType) === 'image'\n ) {\n parts.push(\n {\n inlineData: {\n mimeType: resolveFullMediaType({ part: contentPart }),\n data: convertToBase64(contentPart.data.data),\n },\n },\n {\n text: 'Tool executed successfully and returned this image as a response',\n },\n );\n } else {\n parts.push({ text: JSON.stringify(contentPart) });\n }\n break;\n }\n default:\n parts.push({ text: JSON.stringify(contentPart) });\n break;\n }\n }\n}\n\nexport function convertToGoogleMessages(\n prompt: LanguageModelV4Prompt,\n options?: {\n isGemmaModel?: boolean;\n /**\n * Names to look up under `providerOptions` when reading per-part metadata\n * (e.g. thought signatures). Tried in order; first match wins. For the\n * Vertex provider this is `['googleVertex', 'vertex']` (new key first,\n * legacy key as fallback) and for the Google provider it is `['google']`.\n */\n providerOptionsNames?: readonly string[];\n supportsFunctionResponseParts?: boolean;\n },\n): GooglePrompt {\n const systemInstructionParts: Array<{ text: string }> = [];\n const contents: Array<GoogleContent> = [];\n let systemMessagesAllowed = true;\n const isGemmaModel = options?.isGemmaModel ?? false;\n const providerOptionsNames = options?.providerOptionsNames ?? ['google'];\n const isVertexLike = !providerOptionsNames.includes('google');\n const supportsFunctionResponseParts =\n options?.supportsFunctionResponseParts ?? true;\n\n const readProviderOpts = (part: {\n providerOptions?: Record<string, unknown> | undefined;\n }): Record<string, unknown> | undefined => {\n for (const name of providerOptionsNames) {\n const v = part.providerOptions?.[name];\n if (v != null) return v as Record<string, unknown>;\n }\n // Cross-namespace fallback (gateway interop): Vertex providers may receive\n // metadata under `google`, and the Google provider may receive metadata\n // under `googleVertex`/`vertex`.\n if (isVertexLike) {\n return part.providerOptions?.google as\n | Record<string, unknown>\n | undefined;\n }\n return (part.providerOptions?.googleVertex ??\n part.providerOptions?.vertex) as Record<string, unknown> | undefined;\n };\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n if (!systemMessagesAllowed) {\n throw new UnsupportedFunctionalityError({\n functionality:\n 'system messages are only supported at the beginning of the conversation',\n });\n }\n\n systemInstructionParts.push({ text: content });\n break;\n }\n\n case 'user': {\n systemMessagesAllowed = false;\n\n const parts: GoogleContentPart[] = [];\n\n for (const part of content) {\n switch (part.type) {\n case 'text': {\n parts.push({ text: part.text });\n break;\n }\n\n case 'file': {\n switch (part.data.type) {\n case 'url': {\n parts.push({\n fileData: {\n mimeType: resolveFullMediaType({ part }),\n fileUri: part.data.url.toString(),\n },\n });\n break;\n }\n case 'reference': {\n if (isVertexLike) {\n throw new UnsupportedFunctionalityError({\n functionality: 'file parts with provider references',\n });\n }\n\n parts.push({\n fileData: {\n mimeType: resolveFullMediaType({ part }),\n fileUri: resolveProviderReference({\n reference: part.data.reference,\n provider: 'google',\n }),\n },\n });\n break;\n }\n case 'text': {\n parts.push({\n inlineData: {\n mimeType: isFullMediaType(part.mediaType)\n ? part.mediaType\n : 'text/plain',\n data: convertToBase64(\n new TextEncoder().encode(part.data.text),\n ),\n },\n });\n break;\n }\n case 'data': {\n parts.push({\n inlineData: {\n mimeType: resolveFullMediaType({ part }),\n data: convertToBase64(part.data.data),\n },\n });\n break;\n }\n }\n\n break;\n }\n }\n }\n\n contents.push({ role: 'user', parts });\n break;\n }\n\n case 'assistant': {\n systemMessagesAllowed = false;\n\n contents.push({\n role: 'model',\n parts: content\n .map(part => {\n const providerOpts = readProviderOpts(part);\n const thoughtSignature =\n providerOpts?.thoughtSignature != null\n ? String(providerOpts.thoughtSignature)\n : undefined;\n\n switch (part.type) {\n case 'text': {\n return part.text.length === 0\n ? undefined\n : {\n text: part.text,\n thoughtSignature,\n };\n }\n\n case 'reasoning': {\n return part.text.length === 0\n ? undefined\n : {\n text: part.text,\n thought: true,\n thoughtSignature,\n };\n }\n\n case 'reasoning-file': {\n switch (part.data.type) {\n case 'url': {\n throw new UnsupportedFunctionalityError({\n functionality:\n 'File data URLs in assistant messages are not supported',\n });\n }\n case 'data': {\n return {\n inlineData: {\n mimeType: part.mediaType,\n data: convertToBase64(part.data.data),\n },\n thought: true,\n thoughtSignature,\n };\n }\n }\n break;\n }\n\n case 'file': {\n switch (part.data.type) {\n case 'url': {\n throw new UnsupportedFunctionalityError({\n functionality:\n 'File data URLs in assistant messages are not supported',\n });\n }\n case 'reference': {\n if (isVertexLike) {\n throw new UnsupportedFunctionalityError({\n functionality: 'file parts with provider references',\n });\n }\n\n return {\n fileData: {\n mimeType: part.mediaType,\n fileUri: resolveProviderReference({\n reference: part.data.reference,\n provider: 'google',\n }),\n },\n ...(providerOpts?.thought === true\n ? { thought: true }\n : {}),\n thoughtSignature,\n };\n }\n case 'text': {\n return {\n inlineData: {\n mimeType: isFullMediaType(part.mediaType)\n ? part.mediaType\n : 'text/plain',\n data: convertToBase64(\n new TextEncoder().encode(part.data.text),\n ),\n },\n ...(providerOpts?.thought === true\n ? { thought: true }\n : {}),\n thoughtSignature,\n };\n }\n case 'data': {\n return {\n inlineData: {\n mimeType: part.mediaType,\n data: convertToBase64(part.data.data),\n },\n ...(providerOpts?.thought === true\n ? { thought: true }\n : {}),\n thoughtSignature,\n };\n }\n }\n break;\n }\n\n case 'tool-call': {\n const serverToolCallId =\n providerOpts?.serverToolCallId != null\n ? String(providerOpts.serverToolCallId)\n : undefined;\n const serverToolType =\n providerOpts?.serverToolType != null\n ? String(providerOpts.serverToolType)\n : undefined;\n\n if (serverToolCallId && serverToolType) {\n return {\n toolCall: {\n toolType: serverToolType,\n args:\n typeof part.input === 'string'\n ? JSON.parse(part.input)\n : part.input,\n id: serverToolCallId,\n },\n thoughtSignature,\n };\n }\n\n return {\n functionCall: {\n ...(part.toolCallId != null\n ? { id: part.toolCallId }\n : {}),\n name: part.toolName,\n args: part.input,\n },\n thoughtSignature,\n };\n }\n\n case 'tool-result': {\n const serverToolCallId =\n providerOpts?.serverToolCallId != null\n ? String(providerOpts.serverToolCallId)\n : undefined;\n const serverToolType =\n providerOpts?.serverToolType != null\n ? String(providerOpts.serverToolType)\n : undefined;\n\n if (serverToolCallId && serverToolType) {\n return {\n toolResponse: {\n toolType: serverToolType,\n response:\n part.output.type === 'json' ? part.output.value : {},\n id: serverToolCallId,\n },\n thoughtSignature,\n };\n }\n\n return undefined;\n }\n }\n })\n .filter(part => part !== undefined),\n });\n\n break;\n }\n\n case 'tool': {\n systemMessagesAllowed = false;\n\n const parts: GoogleContentPart[] = [];\n\n for (const part of content) {\n if (part.type === 'tool-approval-response') {\n continue;\n }\n\n const partProviderOpts = readProviderOpts(part);\n const serverToolCallId =\n partProviderOpts?.serverToolCallId != null\n ? String(partProviderOpts.serverToolCallId)\n : undefined;\n const serverToolType =\n partProviderOpts?.serverToolType != null\n ? String(partProviderOpts.serverToolType)\n : undefined;\n\n if (serverToolCallId && serverToolType) {\n const serverThoughtSignature =\n partProviderOpts?.thoughtSignature != null\n ? String(partProviderOpts.thoughtSignature)\n : undefined;\n\n if (contents.length > 0) {\n const lastContent = contents[contents.length - 1];\n if (lastContent.role === 'model') {\n lastContent.parts.push({\n toolResponse: {\n toolType: serverToolType,\n response:\n part.output.type === 'json' ? part.output.value : {},\n id: serverToolCallId,\n },\n thoughtSignature: serverThoughtSignature,\n });\n continue;\n }\n }\n }\n\n const output = part.output;\n\n if (output.type === 'content') {\n if (supportsFunctionResponseParts) {\n appendToolResultParts(\n parts,\n part.toolName,\n output.value,\n part.toolCallId,\n );\n } else {\n appendLegacyToolResultParts(\n parts,\n part.toolName,\n output.value,\n part.toolCallId,\n );\n }\n } else {\n parts.push({\n functionResponse: {\n ...(part.toolCallId != null ? { id: part.toolCallId } : {}),\n name: part.toolName,\n response: {\n name: part.toolName,\n content:\n output.type === 'execution-denied'\n ? (output.reason ?? 'Tool call execution denied.')\n : output.value,\n },\n },\n });\n }\n }\n\n contents.push({\n role: 'user',\n parts,\n });\n break;\n }\n }\n }\n\n if (\n isGemmaModel &&\n systemInstructionParts.length > 0 &&\n contents.length > 0 &&\n contents[0].role === 'user'\n ) {\n const systemText = systemInstructionParts\n .map(part => part.text)\n .join('\\n\\n');\n\n contents[0].parts.unshift({ text: systemText + '\\n\\n' });\n }\n\n return {\n systemInstruction:\n systemInstructionParts.length > 0 && !isGemmaModel\n ? { parts: systemInstructionParts }\n : undefined,\n contents,\n };\n}\n","export function getModelPath(modelId: string): string {\n return modelId.includes('/') ? modelId : `models/${modelId}`;\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type GoogleModelId =\n // Stable models\n // https://ai.google.dev/gemini-api/docs/models/gemini\n | 'gemini-2.0-flash'\n | 'gemini-2.0-flash-001'\n | 'gemini-2.0-flash-lite'\n | 'gemini-2.0-flash-lite-001'\n | 'gemini-2.5-pro'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-flash-image'\n | 'gemini-2.5-flash-lite'\n | 'gemini-2.5-flash-preview-tts'\n | 'gemini-2.5-pro-preview-tts'\n | 'gemini-2.5-flash-native-audio-latest'\n | 'gemini-2.5-flash-native-audio-preview-09-2025'\n | 'gemini-2.5-flash-native-audio-preview-12-2025'\n | 'gemini-2.5-computer-use-preview-10-2025'\n | 'gemini-3-pro-preview'\n | 'gemini-3-pro-image-preview'\n | 'gemini-3-flash-preview'\n | 'gemini-3.1-pro-preview'\n | 'gemini-3.1-pro-preview-customtools'\n | 'gemini-3.1-flash-image-preview'\n | 'gemini-3.1-flash-lite-preview'\n | 'gemini-3.1-flash-tts-preview'\n | 'gemini-3.5-flash'\n // latest version\n // https://ai.google.dev/gemini-api/docs/models#latest\n | 'gemini-pro-latest'\n | 'gemini-flash-latest'\n | 'gemini-flash-lite-latest'\n | 'deep-research-pro-preview-12-2025'\n | 'nano-banana-pro-preview'\n | 'aqa'\n // Experimental models\n // https://ai.google.dev/gemini-api/docs/models/experimental-models\n | 'gemini-robotics-er-1.5-preview'\n | 'gemma-3-1b-it'\n | 'gemma-3-4b-it'\n | 'gemma-3n-e4b-it'\n | 'gemma-3n-e2b-it'\n | 'gemma-3-12b-it'\n | 'gemma-3-27b-it'\n | (string & {});\n\nexport const googleLanguageModelOptions = lazySchema(() =>\n zodSchema(\n z.object({\n responseModalities: z.array(z.enum(['TEXT', 'IMAGE'])).optional(),\n\n thinkingConfig: z\n .object({\n thinkingBudget: z.number().optional(),\n includeThoughts: z.boolean().optional(),\n // https://ai.google.dev/gemini-api/docs/gemini-3?thinking=high#thinking_level\n thinkingLevel: z\n .enum(['minimal', 'low', 'medium', 'high'])\n .optional(),\n })\n .optional(),\n\n /**\n * Optional.\n * The name of the cached content used as context to serve the prediction.\n * Format: cachedContents/{cachedContent}\n */\n cachedContent: z.string().optional(),\n\n /**\n * Optional. Enable structured output. Default is true.\n *\n * This is useful when the JSON Schema contains elements that are\n * not supported by the OpenAPI schema version that\n * Google uses. You can use this to disable\n * structured outputs if you need to.\n */\n structuredOutputs: z.boolean().optional(),\n\n /**\n * Optional. A list of unique safety settings for blocking unsafe content.\n */\n safetySettings: z\n .array(\n z.object({\n category: z.enum([\n 'HARM_CATEGORY_UNSPECIFIED',\n 'HARM_CATEGORY_HATE_SPEECH',\n 'HARM_CATEGORY_DANGEROUS_CONTENT',\n 'HARM_CATEGORY_HARASSMENT',\n 'HARM_CATEGORY_SEXUALLY_EXPLICIT',\n 'HARM_CATEGORY_CIVIC_INTEGRITY',\n ]),\n threshold: z.enum([\n 'HARM_BLOCK_THRESHOLD_UNSPECIFIED',\n 'BLOCK_LOW_AND_ABOVE',\n 'BLOCK_MEDIUM_AND_ABOVE',\n 'BLOCK_ONLY_HIGH',\n 'BLOCK_NONE',\n 'OFF',\n ]),\n }),\n )\n .optional(),\n\n threshold: z\n .enum([\n 'HARM_BLOCK_THRESHOLD_UNSPECIFIED',\n 'BLOCK_LOW_AND_ABOVE',\n 'BLOCK_MEDIUM_AND_ABOVE',\n 'BLOCK_ONLY_HIGH',\n 'BLOCK_NONE',\n 'OFF',\n ])\n .optional(),\n\n /**\n * Optional. Enables timestamp understanding for audio-only files.\n *\n * https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/audio-understanding\n */\n audioTimestamp: z.boolean().optional(),\n\n /**\n * Optional. Defines labels used in billing reports. Available on Vertex AI only.\n *\n * https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/add-labels-to-api-calls\n */\n labels: z.record(z.string(), z.string()).optional(),\n\n /**\n * Optional. If specified, the media resolution specified will be used.\n *\n * https://ai.google.dev/api/generate-content#MediaResolution\n */\n mediaResolution: z\n .enum([\n 'MEDIA_RESOLUTION_UNSPECIFIED',\n 'MEDIA_RESOLUTION_LOW',\n 'MEDIA_RESOLUTION_MEDIUM',\n 'MEDIA_RESOLUTION_HIGH',\n ])\n .optional(),\n\n /**\n * Optional. Configures the image generation aspect ratio for Gemini models.\n *\n * https://ai.google.dev/gemini-api/docs/image-generation#aspect_ratios\n */\n imageConfig: z\n .object({\n aspectRatio: z\n .enum([\n '1:1',\n '2:3',\n '3:2',\n '3:4',\n '4:3',\n '4:5',\n '5:4',\n '9:16',\n '16:9',\n '21:9',\n '1:8',\n '8:1',\n '1:4',\n '4:1',\n ])\n .optional(),\n imageSize: z.enum(['1K', '2K', '4K', '512']).optional(),\n })\n .optional(),\n\n /**\n * Optional. Configuration for grounding retrieval.\n * Used to provide location context for Google Maps and Google Search grounding.\n *\n * https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-maps\n */\n retrievalConfig: z\n .object({\n latLng: z\n .object({\n latitude: z.number(),\n longitude: z.number(),\n })\n .optional(),\n })\n .optional(),\n\n /**\n * Optional. When set to true, function call arguments will be streamed\n * incrementally via partialArgs in streaming responses. Only supported\n * on the Vertex AI API (not the Gemini API) and only for Gemini 3+\n * models.\n *\n * @default false\n *\n * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling#streaming-fc\n */\n streamFunctionCallArguments: z.boolean().optional(),\n\n /**\n * Optional. The service tier to use for the request. Sent as the\n * `serviceTier` body field. Gemini API only.\n */\n serviceTier: z.enum(['standard', 'flex', 'priority']).optional(),\n\n /**\n * Optional. Vertex AI only. Sent as the\n * `X-Vertex-AI-LLM-Shared-Request-Type` request header to select a\n * shared (PayGo) tier. With Provisioned Throughput allocated and\n * `requestType` unset, the request falls back to this tier only if\n * PT capacity is exhausted.\n *\n * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/priority-paygo\n * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/flex-paygo\n */\n sharedRequestType: z.enum(['priority', 'flex', 'standard']).optional(),\n\n /**\n * Optional. Vertex AI only. Sent as the `X-Vertex-AI-LLM-Request-Type`\n * request header. Set to `'shared'` together with `sharedRequestType`\n * to bypass Provisioned Throughput entirely.\n *\n * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/priority-paygo\n */\n requestType: z.enum(['shared']).optional(),\n }),\n ),\n);\n\nexport type GoogleLanguageModelOptions = InferSchema<\n typeof googleLanguageModelOptions\n>;\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4CallOptions,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport { convertJSONSchemaToOpenAPISchema } from './convert-json-schema-to-openapi-schema';\nimport type { GoogleModelId } from './google-language-model-options';\n\nexport function prepareTools({\n tools,\n toolChoice,\n modelId,\n isVertexProvider = false,\n}: {\n tools: LanguageModelV4CallOptions['tools'];\n toolChoice?: LanguageModelV4CallOptions['toolChoice'];\n modelId: GoogleModelId;\n isVertexProvider?: boolean;\n}): {\n tools:\n | Array<\n | {\n functionDeclarations: Array<{\n name: string;\n description: string;\n parameters: unknown;\n }>;\n }\n | Record<string, any>\n >\n | undefined;\n toolConfig:\n | undefined\n | {\n functionCallingConfig?: {\n mode: 'AUTO' | 'NONE' | 'ANY' | 'VALIDATED';\n allowedFunctionNames?: string[];\n streamFunctionCallArguments?: boolean;\n };\n includeServerSideToolInvocations?: boolean;\n };\n toolWarnings: SharedV4Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV4Warning[] = [];\n\n const isLatest = (\n [\n 'gemini-flash-latest',\n 'gemini-flash-lite-latest',\n 'gemini-pro-latest',\n ] as const satisfies GoogleModelId[]\n ).some(id => id === modelId);\n const isGemini2orNewer =\n modelId.includes('gemini-2') ||\n modelId.includes('gemini-3') ||\n modelId.includes('nano-banana') ||\n isLatest;\n const isGemini3orNewer = modelId.includes('gemini-3');\n const supportsFileSearch =\n modelId.includes('gemini-2.5') || modelId.includes('gemini-3');\n\n if (tools == null) {\n return { tools: undefined, toolConfig: undefined, toolWarnings };\n }\n\n // Check for mixed tool types and add warnings\n const hasFunctionTools = tools.some(tool => tool.type === 'function');\n const hasProviderTools = tools.some(tool => tool.type === 'provider');\n\n if (hasFunctionTools && hasProviderTools && !isGemini3orNewer) {\n toolWarnings.push({\n type: 'unsupported',\n feature: `combination of function and provider-defined tools`,\n });\n }\n\n if (hasProviderTools) {\n const googleTools: any[] = [];\n\n const ProviderTools = tools.filter(tool => tool.type === 'provider');\n ProviderTools.forEach(tool => {\n switch (tool.id) {\n case 'google.google_search':\n if (isGemini2orNewer) {\n googleTools.push({ googleSearch: { ...tool.args } });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details: 'Google Search requires Gemini 2.0 or newer.',\n });\n }\n break;\n case 'google.enterprise_web_search':\n if (isGemini2orNewer) {\n googleTools.push({ enterpriseWebSearch: {} });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details: 'Enterprise Web Search requires Gemini 2.0 or newer.',\n });\n }\n break;\n case 'google.url_context':\n if (isGemini2orNewer) {\n googleTools.push({ urlContext: {} });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details:\n 'The URL context tool is not supported with other Gemini models than Gemini 2.',\n });\n }\n break;\n case 'google.code_execution':\n if (isGemini2orNewer) {\n googleTools.push({ codeExecution: {} });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details:\n 'The code execution tool is not supported with other Gemini models than Gemini 2.',\n });\n }\n break;\n case 'google.file_search':\n if (supportsFileSearch) {\n googleTools.push({ fileSearch: { ...tool.args } });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details:\n 'The file search tool is only supported with Gemini 2.5 models and Gemini 3 models.',\n });\n }\n break;\n case 'google.vertex_rag_store':\n if (isGemini2orNewer) {\n googleTools.push({\n retrieval: {\n vertex_rag_store: {\n rag_resources: {\n rag_corpus: tool.args.ragCorpus,\n },\n similarity_top_k: tool.args.topK as number | undefined,\n },\n },\n });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details:\n 'The RAG store tool is not supported with other Gemini models than Gemini 2.',\n });\n }\n break;\n case 'google.google_maps':\n if (isGemini2orNewer) {\n googleTools.push({ googleMaps: {} });\n } else {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details:\n 'The Google Maps grounding tool is not supported with Gemini models other than Gemini 2 or newer.',\n });\n }\n break;\n default:\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n });\n break;\n }\n });\n\n if (hasFunctionTools && isGemini3orNewer && googleTools.length > 0) {\n const functionDeclarations: Array<{\n name: string;\n description: string;\n parameters: unknown;\n }> = [];\n for (const tool of tools) {\n if (tool.type === 'function') {\n functionDeclarations.push({\n name: tool.name,\n description: tool.description ?? '',\n parameters: convertJSONSchemaToOpenAPISchema(tool.inputSchema),\n });\n }\n }\n\n const combinedToolConfig: {\n functionCallingConfig: {\n mode: 'VALIDATED' | 'ANY' | 'NONE';\n allowedFunctionNames?: string[];\n };\n includeServerSideToolInvocations?: true;\n } = {\n functionCallingConfig: { mode: 'VALIDATED' },\n ...(!isVertexProvider && {\n includeServerSideToolInvocations: true,\n }),\n };\n\n if (toolChoice != null) {\n switch (toolChoice.type) {\n case 'auto':\n break;\n case 'none':\n combinedToolConfig.functionCallingConfig = { mode: 'NONE' };\n break;\n case 'required':\n combinedToolConfig.functionCallingConfig = { mode: 'ANY' };\n break;\n case 'tool':\n combinedToolConfig.functionCallingConfig = {\n mode: 'ANY',\n allowedFunctionNames: [toolChoice.toolName],\n };\n break;\n }\n }\n\n return {\n tools: [...googleTools, { functionDeclarations }],\n toolConfig: combinedToolConfig,\n toolWarnings,\n };\n }\n\n return {\n tools: googleTools.length > 0 ? googleTools : undefined,\n toolConfig: undefined,\n toolWarnings,\n };\n }\n\n const functionDeclarations = [];\n let hasStrictTools = false;\n for (const tool of tools) {\n switch (tool.type) {\n case 'function':\n functionDeclarations.push({\n name: tool.name,\n description: tool.description ?? '',\n parameters: convertJSONSchemaToOpenAPISchema(tool.inputSchema),\n });\n if (tool.strict === true) {\n hasStrictTools = true;\n }\n break;\n default:\n toolWarnings.push({\n type: 'unsupported',\n feature: `function tool ${tool.name}`,\n });\n break;\n }\n }\n\n if (toolChoice == null) {\n return {\n tools: [{ functionDeclarations }],\n toolConfig: hasStrictTools\n ? { functionCallingConfig: { mode: 'VALIDATED' } }\n : undefined,\n toolWarnings,\n };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n return {\n tools: [{ functionDeclarations }],\n toolConfig: {\n functionCallingConfig: {\n mode: hasStrictTools ? 'VALIDATED' : 'AUTO',\n },\n },\n toolWarnings,\n };\n case 'none':\n return {\n tools: [{ functionDeclarations }],\n toolConfig: { functionCallingConfig: { mode: 'NONE' } },\n toolWarnings,\n };\n case 'required':\n return {\n tools: [{ functionDeclarations }],\n toolConfig: {\n functionCallingConfig: {\n mode: hasStrictTools ? 'VALIDATED' : 'ANY',\n },\n },\n toolWarnings,\n };\n case 'tool':\n return {\n tools: [{ functionDeclarations }],\n toolConfig: {\n functionCallingConfig: {\n mode: hasStrictTools ? 'VALIDATED' : 'ANY',\n allowedFunctionNames: [toolChoice.toolName],\n },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n","export type PartialArg = {\n jsonPath: string;\n stringValue?: string | null;\n numberValue?: number | null;\n boolValue?: boolean | null;\n nullValue?: unknown;\n willContinue?: boolean | null;\n};\n\ntype PathSegment = string | number;\n\ntype StackEntry = {\n segment: PathSegment;\n isArray: boolean;\n childCount: number;\n};\n\n/**\n * Incrementally builds a JSON object from Google's streaming `partialArgs`\n * chunks emitted during tool-call function calling. Tracks both the structured\n * object and a running JSON text representation so callers can emit text deltas\n * that, when concatenated, form valid nested JSON matching JSON.stringify output.\n *\n * Input: [{jsonPath:\"$.location\",stringValue:\"Boston\"}]\n * Output: '{\"location\":\"Boston\"', then finalize() → closingDelta='}'\n */\nexport class GoogleJSONAccumulator {\n private accumulatedArgs: Record<string, unknown> = {};\n private jsonText = '';\n\n /**\n * Stack representing the currently \"open\" containers in the JSON output.\n * Entry 0 is always the root `{` object once the first value is written.\n */\n private pathStack: StackEntry[] = [];\n\n /**\n * Whether a string value is currently \"open\" (willContinue was true),\n * meaning the closing quote has not yet been emitted.\n */\n private stringOpen = false;\n\n /**\n * Input: [{jsonPath:\"$.brightness\",numberValue:50}]\n * Output: { currentJSON:{brightness:50}, textDelta:'{\"brightness\":50' }\n */\n processPartialArgs(partialArgs: PartialArg[]): {\n currentJSON: Record<string, unknown>;\n textDelta: string;\n } {\n let delta = '';\n\n for (const arg of partialArgs) {\n const rawPath = arg.jsonPath.replace(/^\\$\\./, '');\n if (!rawPath) continue;\n\n const segments = parsePath(rawPath);\n\n const existingValue = getNestedValue(this.accumulatedArgs, segments);\n const isStringContinuation =\n arg.stringValue != null && existingValue !== undefined;\n\n if (isStringContinuation) {\n const escaped = JSON.stringify(arg.stringValue).slice(1, -1);\n setNestedValue(\n this.accumulatedArgs,\n segments,\n (existingValue as string) + arg.stringValue,\n );\n delta += escaped;\n continue;\n }\n\n const resolved = resolvePartialArgValue(arg);\n if (resolved == null) continue;\n\n setNestedValue(this.accumulatedArgs, segments, resolved.value);\n delta += this.emitNavigationTo(segments, arg, resolved.json);\n }\n\n this.jsonText += delta;\n\n return {\n currentJSON: this.accumulatedArgs,\n textDelta: delta,\n };\n }\n\n /**\n * Input: jsonText='{\"brightness\":50', accumulatedArgs={brightness:50}\n * Output: { finalJSON:'{\"brightness\":50}', closingDelta:'}' }\n */\n finalize(): { finalJSON: string; closingDelta: string } {\n const finalArgs = JSON.stringify(this.accumulatedArgs);\n const closingDelta = finalArgs.slice(this.jsonText.length);\n return { finalJSON: finalArgs, closingDelta };\n }\n\n /**\n * Input: pathStack=[] (first call) or pathStack=[root,...] (subsequent calls)\n * Output: '{' (first call) or '' (subsequent calls)\n */\n private ensureRoot(): string {\n if (this.pathStack.length === 0) {\n this.pathStack.push({ segment: '', isArray: false, childCount: 0 });\n return '{';\n }\n return '';\n }\n\n /**\n * Emits the JSON text fragment needed to navigate from the current open\n * path to the new leaf at `targetSegments`, then writes the value.\n *\n * Input: targetSegments=[\"recipe\",\"name\"], arg={jsonPath:\"$.recipe.name\",stringValue:\"Lasagna\"}, valueJson='\"Lasagna\"'\n * Output: '{\"recipe\":{\"name\":\"Lasagna\"'\n */\n private emitNavigationTo(\n targetSegments: PathSegment[],\n arg: PartialArg,\n valueJson: string,\n ): string {\n let fragment = '';\n\n if (this.stringOpen) {\n fragment += '\"';\n this.stringOpen = false;\n }\n\n fragment += this.ensureRoot();\n\n const targetContainerSegments = targetSegments.slice(0, -1);\n const leafSegment = targetSegments[targetSegments.length - 1];\n\n const commonDepth = this.findCommonStackDepth(targetContainerSegments);\n\n fragment += this.closeDownTo(commonDepth);\n fragment += this.openDownTo(targetContainerSegments, leafSegment);\n fragment += this.emitLeaf(leafSegment, arg, valueJson);\n\n return fragment;\n }\n\n /**\n * Returns the stack depth to preserve when navigating to a new target\n * container path. Always >= 1 (the root is never popped).\n *\n * Input: stack=[root,\"recipe\",\"ingredients\",0], target=[\"recipe\",\"ingredients\",1]\n * Output: 3 (keep root+\"recipe\"+\"ingredients\")\n */\n private findCommonStackDepth(targetContainer: PathSegment[]): number {\n const maxDepth = Math.min(\n this.pathStack.length - 1,\n targetContainer.length,\n );\n let common = 0;\n for (let i = 0; i < maxDepth; i++) {\n if (this.pathStack[i + 1].segment === targetContainer[i]) {\n common++;\n } else {\n break;\n }\n }\n return common + 1;\n }\n\n /**\n * Closes containers from the current stack depth back down to `targetDepth`.\n *\n * Input: this.pathStack=[root,\"recipe\",\"ingredients\",0], targetDepth=3\n * Output: '}'\n */\n private closeDownTo(targetDepth: number): string {\n let fragment = '';\n while (this.pathStack.length > targetDepth) {\n const entry = this.pathStack.pop()!;\n fragment += entry.isArray ? ']' : '}';\n }\n return fragment;\n }\n\n /**\n * Opens containers from the current stack depth down to the full target\n * container path, emitting opening `{`, `[`, keys, and commas as needed.\n * `leafSegment` is used to determine if the innermost container is an array.\n *\n * Input: this.pathStack=[root], targetContainer=[\"recipe\",\"ingredients\"], leafSegment=0\n * Output: '\"recipe\":{\"ingredients\":['\n */\n private openDownTo(\n targetContainer: PathSegment[],\n leafSegment: PathSegment,\n ): string {\n let fragment = '';\n\n const startIdx = this.pathStack.length - 1;\n\n for (let i = startIdx; i < targetContainer.length; i++) {\n const seg = targetContainer[i];\n const parentEntry = this.pathStack[this.pathStack.length - 1];\n\n if (parentEntry.childCount > 0) {\n fragment += ',';\n }\n parentEntry.childCount++;\n\n if (typeof seg === 'string') {\n fragment += `${JSON.stringify(seg)}:`;\n }\n\n const childSeg =\n i + 1 < targetContainer.length ? targetContainer[i + 1] : leafSegment;\n const isArray = typeof childSeg === 'number';\n\n fragment += isArray ? '[' : '{';\n\n this.pathStack.push({ segment: seg, isArray, childCount: 0 });\n }\n\n return fragment;\n }\n\n /**\n * Emits the comma, key, and value for a leaf entry in the current container.\n *\n * Input: leafSegment=\"name\", arg={stringValue:\"Lasagna\"}, valueJson='\"Lasagna\"'\n * Output: '\"name\":\"Lasagna\"' (or ',\"name\":\"Lasagna\"' if container.childCount > 0)\n */\n private emitLeaf(\n leafSegment: PathSegment,\n arg: PartialArg,\n valueJson: string,\n ): string {\n let fragment = '';\n const container = this.pathStack[this.pathStack.length - 1];\n\n if (container.childCount > 0) {\n fragment += ',';\n }\n container.childCount++;\n\n if (typeof leafSegment === 'string') {\n fragment += `${JSON.stringify(leafSegment)}:`;\n }\n\n if (arg.stringValue != null && arg.willContinue) {\n fragment += valueJson.slice(0, -1);\n this.stringOpen = true;\n } else {\n fragment += valueJson;\n }\n\n return fragment;\n }\n}\n\n/**\n * Splits a dotted/bracketed JSON path like `recipe.ingredients[0].name` into segments.\n *\n * Input: \"recipe.ingredients[0].name\"\n * Output: [\"recipe\", \"ingredients\", 0, \"name\"]\n */\nfunction parsePath(rawPath: string): Array<string | number> {\n const segments: Array<string | number> = [];\n for (const part of rawPath.split('.')) {\n const bracketIdx = part.indexOf('[');\n if (bracketIdx === -1) {\n segments.push(part);\n } else {\n if (bracketIdx > 0) segments.push(part.slice(0, bracketIdx));\n for (const m of part.matchAll(/\\[(\\d+)\\]/g)) {\n segments.push(parseInt(m[1], 10));\n }\n }\n }\n return segments;\n}\n\n/**\n * Traverses a nested object along the given path segments and returns the leaf value.\n *\n * Input: ({recipe:{name:\"Lasagna\"}}, [\"recipe\",\"name\"])\n * Output: \"Lasagna\"\n */\nfunction getNestedValue(\n obj: Record<string, unknown>,\n segments: Array<string | number>,\n): unknown {\n let current: unknown = obj;\n for (const seg of segments) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string | number, unknown>)[seg];\n }\n return current;\n}\n\n/**\n * Sets a value at a nested path, creating intermediate objects or arrays as needed.\n *\n * Input: obj={}, segments=[\"recipe\",\"ingredients\",0,\"name\"], value=\"Noodles\"\n * Output: {recipe:{ingredients:[{name:\"Noodles\"}]}}\n */\nfunction setNestedValue(\n obj: Record<string, unknown>,\n segments: Array<string | number>,\n value: unknown,\n): void {\n let current: Record<string | number, unknown> = obj;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n const nextSeg = segments[i + 1];\n if (current[seg] == null) {\n current[seg] = typeof nextSeg === 'number' ? [] : {};\n }\n current = current[seg] as Record<string | number, unknown>;\n }\n current[segments[segments.length - 1]] = value;\n}\n\n/**\n * Extracts the first non-null typed value from a partial arg and returns it with its JSON representation.\n *\n * Input: arg={stringValue:\"Boston\"} or arg={numberValue:50}\n * Output: {value:\"Boston\", json:'\"Boston\"'} or {value:50, json:'50'}\n */\nfunction resolvePartialArgValue(arg: {\n stringValue?: string | null;\n numberValue?: number | null;\n boolValue?: boolean | null;\n nullValue?: unknown;\n}): { value: unknown; json: string } | undefined {\n const value = arg.stringValue ?? arg.numberValue ?? arg.boolValue;\n if (value != null) return { value, json: JSON.stringify(value) };\n if ('nullValue' in arg) return { value: null, json: 'null' };\n return undefined;\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapGoogleFinishReason({\n finishReason,\n hasToolCalls,\n}: {\n finishReason: string | null | undefined;\n hasToolCalls: boolean;\n}): LanguageModelV4FinishReason['unified'] {\n switch (finishReason) {\n case 'STOP':\n return hasToolCalls ? 'tool-calls' : 'stop';\n case 'MAX_TOKENS':\n return 'length';\n case 'IMAGE_SAFETY':\n case 'RECITATION':\n case 'SAFETY':\n case 'BLOCKLIST':\n case 'PROHIBITED_CONTENT':\n case 'SPII':\n return 'content-filter';\n case 'MALFORMED_FUNCTION_CALL':\n return 'error';\n case 'FINISH_REASON_UNSPECIFIED':\n case 'OTHER':\n default:\n return 'other';\n }\n}\n","import { createProviderExecutedToolFactory } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * A tool that enables the model to generate and run Python code.\n *\n * @note Ensure the selected model supports Code Execution.\n * Multi-tool usage with the code execution tool is typically compatible with Gemini >=2 models.\n *\n * @see https://ai.google.dev/gemini-api/docs/code-execution (Google AI)\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/code-execution-api (Vertex AI)\n */\nexport const codeExecution = createProviderExecutedToolFactory<\n {\n language: string;\n code: string;\n },\n {\n outcome: string;\n output: string;\n },\n {}\n>({\n id: 'google.code_execution',\n inputSchema: z.object({\n language: z.string().describe('The programming language of the code.'),\n code: z.string().describe('The code to be executed.'),\n }),\n outputSchema: z.object({\n outcome: z\n .string()\n .describe('The outcome of the execution (e.g., \"OUTCOME_OK\").'),\n output: z.string().describe('The output from the code execution.'),\n }),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/web-grounding-enterprise\n\nexport const enterpriseWebSearch = createProviderExecutedToolFactory<\n {\n // Enterprise Web Search does not have any input schema\n },\n {\n // Enterprise Web Search does not have any output parameters\n },\n {\n // Enterprise Web Search does not have any configuration options\n }\n>({\n id: 'google.enterprise_web_search',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/** Tool to retrieve knowledge from the File Search Stores. */\nconst fileSearchArgsBaseSchema = z\n .object({\n /** The names of the file_search_stores to retrieve from.\n * Example: `fileSearchStores/my-file-search-store-123`\n */\n fileSearchStoreNames: z\n .array(z.string())\n .describe(\n 'The names of the file_search_stores to retrieve from. Example: `fileSearchStores/my-file-search-store-123`',\n ),\n /** The number of file search retrieval chunks to retrieve. */\n topK: z\n .number()\n .int()\n .positive()\n .describe('The number of file search retrieval chunks to retrieve.')\n .optional(),\n\n /** Metadata filter to apply to the file search retrieval documents.\n * See https://google.aip.dev/160 for the syntax of the filter expression.\n */\n metadataFilter: z\n .string()\n .describe(\n 'Metadata filter to apply to the file search retrieval documents. See https://google.aip.dev/160 for the syntax of the filter expression.',\n )\n .optional(),\n })\n .passthrough();\n\nexport type GoogleFileSearchToolArgs = z.infer<typeof fileSearchArgsBaseSchema>;\n\nexport const fileSearch = createProviderExecutedToolFactory<\n {},\n {},\n GoogleFileSearchToolArgs\n>({\n id: 'google.file_search',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://ai.google.dev/gemini-api/docs/maps-grounding\n// https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-maps\n\nexport const googleMaps = createProviderExecutedToolFactory<{}, {}, {}>({\n id: 'google.google_maps',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://ai.google.dev/gemini-api/docs/google-search\n// https://ai.google.dev/api/generate-content#GroundingSupport\n// https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-search\n\nexport const googleSearchToolArgsBaseSchema = z\n .object({\n searchTypes: z\n .object({\n webSearch: z.object({}).optional(),\n imageSearch: z.object({}).optional(),\n })\n .optional(),\n\n timeRangeFilter: z\n .object({\n startTime: z.string(),\n endTime: z.string(),\n })\n .optional(),\n })\n .passthrough();\n\nexport type GoogleSearchToolArgs = z.infer<\n typeof googleSearchToolArgsBaseSchema\n>;\n\nexport const googleSearch = createProviderExecutedToolFactory<\n {},\n {},\n GoogleSearchToolArgs\n>({\n id: 'google.google_search',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const urlContext = createProviderExecutedToolFactory<\n {\n // Url context does not have any input schema, it will directly use the url from the prompt\n },\n {},\n {}\n>({\n id: 'google.url_context',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderExecutedToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/rag-engine/use-vertexai-search#generate-content-using-gemini-api\n// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/rag-output-explained\n\n/**\n * A tool that enables the model to perform RAG searches against a Vertex RAG Store.\n *\n * @note Only works with Vertex Gemini models.\n */\nexport const vertexRagStore = createProviderExecutedToolFactory<\n {},\n {},\n {\n /**\n * RagCorpus resource names, eg: projects/{project}/locations/{location}/ragCorpora/{rag_corpus}\n */\n ragCorpus: string;\n\n /**\n * The number of top contexts to retrieve.\n */\n topK?: number;\n }\n>({\n id: 'google.vertex_rag_store',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n outputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import { codeExecution } from './tool/code-execution';\nimport { enterpriseWebSearch } from './tool/enterprise-web-search';\nimport { fileSearch } from './tool/file-search';\nimport { googleMaps } from './tool/google-maps';\nimport { googleSearch } from './tool/google-search';\nimport { urlContext } from './tool/url-context';\nimport { vertexRagStore } from './tool/vertex-rag-store';\n\nexport const googleTools = {\n /**\n * Creates a Google search tool that gives Google direct access to real-time web content.\n * Must have name \"google_search\".\n */\n googleSearch,\n\n /**\n * Creates an Enterprise Web Search tool for grounding responses using a compliance-focused web index.\n * Designed for highly-regulated industries (finance, healthcare, public sector).\n * Does not log customer data and supports VPC service controls.\n * Must have name \"enterprise_web_search\".\n *\n * @note Only available on Vertex AI. Requires Gemini 2.0 or newer.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/web-grounding-enterprise\n */\n enterpriseWebSearch,\n\n /**\n * Creates a Google Maps grounding tool that gives the model access to Google Maps data.\n * Must have name \"google_maps\".\n *\n * @see https://ai.google.dev/gemini-api/docs/maps-grounding\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-maps\n */\n googleMaps,\n\n /**\n * Creates a URL context tool that gives Google direct access to real-time web content.\n * Must have name \"url_context\".\n */\n urlContext,\n\n /**\n * Enables Retrieval Augmented Generation (RAG) via the Gemini File Search tool.\n * Must have name \"file_search\".\n *\n * @param fileSearchStoreNames - Fully-qualified File Search store resource names.\n * @param metadataFilter - Optional filter expression to restrict the files that can be retrieved.\n * @param topK - Optional result limit for the number of chunks returned from File Search.\n *\n * @see https://ai.google.dev/gemini-api/docs/file-search\n */\n fileSearch,\n /**\n * A tool that enables the model to generate and run Python code.\n * Must have name \"code_execution\".\n *\n * @note Ensure the selected model supports Code Execution.\n * Multi-tool usage with the code execution tool is typically compatible with Gemini >=2 models.\n *\n * @see https://ai.google.dev/gemini-api/docs/code-execution (Google AI)\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/code-execution-api (Vertex AI)\n */\n codeExecution,\n\n /**\n * Creates a Vertex RAG Store tool that enables the model to perform RAG searches against a Vertex RAG Store.\n * Must have name \"vertex_rag_store\".\n */\n vertexRagStore,\n};\n","import type {\n ImageModelV4,\n LanguageModelV4Prompt,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertToBase64,\n createJsonResponseHandler,\n generateId as defaultGenerateId,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n zodSchema,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\nimport { googleImageModelOptionsSchema } from './google-image-model-options';\nimport type {\n GoogleImageModelId,\n GoogleImageSettings,\n} from './google-image-settings';\nimport { GoogleLanguageModel } from './google-language-model';\nimport type { GoogleLanguageModelOptions } from './google-language-model-options';\n\ninterface GoogleImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n generateId?: () => string;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class GoogleImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n\n static [WORKFLOW_SERIALIZE](model: GoogleImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: GoogleImageModelConfig;\n }) {\n return new GoogleImageModel(options.modelId, {}, options.config);\n }\n\n get maxImagesPerCall(): number {\n if (this.settings.maxImagesPerCall != null) {\n return this.settings.maxImagesPerCall;\n }\n // https://docs.cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/2-5-flash-image\n if (isGeminiModel(this.modelId)) {\n return 10;\n }\n // https://ai.google.dev/gemini-api/docs/imagen#imagen-model\n return 4;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: GoogleImageModelId,\n private readonly settings: GoogleImageSettings,\n private readonly config: GoogleImageModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<ImageModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>> {\n // Gemini image models use the language model API internally\n if (isGeminiModel(this.modelId)) {\n return this.doGenerateGemini(options);\n }\n return this.doGenerateImagen(options);\n }\n\n private async doGenerateImagen(\n options: Parameters<ImageModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>> {\n const {\n prompt,\n n = 1,\n size,\n aspectRatio = '1:1',\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n } = options;\n const warnings: Array<SharedV4Warning> = [];\n\n // Imagen API endpoints do not support image editing\n if (files != null && files.length > 0) {\n throw new Error(\n 'Google Gemini API does not support image editing with Imagen models. ' +\n 'Use Google Vertex AI (@ai-sdk/google-vertex) for image editing capabilities.',\n );\n }\n\n if (mask != null) {\n throw new Error(\n 'Google Gemini API does not support image editing with masks. ' +\n 'Use Google Vertex AI (@ai-sdk/google-vertex) for image editing capabilities.',\n );\n }\n\n if (size != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'This model does not support the `size` option. Use `aspectRatio` instead.',\n });\n }\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details:\n 'This model does not support the `seed` option through this provider.',\n });\n }\n\n const googleOptions = await parseProviderOptions({\n provider: 'google',\n providerOptions,\n schema: googleImageModelOptionsSchema,\n });\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n const parameters: Record<string, unknown> = {\n sampleCount: n,\n };\n\n if (aspectRatio != null) {\n parameters.aspectRatio = aspectRatio;\n }\n\n if (googleOptions) {\n const { googleSearch: imagenGoogleSearch, ...imagenOptions } =\n googleOptions;\n if (imagenGoogleSearch != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'googleSearch',\n details:\n 'Google Search grounding is only supported on Gemini image models.',\n });\n }\n Object.assign(parameters, imagenOptions);\n }\n\n const body = {\n instances: [{ prompt }],\n parameters,\n };\n\n const { responseHeaders, value: response } = await postJsonToApi<{\n predictions: Array<{ bytesBase64Encoded: string }>;\n }>({\n url: `${this.config.baseURL}/models/${this.modelId}:predict`,\n headers: combineHeaders(\n this.config.headers ? await resolve(this.config.headers) : undefined,\n headers,\n ),\n body,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n return {\n images: response.predictions.map(\n (p: { bytesBase64Encoded: string }) => p.bytesBase64Encoded,\n ),\n warnings,\n providerMetadata: {\n google: {\n images: response.predictions.map(() => ({\n // Add any prediction-specific metadata here\n })),\n },\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n private async doGenerateGemini(\n options: Parameters<ImageModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>> {\n const {\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n } = options;\n const warnings: Array<SharedV4Warning> = [];\n\n // Gemini does not support mask-based inpainting\n if (mask != null) {\n throw new Error(\n 'Gemini image models do not support mask-based image editing.',\n );\n }\n\n // Gemini does not support generating multiple images per call via n parameter\n if (n != null && n > 1) {\n throw new Error(\n 'Gemini image models do not support generating a set number of images per call. Use n=1 or omit the n parameter.',\n );\n }\n\n if (size != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'This model does not support the `size` option. Use `aspectRatio` instead.',\n });\n }\n\n const userContent: Array<\n | { type: 'text'; text: string }\n | {\n type: 'file';\n data:\n | { type: 'data'; data: string | Uint8Array }\n | { type: 'url'; url: URL };\n mediaType: string;\n }\n > = [];\n\n if (prompt != null) {\n userContent.push({ type: 'text', text: prompt });\n }\n\n if (files != null && files.length > 0) {\n for (const file of files) {\n if (file.type === 'url') {\n userContent.push({\n type: 'file',\n data: { type: 'url', url: new URL(file.url) },\n mediaType: 'image/*',\n });\n } else {\n userContent.push({\n type: 'file',\n data: {\n type: 'data',\n data:\n typeof file.data === 'string'\n ? file.data\n : new Uint8Array(file.data),\n },\n mediaType: file.mediaType,\n });\n }\n }\n }\n\n const languageModelPrompt: LanguageModelV4Prompt = [\n { role: 'user', content: userContent },\n ];\n\n // Parse image-model-specific provider options so we can map them onto\n // the underlying language-model call. `googleSearch` is the dedicated\n // escape hatch for grounding (generateImage has no `tools` parameter).\n const googleImageOptions = await parseProviderOptions({\n provider: 'google',\n providerOptions,\n schema: googleImageModelOptionsSchema,\n });\n\n const { googleSearch: _strippedGoogleSearch, ...passthroughGoogleOptions } =\n providerOptions?.google ?? {};\n\n // Instantiate language model\n const languageModel = new GoogleLanguageModel(this.modelId, {\n provider: this.config.provider,\n baseURL: this.config.baseURL,\n headers: this.config.headers ?? {},\n fetch: this.config.fetch,\n generateId: this.config.generateId ?? defaultGenerateId,\n });\n\n // Call language model with image-only response modality\n const result = await languageModel.doGenerate({\n prompt: languageModelPrompt,\n seed,\n providerOptions: {\n google: {\n responseModalities: ['IMAGE'],\n imageConfig: aspectRatio\n ? {\n aspectRatio: aspectRatio as NonNullable<\n GoogleLanguageModelOptions['imageConfig']\n >['aspectRatio'],\n }\n : undefined,\n ...(passthroughGoogleOptions as Omit<\n GoogleLanguageModelOptions,\n 'responseModalities' | 'imageConfig'\n >),\n } satisfies GoogleLanguageModelOptions,\n },\n tools:\n googleImageOptions?.googleSearch != null\n ? [\n {\n type: 'provider',\n id: 'google.google_search',\n name: 'google_search',\n args: googleImageOptions.googleSearch,\n },\n ]\n : undefined,\n headers,\n abortSignal,\n });\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n const images: string[] = [];\n for (const part of result.content) {\n if (\n part.type === 'file' &&\n part.mediaType.startsWith('image/') &&\n part.data.type === 'data'\n ) {\n images.push(convertToBase64(part.data.data));\n }\n }\n\n const languageModelGoogleMetadata =\n (result.providerMetadata?.google as\n | Record<string, unknown>\n | undefined) ?? {};\n\n return {\n images,\n warnings,\n providerMetadata: {\n google: {\n ...languageModelGoogleMetadata,\n images: images.map(() => ({})),\n },\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: result.response?.headers,\n },\n usage: result.usage\n ? {\n inputTokens: result.usage.inputTokens.total,\n outputTokens: result.usage.outputTokens.total,\n totalTokens:\n (result.usage.inputTokens.total ?? 0) +\n (result.usage.outputTokens.total ?? 0),\n }\n : undefined,\n };\n }\n}\n\nfunction isGeminiModel(modelId: string): boolean {\n return modelId.startsWith('gemini-');\n}\n\n// minimal version of the schema\nconst googleImageResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n predictions: z\n .array(z.object({ bytesBase64Encoded: z.string() }))\n .default([]),\n }),\n ),\n);\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleSearchToolArgsBaseSchema } from './tool/google-search';\n\n// Note: For the initial GA launch of Imagen 3, safety filters are not configurable.\n// https://ai.google.dev/gemini-api/docs/imagen#imagen-model\nexport const googleImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n personGeneration: z\n .enum(['dont_allow', 'allow_adult', 'allow_all'])\n .nullish(),\n aspectRatio: z.enum(['1:1', '3:4', '4:3', '9:16', '16:9']).nullish(),\n\n /**\n * Enable Google Search grounding for Gemini image models. The value is\n * forwarded as the args of the `google.tools.googleSearch` provider\n * tool on the underlying language-model call. Pass `{}` for defaults.\n *\n * `generateImage` does not accept a `tools` parameter, so this is the\n * dedicated escape hatch for grounding image generation the same way\n * `generateText` does.\n */\n googleSearch: googleSearchToolArgsBaseSchema.optional(),\n }),\n ),\n);\n\nexport type GoogleImageModelOptions = InferSchema<\n typeof googleImageModelOptionsSchema\n>;\n","import {\n AISDKError,\n type FilesV4,\n type FilesV4UploadFileCallOptions,\n type FilesV4UploadFileResult,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertInlineFileDataToUint8Array,\n createJsonResponseHandler,\n delay,\n lazySchema,\n parseProviderOptions,\n zodSchema,\n getFromApi,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\n\nexport type GoogleFilesUploadOptions = {\n displayName?: string | null;\n pollIntervalMs?: number | null;\n pollTimeoutMs?: number | null;\n\n [key: string]: unknown;\n};\n\ninterface GoogleFilesConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n}\n\nexport class GoogleFiles implements FilesV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(private readonly config: GoogleFilesConfig) {}\n\n async uploadFile(\n options: FilesV4UploadFileCallOptions,\n ): Promise<FilesV4UploadFileResult> {\n const googleOptions = (await parseProviderOptions({\n provider: 'google',\n providerOptions: options.providerOptions,\n schema: googleFilesUploadOptionsSchema,\n })) as GoogleFilesUploadOptions | undefined;\n\n const resolvedHeaders = this.config.headers();\n const fetchFn = this.config.fetch ?? globalThis.fetch;\n\n const warnings: Array<SharedV4Warning> = [];\n if (options.filename != null) {\n warnings.push({ type: 'unsupported', feature: 'filename' });\n }\n\n const fileBytes = convertInlineFileDataToUint8Array(options.data);\n\n const mediaType = options.mediaType;\n const displayName = googleOptions?.displayName;\n\n const baseOrigin = this.config.baseURL.replace(/\\/v1beta$/, '');\n\n const initResponse = await fetchFn(`${baseOrigin}/upload/v1beta/files`, {\n method: 'POST',\n headers: {\n ...resolvedHeaders,\n 'X-Goog-Upload-Protocol': 'resumable',\n 'X-Goog-Upload-Command': 'start',\n 'X-Goog-Upload-Header-Content-Length': String(fileBytes.length),\n 'X-Goog-Upload-Header-Content-Type': mediaType,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n file: {\n ...(displayName != null ? { display_name: displayName } : {}),\n },\n }),\n });\n\n if (!initResponse.ok) {\n const errorBody = await initResponse.text();\n throw new AISDKError({\n name: 'GOOGLE_FILES_UPLOAD_ERROR',\n message: `Failed to initiate resumable upload: ${initResponse.status} ${errorBody}`,\n });\n }\n\n const uploadUrl = initResponse.headers.get('x-goog-upload-url');\n if (!uploadUrl) {\n throw new AISDKError({\n name: 'GOOGLE_FILES_UPLOAD_ERROR',\n message: 'No upload URL returned from initiation request',\n });\n }\n\n const uploadResponse = await fetchFn(uploadUrl, {\n method: 'POST',\n headers: {\n 'Content-Length': String(fileBytes.length),\n 'X-Goog-Upload-Offset': '0',\n 'X-Goog-Upload-Command': 'upload, finalize',\n },\n body: fileBytes,\n });\n\n if (!uploadResponse.ok) {\n const errorBody = await uploadResponse.text();\n throw new AISDKError({\n name: 'GOOGLE_FILES_UPLOAD_ERROR',\n message: `Failed to upload file data: ${uploadResponse.status} ${errorBody}`,\n });\n }\n\n const uploadResult = (await uploadResponse.json()) as {\n file: GoogleFileResource;\n };\n\n let file = uploadResult.file;\n\n const pollIntervalMs = googleOptions?.pollIntervalMs ?? 2000;\n const pollTimeoutMs = googleOptions?.pollTimeoutMs ?? 300000;\n const startTime = Date.now();\n\n while (file.state === 'PROCESSING') {\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'GOOGLE_FILES_UPLOAD_TIMEOUT',\n message: `File processing timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n await delay(pollIntervalMs);\n\n const { value: fileStatus } = await getFromApi({\n url: `${this.config.baseURL}/${file.name}`,\n headers: combineHeaders(resolvedHeaders),\n successfulResponseHandler: createJsonResponseHandler(\n googleFileResponseSchema,\n ),\n failedResponseHandler: googleFailedResponseHandler,\n fetch: this.config.fetch,\n });\n\n file = fileStatus;\n }\n\n if (file.state === 'FAILED') {\n throw new AISDKError({\n name: 'GOOGLE_FILES_UPLOAD_FAILED',\n message: `File processing failed for ${file.name}`,\n });\n }\n\n return {\n warnings,\n providerReference: { google: file.uri },\n mediaType: file.mimeType ?? options.mediaType,\n providerMetadata: {\n google: {\n name: file.name,\n displayName: file.displayName,\n mimeType: file.mimeType,\n sizeBytes: file.sizeBytes,\n state: file.state,\n uri: file.uri,\n ...(file.createTime != null ? { createTime: file.createTime } : {}),\n ...(file.updateTime != null ? { updateTime: file.updateTime } : {}),\n ...(file.expirationTime != null\n ? { expirationTime: file.expirationTime }\n : {}),\n ...(file.sha256Hash != null ? { sha256Hash: file.sha256Hash } : {}),\n },\n },\n };\n }\n}\n\ntype GoogleFileResource = {\n name: string;\n displayName?: string | null;\n mimeType: string;\n sizeBytes?: string | null;\n createTime?: string | null;\n updateTime?: string | null;\n expirationTime?: string | null;\n sha256Hash?: string | null;\n uri: string;\n state: string;\n};\n\nconst googleFileResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n name: z.string(),\n displayName: z.string().nullish(),\n mimeType: z.string(),\n sizeBytes: z.string().nullish(),\n createTime: z.string().nullish(),\n updateTime: z.string().nullish(),\n expirationTime: z.string().nullish(),\n sha256Hash: z.string().nullish(),\n uri: z.string(),\n state: z.string(),\n }),\n ),\n);\n\nconst googleFilesUploadOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n displayName: z.string().nullish(),\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n })\n .passthrough(),\n ),\n);\n","import {\n AISDKError,\n type Experimental_VideoModelV4,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\nimport {\n googleVideoModelOptionsSchema,\n type GoogleVideoModelOptions,\n} from './google-video-model-options';\nimport type { GoogleVideoModelId } from './google-video-settings';\n\ninterface GoogleVideoModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n generateId?: () => string;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class GoogleVideoModel implements Experimental_VideoModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n get maxVideosPerCall(): number {\n // Google supports multiple videos via sampleCount\n return 4;\n }\n\n constructor(\n readonly modelId: GoogleVideoModelId,\n private readonly config: GoogleVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV4['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV4Warning[] = [];\n\n const googleOptions = (await parseProviderOptions({\n provider: 'google',\n providerOptions: options.providerOptions,\n schema: googleVideoModelOptionsSchema,\n })) as GoogleVideoModelOptions | undefined;\n\n const instances: Array<Record<string, unknown>> = [{}];\n const instance = instances[0];\n\n if (options.prompt != null) {\n instance.prompt = options.prompt;\n }\n\n // Handle image-to-video: convert image to base64\n if (options.image != null) {\n if (options.image.type === 'url') {\n warnings.push({\n type: 'unsupported',\n feature: 'URL-based image input',\n details:\n 'Google Generative AI video models require base64-encoded images. URL will be ignored.',\n });\n } else {\n const base64Data =\n typeof options.image.data === 'string'\n ? options.image.data\n : convertUint8ArrayToBase64(options.image.data);\n\n instance.image = {\n inlineData: {\n mimeType: options.image.mediaType || 'image/png',\n data: base64Data,\n },\n };\n }\n }\n\n if (googleOptions?.referenceImages != null) {\n instance.referenceImages = googleOptions.referenceImages.map(refImg => {\n if (refImg.bytesBase64Encoded) {\n return {\n inlineData: {\n mimeType: 'image/png',\n data: refImg.bytesBase64Encoded,\n },\n };\n } else if (refImg.gcsUri) {\n return {\n gcsUri: refImg.gcsUri,\n };\n }\n return refImg;\n });\n }\n\n const parameters: Record<string, unknown> = {\n sampleCount: options.n,\n };\n\n if (options.aspectRatio) {\n parameters.aspectRatio = options.aspectRatio;\n }\n\n if (options.resolution) {\n const resolutionMap: Record<string, string> = {\n '1280x720': '720p',\n '1920x1080': '1080p',\n '3840x2160': '4k',\n };\n parameters.resolution =\n resolutionMap[options.resolution] || options.resolution;\n }\n\n if (options.duration) {\n parameters.durationSeconds = options.duration;\n }\n\n if (options.seed) {\n parameters.seed = options.seed;\n }\n\n if (googleOptions != null) {\n const opts = googleOptions as GoogleVideoModelOptions;\n\n if (\n opts.personGeneration !== undefined &&\n opts.personGeneration !== null\n ) {\n parameters.personGeneration = opts.personGeneration;\n }\n if (opts.negativePrompt !== undefined && opts.negativePrompt !== null) {\n parameters.negativePrompt = opts.negativePrompt;\n }\n\n for (const [key, value] of Object.entries(opts)) {\n if (\n ![\n 'pollIntervalMs',\n 'pollTimeoutMs',\n 'personGeneration',\n 'negativePrompt',\n 'referenceImages',\n ].includes(key)\n ) {\n parameters[key] = value;\n }\n }\n }\n\n const { value: operation } = await postJsonToApi({\n url: `${this.config.baseURL}/models/${this.modelId}:predictLongRunning`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n body: {\n instances,\n parameters,\n },\n successfulResponseHandler: createJsonResponseHandler(\n googleOperationSchema,\n ),\n failedResponseHandler: googleFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const operationName = operation.name;\n if (!operationName) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_ERROR',\n message: 'No operation name returned from API',\n });\n }\n\n const pollIntervalMs = googleOptions?.pollIntervalMs ?? 10000; // 10 seconds (per Google docs)\n const pollTimeoutMs = googleOptions?.pollTimeoutMs ?? 600000; // 10 minutes\n\n const startTime = Date.now();\n let finalOperation = operation;\n let responseHeaders: Record<string, string> | undefined;\n\n while (!finalOperation.done) {\n if (Date.now() - startTime > pollTimeoutMs) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_TIMEOUT',\n message: `Video generation timed out after ${pollTimeoutMs}ms`,\n });\n }\n\n await delay(pollIntervalMs);\n\n if (options.abortSignal?.aborted) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_ABORTED',\n message: 'Video generation request was aborted',\n });\n }\n\n const { value: statusOperation, responseHeaders: pollHeaders } =\n await getFromApi({\n url: `${this.config.baseURL}/${operationName}`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n googleOperationSchema,\n ),\n failedResponseHandler: googleFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n finalOperation = statusOperation;\n responseHeaders = pollHeaders;\n }\n\n if (finalOperation.error) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_FAILED',\n message: `Video generation failed: ${finalOperation.error.message}`,\n });\n }\n\n const response = finalOperation.response;\n if (\n !response?.generateVideoResponse?.generatedSamples ||\n response.generateVideoResponse.generatedSamples.length === 0\n ) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_ERROR',\n message: `No videos in response. Response: ${JSON.stringify(finalOperation)}`,\n });\n }\n\n const videos: Array<{ type: 'url'; url: string; mediaType: string }> = [];\n const videoMetadata: Array<{ uri: string }> = [];\n\n // Get API key from headers to append to download URLs\n const resolvedHeaders = await resolve(this.config.headers);\n const apiKey = resolvedHeaders?.['x-goog-api-key'];\n\n for (const generatedSample of response.generateVideoResponse\n .generatedSamples) {\n if (generatedSample.video?.uri) {\n // Append API key to URL for authentication during download\n const urlWithAuth = apiKey\n ? `${generatedSample.video.uri}${generatedSample.video.uri.includes('?') ? '&' : '?'}key=${apiKey}`\n : generatedSample.video.uri;\n\n videos.push({\n type: 'url',\n url: urlWithAuth,\n mediaType: 'video/mp4',\n });\n videoMetadata.push({\n uri: generatedSample.video.uri,\n });\n }\n }\n\n if (videos.length === 0) {\n throw new AISDKError({\n name: 'GOOGLE_VIDEO_GENERATION_ERROR',\n message: 'No valid videos in response',\n });\n }\n\n return {\n videos,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n google: {\n videos: videoMetadata,\n },\n },\n };\n }\n}\n\nconst googleOperationSchema = z.object({\n name: z.string().nullish(),\n done: z.boolean().nullish(),\n error: z\n .object({\n code: z.number().nullish(),\n message: z.string(),\n status: z.string().nullish(),\n })\n .nullish(),\n response: z\n .object({\n generateVideoResponse: z\n .object({\n generatedSamples: z\n .array(\n z.object({\n video: z\n .object({\n uri: z.string().nullish(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n })\n .nullish(),\n })\n .nullish(),\n});\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type GoogleVideoModelOptions = {\n // Polling configuration\n pollIntervalMs?: number | null;\n pollTimeoutMs?: number | null;\n\n // Video generation options\n personGeneration?: 'dont_allow' | 'allow_adult' | 'allow_all' | null;\n negativePrompt?: string | null;\n\n // Reference images (for style/asset reference)\n referenceImages?: Array<{\n bytesBase64Encoded?: string;\n gcsUri?: string;\n }> | null;\n\n [key: string]: unknown; // For passthrough\n};\n\nexport const googleVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n personGeneration: z\n .enum(['dont_allow', 'allow_adult', 'allow_all'])\n .nullish(),\n negativePrompt: z.string().nullish(),\n referenceImages: z\n .array(\n z.object({\n bytesBase64Encoded: z.string().nullish(),\n gcsUri: z.string().nullish(),\n }),\n )\n .nullish(),\n })\n .passthrough(),\n ),\n);\n","import type {\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamResult,\n SharedV4ProviderMetadata,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId as defaultGenerateId,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { googleFailedResponseHandler } from '../google-error';\nimport { buildGoogleInteractionsStreamTransform } from './build-google-interactions-stream-transform';\nimport { convertGoogleInteractionsUsage } from './convert-google-interactions-usage';\nimport { convertToGoogleInteractionsInput } from './convert-to-google-interactions-input';\nimport {\n googleInteractionsEventSchema,\n googleInteractionsResponseSchema,\n} from './google-interactions-api';\nimport {\n googleInteractionsLanguageModelOptions,\n type GoogleInteractionsModelId,\n} from './google-interactions-language-model-options';\nimport type {\n GoogleInteractionsAgentConfig,\n GoogleInteractionsEnvironmentSource,\n GoogleInteractionsGenerationConfig,\n GoogleInteractionsNetworkAllowlistEntry,\n GoogleInteractionsNetworkConfig,\n GoogleInteractionsRequestBody,\n GoogleInteractionsResponseFormatEntry,\n GoogleInteractionsTool,\n GoogleInteractionsToolChoice,\n} from './google-interactions-prompt';\nimport { mapGoogleInteractionsFinishReason } from './map-google-interactions-finish-reason';\nimport { parseGoogleInteractionsOutputs } from './parse-google-interactions-outputs';\nimport {\n isTerminalStatus,\n pollGoogleInteractionUntilTerminal,\n} from './poll-google-interactions';\nimport { prepareGoogleInteractionsTools } from './prepare-google-interactions-tools';\nimport { streamGoogleInteractionEvents } from './stream-google-interactions';\nimport { synthesizeGoogleInteractionsAgentStream } from './synthesize-google-interactions-agent-stream';\n\nexport type GoogleInteractionsConfig = {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n generateId: () => string;\n supportedUrls?: () => LanguageModelV4['supportedUrls'];\n};\n\nexport type GoogleInteractionsModelInput =\n | GoogleInteractionsModelId\n | { agent: string }\n | { managedAgent: string };\n\nexport class GoogleInteractionsLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n\n readonly modelId: string;\n\n /**\n * Optional agent name. When provided, the request body sends `agent:` instead\n * of `model:` and rejects `tools` / `generation_config` (warned, not thrown).\n */\n readonly agent: string | undefined;\n\n private readonly config: GoogleInteractionsConfig;\n\n static [WORKFLOW_SERIALIZE](model: GoogleInteractionsLanguageModel) {\n return {\n ...serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n }),\n agent: model.agent,\n };\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n agent?: string;\n config: GoogleInteractionsConfig;\n }) {\n return new GoogleInteractionsLanguageModel(\n options.agent != null ? { agent: options.agent } : options.modelId,\n options.config,\n );\n }\n\n constructor(\n modelOrAgent: GoogleInteractionsModelInput,\n config: GoogleInteractionsConfig,\n ) {\n if (typeof modelOrAgent === 'string') {\n this.modelId = modelOrAgent;\n this.agent = undefined;\n } else if ('managedAgent' in modelOrAgent) {\n this.modelId = modelOrAgent.managedAgent;\n this.agent = modelOrAgent.managedAgent;\n } else {\n this.modelId = modelOrAgent.agent;\n this.agent = modelOrAgent.agent;\n }\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n get supportedUrls() {\n if (this.config.supportedUrls) {\n return this.config.supportedUrls();\n }\n return {\n 'image/*': [/^https?:\\/\\/.+/],\n 'application/pdf': [/^https?:\\/\\/.+/],\n 'audio/*': [/^https?:\\/\\/.+/],\n 'video/*': [\n /^https?:\\/\\/(www\\.)?youtube\\.com\\/watch\\?v=.+/,\n /^https?:\\/\\/youtu\\.be\\/.+/,\n /^gs:\\/\\/.+/,\n ],\n };\n }\n\n private async getArgs(options: LanguageModelV4CallOptions) {\n const warnings: Array<SharedV4Warning> = [];\n\n const opts = await parseProviderOptions({\n provider: 'google',\n providerOptions: options.providerOptions,\n schema: googleInteractionsLanguageModelOptions,\n });\n\n const isAgent = this.agent != null;\n\n const hasTools = options.tools != null && options.tools.length > 0;\n\n let toolsForBody: Array<GoogleInteractionsTool> | undefined;\n let toolChoiceForBody: GoogleInteractionsToolChoice | undefined;\n\n if (hasTools && isAgent) {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: tools are not supported when an agent is set; tools will be omitted from the request body.',\n });\n } else if (hasTools) {\n const prepared = prepareGoogleInteractionsTools({\n tools: options.tools,\n toolChoice: options.toolChoice,\n });\n toolsForBody = prepared.tools;\n toolChoiceForBody = prepared.toolChoice;\n warnings.push(...prepared.toolWarnings);\n }\n\n /*\n * `response_format` is a polymorphic array of entries. Three sources\n * contribute, in order:\n *\n * 1. AI SDK call-level `responseFormat: { type: 'json', schema }` →\n * `{ type: 'text', mime_type: 'application/json', schema }`.\n * 2. `providerOptions.google.responseFormat` (primary path) — entries\n * are appended verbatim with camelCase → snake_case translation.\n * 3. `providerOptions.google.imageConfig` (deprecated fallback) — only\n * contributes if no `{type:'image'}` entry was already provided via\n * sources 1 or 2; emits a deprecation warning when used.\n *\n * Agent calls cannot send `generation_config` and (per the API) cannot\n * combine with structured output — emit a warning and drop the field.\n */\n const responseFormatEntries: Array<GoogleInteractionsResponseFormatEntry> =\n [];\n if (options.responseFormat?.type === 'json') {\n if (isAgent) {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: structured output (responseFormat) is not supported when an agent is set; responseFormat will be ignored.',\n });\n } else {\n const entry: GoogleInteractionsResponseFormatEntry = {\n type: 'text',\n mime_type: 'application/json',\n ...(options.responseFormat.schema != null\n ? { schema: options.responseFormat.schema }\n : {}),\n };\n responseFormatEntries.push(entry);\n }\n }\n\n if (opts?.responseFormat != null) {\n for (const entry of opts.responseFormat) {\n if (entry.type === 'text') {\n responseFormatEntries.push(\n pruneUndefined({\n type: 'text' as const,\n mime_type: entry.mimeType ?? undefined,\n schema: entry.schema ?? undefined,\n }),\n );\n } else if (entry.type === 'image') {\n responseFormatEntries.push(\n pruneUndefined({\n type: 'image' as const,\n mime_type: entry.mimeType ?? undefined,\n aspect_ratio: entry.aspectRatio ?? undefined,\n image_size: entry.imageSize ?? undefined,\n }),\n );\n } else if (entry.type === 'audio') {\n responseFormatEntries.push(\n pruneUndefined({\n type: 'audio' as const,\n mime_type: entry.mimeType ?? undefined,\n }),\n );\n }\n }\n }\n\n const {\n input,\n systemInstruction: convertedSystemInstruction,\n warnings: convWarnings,\n } = convertToGoogleInteractionsInput({\n prompt: options.prompt,\n previousInteractionId: opts?.previousInteractionId ?? undefined,\n store: opts?.store ?? undefined,\n mediaResolution: opts?.mediaResolution ?? undefined,\n });\n\n warnings.push(...convWarnings);\n\n let systemInstruction = convertedSystemInstruction;\n const optionSystemInstruction = opts?.systemInstruction ?? undefined;\n if (systemInstruction != null && optionSystemInstruction != null) {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: both AI SDK system message and providerOptions.google.systemInstruction were set; using the AI SDK system message.',\n });\n } else if (systemInstruction == null && optionSystemInstruction != null) {\n systemInstruction = optionSystemInstruction;\n }\n\n /*\n * The Interactions API splits per-call config into `generation_config`\n * (model branch) and `agent_config` (agent branch); the two are mutually\n * exclusive. The AI SDK call-level generation params and the thinking /\n * imageConfig provider options flow into `generation_config`.\n *\n * When an agent is set, none of these fields are accepted by the API.\n * Emit a single `LanguageModelV4CallWarning` listing the dropped field\n * names and continue (do not throw); the agent-only `agent_config`\n * field supersedes them.\n */\n let generationConfig: GoogleInteractionsGenerationConfig | undefined;\n if (isAgent) {\n const droppedFields: Array<string> = [];\n if (options.temperature != null) droppedFields.push('temperature');\n if (options.topP != null) droppedFields.push('topP');\n if (options.seed != null) droppedFields.push('seed');\n if (options.stopSequences != null && options.stopSequences.length > 0) {\n droppedFields.push('stopSequences');\n }\n if (options.maxOutputTokens != null)\n droppedFields.push('maxOutputTokens');\n if (opts?.thinkingLevel != null) droppedFields.push('thinkingLevel');\n if (opts?.thinkingSummaries != null) {\n droppedFields.push('thinkingSummaries');\n }\n if (opts?.imageConfig != null) droppedFields.push('imageConfig');\n if (droppedFields.length > 0) {\n warnings.push({\n type: 'other',\n message: `google.interactions: ${droppedFields.join(', ')} ${droppedFields.length === 1 ? 'is' : 'are'} not supported when an agent is set; use providerOptions.google.agentConfig instead. Dropped from the request body.`,\n });\n }\n generationConfig = undefined;\n } else {\n generationConfig = pruneUndefined({\n temperature: options.temperature ?? undefined,\n top_p: options.topP ?? undefined,\n seed: options.seed ?? undefined,\n stop_sequences:\n options.stopSequences != null && options.stopSequences.length > 0\n ? options.stopSequences\n : undefined,\n max_output_tokens: options.maxOutputTokens ?? undefined,\n thinking_level: opts?.thinkingLevel ?? undefined,\n thinking_summaries: opts?.thinkingSummaries ?? undefined,\n tool_choice: toolChoiceForBody,\n });\n\n /*\n * Deprecated fallback path: `imageConfig` contributes an image entry\n * only when none was supplied via `responseFormat`. A warning is\n * always emitted when `imageConfig` is set so callers migrate to the\n * `responseFormat` shape.\n */\n if (opts?.imageConfig != null) {\n const alreadyHasImageEntry = responseFormatEntries.some(\n entry => entry.type === 'image',\n );\n warnings.push({\n type: 'other',\n message: alreadyHasImageEntry\n ? 'google.interactions: providerOptions.google.imageConfig is deprecated and was ignored because providerOptions.google.responseFormat already supplies an image entry. Use responseFormat exclusively.'\n : 'google.interactions: providerOptions.google.imageConfig is deprecated. Use providerOptions.google.responseFormat with a { type: \"image\", ... } entry instead.',\n });\n if (!alreadyHasImageEntry) {\n responseFormatEntries.push({\n type: 'image',\n mime_type: 'image/png',\n ...(opts.imageConfig.aspectRatio != null\n ? { aspect_ratio: opts.imageConfig.aspectRatio }\n : {}),\n ...(opts.imageConfig.imageSize != null\n ? { image_size: opts.imageConfig.imageSize }\n : {}),\n });\n }\n }\n }\n\n let agentConfig: GoogleInteractionsAgentConfig | undefined;\n if (isAgent && opts?.agentConfig != null) {\n const ac = opts.agentConfig;\n if (ac.type === 'deep-research') {\n agentConfig = pruneUndefined({\n type: 'deep-research',\n thinking_summaries: ac.thinkingSummaries ?? undefined,\n visualization: ac.visualization ?? undefined,\n collaborative_planning: ac.collaborativePlanning ?? undefined,\n }) as GoogleInteractionsAgentConfig;\n } else if (ac.type === 'dynamic') {\n agentConfig = { type: 'dynamic' };\n }\n }\n\n let environment: GoogleInteractionsRequestBody['environment'];\n if (opts?.environment != null) {\n if (!isAgent) {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: environment is only supported when an agent is set; environment will be omitted from the request body.',\n });\n } else if (typeof opts.environment === 'string') {\n environment = opts.environment;\n } else {\n const env = opts.environment;\n const sources: Array<GoogleInteractionsEnvironmentSource> | undefined =\n env.sources?.map(s => {\n if (s.type === 'inline') {\n return {\n type: 'inline' as const,\n content: s.content,\n target: s.target,\n };\n }\n return pruneUndefined({\n type: s.type,\n source: s.source,\n target: s.target ?? undefined,\n }) as GoogleInteractionsEnvironmentSource;\n });\n let network: GoogleInteractionsNetworkConfig | undefined;\n if (env.network === 'disabled') {\n network = 'disabled';\n } else if (env.network != null) {\n network = {\n allowlist: env.network.allowlist.map(entry =>\n pruneUndefined({\n domain: entry.domain,\n transform: entry.transform ?? undefined,\n }),\n ) as Array<GoogleInteractionsNetworkAllowlistEntry>,\n };\n }\n environment = pruneUndefined({\n type: 'remote' as const,\n sources: sources != null && sources.length > 0 ? sources : undefined,\n network,\n });\n }\n }\n\n /*\n * `background` is opt-in via `providerOptions.google.background`. Some\n * agents require it because their server-side workflow cannot complete\n * within a single request; others reject it. When `background: true`, the\n * POST returns a non-terminal status and the SDK polls\n * `GET /interactions/{id}` until the work completes.\n */\n const args: GoogleInteractionsRequestBody = pruneUndefined({\n ...(isAgent ? { agent: this.agent } : { model: this.modelId }),\n input,\n system_instruction: systemInstruction,\n tools: toolsForBody,\n response_format:\n responseFormatEntries.length > 0 ? responseFormatEntries : undefined,\n response_modalities:\n opts?.responseModalities != null\n ? (opts.responseModalities as Array<\n 'text' | 'image' | 'audio' | 'video' | 'document'\n >)\n : undefined,\n previous_interaction_id: opts?.previousInteractionId ?? undefined,\n service_tier: opts?.serviceTier ?? undefined,\n store: opts?.store ?? undefined,\n generation_config:\n generationConfig != null && Object.keys(generationConfig).length > 0\n ? generationConfig\n : undefined,\n agent_config: agentConfig,\n environment,\n background: opts?.background ?? undefined,\n });\n\n return {\n args,\n warnings,\n isAgent,\n isBackground: opts?.background === true,\n pollingTimeoutMs: opts?.pollingTimeoutMs ?? undefined,\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings, isAgent, pollingTimeoutMs } =\n await this.getArgs(options);\n\n const url = `${this.config.baseURL}/interactions`;\n\n const mergedHeaders = combineHeaders(\n INTERACTIONS_API_REVISION_HEADER,\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n );\n\n const postResult = await postJsonToApi({\n url,\n headers: mergedHeaders,\n body: args,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleInteractionsResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let {\n responseHeaders,\n value: response,\n rawValue: rawResponse,\n } = postResult;\n\n /*\n * Agent calls may return a non-terminal status (`in_progress` /\n * `requires_action`) when invoked with `background: true`. Poll\n * `GET /interactions/{id}` until terminal so the user-facing surface\n * matches a synchronous call.\n */\n if (isAgent && !isTerminalStatus(response.status)) {\n const polled = await pollGoogleInteractionUntilTerminal({\n baseURL: this.config.baseURL,\n interactionId: response.id,\n headers: mergedHeaders,\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n timeoutMs: pollingTimeoutMs,\n });\n response = polled.response;\n rawResponse = polled.rawResponse;\n responseHeaders = polled.responseHeaders ?? responseHeaders;\n }\n\n /*\n * `response.id` is omitted when `store: false` (fully stateless mode), and\n * the stream surface returns `id: \"\"` (empty string) for the same case.\n * Normalize both to `undefined` so downstream stamping does not pollute\n * provider metadata with an empty/missing identifier.\n */\n const interactionId =\n typeof response.id === 'string' && response.id.length > 0\n ? response.id\n : undefined;\n\n const { content, hasFunctionCall } = parseGoogleInteractionsOutputs({\n steps: response.steps ?? null,\n generateId: this.config.generateId ?? defaultGenerateId,\n interactionId,\n });\n\n const finishReason: LanguageModelV4FinishReason = {\n unified: mapGoogleInteractionsFinishReason({\n status: response.status,\n hasFunctionCall,\n }),\n raw: response.status,\n };\n\n /*\n * Service tier divergence vs. `:generateContent`:\n *\n * `google-language-model.ts` reads the applied service tier from the\n * `x-gemini-service-tier` HTTP response header (see commit 1adfb76d2d).\n * The Interactions API does NOT surface that header; it returns the\n * applied tier in the response body as `service_tier` on the top-level\n * Interaction object (and on `interaction.complete.interaction` for\n * streaming). The `responseHeaders` parameter is also checked as a\n * defensive fallback in case the API later adds the header.\n */\n const serviceTier =\n response.service_tier ??\n responseHeaders?.['x-gemini-service-tier'] ??\n undefined;\n\n /*\n * `response.id` is omitted when `store: false` (fully stateless mode), so\n * `interactionId` is only surfaced when the API actually returned one.\n */\n const providerMetadata: SharedV4ProviderMetadata = {\n google: {\n ...(interactionId != null ? { interactionId } : {}),\n ...(serviceTier != null ? { serviceTier } : {}),\n },\n };\n\n let timestamp: Date | undefined;\n if (typeof response.created === 'string') {\n const parsed = new Date(response.created);\n if (!Number.isNaN(parsed.getTime())) {\n timestamp = parsed;\n }\n }\n\n return {\n content,\n finishReason,\n usage: convertGoogleInteractionsUsage(response.usage),\n warnings,\n providerMetadata,\n request: { body: args },\n response: {\n headers: responseHeaders,\n body: rawResponse,\n ...(interactionId != null ? { id: interactionId } : {}),\n ...(timestamp ? { timestamp } : {}),\n modelId: response.model ?? undefined,\n },\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings, isBackground, pollingTimeoutMs } =\n await this.getArgs(options);\n\n const url = `${this.config.baseURL}/interactions`;\n\n const mergedHeaders = combineHeaders(\n INTERACTIONS_API_REVISION_HEADER,\n this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n );\n\n /*\n * `background: true` is incompatible with `stream: true` on POST. Drive\n * background calls via POST background -> GET stream (with terminal-status\n * short-circuit). The user-facing stream surface stays identical --\n * text-start / text-delta / text-end / finish parts are emitted in the\n * same order as a true SSE response.\n */\n if (isBackground) {\n return this.doStreamBackground({\n args,\n warnings,\n url,\n mergedHeaders,\n options,\n pollingTimeoutMs,\n });\n }\n\n const body = { ...args, stream: true };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url,\n headers: mergedHeaders,\n body,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n googleInteractionsEventSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n /*\n * Google's API surfaces the applied service tier in the\n * `x-gemini-service-tier` HTTP response header, not in the response body.\n * Mirror the canonical pattern from `google-language-model.ts` (commit\n * 1adfb76d2d) and pipe it through the stream transformer so the `finish`\n * part's `providerMetadata.google.serviceTier` is sourced from the header.\n */\n const headerServiceTier = responseHeaders?.['x-gemini-service-tier'];\n\n const transform = buildGoogleInteractionsStreamTransform({\n warnings,\n generateId: this.config.generateId ?? defaultGenerateId,\n includeRawChunks: options.includeRawChunks,\n serviceTier: headerServiceTier,\n });\n\n return {\n stream: response.pipeThrough(transform),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n\n /*\n * Drive the streaming surface for agent calls. Agents require\n * `background: true`, which is incompatible with `stream: true` on POST.\n *\n * Approach:\n * 1. POST `/interactions` with `background: true`. The response includes\n * the interaction id and an initial (usually non-terminal) status.\n * 2. If the POST status is already terminal (rare), synthesize a stream\n * from the polled outputs and we're done.\n * 3. Otherwise open `GET /interactions/{id}?stream=true` and pipe the\n * SSE events through `buildGoogleInteractionsStreamTransform` so the\n * consumer receives text deltas / thinking summaries / tool events as\n * they happen instead of all at once at the end.\n *\n * The SSE connection can drop while the agent idles between events\n * (`UND_ERR_BODY_TIMEOUT`); `streamGoogleInteractionEvents` handles the\n * reconnect-with-`last_event_id` loop transparently.\n */\n private async doStreamBackground({\n args,\n warnings,\n url,\n mergedHeaders,\n options,\n pollingTimeoutMs,\n }: {\n args: GoogleInteractionsRequestBody;\n warnings: Array<SharedV4Warning>;\n url: string;\n mergedHeaders: Record<string, string | undefined>;\n options: LanguageModelV4CallOptions;\n pollingTimeoutMs: number | undefined;\n }): Promise<LanguageModelV4StreamResult> {\n const postResult = await postJsonToApi({\n url,\n headers: mergedHeaders,\n body: args,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleInteractionsResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { responseHeaders: postHeaders, value: postResponse } = postResult;\n const interactionId = postResponse.id;\n\n if (interactionId == null || interactionId.length === 0) {\n throw new Error(\n 'google.interactions: background POST response did not include an interaction id; cannot stream the result.',\n );\n }\n\n const headerServiceTier = postHeaders?.['x-gemini-service-tier'];\n\n /*\n * If the POST already returned a terminal status (e.g. cached, immediate\n * failure, or `incomplete`), there is nothing to stream from the GET --\n * synthesize directly from the response so the caller still gets a\n * complete stream.\n */\n if (isTerminalStatus(postResponse.status)) {\n const synthesized = synthesizeGoogleInteractionsAgentStream({\n response: postResponse,\n warnings,\n generateId: this.config.generateId ?? defaultGenerateId,\n includeRawChunks: options.includeRawChunks,\n headerServiceTier,\n });\n return {\n stream: synthesized,\n request: { body: args },\n response: { headers: postHeaders },\n };\n }\n\n /*\n * `pollingTimeoutMs` is unused on the live-SSE path -- there's no poll\n * loop to time out -- but we surface it as the per-attempt timeout for\n * the AbortSignal-driven cancel that the caller already controls. Future\n * iterations may use it as a backstop if the SSE+resume loop spins\n * indefinitely.\n */\n void pollingTimeoutMs;\n\n const events = streamGoogleInteractionEvents({\n baseURL: this.config.baseURL,\n interactionId,\n headers: mergedHeaders,\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n });\n\n const transform = buildGoogleInteractionsStreamTransform({\n warnings,\n generateId: this.config.generateId ?? defaultGenerateId,\n includeRawChunks: options.includeRawChunks,\n serviceTier: headerServiceTier,\n });\n\n return {\n stream: events.pipeThrough(transform),\n request: { body: args },\n response: { headers: postHeaders },\n };\n }\n}\n\n/*\n * Pins the Interactions API revision the SDK targets. Sent on every request\n * the model issues so model-id calls, agent calls, polling, SSE reconnects,\n * and cancellation all hit the same schema.\n */\nconst INTERACTIONS_API_REVISION_HEADER: Record<string, string> = {\n 'Api-Revision': '2026-05-20',\n};\n\nfunction pruneUndefined<T extends Record<string, unknown>>(obj: T): T {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n result[key] = value;\n }\n return result as T;\n}\n","import type { JSONObject, LanguageModelV4Usage } from '@ai-sdk/provider';\nimport type { GoogleInteractionsUsage } from './google-interactions-api';\n\nexport function convertGoogleInteractionsUsage(\n usage: GoogleInteractionsUsage | undefined | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n }\n\n const totalInput = usage.total_input_tokens ?? 0;\n const totalOutput = usage.total_output_tokens ?? 0;\n const totalThought = usage.total_thought_tokens ?? 0;\n const totalCached = usage.total_cached_tokens ?? 0;\n\n return {\n inputTokens: {\n total: usage.total_input_tokens ?? undefined,\n noCache:\n usage.total_input_tokens == null ? undefined : totalInput - totalCached,\n cacheRead: usage.total_cached_tokens ?? undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total:\n usage.total_output_tokens == null && usage.total_thought_tokens == null\n ? undefined\n : totalOutput + totalThought,\n text: usage.total_output_tokens ?? undefined,\n reasoning: usage.total_thought_tokens ?? undefined,\n },\n raw: usage as unknown as JSONObject,\n };\n}\n","import type { LanguageModelV4Source } from '@ai-sdk/provider';\nimport type {\n GoogleInteractionsAnnotation,\n GoogleInteractionsBuiltinToolResultContent,\n GoogleInteractionsFileCitation,\n GoogleInteractionsGoogleMapsResultContent,\n GoogleInteractionsGoogleSearchResultContent,\n GoogleInteractionsPlaceCitation,\n GoogleInteractionsURLCitation,\n GoogleInteractionsURLContextResultContent,\n} from './google-interactions-prompt';\n\nconst KNOWN_DOC_EXTENSIONS: Record<string, string> = {\n pdf: 'application/pdf',\n txt: 'text/plain',\n md: 'text/markdown',\n markdown: 'text/markdown',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n};\n\nfunction inferDocMediaType(uriOrName: string): string {\n const lower = uriOrName.toLowerCase();\n for (const [ext, media] of Object.entries(KNOWN_DOC_EXTENSIONS)) {\n if (lower.endsWith(`.${ext}`)) return media;\n }\n return 'application/octet-stream';\n}\n\nfunction basename(uriOrName: string): string | undefined {\n const parts = uriOrName.split('/');\n const last = parts[parts.length - 1];\n return last && last.length > 0 ? last : undefined;\n}\n\n/**\n * Maps a single text-block annotation (`url_citation` / `file_citation` /\n * `place_citation`) onto a `LanguageModelV4Source`. Returns `undefined` when\n * the annotation lacks the minimum payload to form a source (e.g. a URL\n * citation without a `url`).\n */\nexport function annotationToSource({\n annotation,\n generateId,\n}: {\n annotation: GoogleInteractionsAnnotation | { type: string };\n generateId: () => string;\n}): LanguageModelV4Source | undefined {\n switch (annotation.type) {\n case 'url_citation': {\n const a = annotation as GoogleInteractionsURLCitation;\n if (a.url == null || a.url.length === 0) return undefined;\n return {\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: a.url,\n ...(a.title != null ? { title: a.title } : {}),\n };\n }\n case 'file_citation': {\n const a = annotation as GoogleInteractionsFileCitation;\n const uri = a.url ?? a.document_uri ?? a.file_name;\n if (uri == null || uri.length === 0) return undefined;\n if (uri.startsWith('http://') || uri.startsWith('https://')) {\n return {\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: uri,\n ...(a.file_name != null ? { title: a.file_name } : {}),\n };\n }\n const filename = a.file_name ?? basename(uri);\n const mediaType = inferDocMediaType(uri);\n return {\n type: 'source',\n sourceType: 'document',\n id: generateId(),\n mediaType,\n title: a.file_name ?? filename ?? uri,\n ...(filename != null ? { filename } : {}),\n };\n }\n case 'place_citation': {\n const a = annotation as GoogleInteractionsPlaceCitation;\n if (a.url == null || a.url.length === 0) return undefined;\n return {\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: a.url,\n ...(a.name != null ? { title: a.name } : {}),\n };\n }\n default:\n return undefined;\n }\n}\n\n/**\n * Maps a built-in tool *result* content block to zero or more\n * `LanguageModelV4Source` parts. The Interactions API exposes grounding\n * sources both inline (via `text_annotation` deltas) and via tool-result\n * content blocks; the latter is what this function consumes.\n *\n * Supported result kinds:\n * - `url_context_result` -> URL sources for each fetched URL with `status: 'success'`\n * - `google_search_result` -> URL sources (when `url` is present), search-suggestion\n * entries are skipped (they are HTML widgets, not citations)\n * - `google_maps_result` -> URL sources for each place with a `url`\n * - `file_search_result` -> document sources (best-effort -- `result[]` is loosely typed)\n */\nexport function builtinToolResultToSources({\n block,\n generateId,\n}: {\n block: GoogleInteractionsBuiltinToolResultContent;\n generateId: () => string;\n}): Array<LanguageModelV4Source> {\n const sources: Array<LanguageModelV4Source> = [];\n\n switch (block.type) {\n case 'url_context_result': {\n const result =\n (block as GoogleInteractionsURLContextResultContent).result ?? [];\n for (const entry of result) {\n if (entry?.url == null || entry.url.length === 0) continue;\n if (entry.status != null && entry.status !== 'success') continue;\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: entry.url,\n });\n }\n break;\n }\n case 'google_search_result': {\n const result =\n (block as GoogleInteractionsGoogleSearchResultContent).result ?? [];\n for (const entry of result) {\n const url = entry?.url;\n if (url == null || url.length === 0) continue;\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url,\n ...(entry.title != null ? { title: entry.title } : {}),\n });\n }\n break;\n }\n case 'google_maps_result': {\n const result =\n (block as GoogleInteractionsGoogleMapsResultContent).result ?? [];\n for (const entry of result) {\n for (const place of entry.places ?? []) {\n if (place.url == null || place.url.length === 0) continue;\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: place.url,\n ...(place.name != null ? { title: place.name } : {}),\n });\n }\n }\n break;\n }\n case 'file_search_result': {\n const result = (block as { result?: Array<unknown> }).result ?? [];\n for (const raw of result) {\n if (raw == null || typeof raw !== 'object') continue;\n const entry = raw as {\n file_name?: string;\n document_uri?: string;\n url?: string;\n title?: string;\n };\n const uri = entry.url ?? entry.document_uri ?? entry.file_name;\n if (uri == null || uri.length === 0) continue;\n if (uri.startsWith('http://') || uri.startsWith('https://')) {\n sources.push({\n type: 'source',\n sourceType: 'url',\n id: generateId(),\n url: uri,\n ...(entry.title != null ? { title: entry.title } : {}),\n });\n continue;\n }\n const filename = entry.file_name ?? basename(uri);\n const mediaType = inferDocMediaType(uri);\n sources.push({\n type: 'source',\n sourceType: 'document',\n id: generateId(),\n mediaType,\n title: entry.title ?? entry.file_name ?? filename ?? uri,\n ...(filename != null ? { filename } : {}),\n });\n }\n break;\n }\n default:\n break;\n }\n\n return sources;\n}\n\n/**\n * Given a list of annotations attached to a single `text` content block,\n * returns the corresponding `LanguageModelV4Source` parts (de-duplicated by\n * URL/filename to avoid double-counting when the same citation reappears\n * across deltas).\n */\nexport function annotationsToSources({\n annotations,\n generateId,\n}: {\n annotations:\n | Array<GoogleInteractionsAnnotation | { type: string }>\n | null\n | undefined;\n generateId: () => string;\n}): Array<LanguageModelV4Source> {\n if (annotations == null) return [];\n const seen = new Set<string>();\n const sources: Array<LanguageModelV4Source> = [];\n for (const annotation of annotations) {\n const source = annotationToSource({ annotation, generateId });\n if (source == null) continue;\n const key =\n source.sourceType === 'url'\n ? `url:${source.url}`\n : `doc:${source.filename ?? source.title}`;\n if (seen.has(key)) continue;\n seen.add(key);\n sources.push(source);\n }\n return sources;\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\nimport type { GoogleInteractionsStatus } from './google-interactions-prompt';\n\n/*\n * `tool-calls` is selected when the response includes a client-side function\n * call. The API itself signals this via `requires_action`, but\n * `completed + hasFunctionCall` also occurs in practice.\n */\nexport function mapGoogleInteractionsFinishReason({\n status,\n hasFunctionCall,\n}: {\n status: GoogleInteractionsStatus | string | null | undefined;\n hasFunctionCall: boolean;\n}): LanguageModelV4FinishReason['unified'] {\n switch (status) {\n case 'completed':\n return hasFunctionCall ? 'tool-calls' : 'stop';\n case 'requires_action':\n return 'tool-calls';\n case 'failed':\n return 'error';\n case 'incomplete':\n return 'length';\n case 'cancelled':\n return 'other';\n case 'in_progress':\n default:\n return 'other';\n }\n}\n","import type {\n JSONValue,\n LanguageModelV4FinishReason,\n LanguageModelV4Source,\n LanguageModelV4StreamPart,\n SharedV4ProviderMetadata,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport type { ParseResult } from '@ai-sdk/provider-utils';\nimport type {\n GoogleInteractionsEvent,\n GoogleInteractionsUsage,\n} from './google-interactions-api';\nimport { convertGoogleInteractionsUsage } from './convert-google-interactions-usage';\nimport {\n annotationsToSources,\n builtinToolResultToSources,\n} from './extract-google-interactions-sources';\nimport { mapGoogleInteractionsFinishReason } from './map-google-interactions-finish-reason';\nimport type {\n GoogleInteractionsAnnotation,\n GoogleInteractionsBuiltinToolResultContent,\n GoogleInteractionsStatus,\n} from './google-interactions-prompt';\n\nconst BUILTIN_TOOL_CALL_TYPES = new Set([\n 'google_search_call',\n 'code_execution_call',\n 'url_context_call',\n 'file_search_call',\n 'google_maps_call',\n 'mcp_server_tool_call',\n]);\n\nconst BUILTIN_TOOL_RESULT_TYPES = new Set([\n 'google_search_result',\n 'code_execution_result',\n 'url_context_result',\n 'file_search_result',\n 'google_maps_result',\n 'mcp_server_tool_result',\n]);\n\nfunction builtinToolNameFromCallType(type: string): string {\n return type.replace(/_call$/, '');\n}\n\nfunction builtinToolNameFromResultType(type: string): string {\n return type.replace(/_result$/, '');\n}\n\ntype OpenBlockState =\n | { kind: 'text'; id: string; emittedSourceKeys: Set<string> }\n | {\n kind: 'reasoning';\n id: string;\n signature?: string;\n }\n | {\n kind: 'image';\n id: string;\n data?: string;\n mimeType?: string;\n uri?: string;\n }\n | {\n kind: 'function_call';\n id: string;\n toolCallId: string;\n toolName: string;\n /**\n * Accumulator for partial JSON arguments. Arguments stream as a\n * sequence of `arguments_delta` substrings on `step.delta`; each one is\n * appended verbatim and surfaced as a `tool-input-delta`. On\n * `step.stop` the accumulated string is parsed to recover the full\n * arguments object for the final `tool-call` event.\n */\n argumentsAccum: string;\n signature?: string;\n }\n | {\n kind: 'builtin_tool_call';\n id: string;\n blockType: string;\n toolCallId: string;\n toolName: string;\n arguments: Record<string, unknown>;\n callEmitted: boolean;\n }\n | {\n kind: 'builtin_tool_result';\n id: string;\n blockType: string;\n callId: string;\n toolName: string;\n result: unknown;\n isError?: boolean;\n resultEmitted: boolean;\n }\n /**\n * A `model_output` step whose inner content-block kind has not yet been\n * disambiguated. `step.start` may arrive bare (`{type: 'model_output'}`,\n * no content payload); the first `step.delta` reveals whether the block\n * is text or image. The block opens in this transitional state and swaps\n * to `text` / `image` on the first matching delta.\n */\n | { kind: 'pending_model_output'; id: string }\n | { kind: 'unknown'; id: string };\n\n/**\n * Builds a `TransformStream<ParseResult<GoogleInteractionsEvent>, LanguageModelV4StreamPart>`\n * over the Interactions API SSE event stream.\n *\n * Surfaces text + thought (reasoning), function_call, image, built-in tool\n * call/result steps, and `text_annotation` -> `source` parts.\n */\nexport function buildGoogleInteractionsStreamTransform({\n warnings,\n generateId,\n includeRawChunks,\n serviceTier: headerServiceTier,\n}: {\n warnings: Array<SharedV4Warning>;\n generateId: () => string;\n includeRawChunks?: boolean;\n /**\n * Defensive fallback for service tier read from the `x-gemini-service-tier`\n * HTTP response header. The Interactions API surfaces the applied tier in\n * the `interaction.completed` event body (see `service_tier` below); this\n * parameter exists so we still surface a tier if the API later starts\n * sending the header.\n */\n serviceTier?: string;\n}): TransformStream<\n ParseResult<GoogleInteractionsEvent>,\n LanguageModelV4StreamPart\n> {\n let interactionId: string | undefined;\n let usage: GoogleInteractionsUsage | undefined;\n let serviceTier: string | undefined = headerServiceTier;\n let finishStatus: GoogleInteractionsStatus | string | undefined;\n let hasFunctionCall = false;\n\n /*\n * Per-index open step slots. The Interactions API frames concurrent steps\n * (e.g. text alongside thought) by `index`; we track each open slot\n * independently so a text delta at index N never collides with a thought\n * delta at index M.\n */\n const openBlocks = new Map<number, OpenBlockState>();\n\n /*\n * De-duplicate sources across the whole stream. Citations often re-appear\n * across multiple `text_annotation` deltas as the model's text grows;\n * surface each unique URL once.\n */\n const emittedSourceKeys = new Set<string>();\n\n function sourceKey(source: LanguageModelV4Source): string {\n return source.sourceType === 'url'\n ? `url:${source.url}`\n : `doc:${source.filename ?? source.title}`;\n }\n\n return new TransformStream<\n ParseResult<GoogleInteractionsEvent>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n if (includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n if (!chunk.success) {\n finishStatus = 'failed';\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n const eventType = (value as { event_type?: string }).event_type;\n\n switch (eventType) {\n case 'interaction.created': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'interaction.created' }\n >;\n const interaction = event.interaction;\n /*\n * The Interactions API returns `id: \"\"` (empty string) on streaming\n * events when running with `store: false` — there is no server-side\n * record. Treat empty string the same as missing so providerMetadata\n * stays clean.\n */\n interactionId =\n interaction?.id != null && interaction.id.length > 0\n ? interaction.id\n : undefined;\n\n const created = (interaction as { created?: string } | undefined)\n ?.created;\n let timestamp: Date | undefined;\n if (typeof created === 'string') {\n const parsed = new Date(created);\n if (!Number.isNaN(parsed.getTime())) {\n timestamp = parsed;\n }\n }\n\n controller.enqueue({\n type: 'response-metadata',\n ...(interactionId != null ? { id: interactionId } : {}),\n modelId: (interaction as { model?: string } | undefined)?.model,\n ...(timestamp ? { timestamp } : {}),\n });\n break;\n }\n\n case 'step.start': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'step.start' }\n >;\n const step = event.step as\n | {\n type?: string;\n id?: string;\n call_id?: string;\n name?: string;\n arguments?: Record<string, unknown>;\n signature?: string;\n summary?: Array<{ type?: string; text?: string }>;\n result?: unknown;\n is_error?: boolean;\n content?: Array<{\n type?: string;\n text?: string;\n data?: string;\n mime_type?: string;\n uri?: string;\n annotations?: Array<GoogleInteractionsAnnotation>;\n }>;\n }\n | undefined;\n const index = event.index;\n const blockId = `${interactionId ?? 'interaction'}:${index}`;\n const stepType = step?.type;\n\n if (stepType === 'model_output') {\n /*\n * `step.start` for a `model_output` step often carries only the\n * type discriminator — content/image payloads then arrive on\n * subsequent `step.delta` events. Open in a transitional\n * `pending_model_output` state; the first delta promotes it to\n * either `text` (and emits `text-start`) or `image`.\n *\n * `step.content[0]` may also arrive populated as a hint; when\n * present, promote eagerly.\n */\n const initial = step?.content?.[0] as\n | {\n type?: string;\n text?: string;\n data?: string;\n mime_type?: string;\n uri?: string;\n annotations?: Array<GoogleInteractionsAnnotation>;\n }\n | undefined;\n if (initial?.type === 'text') {\n openBlocks.set(index, {\n kind: 'text',\n id: blockId,\n emittedSourceKeys: new Set<string>(),\n });\n controller.enqueue({ type: 'text-start', id: blockId });\n\n const initialSources = annotationsToSources({\n annotations: initial.annotations,\n generateId,\n });\n for (const source of initialSources) {\n const key = sourceKey(source);\n if (emittedSourceKeys.has(key)) continue;\n emittedSourceKeys.add(key);\n controller.enqueue(source);\n }\n } else if (initial?.type === 'image') {\n openBlocks.set(index, {\n kind: 'image',\n id: blockId,\n ...(initial.data != null ? { data: initial.data } : {}),\n ...(initial.mime_type != null\n ? { mimeType: initial.mime_type }\n : {}),\n ...(initial.uri != null ? { uri: initial.uri } : {}),\n });\n } else {\n openBlocks.set(index, {\n kind: 'pending_model_output',\n id: blockId,\n });\n }\n } else if (stepType === 'thought') {\n const signature = step?.signature;\n openBlocks.set(index, {\n kind: 'reasoning',\n id: blockId,\n ...(signature != null ? { signature } : {}),\n });\n controller.enqueue({ type: 'reasoning-start', id: blockId });\n /*\n * A `thought` step's initial `summary[]` may already contain text\n * items on `step.start` — emit those as reasoning deltas so the\n * consumer's reasoning buffer is up to date before any delta\n * arrives.\n */\n if (Array.isArray(step?.summary)) {\n for (const item of step.summary) {\n if (item?.type === 'text' && typeof item.text === 'string') {\n controller.enqueue({\n type: 'reasoning-delta',\n id: blockId,\n delta: item.text,\n });\n }\n }\n }\n } else if (stepType === 'function_call') {\n const toolCallId = step?.id ?? blockId;\n const toolName = step?.name ?? 'unknown';\n hasFunctionCall = true;\n const state: Extract<OpenBlockState, { kind: 'function_call' }> = {\n kind: 'function_call',\n id: blockId,\n toolCallId,\n toolName,\n argumentsAccum: '',\n ...(step?.signature != null ? { signature: step.signature } : {}),\n };\n openBlocks.set(index, state);\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallId,\n toolName,\n });\n } else if (\n stepType != null &&\n BUILTIN_TOOL_CALL_TYPES.has(stepType)\n ) {\n const toolName =\n stepType === 'mcp_server_tool_call'\n ? (step?.name ?? 'mcp_server_tool')\n : builtinToolNameFromCallType(stepType);\n const toolCallId = step?.id ?? blockId;\n const state: Extract<\n OpenBlockState,\n { kind: 'builtin_tool_call' }\n > = {\n kind: 'builtin_tool_call',\n id: blockId,\n blockType: stepType,\n toolCallId,\n toolName,\n arguments: step?.arguments ?? {},\n callEmitted: false,\n };\n openBlocks.set(index, state);\n } else if (\n stepType != null &&\n BUILTIN_TOOL_RESULT_TYPES.has(stepType)\n ) {\n const toolName =\n stepType === 'mcp_server_tool_result'\n ? (step?.name ?? 'mcp_server_tool')\n : builtinToolNameFromResultType(stepType);\n const callId = step?.call_id ?? blockId;\n const state: Extract<\n OpenBlockState,\n { kind: 'builtin_tool_result' }\n > = {\n kind: 'builtin_tool_result',\n id: blockId,\n blockType: stepType,\n callId,\n toolName,\n result: step?.result ?? null,\n ...(step?.is_error != null ? { isError: step.is_error } : {}),\n resultEmitted: false,\n };\n openBlocks.set(index, state);\n } else {\n openBlocks.set(index, { kind: 'unknown', id: blockId });\n }\n break;\n }\n\n case 'step.delta': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'step.delta' }\n >;\n let open = openBlocks.get(event.index);\n if (open == null) break;\n\n const dtype = (event.delta as { type?: string } | undefined)?.type;\n\n /*\n * Promote a pending model_output block to `text` on the first\n * text-shaped delta. Image deltas are emitted inline below — a\n * model_output step can interleave text and image deltas, so the\n * text \"open block\" stays in place across image emissions instead\n * of being swapped for an image state.\n */\n if (open.kind === 'pending_model_output') {\n if (\n dtype === 'text' ||\n dtype === 'text_annotation' ||\n dtype === 'text_annotation_delta'\n ) {\n const promoted: Extract<OpenBlockState, { kind: 'text' }> = {\n kind: 'text',\n id: open.id,\n emittedSourceKeys: new Set<string>(),\n };\n openBlocks.set(event.index, promoted);\n open = promoted;\n controller.enqueue({ type: 'text-start', id: promoted.id });\n }\n }\n\n /*\n * Image deltas inside `model_output` carry the full payload in a\n * single chunk (no per-byte streaming). Emit the `file` part as\n * soon as the delta arrives so it surfaces regardless of whether\n * a text block is currently open at the same index.\n */\n if (\n dtype === 'image' &&\n (open.kind === 'pending_model_output' ||\n open.kind === 'text' ||\n open.kind === 'image')\n ) {\n const img = event.delta as\n | { data?: string; mime_type?: string; uri?: string }\n | undefined;\n const google: Record<string, string> = {};\n if (interactionId != null) google.interactionId = interactionId;\n const providerMetadata =\n Object.keys(google).length > 0 ? { google } : undefined;\n if (img?.data != null && img.data.length > 0) {\n controller.enqueue({\n type: 'file',\n mediaType: img.mime_type ?? 'image/png',\n data: { type: 'data', data: img.data },\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n } else if (img?.uri != null && img.uri.length > 0) {\n controller.enqueue({\n type: 'file',\n mediaType: img.mime_type ?? 'image/png',\n data: { type: 'url', url: new URL(img.uri) },\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n }\n // The file part was emitted inline; clear any data on an\n // eagerly-promoted image OpenBlockState so the `step.stop`\n // handler does not emit a duplicate.\n if (open.kind === 'image') {\n open.data = undefined;\n open.uri = undefined;\n }\n break;\n }\n\n const delta = event.delta as\n | {\n type?: string;\n text?: string;\n signature?: string;\n content?: { type?: string; text?: string };\n id?: string;\n /*\n * `arguments` carries different shapes per delta kind:\n * - `type: 'arguments_delta'` → `string` (partial JSON)\n * - `type: '<builtin>_tool_call'` → `Record<string, unknown>`\n * The branch handler reads it with the matching type.\n */\n arguments?: Record<string, unknown> | string;\n annotations?: Array<GoogleInteractionsAnnotation>;\n call_id?: string;\n result?: unknown;\n is_error?: boolean;\n data?: string;\n mime_type?: string;\n uri?: string;\n name?: string;\n }\n | undefined;\n\n if (open.kind === 'text' && delta?.type === 'text') {\n const text = delta.text ?? '';\n if (text.length > 0) {\n controller.enqueue({\n type: 'text-delta',\n id: open.id,\n delta: text,\n });\n }\n } else if (\n open.kind === 'text' &&\n (delta?.type === 'text_annotation' ||\n delta?.type === 'text_annotation_delta')\n ) {\n const sources = annotationsToSources({\n annotations: delta.annotations,\n generateId,\n });\n for (const source of sources) {\n const key = sourceKey(source);\n if (emittedSourceKeys.has(key)) continue;\n emittedSourceKeys.add(key);\n open.emittedSourceKeys.add(key);\n controller.enqueue(source);\n }\n } else if (open.kind === 'image' && delta?.type === 'image') {\n if (delta.data != null) open.data = delta.data;\n if (delta.mime_type != null) open.mimeType = delta.mime_type;\n if (delta.uri != null) open.uri = delta.uri;\n } else if (open.kind === 'reasoning') {\n if (delta?.type === 'thought_summary') {\n const item = delta.content;\n if (item?.type === 'text' && typeof item.text === 'string') {\n controller.enqueue({\n type: 'reasoning-delta',\n id: open.id,\n delta: item.text,\n });\n }\n } else if (delta?.type === 'thought_signature') {\n const signature = delta.signature;\n if (signature != null) {\n open.signature = signature;\n }\n }\n } else if (\n open.kind === 'function_call' &&\n delta?.type === 'arguments_delta'\n ) {\n /*\n * Partial JSON arguments arrive as `arguments_delta` events.\n * The partial JSON string lives in `delta.arguments` (a string,\n * not the parsed object — the `arguments_delta` name applies to\n * the discriminator only). Append to the accumulator and surface\n * each chunk as a `tool-input-delta`; the full arguments object\n * is emitted at `step.stop`.\n */\n const slice =\n typeof delta.arguments === 'string' ? delta.arguments : '';\n if (slice.length > 0) {\n open.argumentsAccum += slice;\n controller.enqueue({\n type: 'tool-input-delta',\n id: open.toolCallId,\n delta: slice,\n });\n }\n if (delta.id != null) {\n open.toolCallId = delta.id;\n }\n if (delta.signature != null) {\n open.signature = delta.signature;\n }\n hasFunctionCall = true;\n } else if (\n open.kind === 'builtin_tool_call' &&\n delta?.type === open.blockType\n ) {\n if (delta.id != null) open.toolCallId = delta.id;\n if (\n delta.arguments != null &&\n typeof delta.arguments === 'object'\n ) {\n open.arguments = delta.arguments;\n }\n if (\n delta.name != null &&\n open.blockType === 'mcp_server_tool_call'\n ) {\n open.toolName = delta.name;\n }\n } else if (\n open.kind === 'builtin_tool_result' &&\n delta?.type === open.blockType\n ) {\n if (delta.call_id != null) open.callId = delta.call_id;\n if (delta.result !== undefined) open.result = delta.result;\n if (delta.is_error != null) open.isError = delta.is_error;\n if (\n delta.name != null &&\n open.blockType === 'mcp_server_tool_result'\n ) {\n open.toolName = delta.name;\n }\n }\n break;\n }\n\n case 'step.stop': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'step.stop' }\n >;\n const open = openBlocks.get(event.index);\n if (open == null) break;\n\n if (open.kind === 'text') {\n const textProviderMetadata =\n interactionId != null ? { google: { interactionId } } : undefined;\n controller.enqueue({\n type: 'text-end',\n id: open.id,\n ...(textProviderMetadata\n ? { providerMetadata: textProviderMetadata }\n : {}),\n });\n } else if (open.kind === 'reasoning') {\n const google: Record<string, string> = {};\n if (open.signature != null) google.signature = open.signature;\n if (interactionId != null) google.interactionId = interactionId;\n const providerMetadata =\n Object.keys(google).length > 0 ? { google } : undefined;\n controller.enqueue({\n type: 'reasoning-end',\n id: open.id,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n } else if (open.kind === 'image') {\n const google: Record<string, string> = {};\n if (interactionId != null) google.interactionId = interactionId;\n const providerMetadata =\n Object.keys(google).length > 0 ? { google } : undefined;\n if (open.data != null && open.data.length > 0) {\n controller.enqueue({\n type: 'file',\n mediaType: open.mimeType ?? 'image/png',\n data: { type: 'data', data: open.data },\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n } else if (open.uri != null && open.uri.length > 0) {\n controller.enqueue({\n type: 'file',\n mediaType: open.mimeType ?? 'image/png',\n data: { type: 'url', url: new URL(open.uri) },\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n }\n } else if (open.kind === 'function_call') {\n const accumulated =\n open.argumentsAccum.length > 0 ? open.argumentsAccum : '{}';\n controller.enqueue({\n type: 'tool-input-end',\n id: open.toolCallId,\n });\n const google: Record<string, string> = {};\n if (open.signature != null) google.signature = open.signature;\n if (interactionId != null) google.interactionId = interactionId;\n const providerMetadata =\n Object.keys(google).length > 0 ? { google } : undefined;\n controller.enqueue({\n type: 'tool-call',\n toolCallId: open.toolCallId,\n toolName: open.toolName,\n input: accumulated,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n } else if (open.kind === 'builtin_tool_call' && !open.callEmitted) {\n controller.enqueue({\n type: 'tool-call',\n toolCallId: open.toolCallId,\n toolName: open.toolName,\n input: JSON.stringify(open.arguments ?? {}),\n providerExecuted: true,\n });\n open.callEmitted = true;\n } else if (\n open.kind === 'builtin_tool_result' &&\n !open.resultEmitted\n ) {\n controller.enqueue({\n type: 'tool-result',\n toolCallId: open.callId,\n toolName: open.toolName,\n result: (open.result ?? null) as NonNullable<JSONValue>,\n });\n open.resultEmitted = true;\n\n const sources = builtinToolResultToSources({\n block: {\n type: open.blockType,\n call_id: open.callId,\n result: open.result,\n } as unknown as GoogleInteractionsBuiltinToolResultContent,\n generateId,\n });\n for (const source of sources) {\n const key = sourceKey(source);\n if (emittedSourceKeys.has(key)) continue;\n emittedSourceKeys.add(key);\n controller.enqueue(source);\n }\n }\n openBlocks.delete(event.index);\n break;\n }\n\n case 'interaction.status_update':\n case 'interaction.in_progress':\n case 'interaction.requires_action': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n {\n event_type:\n | 'interaction.status_update'\n | 'interaction.in_progress'\n | 'interaction.requires_action';\n }\n >;\n if (event.status != null) {\n finishStatus = event.status;\n } else if (eventType === 'interaction.requires_action') {\n finishStatus = 'requires_action';\n } else {\n finishStatus = 'in_progress';\n }\n break;\n }\n\n case 'interaction.completed': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'interaction.completed' }\n >;\n const interaction = event.interaction as {\n id?: string;\n status?: GoogleInteractionsStatus;\n usage?: GoogleInteractionsUsage;\n service_tier?: string;\n };\n if (interaction?.id != null && interaction.id.length > 0) {\n interactionId = interaction.id;\n }\n if (interaction?.status != null) {\n finishStatus = interaction.status;\n }\n if (interaction?.usage != null) {\n usage = interaction.usage;\n }\n /*\n * The Interactions API surfaces the applied service tier on\n * `interaction.completed.interaction.service_tier` (NOT on the\n * `x-gemini-service-tier` HTTP header that `:generateContent`\n * uses). Body wins over header fallback.\n */\n if (interaction?.service_tier != null) {\n serviceTier = interaction.service_tier;\n }\n break;\n }\n\n case 'error': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'error' }\n >;\n finishStatus = 'failed';\n const errorPayload = event.error ?? {\n message: 'Unknown interaction error',\n };\n controller.enqueue({ type: 'error', error: errorPayload });\n break;\n }\n\n default:\n break;\n }\n },\n\n flush(controller) {\n const finishReason: LanguageModelV4FinishReason = {\n unified: mapGoogleInteractionsFinishReason({\n status: finishStatus,\n hasFunctionCall,\n }),\n raw: finishStatus,\n };\n\n const providerMetadata: SharedV4ProviderMetadata = {\n google: {\n ...(interactionId != null ? { interactionId } : {}),\n ...(serviceTier != null ? { serviceTier } : {}),\n },\n };\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertGoogleInteractionsUsage(usage),\n providerMetadata,\n });\n },\n });\n}\n","import type {\n LanguageModelV4FilePart,\n LanguageModelV4Prompt,\n LanguageModelV4ToolResultOutput,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n convertToBase64,\n getTopLevelMediaType,\n isFullMediaType,\n resolveFullMediaType,\n resolveProviderReference,\n} from '@ai-sdk/provider-utils';\nimport type {\n GoogleInteractionsContent,\n GoogleInteractionsContentBlock,\n GoogleInteractionsFunctionResultContent,\n GoogleInteractionsImageContent,\n GoogleInteractionsInput,\n GoogleInteractionsStep,\n GoogleInteractionsTextContent,\n} from './google-interactions-prompt';\n\nexport type GoogleInteractionsMediaResolution =\n | 'low'\n | 'medium'\n | 'high'\n | 'ultra_high';\n\nexport type ConvertToGoogleInteractionsInputResult = {\n input: GoogleInteractionsInput;\n systemInstruction: string | undefined;\n warnings: Array<SharedV4Warning>;\n};\n\n/**\n * Converts an AI SDK `LanguageModelV4Prompt` into the Gemini Interactions\n * request shape (`{ input: Array<Step>, system_instruction }`).\n *\n * Prior assistant content round-trips as discrete steps:\n * - text / image content → `model_output` step with a single `content` array\n * - reasoning → `thought` step (`signature` + `summary`)\n * - tool-call → `function_call` step\n * User turns (and tool-result turns from the previous round) are sent as\n * `user_input` steps whose `content[]` holds the user's parts (text, files,\n * and — for tool-result turns — `function_result` blocks).\n *\n * Handles text parts, file parts (image / audio / document / video, all four\n * `data.type` shapes), tool-call/tool-result round-tripping, per-step\n * `signature` round-tripping, and statefulness compaction (drop assistant/tool\n * turns whose `providerOptions.google.interactionId === previousInteractionId`).\n */\nexport function convertToGoogleInteractionsInput({\n prompt,\n previousInteractionId,\n store,\n mediaResolution,\n}: {\n prompt: LanguageModelV4Prompt;\n previousInteractionId?: string;\n store?: boolean;\n mediaResolution?: GoogleInteractionsMediaResolution;\n}): ConvertToGoogleInteractionsInputResult {\n const warnings: Array<SharedV4Warning> = [];\n\n /*\n * Behavior matrix for compaction:\n *\n * - `previousInteractionId` set + `store !== false` → compact history (drop\n * assistant/tool turns whose `providerMetadata.google.interactionId`\n * matches), emit `previous_interaction_id`.\n * - `previousInteractionId` set + `store === false` → emit warning\n * (incoherent combo), still send full history (NO compaction).\n * - `store === false`, no `previousInteractionId` → no compaction.\n * - Default → no compaction.\n */\n const incoherentCombo = previousInteractionId != null && store === false;\n const shouldCompact = previousInteractionId != null && store !== false;\n if (incoherentCombo) {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: providerOptions.google.previousInteractionId was set together with store: false. These are incoherent (the prior interaction cannot be referenced when nothing was stored on the server); the full history will be sent and previous_interaction_id will still be emitted.',\n });\n }\n\n const compactedPrompt = shouldCompact\n ? compactPromptForPreviousInteraction({\n prompt,\n previousInteractionId,\n })\n : prompt;\n\n const systemTexts: Array<string> = [];\n const steps: Array<GoogleInteractionsStep> = [];\n\n for (const message of compactedPrompt) {\n switch (message.role) {\n case 'system': {\n systemTexts.push(message.content);\n break;\n }\n case 'user': {\n const content: Array<GoogleInteractionsContentBlock> = [];\n for (const part of message.content) {\n if (part.type === 'text') {\n content.push({ type: 'text', text: part.text });\n } else if (part.type === 'file') {\n const fileBlock = convertFilePartToContent({\n part,\n warnings,\n mediaResolution,\n });\n if (fileBlock != null) {\n content.push(fileBlock);\n }\n }\n }\n const merged = mergeAdjacentTextContent(content);\n if (merged.length > 0) {\n steps.push({ type: 'user_input', content: merged });\n }\n break;\n }\n case 'assistant': {\n /*\n * Prior assistant content fans out into one step per logical block.\n * Adjacent text/image content blocks are coalesced into a single\n * `model_output` step (matching how the API emits them on output);\n * reasoning and tool-calls each become their own step.\n */\n let pendingModelOutput: Array<GoogleInteractionsContentBlock> = [];\n const flushModelOutput = () => {\n if (pendingModelOutput.length > 0) {\n steps.push({ type: 'model_output', content: pendingModelOutput });\n pendingModelOutput = [];\n }\n };\n\n for (const part of message.content) {\n if (part.type === 'text') {\n pendingModelOutput.push({ type: 'text', text: part.text });\n } else if (part.type === 'reasoning') {\n flushModelOutput();\n const signature = part.providerOptions?.google?.signature as\n | string\n | undefined;\n steps.push({\n type: 'thought',\n ...(signature != null ? { signature } : {}),\n summary:\n part.text.length > 0\n ? [{ type: 'text', text: part.text }]\n : undefined,\n });\n } else if (part.type === 'file') {\n const fileBlock = convertFilePartToContent({\n part,\n warnings,\n mediaResolution,\n });\n if (fileBlock != null) {\n pendingModelOutput.push(fileBlock);\n }\n } else if (part.type === 'tool-call') {\n flushModelOutput();\n const signature = part.providerOptions?.google?.signature as\n | string\n | undefined;\n const args =\n typeof part.input === 'string'\n ? safeParseToolArgs(part.input)\n : ((part.input ?? {}) as Record<string, unknown>);\n steps.push({\n type: 'function_call',\n id: part.toolCallId,\n name: part.toolName,\n arguments: args,\n ...(signature != null ? { signature } : {}),\n });\n } else {\n warnings.push({\n type: 'other',\n message: `google.interactions: unsupported assistant content part type \"${part.type}\"; part dropped.`,\n });\n }\n }\n flushModelOutput();\n break;\n }\n case 'tool': {\n /*\n * Tool-result messages are emitted as a `user_input` step whose\n * content holds one `function_result` block per tool-result part.\n * `function_result` remains a content-block type (it sits inside\n * a step), not a top-level step type.\n */\n const content: Array<GoogleInteractionsContentBlock> = [];\n for (const part of message.content) {\n if (part.type !== 'tool-result') {\n warnings.push({\n type: 'other',\n message: `google.interactions: unsupported tool message part type \"${part.type}\"; part dropped.`,\n });\n continue;\n }\n const block = convertToolResultPart({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n output: part.output,\n signature: part.providerOptions?.google?.signature as\n | string\n | undefined,\n warnings,\n });\n content.push(block);\n }\n if (content.length > 0) {\n steps.push({ type: 'user_input', content });\n }\n break;\n }\n }\n }\n\n const systemInstruction =\n systemTexts.length > 0 ? systemTexts.join('\\n\\n') : undefined;\n\n return { input: steps, systemInstruction, warnings };\n}\n\n/**\n * Maps a single AI SDK `LanguageModelV4FilePart` to a Gemini Interactions\n * content block (`image` / `audio` / `document` / `video`).\n */\nfunction convertFilePartToContent({\n part,\n warnings,\n mediaResolution,\n}: {\n part: LanguageModelV4FilePart;\n warnings: Array<SharedV4Warning>;\n mediaResolution?: GoogleInteractionsMediaResolution;\n}): GoogleInteractionsContent | undefined {\n if (part.data.type === 'text') {\n return {\n type: 'text',\n text: part.data.text,\n };\n }\n\n const topLevel = getTopLevelMediaType(part.mediaType);\n let kind: 'image' | 'audio' | 'video' | 'document' | undefined;\n switch (topLevel) {\n case 'image':\n kind = 'image';\n break;\n case 'audio':\n kind = 'audio';\n break;\n case 'video':\n kind = 'video';\n break;\n case 'application':\n kind = 'document';\n break;\n default:\n kind = undefined;\n }\n\n if (kind == null) {\n warnings.push({\n type: 'other',\n message: `google.interactions: unsupported file media type \"${part.mediaType}\"; part dropped.`,\n });\n return undefined;\n }\n\n const resolutionField =\n mediaResolution != null && (kind === 'image' || kind === 'video')\n ? { resolution: mediaResolution }\n : {};\n\n switch (part.data.type) {\n case 'data': {\n const mimeType = resolveFullMediaType({ part });\n return {\n type: kind,\n data: convertToBase64(part.data.data),\n mime_type: mimeType,\n ...resolutionField,\n };\n }\n case 'url': {\n return {\n type: kind,\n uri: part.data.url.toString(),\n ...(isFullMediaType(part.mediaType)\n ? { mime_type: part.mediaType }\n : {}),\n ...resolutionField,\n };\n }\n case 'reference': {\n const uri = resolveProviderReference({\n reference: part.data.reference,\n provider: 'google',\n });\n return {\n type: kind,\n uri,\n ...(isFullMediaType(part.mediaType)\n ? { mime_type: part.mediaType }\n : {}),\n ...resolutionField,\n };\n }\n }\n}\n\n/*\n * Drops assistant messages that were part of the linked interaction\n * (`previousInteractionId`). Tool-result turns whose tool-call counterpart\n * was dropped are also pruned to keep the message stream well-formed.\n */\nfunction compactPromptForPreviousInteraction({\n prompt,\n previousInteractionId,\n}: {\n prompt: LanguageModelV4Prompt;\n previousInteractionId: string;\n}): LanguageModelV4Prompt {\n const out: LanguageModelV4Prompt = [];\n const droppedToolCallIds = new Set<string>();\n\n for (const message of prompt) {\n if (message.role === 'assistant') {\n const matchesLinkedInteraction = message.content.some(part => {\n const partInteractionId = (\n part as { providerOptions?: { google?: { interactionId?: string } } }\n ).providerOptions?.google?.interactionId;\n return partInteractionId === previousInteractionId;\n });\n if (matchesLinkedInteraction) {\n for (const part of message.content) {\n if (part.type === 'tool-call') {\n droppedToolCallIds.add(part.toolCallId);\n }\n }\n continue;\n }\n out.push(message);\n continue;\n }\n if (message.role === 'tool') {\n const remaining = message.content.filter(part => {\n if (part.type !== 'tool-result') {\n return true;\n }\n return !droppedToolCallIds.has(part.toolCallId);\n });\n if (remaining.length === 0) {\n continue;\n }\n out.push({\n ...message,\n content: remaining as typeof message.content,\n });\n continue;\n }\n out.push(message);\n }\n\n return out;\n}\n\nfunction safeParseToolArgs(input: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(input);\n if (\n parsed != null &&\n typeof parsed === 'object' &&\n !Array.isArray(parsed)\n ) {\n return parsed as Record<string, unknown>;\n }\n return { value: parsed };\n } catch {\n return { value: input };\n }\n}\n\nfunction convertToolResultPart({\n toolCallId,\n toolName,\n output,\n signature,\n warnings,\n}: {\n toolCallId: string;\n toolName: string;\n output: LanguageModelV4ToolResultOutput;\n signature: string | undefined;\n warnings: Array<SharedV4Warning>;\n}): GoogleInteractionsFunctionResultContent {\n const base = {\n type: 'function_result' as const,\n call_id: toolCallId,\n name: toolName,\n ...(signature != null ? { signature } : {}),\n };\n\n switch (output.type) {\n case 'text':\n return { ...base, result: output.value };\n case 'json':\n return { ...base, result: JSON.stringify(output.value) };\n case 'error-text':\n return { ...base, is_error: true, result: output.value };\n case 'error-json':\n return { ...base, is_error: true, result: JSON.stringify(output.value) };\n case 'execution-denied':\n return {\n ...base,\n is_error: true,\n result: output.reason ?? 'Tool execution denied by user.',\n };\n case 'content': {\n const blocks: Array<\n GoogleInteractionsTextContent | GoogleInteractionsImageContent\n > = [];\n for (const item of output.value) {\n if (item.type === 'text') {\n blocks.push({ type: 'text', text: item.text });\n } else if (item.type === 'file') {\n const topLevel = getTopLevelMediaType(item.mediaType);\n if (topLevel !== 'image') {\n warnings.push({\n type: 'other',\n message: `google.interactions: tool-result file with mediaType \"${item.mediaType}\" is not supported (Interactions \\`function_result.result\\` accepts only text and image content); part dropped.`,\n });\n continue;\n }\n const imageBlock = filePartToImageBlock({ part: item, warnings });\n if (imageBlock != null) {\n blocks.push(imageBlock);\n }\n } else {\n warnings.push({\n type: 'other',\n message: `google.interactions: tool-result content part type \"${(item as { type: string }).type}\" is not supported; part dropped.`,\n });\n }\n }\n return { ...base, result: blocks };\n }\n }\n}\n\nfunction filePartToImageBlock({\n part,\n warnings,\n}: {\n part: {\n type: 'file';\n mediaType: string;\n data:\n | { type: 'data'; data: Uint8Array | string }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string };\n filename?: string;\n };\n warnings: Array<SharedV4Warning>;\n}): GoogleInteractionsImageContent | undefined {\n switch (part.data.type) {\n case 'data': {\n const mimeType = isFullMediaType(part.mediaType)\n ? part.mediaType\n : resolveFullMediaType({\n part: {\n type: 'file',\n mediaType: part.mediaType,\n data: part.data,\n } as LanguageModelV4FilePart,\n });\n return {\n type: 'image',\n data: convertToBase64(part.data.data),\n mime_type: mimeType,\n };\n }\n case 'url':\n return {\n type: 'image',\n uri: part.data.url.toString(),\n ...(isFullMediaType(part.mediaType)\n ? { mime_type: part.mediaType }\n : {}),\n };\n case 'reference': {\n const uri = resolveProviderReference({\n reference: part.data.reference,\n provider: 'google',\n });\n return {\n type: 'image',\n uri,\n ...(isFullMediaType(part.mediaType)\n ? { mime_type: part.mediaType }\n : {}),\n };\n }\n case 'text': {\n warnings.push({\n type: 'other',\n message:\n 'google.interactions: tool-result image part with `data.type === \"text\"` is not representable as an image; part dropped.',\n });\n return undefined;\n }\n }\n}\n\n/*\n * Collapses runs of adjacent text content blocks within a single user step\n * into one combined text block, separated by a blank line. Text blocks\n * carrying `annotations` are left untouched (annotations are tied to specific\n * text spans).\n */\nfunction mergeAdjacentTextContent(\n content: Array<GoogleInteractionsContentBlock>,\n): Array<GoogleInteractionsContentBlock> {\n if (content.length < 2) {\n return content;\n }\n const result: Array<GoogleInteractionsContentBlock> = [];\n for (const block of content) {\n const last = result[result.length - 1];\n if (\n block.type === 'text' &&\n last != null &&\n last.type === 'text' &&\n (last as GoogleInteractionsTextContent).annotations == null &&\n (block as GoogleInteractionsTextContent).annotations == null\n ) {\n const merged: GoogleInteractionsTextContent = {\n type: 'text',\n text: `${(last as GoogleInteractionsTextContent).text}\\n\\n${(block as GoogleInteractionsTextContent).text}`,\n };\n result[result.length - 1] = merged;\n continue;\n }\n result.push(block);\n }\n return result;\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/*\n * Zod schemas for the Gemini Interactions API wire format.\n *\n * Helpers are defined as factories (invoked only inside the exported\n * `lazySchema(() => ...)` callbacks) so no `z.object(...)` / `z.union(...)`\n * runs at module import. Schemas are intentionally narrow on the fields the\n * SDK consumes and lenient (`loose()` / `unknown`) on the rest, so subsequent\n * additions can widen without breaking the basic path.\n */\n\nconst tokenByModalitySchema = () =>\n z\n .object({\n modality: z.string().nullish(),\n tokens: z.number().nullish(),\n })\n .loose();\n\nconst usageSchema = () =>\n z\n .object({\n total_input_tokens: z.number().nullish(),\n total_output_tokens: z.number().nullish(),\n total_thought_tokens: z.number().nullish(),\n total_cached_tokens: z.number().nullish(),\n total_tool_use_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n input_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n output_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n cached_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n tool_use_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n grounding_tool_count: z\n .array(\n z\n .object({\n type: z.string().nullish(),\n count: z.number().nullish(),\n })\n .loose(),\n )\n .nullish(),\n })\n .loose();\n\nexport type GoogleInteractionsUsage = z.infer<ReturnType<typeof usageSchema>>;\n\nconst interactionStatusSchema = () =>\n z.enum([\n 'in_progress',\n 'requires_action',\n 'completed',\n 'failed',\n 'cancelled',\n 'incomplete',\n ]);\n\nconst annotationSchema = () => {\n const urlCitation = z\n .object({\n type: z.literal('url_citation'),\n url: z.string().nullish(),\n title: z.string().nullish(),\n start_index: z.number().nullish(),\n end_index: z.number().nullish(),\n })\n .loose();\n\n const fileCitation = z\n .object({\n type: z.literal('file_citation'),\n file_name: z.string().nullish(),\n document_uri: z.string().nullish(),\n url: z.string().nullish(),\n page_number: z.number().nullish(),\n media_id: z.string().nullish(),\n start_index: z.number().nullish(),\n end_index: z.number().nullish(),\n custom_metadata: z.record(z.string(), z.unknown()).nullish(),\n })\n .loose();\n\n const placeCitation = z\n .object({\n type: z.literal('place_citation'),\n name: z.string().nullish(),\n url: z.string().nullish(),\n place_id: z.string().nullish(),\n start_index: z.number().nullish(),\n end_index: z.number().nullish(),\n })\n .loose();\n\n return z.union([\n urlCitation,\n fileCitation,\n placeCitation,\n z.object({ type: z.string() }).loose(),\n ]);\n};\n\nconst thoughtSummaryItemSchema = () =>\n z\n .object({\n type: z.string(),\n text: z.string().nullish(),\n data: z.string().nullish(),\n mime_type: z.string().nullish(),\n })\n .loose();\n\n/*\n * Content block schemas — these populate the `content` array of a\n * `model_output` step. Function calls, thoughts, and built-in tool\n * call/result blocks are top-level step types (see `stepSchema` below), not\n * content blocks.\n */\nconst contentBlockSchema = () => {\n const textContent = z\n .object({\n type: z.literal('text'),\n text: z.string(),\n annotations: z.array(annotationSchema()).nullish(),\n })\n .loose();\n\n const imageContent = z\n .object({\n type: z.literal('image'),\n data: z.string().nullish(),\n mime_type: z.string().nullish(),\n resolution: z.enum(['low', 'medium', 'high', 'ultra_high']).nullish(),\n uri: z.string().nullish(),\n })\n .loose();\n\n return z.union([\n textContent,\n imageContent,\n z.object({ type: z.string() }).loose(),\n ]);\n};\n\nexport type GoogleInteractionsContentBlock = z.infer<\n ReturnType<typeof contentBlockSchema>\n>;\n\nconst BUILTIN_TOOL_CALL_STEP_TYPES = [\n 'google_search_call',\n 'code_execution_call',\n 'url_context_call',\n 'file_search_call',\n 'google_maps_call',\n 'mcp_server_tool_call',\n] as const;\n\nconst BUILTIN_TOOL_RESULT_STEP_TYPES = [\n 'google_search_result',\n 'code_execution_result',\n 'url_context_result',\n 'file_search_result',\n 'google_maps_result',\n 'mcp_server_tool_result',\n] as const;\n\n/*\n * Step schema union — elements of `response.steps[]` and the `step` field on\n * `step.start` SSE events.\n *\n * - `user_input` echoes a turn the client sent; only appears on\n * `GET /interactions/{id}` (the full timeline). The SDK skips it.\n * - `model_output` wraps the model's text/image content in `step.content[]`.\n * - `function_call`, `thought`, and the built-in `*_call`/`*_result` steps\n * carry their payload directly on the step (no `content` indirection).\n */\nconst stepSchema = () => {\n const userInputStep = z\n .object({\n type: z.literal('user_input'),\n content: z.array(contentBlockSchema()).nullish(),\n })\n .loose();\n\n const modelOutputStep = z\n .object({\n type: z.literal('model_output'),\n content: z.array(contentBlockSchema()).nullish(),\n })\n .loose();\n\n const functionCallStep = z\n .object({\n type: z.literal('function_call'),\n id: z.string(),\n name: z.string(),\n arguments: z.record(z.string(), z.unknown()).nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n const thoughtStep = z\n .object({\n type: z.literal('thought'),\n signature: z.string().nullish(),\n summary: z.array(thoughtSummaryItemSchema()).nullish(),\n })\n .loose();\n\n const builtinToolCallStep = z\n .object({\n type: z.enum(BUILTIN_TOOL_CALL_STEP_TYPES),\n id: z.string(),\n arguments: z.record(z.string(), z.unknown()).nullish(),\n name: z.string().nullish(),\n server_name: z.string().nullish(),\n search_type: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n const builtinToolResultStep = z\n .object({\n type: z.enum(BUILTIN_TOOL_RESULT_STEP_TYPES),\n call_id: z.string(),\n result: z.unknown().nullish(),\n is_error: z.boolean().nullish(),\n name: z.string().nullish(),\n server_name: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n return z.union([\n userInputStep,\n modelOutputStep,\n functionCallStep,\n thoughtStep,\n builtinToolCallStep,\n builtinToolResultStep,\n z.object({ type: z.string() }).loose(),\n ]);\n};\n\nexport type GoogleInteractionsStep = z.infer<ReturnType<typeof stepSchema>>;\n\nexport const googleInteractionsResponseSchema = lazySchema(() =>\n zodSchema(\n z\n .object({\n /*\n * `id` is omitted from the response body when `store: false` (fully\n * stateless mode) — there is no server-side interaction record for the\n * client to reference. `nullish` lets the schema accept that shape.\n */\n id: z.string().nullish(),\n created: z.string().nullish(),\n updated: z.string().nullish(),\n status: interactionStatusSchema(),\n model: z.string().nullish(),\n agent: z.string().nullish(),\n steps: z.array(stepSchema()).nullish(),\n usage: usageSchema().nullish(),\n service_tier: z.string().nullish(),\n previous_interaction_id: z.string().nullish(),\n response_modalities: z.array(z.string()).nullish(),\n })\n .loose(),\n ),\n);\n\nexport type GoogleInteractionsResponse = InferSchema<\n typeof googleInteractionsResponseSchema\n>;\n\nexport const googleInteractionsEventSchema = lazySchema(() =>\n zodSchema(\n (() => {\n const status = interactionStatusSchema();\n const annotation = annotationSchema();\n const thoughtSummaryItem = thoughtSummaryItemSchema();\n\n const interactionCreatedEvent = z\n .object({\n event_type: z.literal('interaction.created'),\n event_id: z.string().nullish(),\n interaction: z\n .object({\n /*\n * `id` is omitted when `store: false` (fully stateless mode);\n * see the matching note on `googleInteractionsResponseSchema.id`.\n */\n id: z.string().nullish(),\n created: z.string().nullish(),\n model: z.string().nullish(),\n agent: z.string().nullish(),\n status: status.nullish(),\n })\n .loose(),\n })\n .loose();\n\n /*\n * `step.start` carries the discriminated step shape under `step`. For\n * `function_call` steps the `name` is included here; for `thought`\n * steps the initial `signature` and `summary` arrive here when set.\n */\n const stepStartEvent = z\n .object({\n event_type: z.literal('step.start'),\n event_id: z.string().nullish(),\n index: z.number(),\n step: stepSchema(),\n })\n .loose();\n\n const stepDeltaText = z\n .object({\n type: z.literal('text'),\n text: z.string(),\n })\n .loose();\n\n const stepDeltaThoughtSummary = z\n .object({\n type: z.literal('thought_summary'),\n content: thoughtSummaryItem.nullish(),\n })\n .loose();\n\n const stepDeltaThoughtSignature = z\n .object({\n type: z.literal('thought_signature'),\n signature: z.string().nullish(),\n })\n .loose();\n\n /*\n * `function_call` step deltas stream the JSON arguments as a partial\n * string. Wire shape:\n * { type: 'arguments_delta', arguments: '<partial-json-string>' }\n * The partial JSON lives in `arguments` (a string), not in a separate\n * `arguments_delta` field — the discriminator name is the only place\n * `arguments_delta` appears. Consumers accumulate the substrings and\n * parse on `step.stop`.\n */\n const stepDeltaArgumentsDelta = z\n .object({\n type: z.literal('arguments_delta'),\n arguments: z.string().nullish(),\n id: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n /*\n * URL/file/place-citation deltas. The discriminator is\n * `text_annotation_delta` (matching the `_delta` suffix used by\n * `arguments_delta`); `text_annotation` is also accepted as an alias.\n */\n const stepDeltaTextAnnotation = z\n .object({\n type: z.enum(['text_annotation_delta', 'text_annotation']),\n annotations: z.array(annotation).nullish(),\n })\n .loose();\n\n /*\n * `image` deltas carry the entire payload per delta (`data` base64 +\n * `mime_type`, or `uri`) — there is no per-byte streaming.\n */\n const stepDeltaImage = z\n .object({\n type: z.literal('image'),\n data: z.string().nullish(),\n mime_type: z.string().nullish(),\n resolution: z.enum(['low', 'medium', 'high', 'ultra_high']).nullish(),\n uri: z.string().nullish(),\n })\n .loose();\n\n /*\n * Built-in tool call/result step deltas mirror the shape of their step\n * counterparts (full payload per delta — there is no per-token\n * streaming of arguments). Result deltas carry the populated `result`\n * payload.\n */\n const stepDeltaBuiltinToolCall = z\n .object({\n type: z.enum(BUILTIN_TOOL_CALL_STEP_TYPES),\n id: z.string().nullish(),\n arguments: z.record(z.string(), z.unknown()).nullish(),\n name: z.string().nullish(),\n server_name: z.string().nullish(),\n search_type: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n const stepDeltaBuiltinToolResult = z\n .object({\n type: z.enum(BUILTIN_TOOL_RESULT_STEP_TYPES),\n call_id: z.string().nullish(),\n result: z.unknown().nullish(),\n is_error: z.boolean().nullish(),\n name: z.string().nullish(),\n server_name: z.string().nullish(),\n signature: z.string().nullish(),\n })\n .loose();\n\n const stepDeltaUnknown = z.object({ type: z.string() }).loose();\n\n const stepDeltaUnion = z.union([\n stepDeltaText,\n stepDeltaImage,\n stepDeltaThoughtSummary,\n stepDeltaThoughtSignature,\n stepDeltaArgumentsDelta,\n stepDeltaTextAnnotation,\n stepDeltaBuiltinToolCall,\n stepDeltaBuiltinToolResult,\n stepDeltaUnknown,\n ]);\n\n const stepDeltaEvent = z\n .object({\n event_type: z.literal('step.delta'),\n event_id: z.string().nullish(),\n index: z.number(),\n delta: stepDeltaUnion,\n })\n .loose();\n\n const stepStopEvent = z\n .object({\n event_type: z.literal('step.stop'),\n event_id: z.string().nullish(),\n index: z.number(),\n })\n .loose();\n\n /*\n * Status-transition events. The API emits `interaction.status_update`\n * for in-progress and requires-action transitions; the more specific\n * `interaction.in_progress` and `interaction.requires_action` shapes\n * are accepted so all three route through the same handler.\n */\n const interactionStatusUpdateEvent = z\n .object({\n event_type: z.literal('interaction.status_update'),\n event_id: z.string().nullish(),\n interaction_id: z.string().nullish(),\n status: status.nullish(),\n })\n .loose();\n\n const interactionInProgressEvent = z\n .object({\n event_type: z.literal('interaction.in_progress'),\n event_id: z.string().nullish(),\n interaction_id: z.string().nullish(),\n status: status.nullish(),\n })\n .loose();\n\n const interactionRequiresActionEvent = z\n .object({\n event_type: z.literal('interaction.requires_action'),\n event_id: z.string().nullish(),\n interaction_id: z.string().nullish(),\n status: status.nullish(),\n })\n .loose();\n\n const interactionCompletedEvent = z\n .object({\n event_type: z.literal('interaction.completed'),\n event_id: z.string().nullish(),\n interaction: z\n .object({\n id: z.string().nullish(),\n status: status.nullish(),\n usage: usageSchema().nullish(),\n service_tier: z.string().nullish(),\n })\n .loose(),\n })\n .loose();\n\n const errorEvent = z\n .object({\n event_type: z.literal('error'),\n event_id: z.string().nullish(),\n error: z\n .object({\n code: z.string().nullish(),\n message: z.string().nullish(),\n })\n .loose()\n .nullish(),\n })\n .loose();\n\n const unknownEvent = z.object({ event_type: z.string() }).loose();\n\n return z.union([\n interactionCreatedEvent,\n stepStartEvent,\n stepDeltaEvent,\n stepStopEvent,\n interactionStatusUpdateEvent,\n interactionInProgressEvent,\n interactionRequiresActionEvent,\n interactionCompletedEvent,\n errorEvent,\n unknownEvent,\n ]);\n })(),\n ),\n);\n\nexport type GoogleInteractionsEvent = InferSchema<\n typeof googleInteractionsEventSchema\n>;\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Type-only union of Gemini model IDs that the Interactions API accepts via\n * `model:`. Mirrors `Model` from `googleapis/js-genai`\n * `src/interactions/resources/interactions.ts`.\n *\n * Kept as a separate type from `GoogleModelId` even though most IDs overlap;\n * the two surfaces (`:generateContent` vs `/interactions`) are independent and\n * may diverge over time.\n */\nexport type GoogleInteractionsModelId =\n | 'gemini-2.5-computer-use-preview-10-2025'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-flash-image'\n | 'gemini-2.5-flash-lite'\n | 'gemini-2.5-flash-lite-preview-09-2025'\n | 'gemini-2.5-flash-native-audio-preview-12-2025'\n | 'gemini-2.5-flash-preview-09-2025'\n | 'gemini-2.5-flash-preview-tts'\n | 'gemini-2.5-pro'\n | 'gemini-2.5-pro-preview-tts'\n | 'gemini-3-flash-preview'\n | 'gemini-3-pro-image-preview'\n | 'gemini-3-pro-preview'\n | 'gemini-3.1-pro-preview'\n | 'gemini-3.1-flash-image-preview'\n | 'gemini-3.1-flash-lite-preview'\n | 'gemini-3.1-flash-tts-preview'\n | 'gemini-3.5-flash'\n | 'lyria-3-clip-preview'\n | 'lyria-3-pro-preview'\n | (string & {});\n\n/**\n * Provider-options schema for `google.interactions(...)` calls. Read from the\n * shared `providerOptions.google.*` namespace (per PRD); per-call options that\n * the AI SDK doesn't natively expose live here.\n *\n * All fields are `.nullish()` per the existing google provider convention.\n */\nexport const googleInteractionsLanguageModelOptions = lazySchema(() =>\n zodSchema(\n z.object({\n previousInteractionId: z.string().nullish(),\n store: z.boolean().nullish(),\n\n agent: z.string().nullish(),\n agentConfig: z\n .union([\n z\n .object({\n type: z.literal('dynamic'),\n })\n .loose(),\n z.object({\n type: z.literal('deep-research'),\n thinkingSummaries: z.enum(['auto', 'none']).nullish(),\n visualization: z.enum(['off', 'auto']).nullish(),\n collaborativePlanning: z.boolean().nullish(),\n }),\n ])\n .nullish(),\n\n thinkingLevel: z.enum(['minimal', 'low', 'medium', 'high']).nullish(),\n thinkingSummaries: z.enum(['auto', 'none']).nullish(),\n\n /**\n * Output-format entries that map directly to the API's `response_format`\n * array. Use this to request image, audio, or non-JSON text outputs\n * with full control over `mime_type`, `aspect_ratio`, and `image_size`.\n *\n * Entries are sent in order. The AI SDK call-level `responseFormat: {\n * type: 'json', schema }` still drives JSON-mode and adds a matching\n * text entry automatically; entries listed here are appended.\n */\n responseFormat: z\n .array(\n z.union([\n z\n .object({\n type: z.literal('text'),\n mimeType: z.string().nullish(),\n schema: z.unknown().nullish(),\n })\n .loose(),\n z\n .object({\n type: z.literal('image'),\n mimeType: z.string().nullish(),\n aspectRatio: z\n .enum([\n '1:1',\n '2:3',\n '3:2',\n '3:4',\n '4:3',\n '4:5',\n '5:4',\n '9:16',\n '16:9',\n '21:9',\n '1:8',\n '8:1',\n '1:4',\n '4:1',\n ])\n .nullish(),\n imageSize: z.enum(['1K', '2K', '4K', '512']).nullish(),\n })\n .loose(),\n z\n .object({\n type: z.literal('audio'),\n mimeType: z.string().nullish(),\n })\n .loose(),\n ]),\n )\n .nullish(),\n\n /**\n * @deprecated Use `responseFormat` with a `{ type: 'image', ... }`\n * entry instead. Retained for backwards compatibility; the SDK\n * translates it into a matching `response_format` image entry and\n * emits a warning when set.\n */\n imageConfig: z\n .object({\n aspectRatio: z\n .enum([\n '1:1',\n '2:3',\n '3:2',\n '3:4',\n '4:3',\n '4:5',\n '5:4',\n '9:16',\n '16:9',\n '21:9',\n '1:8',\n '8:1',\n '1:4',\n '4:1',\n ])\n .nullish(),\n imageSize: z.enum(['1K', '2K', '4K', '512']).nullish(),\n })\n .nullish(),\n mediaResolution: z\n .enum(['low', 'medium', 'high', 'ultra_high'])\n .nullish(),\n\n responseModalities: z\n .array(z.enum(['text', 'image', 'audio', 'video', 'document']))\n .nullish(),\n serviceTier: z.enum(['flex', 'standard', 'priority']).nullish(),\n\n /**\n * Alternative to AI SDK `system` message. If both are set, the AI SDK\n * `system` message wins and a warning is emitted.\n */\n systemInstruction: z.string().nullish(),\n\n /**\n * Per-block signature for round-tripping `thought.signature` and\n * `function_call.signature` blocks. Set by the SDK on output reasoning /\n * tool-call parts; passed back unchanged on input parts so the API\n * accepts the prior turn.\n */\n signature: z.string().nullish(),\n\n /**\n * Set by the SDK on output assistant messages. The converter uses it to\n * decide which messages to drop when compacting under\n * `previousInteractionId`.\n */\n interactionId: z.string().nullish(),\n\n /**\n * Maximum time, in milliseconds, to poll a background interaction (agent\n * call) before giving up. Defaults to 30 minutes. Long-running agents\n * such as deep research can take tens of minutes — increase if needed.\n */\n pollingTimeoutMs: z.number().int().positive().nullish(),\n\n /**\n * Run the interaction in the background. Required for agents whose\n * server-side workflow cannot complete within a single request/response.\n * When `true`, the POST returns with a non-terminal status and the SDK\n * polls `GET /interactions/{id}` until the work completes. Some agents\n * reject `true`; see the agent's documentation for which mode it\n * requires.\n */\n background: z.boolean().nullish(),\n\n /**\n * Environment configuration for the agent sandbox. Only applies to agent\n * calls (`google.interactions({ agent })`); ignored on model-id calls.\n *\n * - `\"remote\"`: provision a fresh sandbox for this call.\n * - any other string: an existing `environment_id` to reuse.\n * - object: provision a fresh sandbox and optionally preload `sources`\n * and/or constrain outbound traffic via `network`.\n */\n environment: z\n .union([\n z.string(),\n z.object({\n type: z.literal('remote'),\n sources: z\n .array(\n z.union([\n z.object({\n type: z.literal('gcs'),\n source: z.string(),\n target: z.string().nullish(),\n }),\n z.object({\n type: z.literal('repository'),\n source: z.string(),\n target: z.string().nullish(),\n }),\n z.object({\n type: z.literal('inline'),\n content: z.string(),\n target: z.string(),\n }),\n ]),\n )\n .nullish(),\n network: z\n .union([\n z.literal('disabled'),\n z.object({\n allowlist: z.array(\n z.object({\n domain: z.string(),\n transform: z\n .array(z.record(z.string(), z.string()))\n .nullish(),\n }),\n ),\n }),\n ])\n .nullish(),\n }),\n ])\n .nullish(),\n }),\n ),\n);\n\nexport type GoogleLanguageModelInteractionsOptions = InferSchema<\n typeof googleInteractionsLanguageModelOptions\n>;\n","import type { JSONValue, LanguageModelV4Content } from '@ai-sdk/provider';\nimport type { GoogleInteractionsStep } from './google-interactions-api';\nimport {\n annotationsToSources,\n builtinToolResultToSources,\n} from './extract-google-interactions-sources';\nimport type {\n GoogleInteractionsAnnotation,\n GoogleInteractionsBuiltinToolResultContent,\n} from './google-interactions-prompt';\n\nexport type ParseGoogleInteractionsOutputsResult = {\n content: Array<LanguageModelV4Content>;\n hasFunctionCall: boolean;\n};\n\n/*\n * Builds a `providerMetadata.google` payload for an output part so the\n * Interactions converter on the next turn can read both the per-step\n * `signature` (round-trip) and the parent `interactionId` (history compaction\n * under `previousInteractionId`).\n */\nfunction googleProviderMetadata({\n signature,\n interactionId,\n}: {\n signature?: string | null;\n interactionId?: string;\n}): { providerMetadata: { google: Record<string, string> } } | object {\n const google: Record<string, string> = {};\n if (signature != null) {\n google.signature = signature;\n }\n if (interactionId != null) {\n google.interactionId = interactionId;\n }\n return Object.keys(google).length > 0 ? { providerMetadata: { google } } : {};\n}\n\nconst BUILTIN_TOOL_CALL_TYPES = new Set([\n 'google_search_call',\n 'code_execution_call',\n 'url_context_call',\n 'file_search_call',\n 'google_maps_call',\n 'mcp_server_tool_call',\n]);\n\nconst BUILTIN_TOOL_RESULT_TYPES = new Set([\n 'google_search_result',\n 'code_execution_result',\n 'url_context_result',\n 'file_search_result',\n 'google_maps_result',\n 'mcp_server_tool_result',\n]);\n\nfunction builtinToolNameFromCallType(type: string): string {\n return type.replace(/_call$/, '');\n}\n\nfunction builtinToolNameFromResultType(type: string): string {\n return type.replace(/_result$/, '');\n}\n\n/**\n * Walks the `steps[]` array of an Interactions response and emits AI SDK\n * `LanguageModelV4Content[]`. Surfaces:\n *\n * - `model_output` steps: iterates `step.content[]` for `text` (with\n * annotations → source parts) and `image` content blocks.\n * - `thought` steps: emits a single `reasoning` part from `summary[*]`.\n * - `function_call` steps: emits a `tool-call` part directly.\n * - Built-in tool `*_call` / `*_result` steps (Google Search, Code Execution,\n * URL Context, File Search, Google Maps, MCP Server): emits\n * `tool-call`/`tool-result` parts with `providerExecuted: true`.\n * - `user_input` steps are skipped (they echo the client's input).\n */\nexport function parseGoogleInteractionsOutputs({\n steps,\n generateId,\n interactionId,\n}: {\n steps: Array<GoogleInteractionsStep> | null | undefined;\n generateId: () => string;\n /**\n * Top-level `Interaction.id` on the response. Stamped onto each output\n * part's `providerMetadata.google.interactionId` so the converter can drop\n * matching assistant turns when `previousInteractionId` is used on the\n * next turn (compaction).\n */\n interactionId?: string;\n}): ParseGoogleInteractionsOutputsResult {\n const content: Array<LanguageModelV4Content> = [];\n let hasFunctionCall = false;\n\n if (steps == null) {\n return { content, hasFunctionCall };\n }\n\n for (const step of steps) {\n if (step == null || typeof step !== 'object') continue;\n const type = (step as { type?: string }).type;\n if (typeof type !== 'string') continue;\n\n switch (type) {\n case 'user_input': {\n break;\n }\n case 'model_output': {\n const blocks =\n (step as { content?: Array<{ type?: string; [k: string]: unknown }> })\n .content ?? [];\n for (const block of blocks) {\n if (block == null || typeof block !== 'object') continue;\n const blockType = block.type;\n if (blockType === 'text') {\n const text = (block as { text?: string }).text ?? '';\n const annotations = (\n block as {\n annotations?: Array<GoogleInteractionsAnnotation>;\n }\n ).annotations;\n content.push({\n type: 'text',\n text,\n ...googleProviderMetadata({ interactionId }),\n });\n const sources = annotationsToSources({ annotations, generateId });\n for (const source of sources) {\n content.push(source);\n }\n } else if (blockType === 'image') {\n const image = block as {\n data?: string;\n mime_type?: string;\n uri?: string;\n };\n if (image.data != null && image.data.length > 0) {\n content.push({\n type: 'file',\n mediaType: image.mime_type ?? 'image/png',\n data: { type: 'data', data: image.data },\n ...googleProviderMetadata({ interactionId }),\n });\n } else if (image.uri != null && image.uri.length > 0) {\n content.push({\n type: 'file',\n mediaType: image.mime_type ?? 'image/png',\n data: { type: 'url', url: new URL(image.uri) },\n ...googleProviderMetadata({ interactionId }),\n });\n }\n }\n }\n break;\n }\n case 'thought': {\n const thought = step as {\n signature?: string;\n summary?: Array<{ type: string; text?: string }>;\n };\n const summary = Array.isArray(thought.summary) ? thought.summary : [];\n const text = summary\n .filter(\n item => item?.type === 'text' && typeof item.text === 'string',\n )\n .map(item => item.text as string)\n .join('\\n');\n content.push({\n type: 'reasoning',\n text,\n ...googleProviderMetadata({\n signature: thought.signature,\n interactionId,\n }),\n });\n break;\n }\n case 'function_call': {\n hasFunctionCall = true;\n const call = step as {\n id: string;\n name: string;\n arguments?: Record<string, unknown> | null;\n signature?: string | null;\n };\n content.push({\n type: 'tool-call',\n toolCallId: call.id,\n toolName: call.name,\n input: JSON.stringify(call.arguments ?? {}),\n ...googleProviderMetadata({\n signature: call.signature,\n interactionId,\n }),\n });\n break;\n }\n default: {\n if (BUILTIN_TOOL_CALL_TYPES.has(type)) {\n const call = step as {\n id?: string;\n arguments?: Record<string, unknown>;\n name?: string;\n server_name?: string;\n };\n const toolName =\n type === 'mcp_server_tool_call'\n ? (call.name ?? 'mcp_server_tool')\n : builtinToolNameFromCallType(type);\n const input = JSON.stringify(call.arguments ?? {});\n content.push({\n type: 'tool-call',\n toolCallId: call.id ?? generateId(),\n toolName,\n input,\n providerExecuted: true,\n });\n } else if (BUILTIN_TOOL_RESULT_TYPES.has(type)) {\n const result = step as {\n call_id?: string;\n result?: unknown;\n is_error?: boolean;\n name?: string;\n };\n const toolName =\n type === 'mcp_server_tool_result'\n ? (result.name ?? 'mcp_server_tool')\n : builtinToolNameFromResultType(type);\n content.push({\n type: 'tool-result',\n toolCallId: result.call_id ?? generateId(),\n toolName,\n result: (result.result ?? null) as NonNullable<JSONValue>,\n });\n const sources = builtinToolResultToSources({\n block:\n step as unknown as GoogleInteractionsBuiltinToolResultContent,\n generateId,\n });\n for (const source of sources) {\n content.push(source);\n }\n }\n break;\n }\n }\n }\n\n return { content, hasFunctionCall };\n}\n","import {\n createJsonResponseHandler,\n delay,\n getFromApi,\n isAbortError,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { googleFailedResponseHandler } from '../google-error';\nimport { cancelGoogleInteraction } from './cancel-google-interaction';\nimport {\n googleInteractionsResponseSchema,\n type GoogleInteractionsResponse,\n} from './google-interactions-api';\nimport type { GoogleInteractionsStatus } from './google-interactions-prompt';\n\nconst TERMINAL_STATUSES: ReadonlySet<GoogleInteractionsStatus | string> =\n new Set(['completed', 'failed', 'cancelled', 'incomplete']);\n\nexport function isTerminalStatus(\n status: GoogleInteractionsStatus | string | null | undefined,\n): boolean {\n return status != null && TERMINAL_STATUSES.has(status);\n}\n\n/*\n * Default polling cadence for background interactions. Starts at 1 s, doubles\n * each tick up to a 10 s ceiling, and gives up after 30 minutes -- agent runs\n * such as deep research can take tens of minutes server-side, so we err on\n * the long side rather than truncate a real run. Override per-call via\n * `providerOptions.google.pollingTimeoutMs`.\n */\nconst DEFAULT_INITIAL_DELAY_MS = 1000;\nconst DEFAULT_MAX_DELAY_MS = 10000;\nconst DEFAULT_TIMEOUT_MS = 30 * 60 * 1000;\n\nexport type PollGoogleInteractionResult = {\n response: GoogleInteractionsResponse;\n rawResponse: unknown;\n responseHeaders: Record<string, string> | undefined;\n};\n\n/**\n * Polls `GET {baseURL}/interactions/{id}` until the response status is\n * terminal (`completed` / `failed` / `cancelled` / `incomplete`). Throws if\n * the polling loop exceeds `timeoutMs`, the response has no `id` to poll on,\n * or the abort signal fires.\n */\nexport async function pollGoogleInteractionUntilTerminal({\n baseURL,\n interactionId,\n headers,\n fetch,\n abortSignal,\n initialDelayMs = DEFAULT_INITIAL_DELAY_MS,\n maxDelayMs = DEFAULT_MAX_DELAY_MS,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n}: {\n baseURL: string;\n interactionId: string | null | undefined;\n headers: Record<string, string | undefined>;\n fetch?: FetchFunction;\n abortSignal?: AbortSignal;\n initialDelayMs?: number;\n maxDelayMs?: number;\n timeoutMs?: number;\n}): Promise<PollGoogleInteractionResult> {\n if (interactionId == null || interactionId.length === 0) {\n throw new Error(\n 'google.interactions: cannot poll a background interaction without an id. ' +\n 'The POST response did not include an interaction id.',\n );\n }\n\n const startedAt = Date.now();\n let nextDelayMs = initialDelayMs;\n const url = `${baseURL}/interactions/${encodeURIComponent(interactionId)}`;\n\n /*\n * When the caller aborts, fire a best-effort `POST /interactions/{id}/cancel`\n * so the run stops billing on Google's side. Wrap every exit path that's\n * triggered by an abort -- the explicit `abortSignal.aborted` check, the\n * AbortError thrown by `delay()`, and any AbortError thrown by `getFromApi`.\n */\n const cancelOnServer = () =>\n cancelGoogleInteraction({ baseURL, interactionId, headers, fetch });\n\n try {\n while (true) {\n if (abortSignal?.aborted) {\n await cancelOnServer();\n throw new DOMException('Polling was aborted', 'AbortError');\n }\n\n if (Date.now() - startedAt > timeoutMs) {\n throw new Error(\n `google.interactions: timed out polling interaction ${interactionId} after ${timeoutMs}ms.`,\n );\n }\n\n await delay(nextDelayMs, { abortSignal });\n\n const {\n value: response,\n rawValue: rawResponse,\n responseHeaders,\n } = await getFromApi({\n url,\n headers,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n googleInteractionsResponseSchema,\n ),\n abortSignal,\n fetch,\n });\n\n if (isTerminalStatus(response.status)) {\n return { response, rawResponse, responseHeaders };\n }\n\n nextDelayMs = Math.min(nextDelayMs * 2, maxDelayMs);\n }\n } catch (error) {\n if (isAbortError(error)) {\n await cancelOnServer();\n }\n throw error;\n }\n}\n","import {\n combineHeaders,\n getRuntimeEnvironmentUserAgent,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\n\nconst getOriginalFetch = () => globalThis.fetch;\n\n/**\n * Best-effort `POST /interactions/{id}/cancel` to stop a background interaction\n * on Google's side after the caller has aborted locally. Errors and non-2xx\n * responses are swallowed so a cancel failure cannot mask the original abort.\n *\n * Skips the request entirely if `interactionId` is missing/empty -- e.g. when\n * the interaction was created with `store: false` and the API did not return an\n * id.\n */\nexport async function cancelGoogleInteraction({\n baseURL,\n interactionId,\n headers,\n fetch = getOriginalFetch(),\n}: {\n baseURL: string;\n interactionId: string | null | undefined;\n headers: Record<string, string | undefined>;\n fetch?: FetchFunction;\n}): Promise<void> {\n if (interactionId == null || interactionId.length === 0) {\n return;\n }\n\n const url = `${baseURL}/interactions/${encodeURIComponent(interactionId)}/cancel`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: withUserAgentSuffix(\n combineHeaders({ 'Content-Type': 'application/json' }, headers),\n getRuntimeEnvironmentUserAgent(),\n ),\n body: '{}',\n });\n\n /*\n * Drain the body so undici/Node can return the connection to the pool.\n * Errors (e.g. non-2xx, network failure) are intentionally ignored: this\n * is a best-effort cleanup and must not throw past the caller, which is\n * already handling an aborted/failed run.\n */\n try {\n await response.text();\n } catch {\n // ignore\n }\n } catch {\n // ignore -- cancel is best-effort\n }\n}\n","import type {\n LanguageModelV4CallOptions,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport type {\n GoogleInteractionsTool,\n GoogleInteractionsToolChoice,\n} from './google-interactions-prompt';\n\nexport type PrepareGoogleInteractionsToolsResult = {\n tools: Array<GoogleInteractionsTool> | undefined;\n toolChoice: GoogleInteractionsToolChoice | undefined;\n toolWarnings: Array<SharedV4Warning>;\n};\n\n/**\n * Maps AI SDK tool definitions and `toolChoice` onto the Gemini Interactions\n * `tools[]` and `tool_choice` request fields.\n *\n * AI SDK function tools (`{ type: 'function', name, description, inputSchema }`)\n * map to Interactions `{ type: 'function', name, description, parameters }`,\n * with `parameters` passed through as plain JSON Schema (per\n * `googleapis/js-genai` `samples/interactions_tool_call_with_functions.ts` and\n * `src/interactions/resources/interactions.ts` `Function.parameters: unknown`).\n *\n * Provider-defined tools (`{ type: 'provider', id: 'google.<name>', args }`)\n * map to the discriminated `Tool` union. The full set of\n * provider-defined tool ids supported here:\n *\n * - `google.google_search` -> `{ type: 'google_search', search_types? }`\n * - `google.code_execution` -> `{ type: 'code_execution' }`\n * - `google.url_context` -> `{ type: 'url_context' }`\n * - `google.file_search` -> `{ type: 'file_search', file_search_store_names?, top_k?, metadata_filter? }`\n * - `google.google_maps` -> `{ type: 'google_maps', latitude?, longitude?, enable_widget? }`\n * - `google.computer_use` -> `{ type: 'computer_use', environment?, excludedPredefinedFunctions? }`\n * - `google.mcp_server` -> `{ type: 'mcp_server', name?, url?, headers?, allowed_tools? }`\n * - `google.retrieval` -> `{ type: 'retrieval', retrieval_types?, vertex_ai_search_config? }`\n *\n * `toolChoice` shapes:\n * - `'auto'` -> `'auto'`\n * - `'required'` -> `'any'`\n * - `'none'` -> `'none'`\n * - `{ type: 'tool', toolName }` -> `{ allowed_tools: { mode: 'validated', tools: [name] } }`\n * (Interactions `AllowedTools.tools` is an `Array<string>` of function\n * names, not tool descriptors -- see `src/interactions/resources/interactions.ts`\n * line ~151).\n */\nexport function prepareGoogleInteractionsTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV4CallOptions['tools'];\n toolChoice?: LanguageModelV4CallOptions['toolChoice'];\n}): PrepareGoogleInteractionsToolsResult {\n const toolWarnings: Array<SharedV4Warning> = [];\n\n const normalized = tools?.length ? tools : undefined;\n\n if (normalized == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const interactionsTools: Array<GoogleInteractionsTool> = [];\n\n for (const tool of normalized) {\n if (tool.type === 'function') {\n interactionsTools.push({\n type: 'function',\n name: tool.name,\n description: tool.description ?? '',\n parameters: tool.inputSchema,\n });\n continue;\n }\n\n if (tool.type === 'provider') {\n const args = (tool.args ?? {}) as Record<string, unknown>;\n switch (tool.id) {\n case 'google.google_search': {\n const searchTypesArg = args.searchTypes as\n | { webSearch?: unknown; imageSearch?: unknown }\n | undefined;\n let search_types:\n | Array<'web_search' | 'image_search' | 'enterprise_web_search'>\n | undefined;\n if (searchTypesArg != null && typeof searchTypesArg === 'object') {\n const list: Array<\n 'web_search' | 'image_search' | 'enterprise_web_search'\n > = [];\n if (searchTypesArg.webSearch != null) list.push('web_search');\n if (searchTypesArg.imageSearch != null) list.push('image_search');\n if (list.length > 0) {\n search_types = list;\n }\n }\n interactionsTools.push({\n type: 'google_search',\n ...(search_types != null ? { search_types } : {}),\n });\n break;\n }\n case 'google.code_execution': {\n interactionsTools.push({ type: 'code_execution' });\n break;\n }\n case 'google.url_context': {\n interactionsTools.push({ type: 'url_context' });\n break;\n }\n case 'google.file_search': {\n interactionsTools.push({\n type: 'file_search',\n ...(args.fileSearchStoreNames != null\n ? {\n file_search_store_names:\n args.fileSearchStoreNames as Array<string>,\n }\n : {}),\n ...(args.topK != null ? { top_k: args.topK as number } : {}),\n ...(args.metadataFilter != null\n ? { metadata_filter: args.metadataFilter as string }\n : {}),\n });\n break;\n }\n case 'google.google_maps': {\n interactionsTools.push({\n type: 'google_maps',\n ...(args.latitude != null\n ? { latitude: args.latitude as number }\n : {}),\n ...(args.longitude != null\n ? { longitude: args.longitude as number }\n : {}),\n ...(args.enableWidget != null\n ? { enable_widget: args.enableWidget as boolean }\n : {}),\n });\n break;\n }\n case 'google.computer_use': {\n interactionsTools.push({\n type: 'computer_use',\n environment:\n (args.environment as 'browser' | undefined) ?? 'browser',\n ...(args.excludedPredefinedFunctions != null\n ? {\n excludedPredefinedFunctions:\n args.excludedPredefinedFunctions as Array<string>,\n }\n : {}),\n });\n break;\n }\n case 'google.mcp_server': {\n interactionsTools.push({\n type: 'mcp_server',\n ...(args.name != null ? { name: args.name as string } : {}),\n ...(args.url != null ? { url: args.url as string } : {}),\n ...(args.headers != null\n ? { headers: args.headers as Record<string, string> }\n : {}),\n ...(args.allowedTools != null\n ? { allowed_tools: args.allowedTools as Array<unknown> }\n : {}),\n });\n break;\n }\n case 'google.retrieval': {\n const vertexAiSearchConfig =\n (args.vertexAiSearchConfig as\n | { datastores?: Array<string>; engine?: string }\n | undefined) ?? undefined;\n interactionsTools.push({\n type: 'retrieval',\n ...(args.retrievalTypes != null\n ? {\n retrieval_types:\n args.retrievalTypes as Array<'vertex_ai_search'>,\n }\n : { retrieval_types: ['vertex_ai_search'] }),\n ...(vertexAiSearchConfig != null\n ? { vertex_ai_search_config: vertexAiSearchConfig }\n : {}),\n });\n break;\n }\n default: {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n details: `provider-defined tool ${tool.id} is not supported by google.interactions; tool dropped.`,\n });\n break;\n }\n }\n continue;\n }\n\n toolWarnings.push({\n type: 'unsupported',\n feature: `tool of type ${(tool as { type: string }).type}`,\n details:\n 'Only function tools and google.* provider-defined tools are supported by google.interactions; tool dropped.',\n });\n }\n\n /*\n * `tool_choice` on the Interactions API governs function calling only -- the\n * API rejects requests with `tool_choice` set when no `function` tools are\n * present (`{\"error\":{\"message\":\"Function calling config is set without\n * function_declarations.\"}}`). Drop `tool_choice` when the resolved tool\n * list is empty or contains no function tools.\n */\n const hasFunctionTool = interactionsTools.some(t => t.type === 'function');\n\n let mappedToolChoice: GoogleInteractionsToolChoice | undefined;\n if (toolChoice != null && hasFunctionTool) {\n switch (toolChoice.type) {\n case 'auto':\n mappedToolChoice = 'auto';\n break;\n case 'required':\n mappedToolChoice = 'any';\n break;\n case 'none':\n mappedToolChoice = 'none';\n break;\n case 'tool':\n mappedToolChoice = {\n allowed_tools: {\n mode: 'validated',\n tools: [toolChoice.toolName],\n },\n };\n break;\n }\n }\n\n return {\n tools: interactionsTools.length > 0 ? interactionsTools : undefined,\n toolChoice: mappedToolChoice,\n toolWarnings,\n };\n}\n","import {\n createEventSourceResponseHandler,\n delay,\n getFromApi,\n isAbortError,\n type FetchFunction,\n type ParseResult,\n} from '@ai-sdk/provider-utils';\nimport { googleFailedResponseHandler } from '../google-error';\nimport { cancelGoogleInteraction } from './cancel-google-interaction';\nimport {\n googleInteractionsEventSchema,\n type GoogleInteractionsEvent,\n} from './google-interactions-api';\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_DELAY_MS = 500;\n\n/**\n * Connects to `GET {baseURL}/interactions/{id}?stream=true` and surfaces the\n * server-sent events as a `ReadableStream<ParseResult<GoogleInteractionsEvent>>`\n * so the existing `buildGoogleInteractionsStreamTransform` can consume them\n * unchanged.\n *\n * The connection can drop mid-run: long-running agents idle for long\n * stretches between SSE events and undici's default body timeout terminates\n * the request with `UND_ERR_BODY_TIMEOUT`. We track the last seen `event_id`\n * and reconnect with `?last_event_id=<id>` on any unexpected end. After\n * `maxRetries` consecutive failures the stream errors out so the caller can\n * decide whether to fall back to polling.\n *\n * The stream completes cleanly when an `interaction.complete` event with a\n * terminal status arrives, or when an `error` event arrives.\n */\nexport function streamGoogleInteractionEvents({\n baseURL,\n interactionId,\n headers,\n fetch,\n abortSignal,\n maxRetries = DEFAULT_MAX_RETRIES,\n retryDelayMs = DEFAULT_RETRY_DELAY_MS,\n}: {\n baseURL: string;\n interactionId: string;\n headers: Record<string, string | undefined>;\n fetch?: FetchFunction;\n abortSignal?: AbortSignal;\n maxRetries?: number;\n retryDelayMs?: number;\n}): ReadableStream<ParseResult<GoogleInteractionsEvent>> {\n if (interactionId.length === 0) {\n throw new Error(\n 'google.interactions: cannot stream a background interaction without an id.',\n );\n }\n\n const eventSourceHeaders = {\n ...headers,\n accept: 'text/event-stream',\n };\n\n let lastEventId: string | undefined;\n let complete = false;\n let attempt = 0;\n let receivedAnyEventThisAttempt = false;\n let currentReader:\n | ReadableStreamDefaultReader<ParseResult<GoogleInteractionsEvent>>\n | undefined;\n\n /*\n * Forwards `cancel()` from the consumer (and the upstream `abortSignal`) to\n * any in-flight `getFromApi` or `delay` so the loop unblocks immediately\n * instead of waiting for the next iteration to notice a flag.\n */\n const internalAbort = new AbortController();\n const upstreamAbortHandler = () => internalAbort.abort();\n if (abortSignal != null) {\n if (abortSignal.aborted) {\n internalAbort.abort();\n } else {\n abortSignal.addEventListener('abort', upstreamAbortHandler, {\n once: true,\n });\n }\n }\n const effectiveSignal = internalAbort.signal;\n\n function buildUrl(): string {\n const base = `${baseURL}/interactions/${encodeURIComponent(interactionId)}`;\n const params = new URLSearchParams({ stream: 'true' });\n if (lastEventId != null) {\n params.set('last_event_id', lastEventId);\n }\n return `${base}?${params.toString()}`;\n }\n\n async function openReader() {\n const { value: stream } = await getFromApi({\n url: buildUrl(),\n headers: eventSourceHeaders,\n failedResponseHandler: googleFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n googleInteractionsEventSchema,\n ),\n abortSignal: effectiveSignal,\n fetch,\n });\n return stream.getReader();\n }\n\n return new ReadableStream<ParseResult<GoogleInteractionsEvent>>({\n async start(controller) {\n try {\n while (!complete && !effectiveSignal.aborted) {\n if (currentReader == null) {\n try {\n currentReader = await openReader();\n receivedAnyEventThisAttempt = false;\n } catch (error) {\n if (isAbortError(error) || effectiveSignal.aborted) {\n controller.error(error);\n return;\n }\n attempt++;\n if (attempt >= maxRetries) {\n controller.error(error);\n return;\n }\n await delay(retryDelayMs * attempt, {\n abortSignal: effectiveSignal,\n });\n continue;\n }\n }\n\n try {\n const { done, value } = await currentReader.read();\n if (done) {\n /*\n * Underlying stream ended. If we already saw the terminal event\n * we exit cleanly; otherwise this is an unexpected disconnect\n * and we'll reconnect with `last_event_id`.\n *\n * If the connection closed without producing any events at all\n * this attempt, count it as a failed attempt -- otherwise an\n * empty/misbehaving server response would loop forever.\n */\n currentReader = undefined;\n if (complete) break;\n if (!receivedAnyEventThisAttempt) {\n attempt++;\n if (attempt >= maxRetries) {\n controller.error(\n new Error(\n 'google.interactions: SSE stream closed without producing any events.',\n ),\n );\n return;\n }\n await delay(retryDelayMs * attempt, {\n abortSignal: effectiveSignal,\n });\n } else {\n attempt = 0;\n }\n continue;\n }\n\n receivedAnyEventThisAttempt = true;\n\n if (value.success) {\n const ev = value.value as {\n event_id?: string;\n event_type?: string;\n };\n if (typeof ev.event_id === 'string' && ev.event_id.length > 0) {\n lastEventId = ev.event_id;\n }\n if (\n ev.event_type === 'interaction.completed' ||\n ev.event_type === 'error'\n ) {\n complete = true;\n }\n }\n\n controller.enqueue(value);\n } catch (error) {\n if (isAbortError(error) || effectiveSignal.aborted) {\n controller.error(error);\n return;\n }\n currentReader = undefined;\n attempt++;\n if (attempt >= maxRetries) {\n controller.error(error);\n return;\n }\n await delay(retryDelayMs * attempt, {\n abortSignal: effectiveSignal,\n });\n }\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n } finally {\n if (abortSignal != null) {\n abortSignal.removeEventListener('abort', upstreamAbortHandler);\n }\n currentReader?.cancel().catch(() => {});\n currentReader = undefined;\n\n /*\n * If we're exiting because the caller aborted (or the consumer\n * cancelled the stream) before the agent finished, fire\n * `POST /interactions/{id}/cancel` so the run stops billing on\n * Google's side. Skipped when `complete` is set -- the agent already\n * reported terminal status via `interaction.complete` / `error`.\n */\n if (effectiveSignal.aborted && !complete) {\n await cancelGoogleInteraction({\n baseURL,\n interactionId,\n headers,\n fetch,\n });\n }\n }\n },\n\n cancel() {\n internalAbort.abort();\n currentReader?.cancel().catch(() => {});\n currentReader = undefined;\n },\n });\n}\n","import type {\n LanguageModelV4FinishReason,\n LanguageModelV4StreamPart,\n SharedV4ProviderMetadata,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport { convertGoogleInteractionsUsage } from './convert-google-interactions-usage';\nimport { type GoogleInteractionsResponse } from './google-interactions-api';\nimport { mapGoogleInteractionsFinishReason } from './map-google-interactions-finish-reason';\nimport { parseGoogleInteractionsOutputs } from './parse-google-interactions-outputs';\n\n/**\n * Synthesizes a `LanguageModelV4StreamPart` stream from a fully-resolved\n * Interaction response (i.e. the `response` returned after polling a\n * `background: true` agent call to a terminal status).\n *\n * Agent calls cannot use SSE (`stream: true` is incompatible with\n * `background: true`), so we deterministically replay the polled outputs as a\n * stream sequence in the same order/shape `buildGoogleInteractionsStreamTransform`\n * would produce. Each text/reasoning block is emitted as a single delta — the\n * server has already produced the whole block by the time we synthesize.\n */\nexport function synthesizeGoogleInteractionsAgentStream({\n response,\n warnings,\n generateId,\n includeRawChunks,\n headerServiceTier,\n}: {\n response: GoogleInteractionsResponse;\n warnings: Array<SharedV4Warning>;\n generateId: () => string;\n includeRawChunks?: boolean;\n headerServiceTier?: string;\n}): ReadableStream<LanguageModelV4StreamPart> {\n return new ReadableStream<LanguageModelV4StreamPart>({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n\n const interactionId =\n typeof response.id === 'string' && response.id.length > 0\n ? response.id\n : undefined;\n\n let timestamp: Date | undefined;\n const created = response.created;\n if (typeof created === 'string') {\n const parsed = new Date(created);\n if (!Number.isNaN(parsed.getTime())) {\n timestamp = parsed;\n }\n }\n\n controller.enqueue({\n type: 'response-metadata',\n ...(interactionId != null ? { id: interactionId } : {}),\n modelId: response.model ?? undefined,\n ...(timestamp ? { timestamp } : {}),\n });\n\n if (includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: response });\n }\n\n const { content, hasFunctionCall } = parseGoogleInteractionsOutputs({\n steps: response.steps ?? null,\n generateId,\n interactionId,\n });\n\n let blockCounter = 0;\n const nextBlockId = () => `${interactionId ?? 'agent'}:${blockCounter++}`;\n\n for (const part of content) {\n switch (part.type) {\n case 'text': {\n const id = nextBlockId();\n const providerMetadata = part.providerMetadata;\n controller.enqueue({ type: 'text-start', id });\n if (part.text.length > 0) {\n controller.enqueue({ type: 'text-delta', id, delta: part.text });\n }\n controller.enqueue({\n type: 'text-end',\n id,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n break;\n }\n case 'reasoning': {\n const id = nextBlockId();\n const providerMetadata = part.providerMetadata;\n controller.enqueue({ type: 'reasoning-start', id });\n if (part.text.length > 0) {\n controller.enqueue({\n type: 'reasoning-delta',\n id,\n delta: part.text,\n });\n }\n controller.enqueue({\n type: 'reasoning-end',\n id,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n break;\n }\n case 'tool-call': {\n const providerMetadata = part.providerMetadata;\n controller.enqueue({\n type: 'tool-input-start',\n id: part.toolCallId,\n toolName: part.toolName,\n ...(part.providerExecuted\n ? { providerExecuted: part.providerExecuted }\n : {}),\n });\n controller.enqueue({\n type: 'tool-input-delta',\n id: part.toolCallId,\n delta: part.input,\n });\n controller.enqueue({\n type: 'tool-input-end',\n id: part.toolCallId,\n });\n controller.enqueue({\n type: 'tool-call',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...(part.providerExecuted\n ? { providerExecuted: part.providerExecuted }\n : {}),\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n break;\n }\n case 'tool-result': {\n controller.enqueue({\n type: 'tool-result',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n });\n break;\n }\n case 'source':\n case 'file': {\n controller.enqueue(part);\n break;\n }\n default:\n break;\n }\n }\n\n const serviceTier = response.service_tier ?? headerServiceTier;\n\n const finishReason: LanguageModelV4FinishReason = {\n unified: mapGoogleInteractionsFinishReason({\n status: response.status,\n hasFunctionCall,\n }),\n raw: response.status,\n };\n\n const providerMetadata: SharedV4ProviderMetadata = {\n google: {\n ...(interactionId != null ? { interactionId } : {}),\n ...(serviceTier != null ? { serviceTier } : {}),\n },\n };\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertGoogleInteractionsUsage(response.usage),\n providerMetadata,\n });\n\n controller.close();\n },\n });\n}\n"],"mappings":"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","names":["generateId","withUserAgentSuffix","lazySchema","zodSchema","z","lazySchema","zodSchema","z","responseHeaders","response","rawValue","lazySchema","zodSchema","z","combineHeaders","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","resolve","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","zodSchema","z","_a","_b","_c","_d","lazySchema","zodSchema","z","UnsupportedFunctionalityError","googleTools","functionDeclarations","UnsupportedFunctionalityError","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","googleTools","combineHeaders","resolve","postJsonToApi","createJsonResponseHandler","generateId","args","z","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","createProviderExecutedToolFactory","lazySchema","zodSchema","z","combineHeaders","convertToBase64","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","resolve","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","zodSchema","z","lazySchema","zodSchema","z","lazySchema","zodSchema","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","postJsonToApi","combineHeaders","resolve","createJsonResponseHandler","convertToBase64","lazySchema","zodSchema","z","combineHeaders","createJsonResponseHandler","lazySchema","parseProviderOptions","zodSchema","z","parseProviderOptions","combineHeaders","createJsonResponseHandler","lazySchema","zodSchema","z","AISDKError","combineHeaders","createJsonResponseHandler","delay","getFromApi","parseProviderOptions","postJsonToApi","resolve","z","lazySchema","zodSchema","z","parseProviderOptions","postJsonToApi","combineHeaders","resolve","createJsonResponseHandler","AISDKError","delay","getFromApi","z","combineHeaders","createEventSourceResponseHandler","createJsonResponseHandler","defaultGenerateId","parseProviderOptions","postJsonToApi","resolve","serializeModelOptions","WORKFLOW_DESERIALIZE","WORKFLOW_SERIALIZE","generateId","generateId","google","convertToBase64","getTopLevelMediaType","isFullMediaType","resolveFullMediaType","resolveProviderReference","lazySchema","zodSchema","z","usageSchema","lazySchema","zodSchema","z","google","BUILTIN_TOOL_CALL_TYPES","BUILTIN_TOOL_RESULT_TYPES","builtinToolNameFromCallType","builtinToolNameFromResultType","generateId","createJsonResponseHandler","delay","getFromApi","combineHeaders","delay","getFromApi","createJsonResponseHandler","createEventSourceResponseHandler","delay","getFromApi","isAbortError","getFromApi","createEventSourceResponseHandler","isAbortError","delay","generateId","providerMetadata","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","_a","combineHeaders","resolve","postJsonToApi","createJsonResponseHandler","defaultGenerateId","createEventSourceResponseHandler","withUserAgentSuffix","_a","generateId"]}
|