@ai-sdk/google 3.0.66 → 3.0.68

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/google-provider.ts","../src/version.ts","../src/google-generative-ai-embedding-model.ts","../src/google-error.ts","../src/google-generative-ai-embedding-options.ts","../src/google-generative-ai-language-model.ts","../src/convert-google-generative-ai-usage.ts","../src/convert-json-schema-to-openapi-schema.ts","../src/convert-to-google-generative-ai-messages.ts","../src/get-model-path.ts","../src/google-generative-ai-options.ts","../src/google-prepare-tools.ts","../src/google-json-accumulator.ts","../src/map-google-generative-ai-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-generative-ai-image-model.ts","../src/google-generative-ai-video-model.ts"],"sourcesContent":["import type {\n EmbeddingModelV3,\n Experimental_VideoModelV3,\n ImageModelV3,\n LanguageModelV3,\n ProviderV3,\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 { GoogleGenerativeAIEmbeddingModel } from './google-generative-ai-embedding-model';\nimport type { GoogleGenerativeAIEmbeddingModelId } from './google-generative-ai-embedding-options';\nimport { GoogleGenerativeAILanguageModel } from './google-generative-ai-language-model';\nimport type { GoogleGenerativeAIModelId } from './google-generative-ai-options';\nimport { googleTools } from './google-tools';\n\nimport type {\n GoogleGenerativeAIImageSettings,\n GoogleGenerativeAIImageModelId,\n} from './google-generative-ai-image-settings';\nimport { GoogleGenerativeAIImageModel } from './google-generative-ai-image-model';\nimport { GoogleGenerativeAIVideoModel } from './google-generative-ai-video-model';\nimport type { GoogleGenerativeAIVideoModelId } from './google-generative-ai-video-settings';\n\nexport interface GoogleGenerativeAIProvider extends ProviderV3 {\n (modelId: GoogleGenerativeAIModelId): LanguageModelV3;\n\n languageModel(modelId: GoogleGenerativeAIModelId): LanguageModelV3;\n\n chat(modelId: GoogleGenerativeAIModelId): LanguageModelV3;\n\n /**\n * Creates a model for image generation.\n */\n image(\n modelId: GoogleGenerativeAIImageModelId,\n settings?: GoogleGenerativeAIImageSettings,\n ): ImageModelV3;\n\n /**\n * @deprecated Use `chat()` instead.\n */\n generativeAI(modelId: GoogleGenerativeAIModelId): LanguageModelV3;\n\n /**\n * Creates a model for text embeddings.\n */\n embedding(modelId: GoogleGenerativeAIEmbeddingModelId): EmbeddingModelV3;\n\n /**\n * Creates a model for text embeddings.\n */\n embeddingModel(modelId: GoogleGenerativeAIEmbeddingModelId): EmbeddingModelV3;\n\n /**\n * @deprecated Use `embedding` instead.\n */\n textEmbedding(modelId: GoogleGenerativeAIEmbeddingModelId): EmbeddingModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(\n modelId: GoogleGenerativeAIEmbeddingModelId,\n ): EmbeddingModelV3;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: GoogleGenerativeAIVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(\n modelId: GoogleGenerativeAIVideoModelId,\n ): Experimental_VideoModelV3;\n\n tools: typeof googleTools;\n}\n\nexport interface GoogleGenerativeAIProviderSettings {\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 Generative AI provider instance.\n */\nexport function createGoogleGenerativeAI(\n options: GoogleGenerativeAIProviderSettings = {},\n): GoogleGenerativeAIProvider {\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: GoogleGenerativeAIModelId) =>\n new GoogleGenerativeAILanguageModel(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: GoogleGenerativeAIEmbeddingModelId) =>\n new GoogleGenerativeAIEmbeddingModel(modelId, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createImageModel = (\n modelId: GoogleGenerativeAIImageModelId,\n settings: GoogleGenerativeAIImageSettings = {},\n ) =>\n new GoogleGenerativeAIImageModel(modelId, settings, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: GoogleGenerativeAIVideoModelId) =>\n new GoogleGenerativeAIVideoModel(modelId, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n generateId: options.generateId ?? generateId,\n });\n\n const provider = function (modelId: GoogleGenerativeAIModelId) {\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 = 'v3' 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.tools = googleTools;\n\n return provider as GoogleGenerativeAIProvider;\n}\n\n/**\n * Default Google Generative AI provider instance.\n */\nexport const google = createGoogleGenerativeAI();\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 EmbeddingModelV3,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n resolve,\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 GoogleGenerativeAIEmbeddingModelId,\n} from './google-generative-ai-embedding-options';\n\ntype GoogleGenerativeAIEmbeddingConfig = {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class GoogleGenerativeAIEmbeddingModel implements EmbeddingModelV3 {\n readonly specificationVersion = 'v3';\n readonly modelId: GoogleGenerativeAIEmbeddingModelId;\n readonly maxEmbeddingsPerCall = 2048;\n readonly supportsParallelCalls = true;\n\n private readonly config: GoogleGenerativeAIEmbeddingConfig;\n\n get provider(): string {\n return this.config.provider;\n }\n constructor(\n modelId: GoogleGenerativeAIEmbeddingModelId,\n config: GoogleGenerativeAIEmbeddingConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n }\n\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions,\n }: Parameters<EmbeddingModelV3['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV3['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 await resolve(this.config.headers),\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 type InferSchema,\n lazySchema,\n zodSchema,\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 type InferSchema,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type GoogleGenerativeAIEmbeddingModelId =\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]);\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 LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3Source,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n JSONObject,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n resolve,\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 convertGoogleGenerativeAIUsage,\n type GoogleGenerativeAIUsageMetadata,\n} from './convert-google-generative-ai-usage';\nimport { convertJSONSchemaToOpenAPISchema } from './convert-json-schema-to-openapi-schema';\nimport { convertToGoogleGenerativeAIMessages } from './convert-to-google-generative-ai-messages';\nimport { getModelPath } from './get-model-path';\nimport { googleFailedResponseHandler } from './google-error';\nimport {\n googleLanguageModelOptions,\n VertexServiceTierMap,\n type GoogleGenerativeAIModelId,\n} from './google-generative-ai-options';\nimport type {\n GoogleGenerativeAIContentPart,\n GoogleGenerativeAIProviderMetadata,\n} from './google-generative-ai-prompt';\nimport { prepareTools } from './google-prepare-tools';\nimport {\n GoogleJSONAccumulator,\n type PartialArg,\n} from './google-json-accumulator';\nimport { mapGoogleGenerativeAIFinishReason } from './map-google-generative-ai-finish-reason';\n\ntype GoogleGenerativeAIConfig = {\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?: () => LanguageModelV3['supportedUrls'];\n};\n\nexport class GoogleGenerativeAILanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\n\n readonly modelId: GoogleGenerativeAIModelId;\n\n private readonly config: GoogleGenerativeAIConfig;\n private readonly generateId: () => string;\n\n constructor(\n modelId: GoogleGenerativeAIModelId,\n config: GoogleGenerativeAIConfig,\n ) {\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 providerOptions,\n }: LanguageModelV3CallOptions,\n { isStreaming = false }: { isStreaming?: boolean } = {},\n ) {\n const warnings: SharedV3Warning[] = [];\n\n const providerOptionsName = this.config.provider.includes('vertex')\n ? 'vertex'\n : 'google';\n let googleOptions = await parseProviderOptions({\n provider: providerOptionsName,\n providerOptions,\n schema: googleLanguageModelOptions,\n });\n\n if (googleOptions == null && providerOptionsName !== '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 // Vertex API requires another service tier format.\n let sanitizedServiceTier: string | undefined = googleOptions?.serviceTier;\n if (googleOptions?.serviceTier && isVertexProvider) {\n sanitizedServiceTier = VertexServiceTierMap[googleOptions.serviceTier];\n }\n\n const isGemmaModel = this.modelId.toLowerCase().startsWith('gemma-');\n const supportsFunctionResponseParts = this.modelId.startsWith('gemini-3');\n\n const { contents, systemInstruction } = convertToGoogleGenerativeAIMessages(\n prompt,\n {\n isGemmaModel,\n providerOptionsName,\n supportsFunctionResponseParts,\n },\n );\n\n const {\n tools: googleTools,\n toolConfig: googleToolConfig,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n modelId: this.modelId,\n });\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: googleOptions?.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: sanitizedServiceTier,\n },\n warnings: [...warnings, ...toolWarnings],\n providerOptionsName,\n };\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const { args, warnings, providerOptionsName } = await this.getArgs(options);\n\n const mergedHeaders = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\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<LanguageModelV3Content> = [];\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 ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n },\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 (\n 'functionCall' in part &&\n part.functionCall.name != null &&\n part.functionCall.args != null\n ) {\n content.push({\n type: 'tool-call' as const,\n toolCallId: this.config.generateId(),\n toolName: part.functionCall.name,\n input: JSON.stringify(part.functionCall.args),\n providerMetadata: part.thoughtSignature\n ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n },\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: 'file' as const,\n data: part.inlineData.data,\n mediaType: part.inlineData.mimeType,\n providerMetadata:\n hasThought || hasThoughtSignature\n ? {\n [providerOptionsName]: {\n ...(hasThought ? { thought: true } : {}),\n ...(hasThoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n },\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 ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n },\n }\n : {\n [providerOptionsName]: {\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n },\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 ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n },\n }\n : {\n [providerOptionsName]: {\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n },\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: mapGoogleGenerativeAIFinishReason({\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: convertGoogleGenerativeAIUsage(usageMetadata),\n warnings,\n providerMetadata: {\n [providerOptionsName]: {\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: response.serviceTier ?? null,\n } satisfies GoogleGenerativeAIProviderMetadata,\n },\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: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const { args, warnings, providerOptionsName } = await this.getArgs(\n options,\n { isStreaming: true },\n );\n\n const headers = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\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: LanguageModelV3FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage: GoogleGenerativeAIUsageMetadata | undefined = undefined;\n let providerMetadata: SharedV3ProviderMetadata | undefined = undefined;\n let lastGroundingMetadata: GroundingMetadataSchema | null = null;\n let lastUrlContextMetadata: UrlContextMetadataSchema | null = null;\n let serviceTier: string | 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?: SharedV3ProviderMetadata;\n }> = [];\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<ChunkSchema>,\n LanguageModelV3StreamPart\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 if (value.serviceTier != null) {\n serviceTier = value.serviceTier;\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 ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n },\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 =\n hasThought || hasThoughtSignature\n ? {\n [providerOptionsName]: {\n ...(hasThought ? { thought: true } : {}),\n ...(hasThoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n },\n }\n : undefined;\n controller.enqueue({\n type: 'file',\n mediaType: part.inlineData.mimeType,\n 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 = {\n [providerOptionsName]: {\n ...(part.thoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n },\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 = {\n [providerOptionsName]: {\n ...(part.thoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n },\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 ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n },\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\n if (isStreamingChunk) {\n if (\n part.functionCall.name != null &&\n part.functionCall.willContinue === true\n ) {\n const toolCallId = 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 { textDelta } = accumulator.processPartialArgs(\n part.functionCall.partialArgs as PartialArg[],\n );\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 }\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 { textDelta } = active.accumulator.processPartialArgs(\n part.functionCall.partialArgs as PartialArg[],\n );\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 }\n } else if (\n isTerminalChunk &&\n activeStreamingToolCalls.length > 0\n ) {\n const active = activeStreamingToolCalls.pop()!;\n const { finalJSON, closingDelta } =\n 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 } else if (isCompleteCall) {\n const toolCallId = 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 }\n }\n }\n\n if (candidate.finishReason != null) {\n finishReason = {\n unified: mapGoogleGenerativeAIFinishReason({\n finishReason: candidate.finishReason,\n hasToolCalls,\n }),\n raw: candidate.finishReason,\n };\n\n providerMetadata = {\n [providerOptionsName]: {\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,\n } satisfies GoogleGenerativeAIProviderMetadata,\n };\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: convertGoogleGenerativeAIUsage(usage),\n providerMetadata,\n });\n },\n }),\n ),\n response: { headers: responseHeaders },\n request: { body: args },\n };\n }\n}\n\nfunction getToolCallsFromParts({\n parts,\n generateId,\n providerOptionsName,\n}: {\n parts: ContentSchema['parts'];\n generateId: () => string;\n providerOptionsName: string;\n}) {\n const functionCallParts = parts?.filter(\n part => 'functionCall' in part,\n ) as Array<\n GoogleGenerativeAIContentPart & {\n functionCall: { name: string; args: unknown };\n thoughtSignature?: string | null;\n }\n >;\n\n return functionCallParts == null || functionCallParts.length === 0\n ? undefined\n : functionCallParts.map(part => ({\n type: 'tool-call' as const,\n toolCallId: generateId(),\n toolName: part.functionCall.name,\n args: JSON.stringify(part.functionCall.args),\n providerMetadata: part.thoughtSignature\n ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n },\n }\n : undefined,\n }));\n}\n\nfunction extractSources({\n groundingMetadata,\n generateId,\n}: {\n groundingMetadata: GroundingMetadataSchema | undefined | null;\n generateId: () => string;\n}): undefined | LanguageModelV3Source[] {\n if (!groundingMetadata?.groundingChunks) {\n return undefined;\n }\n\n const sources: LanguageModelV3Source[] = [];\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 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 // 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 serviceTier: z.string().nullish(),\n }),\n ),\n);\n\ntype ContentSchema = NonNullable<\n InferSchema<typeof responseSchema>['candidates'][number]['content']\n>;\nexport type GroundingMetadataSchema = NonNullable<\n InferSchema<typeof responseSchema>['candidates'][number]['groundingMetadata']\n>;\n\ntype GroundingChunkSchema = NonNullable<\n GroundingMetadataSchema['groundingChunks']\n>[number];\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 serviceTier: z.string().nullish(),\n }),\n ),\n);\n\ntype ChunkSchema = InferSchema<typeof chunkSchema>;\n","import type { LanguageModelV3Usage } from '@ai-sdk/provider';\n\nexport type GoogleGenerativeAITokenDetail = {\n modality: string;\n tokenCount: number;\n};\n\nexport type GoogleGenerativeAIUsageMetadata = {\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 promptTokensDetails?: GoogleGenerativeAITokenDetail[] | null;\n candidatesTokensDetails?: GoogleGenerativeAITokenDetail[] | null;\n};\n\nexport function convertGoogleGenerativeAIUsage(\n usage: GoogleGenerativeAIUsageMetadata | undefined | null,\n): LanguageModelV3Usage {\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 LanguageModelV3Prompt,\n} from '@ai-sdk/provider';\nimport { convertToBase64 } from '@ai-sdk/provider-utils';\nimport type {\n GoogleGenerativeAIContent,\n GoogleGenerativeAIContentPart,\n GoogleGenerativeAIFunctionResponsePart,\n GoogleGenerativeAIPrompt,\n} from './google-generative-ai-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): GoogleGenerativeAIFunctionResponsePart | 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: GoogleGenerativeAIContentPart[],\n toolName: string,\n outputValue: Array<{\n type: string;\n [key: string]: unknown;\n }>,\n): void {\n const functionResponseParts: GoogleGenerativeAIFunctionResponsePart[] = [];\n const responseTextParts: string[] = [];\n\n for (const contentPart of outputValue) {\n switch (contentPart.type) {\n case 'text': {\n responseTextParts.push(contentPart.text as string);\n break;\n }\n case 'image-data':\n case 'file-data': {\n functionResponseParts.push({\n inlineData: {\n mimeType: contentPart.mediaType as string,\n data: contentPart.data as string,\n },\n });\n break;\n }\n case 'image-url':\n case 'file-url': {\n const functionResponsePart = convertUrlToolResultPart(\n contentPart.url as string,\n );\n\n if (functionResponsePart != null) {\n functionResponseParts.push(functionResponsePart);\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 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: GoogleGenerativeAIContentPart[],\n toolName: string,\n outputValue: Array<{\n type: string;\n [key: string]: unknown;\n }>,\n): void {\n for (const contentPart of outputValue) {\n switch (contentPart.type) {\n case 'text':\n parts.push({\n functionResponse: {\n name: toolName,\n response: {\n name: toolName,\n content: contentPart.text,\n },\n },\n });\n break;\n case 'image-data':\n parts.push(\n {\n inlineData: {\n mimeType: String(contentPart.mediaType),\n data: String(contentPart.data),\n },\n },\n {\n text: 'Tool executed successfully and returned this image as a response',\n },\n );\n break;\n default:\n parts.push({ text: JSON.stringify(contentPart) });\n break;\n }\n }\n}\n\nexport function convertToGoogleGenerativeAIMessages(\n prompt: LanguageModelV3Prompt,\n options?: {\n isGemmaModel?: boolean;\n providerOptionsName?: string;\n supportsFunctionResponseParts?: boolean;\n },\n): GoogleGenerativeAIPrompt {\n const systemInstructionParts: Array<{ text: string }> = [];\n const contents: Array<GoogleGenerativeAIContent> = [];\n let systemMessagesAllowed = true;\n const isGemmaModel = options?.isGemmaModel ?? false;\n const providerOptionsName = options?.providerOptionsName ?? 'google';\n const supportsFunctionResponseParts =\n options?.supportsFunctionResponseParts ?? true;\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: GoogleGenerativeAIContentPart[] = [];\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 // default to image/jpeg for unknown image/* types\n const mediaType =\n part.mediaType === 'image/*' ? 'image/jpeg' : part.mediaType;\n\n parts.push(\n part.data instanceof URL\n ? {\n fileData: {\n mimeType: mediaType,\n fileUri: part.data.toString(),\n },\n }\n : {\n inlineData: {\n mimeType: mediaType,\n data: convertToBase64(part.data),\n },\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 =\n part.providerOptions?.[providerOptionsName] ??\n (providerOptionsName !== 'google'\n ? part.providerOptions?.google\n : part.providerOptions?.vertex);\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 'file': {\n if (part.data instanceof URL) {\n throw new UnsupportedFunctionalityError({\n functionality:\n 'File data URLs in assistant messages are not supported',\n });\n }\n\n return {\n inlineData: {\n mimeType: part.mediaType,\n data: convertToBase64(part.data),\n },\n ...(providerOpts?.thought === true\n ? { thought: true }\n : {}),\n thoughtSignature,\n };\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 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: GoogleGenerativeAIContentPart[] = [];\n\n for (const part of content) {\n if (part.type === 'tool-approval-response') {\n continue;\n }\n\n const partProviderOpts =\n part.providerOptions?.[providerOptionsName] ??\n (providerOptionsName !== 'google'\n ? part.providerOptions?.google\n : part.providerOptions?.vertex);\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(parts, part.toolName, output.value);\n } else {\n appendLegacyToolResultParts(parts, part.toolName, output.value);\n }\n } else {\n parts.push({\n functionResponse: {\n name: part.toolName,\n response: {\n name: part.toolName,\n content:\n output.type === 'execution-denied'\n ? (output.reason ?? 'Tool 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 GoogleGenerativeAIModelId =\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 // 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 Generative AI 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.\n */\n serviceTier: z.enum(['standard', 'flex', 'priority']).optional(),\n }),\n ),\n);\n\nexport type GoogleLanguageModelOptions = InferSchema<\n typeof googleLanguageModelOptions\n>;\n\n// Vertex API requires another service tier format.\nexport const VertexServiceTierMap = {\n standard: 'SERVICE_TIER_STANDARD',\n flex: 'SERVICE_TIER_FLEX',\n priority: 'SERVICE_TIER_PRIORITY',\n} as const;\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV3CallOptions,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport { convertJSONSchemaToOpenAPISchema } from './convert-json-schema-to-openapi-schema';\nimport type { GoogleGenerativeAIModelId } from './google-generative-ai-options';\n\nexport function prepareTools({\n tools,\n toolChoice,\n modelId,\n}: {\n tools: LanguageModelV3CallOptions['tools'];\n toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n modelId: GoogleGenerativeAIModelId;\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: SharedV3Warning[];\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: SharedV3Warning[] = [];\n\n const isLatest = (\n [\n 'gemini-flash-latest',\n 'gemini-flash-lite-latest',\n 'gemini-pro-latest',\n ] as const satisfies GoogleGenerativeAIModelId[]\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 includeServerSideToolInvocations: true,\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 { LanguageModelV3FinishReason } from '@ai-sdk/provider';\n\nexport function mapGoogleGenerativeAIFinishReason({\n finishReason,\n hasToolCalls,\n}: {\n finishReason: string | null | undefined;\n hasToolCalls: boolean;\n}): LanguageModelV3FinishReason['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 { createProviderToolFactoryWithOutputSchema } 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 = createProviderToolFactoryWithOutputSchema<\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 createProviderToolFactory,\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 = createProviderToolFactory<\n {\n // Enterprise Web Search does not have any input schema\n },\n {}\n>({\n id: 'google.enterprise_web_search',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderToolFactory,\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\nconst fileSearchArgsSchema = lazySchema(() =>\n zodSchema(fileSearchArgsBaseSchema),\n);\n\nexport const fileSearch = createProviderToolFactory<\n {},\n GoogleFileSearchToolArgs\n>({\n id: 'google.file_search',\n inputSchema: fileSearchArgsSchema,\n});\n","import {\n createProviderToolFactory,\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 = createProviderToolFactory<{}, {}>({\n id: 'google.google_maps',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderToolFactory,\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\nconst googleSearchToolArgsSchema = lazySchema(() =>\n zodSchema(googleSearchToolArgsBaseSchema),\n);\n\nexport const googleSearch = createProviderToolFactory<{}, GoogleSearchToolArgs>(\n {\n id: 'google.google_search',\n inputSchema: googleSearchToolArgsSchema,\n },\n);\n","import {\n createProviderToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const urlContext = createProviderToolFactory<\n {\n // Url context does not have any input schema, it will directly use the url from the prompt\n },\n {}\n>({\n id: 'google.url_context',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import { createProviderToolFactory } 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 = createProviderToolFactory<\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: z.object({\n ragCorpus: z.string(),\n topK: z.number().optional(),\n }),\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 ImageModelV3,\n LanguageModelV3Prompt,\n SharedV3Warning,\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 zodSchema,\n type FetchFunction,\n type Resolvable,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\nimport type {\n GoogleGenerativeAIImageModelId,\n GoogleGenerativeAIImageSettings,\n} from './google-generative-ai-image-settings';\nimport { GoogleGenerativeAILanguageModel } from './google-generative-ai-language-model';\nimport type { GoogleLanguageModelOptions } from './google-generative-ai-options';\n\ninterface GoogleGenerativeAIImageModelConfig {\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 GoogleGenerativeAIImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\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: GoogleGenerativeAIImageModelId,\n private readonly settings: GoogleGenerativeAIImageSettings,\n private readonly config: GoogleGenerativeAIImageModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['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<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['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<SharedV3Warning> = [];\n\n // Imagen API endpoints do not support image editing\n if (files != null && files.length > 0) {\n throw new Error(\n 'Google Generative AI 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 Generative AI 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(await resolve(this.config.headers), headers),\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<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['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<SharedV3Warning> = [];\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 // Build user message content for language model\n const userContent: Array<\n | { type: 'text'; text: string }\n | { type: 'file'; data: string | Uint8Array | URL; mediaType: string }\n > = [];\n\n // Add text prompt\n if (prompt != null) {\n userContent.push({ type: 'text', text: prompt });\n }\n\n // Add input images for editing\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: new URL(file.url),\n mediaType: 'image/*',\n });\n } else {\n userContent.push({\n type: 'file',\n data:\n typeof file.data === 'string'\n ? file.data\n : new Uint8Array(file.data),\n mediaType: file.mediaType,\n });\n }\n }\n }\n\n const languageModelPrompt: LanguageModelV3Prompt = [\n { role: 'user', content: userContent },\n ];\n\n // Instantiate language model\n const languageModel = new GoogleGenerativeAILanguageModel(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 // Extract images from language model response\n const images: string[] = [];\n for (const part of result.content) {\n if (part.type === 'file' && part.mediaType.startsWith('image/')) {\n images.push(convertToBase64(part.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\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\nconst 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 Experimental_VideoModelV3,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonResponseHandler,\n delay,\n type FetchFunction,\n getFromApi,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n type Resolvable,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\nimport type { GoogleGenerativeAIVideoModelId } from './google-generative-ai-video-settings';\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\ninterface GoogleGenerativeAIVideoModelConfig {\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 GoogleGenerativeAIVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\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: GoogleGenerativeAIVideoModelId,\n private readonly config: GoogleGenerativeAIVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\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\nconst 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"],"mappings":";AAOA;AAAA,EACE,cAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACXA,IAAM,UACX,OACI,WACA;;;ACLN;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,OAEK;AACP,SAAS,KAAAC,UAAS;;;ACdlB;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS;AAElB,IAAM,wBAAwB;AAAA,EAAW,MACvC;AAAA,IACE,EAAE,OAAO;AAAA,MACP,OAAO,EAAE,OAAO;AAAA,QACd,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC1B,SAAS,EAAE,OAAO;AAAA,QAClB,QAAQ,EAAE,OAAO;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAIO,IAAM,8BAA8B,+BAA+B;AAAA,EACxE,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK,MAAM;AACrC,CAAC;;;ACzBD;AAAA,EAEE,cAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;AAOlB,IAAM,mCAAmCA,GAAE,MAAM;AAAA,EAC/CA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,CAAC;AAAA,EAC7BA,GAAE,OAAO;AAAA,IACP,YAAYA,GAAE,OAAO;AAAA,MACnB,UAAUA,GAAE,OAAO;AAAA,MACnB,MAAMA,GAAE,OAAO;AAAA,IACjB,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAEM,IAAM,8BAA8BF;AAAA,EAAW,MACpDC;AAAA,IACEC,GAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKP,sBAAsBA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAc1C,UAAUA,GACP,KAAK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWZ,SAASA,GACN,MAAMA,GAAE,MAAM,gCAAgC,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,EACjE,SAAS;AAAA,IACd,CAAC;AAAA,EACH;AACF;;;AF1CO,IAAM,mCAAN,MAAmE;AAAA,EAWxE,YACE,SACA,QACA;AAbF,SAAS,uBAAuB;AAEhC,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AAW/B,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AAAA,EATA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EASA,MAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAEE;AAEA,UAAM,gBAAgB,MAAM,qBAAqB;AAAA,MAC/C,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,OAAO,SAAS,KAAK,sBAAsB;AAC7C,YAAM,IAAI,mCAAmC;AAAA,QAC3C,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,sBAAsB,KAAK;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,gBAAgB;AAAA,MACpB,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,oBAAoB,+CAAe;AAEzC,QACE,qBAAqB,QACrB,kBAAkB,WAAW,OAAO,QACpC;AACA,YAAM,IAAI;AAAA,QACR,6CAA6C,kBAAkB,MAAM,sCAAsC,OAAO,MAAM;AAAA,MAC1H;AAAA,IACF;AAGA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,aAAa,uDAAoB;AACvC,YAAM,WAAW,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;AACtD,YAAM,QACJ,cAAc,OACV,CAAC,GAAG,UAAU,GAAG,UAAU,IAC3B,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE,CAAC;AAE1B,YAAM;AAAA,QACJ,iBAAAC;AAAA,QACA,OAAOC;AAAA,QACP,UAAAC;AAAA,MACF,IAAI,MAAM,cAAc;AAAA,QACtB,KAAK,GAAG,KAAK,OAAO,OAAO,WAAW,KAAK,OAAO;AAAA,QAClD,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,OAAO,UAAU,KAAK,OAAO;AAAA,UAC7B,SAAS;AAAA,YACP;AAAA,UACF;AAAA,UACA,sBAAsB,+CAAe;AAAA,UACrC,UAAU,+CAAe;AAAA,QAC3B;AAAA,QACA,uBAAuB;AAAA,QACvB,2BAA2B;AAAA,UACzB;AAAA,QACF;AAAA,QACA;AAAA,QACA,OAAO,KAAK,OAAO;AAAA,MACrB,CAAC;AAED,aAAO;AAAA,QACL,UAAU,CAAC;AAAA,QACX,YAAY,CAACD,UAAS,UAAU,MAAM;AAAA,QACtC,OAAO;AAAA,QACP,UAAU,EAAE,SAASD,kBAAiB,MAAME,UAAS;AAAA,MACvD;AAAA,IACF;AAGA,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF,IAAI,MAAM,cAAc;AAAA,MACtB,KAAK,GAAG,KAAK,OAAO,OAAO,WAAW,KAAK,OAAO;AAAA,MAClD,SAAS;AAAA,MACT,MAAM;AAAA,QACJ,UAAU,OAAO,IAAI,CAAC,OAAO,UAAU;AACrC,gBAAM,aAAa,uDAAoB;AACvC,gBAAM,WAAW,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC;AAC9C,iBAAO;AAAA,YACL,OAAO,UAAU,KAAK,OAAO;AAAA,YAC7B,SAAS;AAAA,cACP,MAAM;AAAA,cACN,OACE,cAAc,OACV,CAAC,GAAG,UAAU,GAAG,UAAU,IAC3B,CAAC,EAAE,MAAM,MAAM,CAAC;AAAA,YACxB;AAAA,YACA,sBAAsB,+CAAe;AAAA,YACrC,UAAU,+CAAe;AAAA,UAC3B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,WAAO;AAAA,MACL,UAAU,CAAC;AAAA,MACX,YAAY,SAAS,WAAW,IAAI,UAAQ,KAAK,MAAM;AAAA,MACvD,OAAO;AAAA,MACP,UAAU,EAAE,SAAS,iBAAiB,MAAM,SAAS;AAAA,IACvD;AAAA,EACF;AACF;AAIA,IAAM,gDAAgDC;AAAA,EAAW,MAC/DC;AAAA,IACEC,GAAE,OAAO;AAAA,MACP,YAAYA,GAAE,MAAMA,GAAE,OAAO,EAAE,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,CAAC,CAAC;AAAA,IAC/D,CAAC;AAAA,EACH;AACF;AAGA,IAAM,kDAAkDF;AAAA,EAAW,MACjEC;AAAA,IACEC,GAAE,OAAO;AAAA,MACP,WAAWA,GAAE,OAAO,EAAE,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,CAAC;AAAA,IACrD,CAAC;AAAA,EACH;AACF;;;AG9KA;AAAA,EACE,kBAAAC;AAAA,EACA;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,OAKK;AACP,SAAS,KAAAC,UAAS;;;ACVX,SAAS,+BACd,OACsB;AApBxB;AAqBE,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,MACL,aAAa;AAAA,QACX,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,WAAW;AAAA,MACb;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAEA,QAAM,gBAAe,WAAM,qBAAN,YAA0B;AAC/C,QAAM,oBAAmB,WAAM,yBAAN,YAA8B;AACvD,QAAM,uBAAsB,WAAM,4BAAN,YAAiC;AAC7D,QAAM,kBAAiB,WAAM,uBAAN,YAA4B;AAEnD,SAAO;AAAA,IACL,aAAa;AAAA,MACX,OAAO;AAAA,MACP,SAAS,eAAe;AAAA,MACxB,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACZ,OAAO,mBAAmB;AAAA,MAC1B,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,IACA,KAAK;AAAA,EACP;AACF;;;ACpDO,SAAS,iCACd,YACA,SAAS,MACA;AAET,MAAI,cAAc,MAAM;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,oBAAoB,UAAU,GAAG;AACnC,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,eAAe,YAAY,WAAW,aAAa;AAC5D,aAAO,EAAE,MAAM,UAAU,aAAa,WAAW,YAAY;AAAA,IAC/D;AACA,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AAEA,MAAI,OAAO,eAAe,WAAW;AACnC,WAAO,EAAE,MAAM,WAAW,YAAY,CAAC,EAAE;AAAA,EAC3C;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,MAAM;AAAA,EACR,IAAI;AAEJ,QAAM,SAAkC,CAAC;AAEzC,MAAI,YAAa,QAAO,cAAc;AACtC,MAAI,SAAU,QAAO,WAAW;AAChC,MAAI,OAAQ,QAAO,SAAS;AAE5B,MAAI,eAAe,QAAW;AAC5B,WAAO,OAAO,CAAC,UAAU;AAAA,EAC3B;AAGA,MAAI,MAAM;AACR,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,YAAM,UAAU,KAAK,SAAS,MAAM;AACpC,YAAM,eAAe,KAAK,OAAO,OAAK,MAAM,MAAM;AAElD,UAAI,aAAa,WAAW,GAAG;AAE7B,eAAO,OAAO;AAAA,MAChB,OAAO;AAEL,eAAO,QAAQ,aAAa,IAAI,QAAM,EAAE,MAAM,EAAE,EAAE;AAClD,YAAI,SAAS;AACX,iBAAO,WAAW;AAAA,QACpB;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,OAAO;AAAA,IAChB;AAAA,EACF;AAGA,MAAI,eAAe,QAAW;AAC5B,WAAO,OAAO;AAAA,EAChB;AAEA,MAAI,cAAc,MAAM;AACtB,WAAO,aAAa,OAAO,QAAQ,UAAU,EAAE;AAAA,MAC7C,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AACrB,YAAI,GAAG,IAAI,iCAAiC,OAAO,KAAK;AACxD,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,OAAO;AACT,WAAO,QAAQ,MAAM,QAAQ,KAAK,IAC9B,MAAM,IAAI,UAAQ,iCAAiC,MAAM,KAAK,CAAC,IAC/D,iCAAiC,OAAO,KAAK;AAAA,EACnD;AAEA,MAAI,OAAO;AACT,WAAO,QAAQ,MAAM;AAAA,MAAI,UACvB,iCAAiC,MAAM,KAAK;AAAA,IAC9C;AAAA,EACF;AACA,MAAI,OAAO;AAET,QACE,MAAM;AAAA,MACJ,YAAU,OAAO,WAAW,aAAY,iCAAQ,UAAS;AAAA,IAC3D,GACA;AACA,YAAM,iBAAiB,MAAM;AAAA,QAC3B,YAAU,EAAE,OAAO,WAAW,aAAY,iCAAQ,UAAS;AAAA,MAC7D;AAEA,UAAI,eAAe,WAAW,GAAG;AAE/B,cAAM,YAAY;AAAA,UAChB,eAAe,CAAC;AAAA,UAChB;AAAA,QACF;AACA,YAAI,OAAO,cAAc,UAAU;AACjC,iBAAO,WAAW;AAClB,iBAAO,OAAO,QAAQ,SAAS;AAAA,QACjC;AAAA,MACF,OAAO;AAEL,eAAO,QAAQ,eAAe;AAAA,UAAI,UAChC,iCAAiC,MAAM,KAAK;AAAA,QAC9C;AACA,eAAO,WAAW;AAAA,MACpB;AAAA,IACF,OAAO;AACL,aAAO,QAAQ,MAAM;AAAA,QAAI,UACvB,iCAAiC,MAAM,KAAK;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO;AACT,WAAO,QAAQ,MAAM;AAAA,MAAI,UACvB,iCAAiC,MAAM,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,MAAI,cAAc,QAAW;AAC3B,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,YAA4C;AACvE,SACE,cAAc,QACd,OAAO,eAAe,YACtB,WAAW,SAAS,aACnB,WAAW,cAAc,QACxB,OAAO,KAAK,WAAW,UAAU,EAAE,WAAW,MAChD,CAAC,WAAW;AAEhB;;;AC7JA;AAAA,EACE;AAAA,OAEK;AACP,SAAS,uBAAuB;AAQhC,IAAM,eAAe;AAErB,SAAS,mBACP,OACiD;AACjD,QAAM,QAAQ,aAAa,KAAK,KAAK;AACrC,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW,MAAM,CAAC;AAAA,IAClB,MAAM,MAAM,CAAC;AAAA,EACf;AACF;AAEA,SAAS,yBACP,KACoD;AAIpD,QAAM,gBAAgB,mBAAmB,GAAG;AAC5C,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,MACV,UAAU,cAAc;AAAA,MACxB,MAAM,cAAc;AAAA,IACtB;AAAA,EACF;AACF;AAOA,SAAS,sBACP,OACA,UACA,aAIM;AACN,QAAM,wBAAkE,CAAC;AACzE,QAAM,oBAA8B,CAAC;AAErC,aAAW,eAAe,aAAa;AACrC,YAAQ,YAAY,MAAM;AAAA,MACxB,KAAK,QAAQ;AACX,0BAAkB,KAAK,YAAY,IAAc;AACjD;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,aAAa;AAChB,8BAAsB,KAAK;AAAA,UACzB,YAAY;AAAA,YACV,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,UACpB;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,YAAY;AACf,cAAM,uBAAuB;AAAA,UAC3B,YAAY;AAAA,QACd;AAEA,YAAI,wBAAwB,MAAM;AAChC,gCAAsB,KAAK,oBAAoB;AAAA,QACjD,OAAO;AACL,4BAAkB,KAAK,KAAK,UAAU,WAAW,CAAC;AAAA,QACpD;AACA;AAAA,MACF;AAAA,MACA,SAAS;AACP,0BAAkB,KAAK,KAAK,UAAU,WAAW,CAAC;AAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK;AAAA,IACT,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM;AAAA,QACN,SACE,kBAAkB,SAAS,IACvB,kBAAkB,KAAK,IAAI,IAC3B;AAAA,MACR;AAAA,MACA,GAAI,sBAAsB,SAAS,IAC/B,EAAE,OAAO,sBAAsB,IAC/B,CAAC;AAAA,IACP;AAAA,EACF,CAAC;AACH;AAOA,SAAS,4BACP,OACA,UACA,aAIM;AACN,aAAW,eAAe,aAAa;AACrC,YAAQ,YAAY,MAAM;AAAA,MACxB,KAAK;AACH,cAAM,KAAK;AAAA,UACT,kBAAkB;AAAA,YAChB,MAAM;AAAA,YACN,UAAU;AAAA,cACR,MAAM;AAAA,cACN,SAAS,YAAY;AAAA,YACvB;AAAA,UACF;AAAA,QACF,CAAC;AACD;AAAA,MACF,KAAK;AACH,cAAM;AAAA,UACJ;AAAA,YACE,YAAY;AAAA,cACV,UAAU,OAAO,YAAY,SAAS;AAAA,cACtC,MAAM,OAAO,YAAY,IAAI;AAAA,YAC/B;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,UACR;AAAA,QACF;AACA;AAAA,MACF;AACE,cAAM,KAAK,EAAE,MAAM,KAAK,UAAU,WAAW,EAAE,CAAC;AAChD;AAAA,IACJ;AAAA,EACF;AACF;AAEO,SAAS,oCACd,QACA,SAK0B;AAzK5B;AA0KE,QAAM,yBAAkD,CAAC;AACzD,QAAM,WAA6C,CAAC;AACpD,MAAI,wBAAwB;AAC5B,QAAM,gBAAe,wCAAS,iBAAT,YAAyB;AAC9C,QAAM,uBAAsB,wCAAS,wBAAT,YAAgC;AAC5D,QAAM,iCACJ,wCAAS,kCAAT,YAA0C;AAE5C,aAAW,EAAE,MAAM,QAAQ,KAAK,QAAQ;AACtC,YAAQ,MAAM;AAAA,MACZ,KAAK,UAAU;AACb,YAAI,CAAC,uBAAuB;AAC1B,gBAAM,IAAI,8BAA8B;AAAA,YACtC,eACE;AAAA,UACJ,CAAC;AAAA,QACH;AAEA,+BAAuB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7C;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,gCAAwB;AAExB,cAAM,QAAyC,CAAC;AAEhD,mBAAW,QAAQ,SAAS;AAC1B,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK,QAAQ;AACX,oBAAM,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC;AAC9B;AAAA,YACF;AAAA,YAEA,KAAK,QAAQ;AAEX,oBAAM,YACJ,KAAK,cAAc,YAAY,eAAe,KAAK;AAErD,oBAAM;AAAA,gBACJ,KAAK,gBAAgB,MACjB;AAAA,kBACE,UAAU;AAAA,oBACR,UAAU;AAAA,oBACV,SAAS,KAAK,KAAK,SAAS;AAAA,kBAC9B;AAAA,gBACF,IACA;AAAA,kBACE,YAAY;AAAA,oBACV,UAAU;AAAA,oBACV,MAAM,gBAAgB,KAAK,IAAI;AAAA,kBACjC;AAAA,gBACF;AAAA,cACN;AAEA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,iBAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,CAAC;AACrC;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,gCAAwB;AAExB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,OAAO,QACJ,IAAI,UAAQ;AAhPzB,gBAAAC,KAAAC,KAAAC,KAAAC;AAiPc,kBAAM,gBACJA,OAAAH,MAAA,KAAK,oBAAL,gBAAAA,IAAuB,yBAAvB,OAAAG,MACC,wBAAwB,YACrBF,MAAA,KAAK,oBAAL,gBAAAA,IAAsB,UACtBC,MAAA,KAAK,oBAAL,gBAAAA,IAAsB;AAC5B,kBAAM,oBACJ,6CAAc,qBAAoB,OAC9B,OAAO,aAAa,gBAAgB,IACpC;AAEN,oBAAQ,KAAK,MAAM;AAAA,cACjB,KAAK,QAAQ;AACX,uBAAO,KAAK,KAAK,WAAW,IACxB,SACA;AAAA,kBACE,MAAM,KAAK;AAAA,kBACX;AAAA,gBACF;AAAA,cACN;AAAA,cAEA,KAAK,aAAa;AAChB,uBAAO,KAAK,KAAK,WAAW,IACxB,SACA;AAAA,kBACE,MAAM,KAAK;AAAA,kBACX,SAAS;AAAA,kBACT;AAAA,gBACF;AAAA,cACN;AAAA,cAEA,KAAK,QAAQ;AACX,oBAAI,KAAK,gBAAgB,KAAK;AAC5B,wBAAM,IAAI,8BAA8B;AAAA,oBACtC,eACE;AAAA,kBACJ,CAAC;AAAA,gBACH;AAEA,uBAAO;AAAA,kBACL,YAAY;AAAA,oBACV,UAAU,KAAK;AAAA,oBACf,MAAM,gBAAgB,KAAK,IAAI;AAAA,kBACjC;AAAA,kBACA,IAAI,6CAAc,aAAY,OAC1B,EAAE,SAAS,KAAK,IAChB,CAAC;AAAA,kBACL;AAAA,gBACF;AAAA,cACF;AAAA,cAEA,KAAK,aAAa;AAChB,sBAAM,oBACJ,6CAAc,qBAAoB,OAC9B,OAAO,aAAa,gBAAgB,IACpC;AACN,sBAAM,kBACJ,6CAAc,mBAAkB,OAC5B,OAAO,aAAa,cAAc,IAClC;AAEN,oBAAI,oBAAoB,gBAAgB;AACtC,yBAAO;AAAA,oBACL,UAAU;AAAA,sBACR,UAAU;AAAA,sBACV,MACE,OAAO,KAAK,UAAU,WAClB,KAAK,MAAM,KAAK,KAAK,IACrB,KAAK;AAAA,sBACX,IAAI;AAAA,oBACN;AAAA,oBACA;AAAA,kBACF;AAAA,gBACF;AAEA,uBAAO;AAAA,kBACL,cAAc;AAAA,oBACZ,MAAM,KAAK;AAAA,oBACX,MAAM,KAAK;AAAA,kBACb;AAAA,kBACA;AAAA,gBACF;AAAA,cACF;AAAA,cAEA,KAAK,eAAe;AAClB,sBAAM,oBACJ,6CAAc,qBAAoB,OAC9B,OAAO,aAAa,gBAAgB,IACpC;AACN,sBAAM,kBACJ,6CAAc,mBAAkB,OAC5B,OAAO,aAAa,cAAc,IAClC;AAEN,oBAAI,oBAAoB,gBAAgB;AACtC,yBAAO;AAAA,oBACL,cAAc;AAAA,sBACZ,UAAU;AAAA,sBACV,UACE,KAAK,OAAO,SAAS,SAAS,KAAK,OAAO,QAAQ,CAAC;AAAA,sBACrD,IAAI;AAAA,oBACN;AAAA,oBACA;AAAA,kBACF;AAAA,gBACF;AAEA,uBAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF,CAAC,EACA,OAAO,UAAQ,SAAS,MAAS;AAAA,QACtC,CAAC;AAED;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,gCAAwB;AAExB,cAAM,QAAyC,CAAC;AAEhD,mBAAW,QAAQ,SAAS;AAC1B,cAAI,KAAK,SAAS,0BAA0B;AAC1C;AAAA,UACF;AAEA,gBAAM,oBACJ,gBAAK,oBAAL,mBAAuB,yBAAvB,YACC,wBAAwB,YACrB,UAAK,oBAAL,mBAAsB,UACtB,UAAK,oBAAL,mBAAsB;AAC5B,gBAAM,oBACJ,qDAAkB,qBAAoB,OAClC,OAAO,iBAAiB,gBAAgB,IACxC;AACN,gBAAM,kBACJ,qDAAkB,mBAAkB,OAChC,OAAO,iBAAiB,cAAc,IACtC;AAEN,cAAI,oBAAoB,gBAAgB;AACtC,kBAAM,0BACJ,qDAAkB,qBAAoB,OAClC,OAAO,iBAAiB,gBAAgB,IACxC;AAEN,gBAAI,SAAS,SAAS,GAAG;AACvB,oBAAM,cAAc,SAAS,SAAS,SAAS,CAAC;AAChD,kBAAI,YAAY,SAAS,SAAS;AAChC,4BAAY,MAAM,KAAK;AAAA,kBACrB,cAAc;AAAA,oBACZ,UAAU;AAAA,oBACV,UACE,KAAK,OAAO,SAAS,SAAS,KAAK,OAAO,QAAQ,CAAC;AAAA,oBACrD,IAAI;AAAA,kBACN;AAAA,kBACA,kBAAkB;AAAA,gBACpB,CAAC;AACD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,SAAS,KAAK;AAEpB,cAAI,OAAO,SAAS,WAAW;AAC7B,gBAAI,+BAA+B;AACjC,oCAAsB,OAAO,KAAK,UAAU,OAAO,KAAK;AAAA,YAC1D,OAAO;AACL,0CAA4B,OAAO,KAAK,UAAU,OAAO,KAAK;AAAA,YAChE;AAAA,UACF,OAAO;AACL,kBAAM,KAAK;AAAA,cACT,kBAAkB;AAAA,gBAChB,MAAM,KAAK;AAAA,gBACX,UAAU;AAAA,kBACR,MAAM,KAAK;AAAA,kBACX,SACE,OAAO,SAAS,sBACX,YAAO,WAAP,YAAiB,2BAClB,OAAO;AAAA,gBACf;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAEA,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MACE,gBACA,uBAAuB,SAAS,KAChC,SAAS,SAAS,KAClB,SAAS,CAAC,EAAE,SAAS,QACrB;AACA,UAAM,aAAa,uBAChB,IAAI,UAAQ,KAAK,IAAI,EACrB,KAAK,MAAM;AAEd,aAAS,CAAC,EAAE,MAAM,QAAQ,EAAE,MAAM,aAAa,OAAO,CAAC;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,mBACE,uBAAuB,SAAS,KAAK,CAAC,eAClC,EAAE,OAAO,uBAAuB,IAChC;AAAA,IACN;AAAA,EACF;AACF;;;ACxcO,SAAS,aAAa,SAAyB;AACpD,SAAO,QAAQ,SAAS,GAAG,IAAI,UAAU,UAAU,OAAO;AAC5D;;;ACFA;AAAA,EACE,cAAAE;AAAA,EACA,aAAAC;AAAA,OAEK;AACP,SAAS,KAAAC,UAAS;AA8CX,IAAM,6BAA6BF;AAAA,EAAW,MACnDC;AAAA,IACEC,GAAE,OAAO;AAAA,MACP,oBAAoBA,GAAE,MAAMA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,MAEhE,gBAAgBA,GACb,OAAO;AAAA,QACN,gBAAgBA,GAAE,OAAO,EAAE,SAAS;AAAA,QACpC,iBAAiBA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,QAEtC,eAAeA,GACZ,KAAK,CAAC,WAAW,OAAO,UAAU,MAAM,CAAC,EACzC,SAAS;AAAA,MACd,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOZ,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUnC,mBAAmBA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,MAKxC,gBAAgBA,GACb;AAAA,QACCA,GAAE,OAAO;AAAA,UACP,UAAUA,GAAE,KAAK;AAAA,YACf;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,UACD,WAAWA,GAAE,KAAK;AAAA,YAChB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH,EACC,SAAS;AAAA,MAEZ,WAAWA,GACR,KAAK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOZ,gBAAgBA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOrC,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOlD,iBAAiBA,GACd,KAAK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOZ,aAAaA,GACV,OAAO;AAAA,QACN,aAAaA,GACV,KAAK;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC,EACA,SAAS;AAAA,QACZ,WAAWA,GAAE,KAAK,CAAC,MAAM,MAAM,MAAM,KAAK,CAAC,EAAE,SAAS;AAAA,MACxD,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQZ,iBAAiBA,GACd,OAAO;AAAA,QACN,QAAQA,GACL,OAAO;AAAA,UACN,UAAUA,GAAE,OAAO;AAAA,UACnB,WAAWA,GAAE,OAAO;AAAA,QACtB,CAAC,EACA,SAAS;AAAA,MACd,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYZ,6BAA6BA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,MAKlD,aAAaA,GAAE,KAAK,CAAC,YAAY,QAAQ,UAAU,CAAC,EAAE,SAAS;AAAA,IACjE,CAAC;AAAA,EACH;AACF;AAOO,IAAM,uBAAuB;AAAA,EAClC,UAAU;AAAA,EACV,MAAM;AAAA,EACN,UAAU;AACZ;;;AChOA;AAAA,EACE,iCAAAC;AAAA,OAGK;AAIA,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GA4BE;AAxCF;AA0CE,WAAQ,+BAAO,UAAS,QAAQ;AAEhC,QAAM,eAAkC,CAAC;AAEzC,QAAM,WACJ;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACA,KAAK,QAAM,OAAO,OAAO;AAC3B,QAAM,mBACJ,QAAQ,SAAS,UAAU,KAC3B,QAAQ,SAAS,UAAU,KAC3B,QAAQ,SAAS,aAAa,KAC9B;AACF,QAAM,mBAAmB,QAAQ,SAAS,UAAU;AACpD,QAAM,qBACJ,QAAQ,SAAS,YAAY,KAAK,QAAQ,SAAS,UAAU;AAE/D,MAAI,SAAS,MAAM;AACjB,WAAO,EAAE,OAAO,QAAW,YAAY,QAAW,aAAa;AAAA,EACjE;AAGA,QAAM,mBAAmB,MAAM,KAAK,UAAQ,KAAK,SAAS,UAAU;AACpE,QAAM,mBAAmB,MAAM,KAAK,UAAQ,KAAK,SAAS,UAAU;AAEpE,MAAI,oBAAoB,oBAAoB,CAAC,kBAAkB;AAC7D,iBAAa,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,kBAAkB;AACpB,UAAMC,eAAqB,CAAC;AAE5B,UAAM,gBAAgB,MAAM,OAAO,UAAQ,KAAK,SAAS,UAAU;AACnE,kBAAc,QAAQ,UAAQ;AAC5B,cAAQ,KAAK,IAAI;AAAA,QACf,KAAK;AACH,cAAI,kBAAkB;AACpB,YAAAA,aAAY,KAAK,EAAE,cAAc,EAAE,GAAG,KAAK,KAAK,EAAE,CAAC;AAAA,UACrD,OAAO;AACL,yBAAa,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,SAAS,yBAAyB,KAAK,EAAE;AAAA,cACzC,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK;AACH,cAAI,kBAAkB;AACpB,YAAAA,aAAY,KAAK,EAAE,qBAAqB,CAAC,EAAE,CAAC;AAAA,UAC9C,OAAO;AACL,yBAAa,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,SAAS,yBAAyB,KAAK,EAAE;AAAA,cACzC,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK;AACH,cAAI,kBAAkB;AACpB,YAAAA,aAAY,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;AAAA,UACrC,OAAO;AACL,yBAAa,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,SAAS,yBAAyB,KAAK,EAAE;AAAA,cACzC,SACE;AAAA,YACJ,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK;AACH,cAAI,kBAAkB;AACpB,YAAAA,aAAY,KAAK,EAAE,eAAe,CAAC,EAAE,CAAC;AAAA,UACxC,OAAO;AACL,yBAAa,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,SAAS,yBAAyB,KAAK,EAAE;AAAA,cACzC,SACE;AAAA,YACJ,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK;AACH,cAAI,oBAAoB;AACtB,YAAAA,aAAY,KAAK,EAAE,YAAY,EAAE,GAAG,KAAK,KAAK,EAAE,CAAC;AAAA,UACnD,OAAO;AACL,yBAAa,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,SAAS,yBAAyB,KAAK,EAAE;AAAA,cACzC,SACE;AAAA,YACJ,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK;AACH,cAAI,kBAAkB;AACpB,YAAAA,aAAY,KAAK;AAAA,cACf,WAAW;AAAA,gBACT,kBAAkB;AAAA,kBAChB,eAAe;AAAA,oBACb,YAAY,KAAK,KAAK;AAAA,kBACxB;AAAA,kBACA,kBAAkB,KAAK,KAAK;AAAA,gBAC9B;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH,OAAO;AACL,yBAAa,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,SAAS,yBAAyB,KAAK,EAAE;AAAA,cACzC,SACE;AAAA,YACJ,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK;AACH,cAAI,kBAAkB;AACpB,YAAAA,aAAY,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;AAAA,UACrC,OAAO;AACL,yBAAa,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,SAAS,yBAAyB,KAAK,EAAE;AAAA,cACzC,SACE;AAAA,YACJ,CAAC;AAAA,UACH;AACA;AAAA,QACF;AACE,uBAAa,KAAK;AAAA,YAChB,MAAM;AAAA,YACN,SAAS,yBAAyB,KAAK,EAAE;AAAA,UAC3C,CAAC;AACD;AAAA,MACJ;AAAA,IACF,CAAC;AAED,QAAI,oBAAoB,oBAAoBA,aAAY,SAAS,GAAG;AAClE,YAAMC,wBAID,CAAC;AACN,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,SAAS,YAAY;AAC5B,UAAAA,sBAAqB,KAAK;AAAA,YACxB,MAAM,KAAK;AAAA,YACX,cAAa,UAAK,gBAAL,YAAoB;AAAA,YACjC,YAAY,iCAAiC,KAAK,WAAW;AAAA,UAC/D,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,qBAMF;AAAA,QACF,uBAAuB,EAAE,MAAM,YAAY;AAAA,QAC3C,kCAAkC;AAAA,MACpC;AAEA,UAAI,cAAc,MAAM;AACtB,gBAAQ,WAAW,MAAM;AAAA,UACvB,KAAK;AACH;AAAA,UACF,KAAK;AACH,+BAAmB,wBAAwB,EAAE,MAAM,OAAO;AAC1D;AAAA,UACF,KAAK;AACH,+BAAmB,wBAAwB,EAAE,MAAM,MAAM;AACzD;AAAA,UACF,KAAK;AACH,+BAAmB,wBAAwB;AAAA,cACzC,MAAM;AAAA,cACN,sBAAsB,CAAC,WAAW,QAAQ;AAAA,YAC5C;AACA;AAAA,QACJ;AAAA,MACF;AAEA,aAAO;AAAA,QACL,OAAO,CAAC,GAAGD,cAAa,EAAE,sBAAAC,sBAAqB,CAAC;AAAA,QAChD,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAOD,aAAY,SAAS,IAAIA,eAAc;AAAA,MAC9C,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAuB,CAAC;AAC9B,MAAI,iBAAiB;AACrB,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,6BAAqB,KAAK;AAAA,UACxB,MAAM,KAAK;AAAA,UACX,cAAa,UAAK,gBAAL,YAAoB;AAAA,UACjC,YAAY,iCAAiC,KAAK,WAAW;AAAA,QAC/D,CAAC;AACD,YAAI,KAAK,WAAW,MAAM;AACxB,2BAAiB;AAAA,QACnB;AACA;AAAA,MACF;AACE,qBAAa,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,SAAS,iBAAiB,KAAK,IAAI;AAAA,QACrC,CAAC;AACD;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,cAAc,MAAM;AACtB,WAAO;AAAA,MACL,OAAO,CAAC,EAAE,qBAAqB,CAAC;AAAA,MAChC,YAAY,iBACR,EAAE,uBAAuB,EAAE,MAAM,YAAY,EAAE,IAC/C;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,WAAW;AAExB,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,QACL,OAAO,CAAC,EAAE,qBAAqB,CAAC;AAAA,QAChC,YAAY;AAAA,UACV,uBAAuB;AAAA,YACrB,MAAM,iBAAiB,cAAc;AAAA,UACvC;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,OAAO,CAAC,EAAE,qBAAqB,CAAC;AAAA,QAChC,YAAY,EAAE,uBAAuB,EAAE,MAAM,OAAO,EAAE;AAAA,QACtD;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,OAAO,CAAC,EAAE,qBAAqB,CAAC;AAAA,QAChC,YAAY;AAAA,UACV,uBAAuB;AAAA,YACrB,MAAM,iBAAiB,cAAc;AAAA,UACvC;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,OAAO,CAAC,EAAE,qBAAqB,CAAC;AAAA,QAChC,YAAY;AAAA,UACV,uBAAuB;AAAA,YACrB,MAAM,iBAAiB,cAAc;AAAA,YACrC,sBAAsB,CAAC,WAAW,QAAQ;AAAA,UAC5C;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS;AACP,YAAM,mBAA0B;AAChC,YAAM,IAAIE,+BAA8B;AAAA,QACtC,eAAe,qBAAqB,gBAAgB;AAAA,MACtD,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACzSO,IAAM,wBAAN,MAA4B;AAAA,EAA5B;AACL,SAAQ,kBAA2C,CAAC;AACpD,SAAQ,WAAW;AAMnB;AAAA;AAAA;AAAA;AAAA,SAAQ,YAA0B,CAAC;AAMnC;AAAA;AAAA;AAAA;AAAA,SAAQ,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrB,mBAAmB,aAGjB;AACA,QAAI,QAAQ;AAEZ,eAAW,OAAO,aAAa;AAC7B,YAAM,UAAU,IAAI,SAAS,QAAQ,SAAS,EAAE;AAChD,UAAI,CAAC,QAAS;AAEd,YAAM,WAAW,UAAU,OAAO;AAElC,YAAM,gBAAgB,eAAe,KAAK,iBAAiB,QAAQ;AACnE,YAAM,uBACJ,IAAI,eAAe,QAAQ,kBAAkB;AAE/C,UAAI,sBAAsB;AACxB,cAAM,UAAU,KAAK,UAAU,IAAI,WAAW,EAAE,MAAM,GAAG,EAAE;AAC3D;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACC,gBAA2B,IAAI;AAAA,QAClC;AACA,iBAAS;AACT;AAAA,MACF;AAEA,YAAM,WAAW,uBAAuB,GAAG;AAC3C,UAAI,YAAY,KAAM;AAEtB,qBAAe,KAAK,iBAAiB,UAAU,SAAS,KAAK;AAC7D,eAAS,KAAK,iBAAiB,UAAU,KAAK,SAAS,IAAI;AAAA,IAC7D;AAEA,SAAK,YAAY;AAEjB,WAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB,WAAW;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAwD;AACtD,UAAM,YAAY,KAAK,UAAU,KAAK,eAAe;AACrD,UAAM,eAAe,UAAU,MAAM,KAAK,SAAS,MAAM;AACzD,WAAO,EAAE,WAAW,WAAW,aAAa;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAqB;AAC3B,QAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,WAAK,UAAU,KAAK,EAAE,SAAS,IAAI,SAAS,OAAO,YAAY,EAAE,CAAC;AAClE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,iBACN,gBACA,KACA,WACQ;AACR,QAAI,WAAW;AAEf,QAAI,KAAK,YAAY;AACnB,kBAAY;AACZ,WAAK,aAAa;AAAA,IACpB;AAEA,gBAAY,KAAK,WAAW;AAE5B,UAAM,0BAA0B,eAAe,MAAM,GAAG,EAAE;AAC1D,UAAM,cAAc,eAAe,eAAe,SAAS,CAAC;AAE5D,UAAM,cAAc,KAAK,qBAAqB,uBAAuB;AAErE,gBAAY,KAAK,YAAY,WAAW;AACxC,gBAAY,KAAK,WAAW,yBAAyB,WAAW;AAChE,gBAAY,KAAK,SAAS,aAAa,KAAK,SAAS;AAErD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,qBAAqB,iBAAwC;AACnE,UAAM,WAAW,KAAK;AAAA,MACpB,KAAK,UAAU,SAAS;AAAA,MACxB,gBAAgB;AAAA,IAClB;AACA,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,UAAI,KAAK,UAAU,IAAI,CAAC,EAAE,YAAY,gBAAgB,CAAC,GAAG;AACxD;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,YAAY,aAA6B;AAC/C,QAAI,WAAW;AACf,WAAO,KAAK,UAAU,SAAS,aAAa;AAC1C,YAAM,QAAQ,KAAK,UAAU,IAAI;AACjC,kBAAY,MAAM,UAAU,MAAM;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,WACN,iBACA,aACQ;AACR,QAAI,WAAW;AAEf,UAAM,WAAW,KAAK,UAAU,SAAS;AAEzC,aAAS,IAAI,UAAU,IAAI,gBAAgB,QAAQ,KAAK;AACtD,YAAM,MAAM,gBAAgB,CAAC;AAC7B,YAAM,cAAc,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC;AAE5D,UAAI,YAAY,aAAa,GAAG;AAC9B,oBAAY;AAAA,MACd;AACA,kBAAY;AAEZ,UAAI,OAAO,QAAQ,UAAU;AAC3B,oBAAY,GAAG,KAAK,UAAU,GAAG,CAAC;AAAA,MACpC;AAEA,YAAM,WACJ,IAAI,IAAI,gBAAgB,SAAS,gBAAgB,IAAI,CAAC,IAAI;AAC5D,YAAM,UAAU,OAAO,aAAa;AAEpC,kBAAY,UAAU,MAAM;AAE5B,WAAK,UAAU,KAAK,EAAE,SAAS,KAAK,SAAS,YAAY,EAAE,CAAC;AAAA,IAC9D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,SACN,aACA,KACA,WACQ;AACR,QAAI,WAAW;AACf,UAAM,YAAY,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC;AAE1D,QAAI,UAAU,aAAa,GAAG;AAC5B,kBAAY;AAAA,IACd;AACA,cAAU;AAEV,QAAI,OAAO,gBAAgB,UAAU;AACnC,kBAAY,GAAG,KAAK,UAAU,WAAW,CAAC;AAAA,IAC5C;AAEA,QAAI,IAAI,eAAe,QAAQ,IAAI,cAAc;AAC/C,kBAAY,UAAU,MAAM,GAAG,EAAE;AACjC,WAAK,aAAa;AAAA,IACpB,OAAO;AACL,kBAAY;AAAA,IACd;AAEA,WAAO;AAAA,EACT;AACF;AAQA,SAAS,UAAU,SAAyC;AAC1D,QAAM,WAAmC,CAAC;AAC1C,aAAW,QAAQ,QAAQ,MAAM,GAAG,GAAG;AACrC,UAAM,aAAa,KAAK,QAAQ,GAAG;AACnC,QAAI,eAAe,IAAI;AACrB,eAAS,KAAK,IAAI;AAAA,IACpB,OAAO;AACL,UAAI,aAAa,EAAG,UAAS,KAAK,KAAK,MAAM,GAAG,UAAU,CAAC;AAC3D,iBAAW,KAAK,KAAK,SAAS,YAAY,GAAG;AAC3C,iBAAS,KAAK,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAQA,SAAS,eACP,KACA,UACS;AACT,MAAI,UAAmB;AACvB,aAAW,OAAO,UAAU;AAC1B,QAAI,WAAW,QAAQ,OAAO,YAAY,SAAU,QAAO;AAC3D,cAAW,QAA6C,GAAG;AAAA,EAC7D;AACA,SAAO;AACT;AAQA,SAAS,eACP,KACA,UACA,OACM;AACN,MAAI,UAA4C;AAChD,WAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,UAAM,MAAM,SAAS,CAAC;AACtB,UAAM,UAAU,SAAS,IAAI,CAAC;AAC9B,QAAI,QAAQ,GAAG,KAAK,MAAM;AACxB,cAAQ,GAAG,IAAI,OAAO,YAAY,WAAW,CAAC,IAAI,CAAC;AAAA,IACrD;AACA,cAAU,QAAQ,GAAG;AAAA,EACvB;AACA,UAAQ,SAAS,SAAS,SAAS,CAAC,CAAC,IAAI;AAC3C;AAQA,SAAS,uBAAuB,KAKiB;AA1UjD;AA2UE,QAAM,SAAQ,eAAI,gBAAJ,YAAmB,IAAI,gBAAvB,YAAsC,IAAI;AACxD,MAAI,SAAS,KAAM,QAAO,EAAE,OAAO,MAAM,KAAK,UAAU,KAAK,EAAE;AAC/D,MAAI,eAAe,IAAK,QAAO,EAAE,OAAO,MAAM,MAAM,OAAO;AAC3D,SAAO;AACT;;;AC7UO,SAAS,kCAAkC;AAAA,EAChD;AAAA,EACA;AACF,GAG2C;AACzC,UAAQ,cAAc;AAAA,IACpB,KAAK;AACH,aAAO,eAAe,eAAe;AAAA,IACvC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EACX;AACF;;;ARsCO,IAAM,kCAAN,MAAiE;AAAA,EAQtE,YACE,SACA,QACA;AAVF,SAAS,uBAAuB;AAnElC;AA8EI,SAAK,UAAU;AACf,SAAK,SAAS;AACd,SAAK,cAAa,YAAO,eAAP,YAAqB;AAAA,EACzC;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,gBAAgB;AAvFtB;AAwFI,YAAO,sBAAK,QAAO,kBAAZ,4CAAiC,CAAC;AAAA,EAC3C;AAAA,EAEA,MAAc,QACZ;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GACA,EAAE,cAAc,MAAM,IAA+B,CAAC,GACtD;AA5GJ;AA6GI,UAAM,WAA8B,CAAC;AAErC,UAAM,sBAAsB,KAAK,OAAO,SAAS,SAAS,QAAQ,IAC9D,WACA;AACJ,QAAI,gBAAgB,MAAMC,sBAAqB;AAAA,MAC7C,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,iBAAiB,QAAQ,wBAAwB,UAAU;AAC7D,sBAAgB,MAAMA,sBAAqB;AAAA,QACzC,UAAU;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,UAAM,mBAAmB,KAAK,OAAO,SAAS,WAAW,gBAAgB;AAEzE,SACE,+BAAO;AAAA,MACL,UACE,KAAK,SAAS,cAAc,KAAK,OAAO;AAAA,UAE5C,CAAC,kBACD;AACA,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SACE,2KAEI,KAAK,OAAO,QAAQ;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,SAAI,+CAAe,gCAA+B,CAAC,kBAAkB;AACnE,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SACE,8HAEI,KAAK,OAAO,QAAQ;AAAA,MAC5B,CAAC;AAAA,IACH;AAGA,QAAI,uBAA2C,+CAAe;AAC9D,SAAI,+CAAe,gBAAe,kBAAkB;AAClD,6BAAuB,qBAAqB,cAAc,WAAW;AAAA,IACvE;AAEA,UAAM,eAAe,KAAK,QAAQ,YAAY,EAAE,WAAW,QAAQ;AACnE,UAAM,gCAAgC,KAAK,QAAQ,WAAW,UAAU;AAExE,UAAM,EAAE,UAAU,kBAAkB,IAAI;AAAA,MACtC;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM;AAAA,MACJ,OAAOC;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,IACF,IAAI,aAAa;AAAA,MACf;AAAA,MACA;AAAA,MACA,SAAS,KAAK;AAAA,IAChB,CAAC;AAED,UAAM,8BACJ,eAAe,oBACV,oDAAe,gCAAf,YAA8C,QAC/C;AAEN,UAAM,aACJ,oBACA,gCACA,+CAAe,mBACX;AAAA,MACE,GAAG;AAAA,MACH,GAAI,+BAA+B;AAAA,QACjC,uBAAuB;AAAA,UACrB,GAAG,qDAAkB;AAAA,UACrB,6BAA6B;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,IAAI,+CAAe,oBAAmB;AAAA,QACpC,iBAAiB,cAAc;AAAA,MACjC;AAAA,IACF,IACA;AAEN,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,kBAAkB;AAAA;AAAA,UAEhB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAGA,mBACE,iDAAgB,UAAS,SAAS,qBAAqB;AAAA,UACzD,iBACE,iDAAgB,UAAS,UACzB,eAAe,UAAU;AAAA;AAAA;AAAA,YAIxB,oDAAe,sBAAf,YAAoC,QACjC,iCAAiC,eAAe,MAAM,IACtD;AAAA,UACN,IAAI,+CAAe,mBAAkB;AAAA,YACnC,gBAAgB,cAAc;AAAA,UAChC;AAAA;AAAA,UAGA,oBAAoB,+CAAe;AAAA,UACnC,gBAAgB,+CAAe;AAAA,UAC/B,IAAI,+CAAe,oBAAmB;AAAA,YACpC,iBAAiB,cAAc;AAAA,UACjC;AAAA,UACA,IAAI,+CAAe,gBAAe;AAAA,YAChC,aAAa,cAAc;AAAA,UAC7B;AAAA,QACF;AAAA,QACA;AAAA,QACA,mBAAmB,eAAe,SAAY;AAAA,QAC9C,gBAAgB,+CAAe;AAAA,QAC/B,OAAOA;AAAA,QACP;AAAA,QACA,eAAe,+CAAe;AAAA,QAC9B,QAAQ,+CAAe;AAAA,QACvB,aAAa;AAAA,MACf;AAAA,MACA,UAAU,CAAC,GAAG,UAAU,GAAG,YAAY;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,SACwC;AAvQ5C;AAwQI,UAAM,EAAE,MAAM,UAAU,oBAAoB,IAAI,MAAM,KAAK,QAAQ,OAAO;AAE1E,UAAM,gBAAgBC;AAAA,MACpB,MAAMC,SAAQ,KAAK,OAAO,OAAO;AAAA,MACjC,QAAQ;AAAA,IACV;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,IAAI,MAAMC,eAAc;AAAA,MACtB,KAAK,GAAG,KAAK,OAAO,OAAO,IAAI;AAAA,QAC7B,KAAK;AAAA,MACP,CAAC;AAAA,MACD,SAAS;AAAA,MACT,MAAM;AAAA,MACN,uBAAuB;AAAA,MACvB,2BAA2BC,2BAA0B,cAAc;AAAA,MACnE,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,YAAY,SAAS,WAAW,CAAC;AACvC,UAAM,UAAyC,CAAC;AAGhD,UAAM,SAAQ,qBAAU,YAAV,mBAAmB,UAAnB,YAA4B,CAAC;AAE3C,UAAM,gBAAgB,SAAS;AAG/B,QAAI;AAEJ,QAAI;AAGJ,eAAW,QAAQ,OAAO;AACxB,UAAI,oBAAoB,UAAQ,UAAK,mBAAL,mBAAqB,OAAM;AACzD,cAAM,aAAa,KAAK,OAAO,WAAW;AAC1C,sCAA8B;AAE9B,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,UAAU;AAAA,UACV,OAAO,KAAK,UAAU,KAAK,cAAc;AAAA,UACzC,kBAAkB;AAAA,QACpB,CAAC;AAAA,MACH,WAAW,yBAAyB,QAAQ,KAAK,qBAAqB;AACpE,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA;AAAA,UAEN,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,QAAQ;AAAA,YACN,SAAS,KAAK,oBAAoB;AAAA,YAClC,SAAQ,UAAK,oBAAoB,WAAzB,YAAmC;AAAA,UAC7C;AAAA,QACF,CAAC;AAED,sCAA8B;AAAA,MAChC,WAAW,UAAU,QAAQ,KAAK,QAAQ,MAAM;AAC9C,cAAM,2BAA2B,KAAK,mBAClC;AAAA,UACE,CAAC,mBAAmB,GAAG;AAAA,YACrB,kBAAkB,KAAK;AAAA,UACzB;AAAA,QACF,IACA;AAEJ,YAAI,KAAK,KAAK,WAAW,GAAG;AAC1B,cAAI,4BAA4B,QAAQ,QAAQ,SAAS,GAAG;AAC1D,kBAAM,cAAc,QAAQ,QAAQ,SAAS,CAAC;AAC9C,wBAAY,mBAAmB;AAAA,UACjC;AAAA,QACF,OAAO;AACL,kBAAQ,KAAK;AAAA,YACX,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,YAC5C,MAAM,KAAK;AAAA,YACX,kBAAkB;AAAA,UACpB,CAAC;AAAA,QACH;AAAA,MACF,WACE,kBAAkB,QAClB,KAAK,aAAa,QAAQ,QAC1B,KAAK,aAAa,QAAQ,MAC1B;AACA,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY,KAAK,OAAO,WAAW;AAAA,UACnC,UAAU,KAAK,aAAa;AAAA,UAC5B,OAAO,KAAK,UAAU,KAAK,aAAa,IAAI;AAAA,UAC5C,kBAAkB,KAAK,mBACnB;AAAA,YACE,CAAC,mBAAmB,GAAG;AAAA,cACrB,kBAAkB,KAAK;AAAA,YACzB;AAAA,UACF,IACA;AAAA,QACN,CAAC;AAAA,MACH,WAAW,gBAAgB,MAAM;AAC/B,cAAM,aAAa,KAAK,YAAY;AACpC,cAAM,sBAAsB,CAAC,CAAC,KAAK;AACnC,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,MAAM,KAAK,WAAW;AAAA,UACtB,WAAW,KAAK,WAAW;AAAA,UAC3B,kBACE,cAAc,sBACV;AAAA,YACE,CAAC,mBAAmB,GAAG;AAAA,cACrB,GAAI,aAAa,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,cACtC,GAAI,sBACA,EAAE,kBAAkB,KAAK,iBAAiB,IAC1C,CAAC;AAAA,YACP;AAAA,UACF,IACA;AAAA,QACR,CAAC;AAAA,MACH,WAAW,cAAc,QAAQ,KAAK,UAAU;AAC9C,cAAM,cAAa,UAAK,SAAS,OAAd,YAAoB,KAAK,OAAO,WAAW;AAC9D,+BAAuB;AACvB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA,UAAU,UAAU,KAAK,SAAS,QAAQ;AAAA,UAC1C,OAAO,KAAK,WAAU,UAAK,SAAS,SAAd,YAAsB,CAAC,CAAC;AAAA,UAC9C,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,kBAAkB,KAAK,mBACnB;AAAA,YACE,CAAC,mBAAmB,GAAG;AAAA,cACrB,kBAAkB,KAAK;AAAA,cACvB,kBAAkB;AAAA,cAClB,gBAAgB,KAAK,SAAS;AAAA,YAChC;AAAA,UACF,IACA;AAAA,YACE,CAAC,mBAAmB,GAAG;AAAA,cACrB,kBAAkB;AAAA,cAClB,gBAAgB,KAAK,SAAS;AAAA,YAChC;AAAA,UACF;AAAA,QACN,CAAC;AAAA,MACH,WAAW,kBAAkB,QAAQ,KAAK,cAAc;AACtD,cAAM,sBACJ,2DACA,KAAK,aAAa,OADlB,YAEA,KAAK,OAAO,WAAW;AACzB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,UAAU,UAAU,KAAK,aAAa,QAAQ;AAAA,UAC9C,SAAS,UAAK,aAAa,aAAlB,YAA8B,CAAC;AAAA,UACxC,kBAAkB,KAAK,mBACnB;AAAA,YACE,CAAC,mBAAmB,GAAG;AAAA,cACrB,kBAAkB,KAAK;AAAA,cACvB,kBAAkB;AAAA,cAClB,gBAAgB,KAAK,aAAa;AAAA,YACpC;AAAA,UACF,IACA;AAAA,YACE,CAAC,mBAAmB,GAAG;AAAA,cACrB,kBAAkB;AAAA,cAClB,gBAAgB,KAAK,aAAa;AAAA,YACpC;AAAA,UACF;AAAA,QACN,CAAC;AACD,+BAAuB;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,WACJ,oBAAe;AAAA,MACb,mBAAmB,UAAU;AAAA,MAC7B,YAAY,KAAK,OAAO;AAAA,IAC1B,CAAC,MAHD,YAGM,CAAC;AACT,eAAW,UAAU,SAAS;AAC5B,cAAQ,KAAK,MAAM;AAAA,IACrB;AAEA,WAAO;AAAA,MACL;AAAA,MACA,cAAc;AAAA,QACZ,SAAS,kCAAkC;AAAA,UACzC,cAAc,UAAU;AAAA;AAAA,UAExB,cAAc,QAAQ;AAAA,YACpB,UAAQ,KAAK,SAAS,eAAe,CAAC,KAAK;AAAA,UAC7C;AAAA,QACF,CAAC;AAAA,QACD,MAAK,eAAU,iBAAV,YAA0B;AAAA,MACjC;AAAA,MACA,OAAO,+BAA+B,aAAa;AAAA,MACnD;AAAA,MACA,kBAAkB;AAAA,QAChB,CAAC,mBAAmB,GAAG;AAAA,UACrB,iBAAgB,cAAS,mBAAT,YAA2B;AAAA,UAC3C,oBAAmB,eAAU,sBAAV,YAA+B;AAAA,UAClD,qBAAoB,eAAU,uBAAV,YAAgC;AAAA,UACpD,gBAAe,eAAU,kBAAV,YAA2B;AAAA,UAC1C,eAAe,wCAAiB;AAAA,UAChC,gBAAe,eAAU,kBAAV,YAA2B;AAAA,UAC1C,cAAa,cAAS,gBAAT,YAAwB;AAAA,QACvC;AAAA,MACF;AAAA,MACA,SAAS,EAAE,MAAM,KAAK;AAAA,MACtB,UAAU;AAAA;AAAA,QAER,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SACsC;AACtC,UAAM,EAAE,MAAM,UAAU,oBAAoB,IAAI,MAAM,KAAK;AAAA,MACzD;AAAA,MACA,EAAE,aAAa,KAAK;AAAA,IACtB;AAEA,UAAM,UAAUH;AAAA,MACd,MAAMC,SAAQ,KAAK,OAAO,OAAO;AAAA,MACjC,QAAQ;AAAA,IACV;AAEA,UAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,MAAMC,eAAc;AAAA,MAC/D,KAAK,GAAG,KAAK,OAAO,OAAO,IAAI;AAAA,QAC7B,KAAK;AAAA,MACP,CAAC;AAAA,MACD;AAAA,MACA,MAAM;AAAA,MACN,uBAAuB;AAAA,MACvB,2BAA2B,iCAAiC,WAAW;AAAA,MACvE,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,QAAI,eAA4C;AAAA,MAC9C,SAAS;AAAA,MACT,KAAK;AAAA,IACP;AACA,QAAI,QAAqD;AACzD,QAAI,mBAAyD;AAC7D,QAAI,wBAAwD;AAC5D,QAAI,yBAA0D;AAC9D,QAAI,cAA6B;AAEjC,UAAME,cAAa,KAAK,OAAO;AAC/B,QAAI,eAAe;AAGnB,QAAI,qBAAoC;AACxC,QAAI,0BAAyC;AAC7C,QAAI,eAAe;AAGnB,UAAM,oBAAoB,oBAAI,IAAY;AAE1C,QAAI;AAEJ,QAAI;AAEJ,UAAM,2BAKD,CAAC;AAEN,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,QACf,IAAI,gBAGF;AAAA,UACA,MAAM,YAAY;AAChB,uBAAW,QAAQ,EAAE,MAAM,gBAAgB,SAAS,CAAC;AAAA,UACvD;AAAA,UAEA,UAAU,OAAO,YAAY;AApiBvC;AAqiBY,gBAAI,QAAQ,kBAAkB;AAC5B,yBAAW,QAAQ,EAAE,MAAM,OAAO,UAAU,MAAM,SAAS,CAAC;AAAA,YAC9D;AAEA,gBAAI,CAAC,MAAM,SAAS;AAClB,yBAAW,QAAQ,EAAE,MAAM,SAAS,OAAO,MAAM,MAAM,CAAC;AACxD;AAAA,YACF;AAEA,kBAAM,QAAQ,MAAM;AAEpB,kBAAM,gBAAgB,MAAM;AAE5B,gBAAI,iBAAiB,MAAM;AACzB,sBAAQ;AAAA,YACV;AAEA,gBAAI,MAAM,eAAe,MAAM;AAC7B,4BAAc,MAAM;AAAA,YACtB;AAEA,kBAAM,aAAY,WAAM,eAAN,mBAAmB;AAGrC,gBAAI,aAAa,MAAM;AACrB;AAAA,YACF;AAEA,kBAAM,UAAU,UAAU;AAE1B,gBAAI,UAAU,qBAAqB,MAAM;AACvC,sCAAwB,UAAU;AAAA,YACpC;AACA,gBAAI,UAAU,sBAAsB,MAAM;AACxC,uCAAyB,UAAU;AAAA,YACrC;AAEA,kBAAM,UAAU,eAAe;AAAA,cAC7B,mBAAmB,UAAU;AAAA,cAC7B,YAAAA;AAAA,YACF,CAAC;AACD,gBAAI,WAAW,MAAM;AACnB,yBAAW,UAAU,SAAS;AAC5B,oBACE,OAAO,eAAe,SACtB,CAAC,kBAAkB,IAAI,OAAO,GAAG,GACjC;AACA,oCAAkB,IAAI,OAAO,GAAG;AAChC,6BAAW,QAAQ,MAAM;AAAA,gBAC3B;AAAA,cACF;AAAA,YACF;AAGA,gBAAI,WAAW,MAAM;AAEnB,oBAAM,SAAQ,aAAQ,UAAR,YAAiB,CAAC;AAChC,yBAAW,QAAQ,OAAO;AACxB,oBAAI,oBAAoB,UAAQ,UAAK,mBAAL,mBAAqB,OAAM;AACzD,wBAAM,aAAaA,YAAW;AAC9B,gDAA8B;AAE9B,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN;AAAA,oBACA,UAAU;AAAA,oBACV,OAAO,KAAK,UAAU,KAAK,cAAc;AAAA,oBACzC,kBAAkB;AAAA,kBACpB,CAAC;AAAA,gBACH,WACE,yBAAyB,QACzB,KAAK,qBACL;AAEA,wBAAM,aAAa;AAEnB,sBAAI,YAAY;AACd,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN;AAAA,sBACA,UAAU;AAAA,sBACV,QAAQ;AAAA,wBACN,SAAS,KAAK,oBAAoB;AAAA,wBAClC,SAAQ,UAAK,oBAAoB,WAAzB,YAAmC;AAAA,sBAC7C;AAAA,oBACF,CAAC;AAED,kDAA8B;AAAA,kBAChC;AAAA,gBACF,WAAW,UAAU,QAAQ,KAAK,QAAQ,MAAM;AAC9C,wBAAM,2BAA2B,KAAK,mBAClC;AAAA,oBACE,CAAC,mBAAmB,GAAG;AAAA,sBACrB,kBAAkB,KAAK;AAAA,oBACzB;AAAA,kBACF,IACA;AAEJ,sBAAI,KAAK,KAAK,WAAW,GAAG;AAC1B,wBACE,4BAA4B,QAC5B,uBAAuB,MACvB;AACA,iCAAW,QAAQ;AAAA,wBACjB,MAAM;AAAA,wBACN,IAAI;AAAA,wBACJ,OAAO;AAAA,wBACP,kBAAkB;AAAA,sBACpB,CAAC;AAAA,oBACH;AAAA,kBACF,WAAW,KAAK,YAAY,MAAM;AAEhC,wBAAI,uBAAuB,MAAM;AAC/B,iCAAW,QAAQ;AAAA,wBACjB,MAAM;AAAA,wBACN,IAAI;AAAA,sBACN,CAAC;AACD,2CAAqB;AAAA,oBACvB;AAGA,wBAAI,4BAA4B,MAAM;AACpC,gDAA0B,OAAO,cAAc;AAC/C,iCAAW,QAAQ;AAAA,wBACjB,MAAM;AAAA,wBACN,IAAI;AAAA,wBACJ,kBAAkB;AAAA,sBACpB,CAAC;AAAA,oBACH;AAEA,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAI;AAAA,sBACJ,OAAO,KAAK;AAAA,sBACZ,kBAAkB;AAAA,oBACpB,CAAC;AAAA,kBACH,OAAO;AACL,wBAAI,4BAA4B,MAAM;AACpC,iCAAW,QAAQ;AAAA,wBACjB,MAAM;AAAA,wBACN,IAAI;AAAA,sBACN,CAAC;AACD,gDAA0B;AAAA,oBAC5B;AAEA,wBAAI,uBAAuB,MAAM;AAC/B,2CAAqB,OAAO,cAAc;AAC1C,iCAAW,QAAQ;AAAA,wBACjB,MAAM;AAAA,wBACN,IAAI;AAAA,wBACJ,kBAAkB;AAAA,sBACpB,CAAC;AAAA,oBACH;AAEA,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAI;AAAA,sBACJ,OAAO,KAAK;AAAA,sBACZ,kBAAkB;AAAA,oBACpB,CAAC;AAAA,kBACH;AAAA,gBACF,WAAW,gBAAgB,MAAM;AAG/B,sBAAI,uBAAuB,MAAM;AAC/B,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAI;AAAA,oBACN,CAAC;AACD,yCAAqB;AAAA,kBACvB;AACA,sBAAI,4BAA4B,MAAM;AACpC,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAI;AAAA,oBACN,CAAC;AACD,8CAA0B;AAAA,kBAC5B;AAEA,wBAAM,aAAa,KAAK,YAAY;AACpC,wBAAM,sBAAsB,CAAC,CAAC,KAAK;AACnC,wBAAM,WACJ,cAAc,sBACV;AAAA,oBACE,CAAC,mBAAmB,GAAG;AAAA,sBACrB,GAAI,aAAa,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,sBACtC,GAAI,sBACA,EAAE,kBAAkB,KAAK,iBAAiB,IAC1C,CAAC;AAAA,oBACP;AAAA,kBACF,IACA;AACN,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,WAAW,KAAK,WAAW;AAAA,oBAC3B,MAAM,KAAK,WAAW;AAAA,oBACtB,kBAAkB;AAAA,kBACpB,CAAC;AAAA,gBACH,WAAW,cAAc,QAAQ,KAAK,UAAU;AAC9C,wBAAM,cAAa,UAAK,SAAS,OAAd,YAAoBA,YAAW;AAClD,yCAAuB;AACvB,wBAAM,aAAa;AAAA,oBACjB,CAAC,mBAAmB,GAAG;AAAA,sBACrB,GAAI,KAAK,mBACL,EAAE,kBAAkB,KAAK,iBAAiB,IAC1C,CAAC;AAAA,sBACL,kBAAkB;AAAA,sBAClB,gBAAgB,KAAK,SAAS;AAAA,oBAChC;AAAA,kBACF;AAEA,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN;AAAA,oBACA,UAAU,UAAU,KAAK,SAAS,QAAQ;AAAA,oBAC1C,OAAO,KAAK,WAAU,UAAK,SAAS,SAAd,YAAsB,CAAC,CAAC;AAAA,oBAC9C,kBAAkB;AAAA,oBAClB,SAAS;AAAA,oBACT,kBAAkB;AAAA,kBACpB,CAAC;AAAA,gBACH,WAAW,kBAAkB,QAAQ,KAAK,cAAc;AACtD,wBAAM,sBACJ,2DACA,KAAK,aAAa,OADlB,YAEAA,YAAW;AACb,wBAAM,aAAa;AAAA,oBACjB,CAAC,mBAAmB,GAAG;AAAA,sBACrB,GAAI,KAAK,mBACL,EAAE,kBAAkB,KAAK,iBAAiB,IAC1C,CAAC;AAAA,sBACL,kBAAkB;AAAA,sBAClB,gBAAgB,KAAK,aAAa;AAAA,oBACpC;AAAA,kBACF;AAEA,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,YAAY;AAAA,oBACZ,UAAU,UAAU,KAAK,aAAa,QAAQ;AAAA,oBAC9C,SAAS,UAAK,aAAa,aAAlB,YAA8B,CAAC;AAAA,oBACxC,kBAAkB;AAAA,kBACpB,CAAC;AACD,yCAAuB;AAAA,gBACzB;AAAA,cACF;AAGA,yBAAW,QAAQ,OAAO;AACxB,oBAAI,EAAE,kBAAkB,MAAO;AAE/B,sBAAM,eAAe,KAAK,mBACtB;AAAA,kBACE,CAAC,mBAAmB,GAAG;AAAA,oBACrB,kBAAkB,KAAK;AAAA,kBACzB;AAAA,gBACF,IACA;AAEJ,sBAAM,mBACJ,KAAK,aAAa,eAAe,QAChC,KAAK,aAAa,QAAQ,QACzB,KAAK,aAAa,iBAAiB;AACvC,sBAAM,kBACJ,KAAK,aAAa,QAAQ,QAC1B,KAAK,aAAa,QAAQ,QAC1B,KAAK,aAAa,eAAe,QACjC,KAAK,aAAa,gBAAgB;AACpC,sBAAM,iBACJ,KAAK,aAAa,QAAQ,QAC1B,KAAK,aAAa,QAAQ,QAC1B,KAAK,aAAa,eAAe;AAEnC,oBAAI,kBAAkB;AACpB,sBACE,KAAK,aAAa,QAAQ,QAC1B,KAAK,aAAa,iBAAiB,MACnC;AACA,0BAAM,aAAaA,YAAW;AAC9B,0BAAM,cAAc,IAAI,sBAAsB;AAC9C,6CAAyB,KAAK;AAAA,sBAC5B;AAAA,sBACA,UAAU,KAAK,aAAa;AAAA,sBAC5B;AAAA,sBACA,kBAAkB;AAAA,oBACpB,CAAC;AAED,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAI;AAAA,sBACJ,UAAU,KAAK,aAAa;AAAA,sBAC5B,kBAAkB;AAAA,oBACpB,CAAC;AAED,wBAAI,KAAK,aAAa,eAAe,MAAM;AACzC,4BAAM,EAAE,UAAU,IAAI,YAAY;AAAA,wBAChC,KAAK,aAAa;AAAA,sBACpB;AACA,0BAAI,UAAU,SAAS,GAAG;AACxB,mCAAW,QAAQ;AAAA,0BACjB,MAAM;AAAA,0BACN,IAAI;AAAA,0BACJ,OAAO;AAAA,0BACP,kBAAkB;AAAA,wBACpB,CAAC;AAAA,sBACH;AAAA,oBACF;AAAA,kBACF,WACE,KAAK,aAAa,eAAe,QACjC,yBAAyB,SAAS,GAClC;AACA,0BAAM,SACJ,yBACE,yBAAyB,SAAS,CACpC;AACF,0BAAM,EAAE,UAAU,IAAI,OAAO,YAAY;AAAA,sBACvC,KAAK,aAAa;AAAA,oBACpB;AACA,wBAAI,UAAU,SAAS,GAAG;AACxB,iCAAW,QAAQ;AAAA,wBACjB,MAAM;AAAA,wBACN,IAAI,OAAO;AAAA,wBACX,OAAO;AAAA,wBACP,kBAAkB;AAAA,sBACpB,CAAC;AAAA,oBACH;AAAA,kBACF;AAAA,gBACF,WACE,mBACA,yBAAyB,SAAS,GAClC;AACA,wBAAM,SAAS,yBAAyB,IAAI;AAC5C,wBAAM,EAAE,WAAW,aAAa,IAC9B,OAAO,YAAY,SAAS;AAE9B,sBAAI,aAAa,SAAS,GAAG;AAC3B,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAI,OAAO;AAAA,sBACX,OAAO;AAAA,sBACP,kBAAkB,OAAO;AAAA,oBAC3B,CAAC;AAAA,kBACH;AAEA,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,IAAI,OAAO;AAAA,oBACX,kBAAkB,OAAO;AAAA,kBAC3B,CAAC;AAED,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,YAAY,OAAO;AAAA,oBACnB,UAAU,OAAO;AAAA,oBACjB,OAAO;AAAA,oBACP,kBAAkB,OAAO;AAAA,kBAC3B,CAAC;AAED,iCAAe;AAAA,gBACjB,WAAW,gBAAgB;AACzB,wBAAM,aAAaA,YAAW;AAC9B,wBAAM,WAAW,KAAK,aAAa;AACnC,wBAAMC,QACJ,OAAO,KAAK,aAAa,SAAS,WAC9B,KAAK,aAAa,OAClB,KAAK,WAAU,UAAK,aAAa,SAAlB,YAA0B,CAAC,CAAC;AAEjD,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ;AAAA,oBACA,kBAAkB;AAAA,kBACpB,CAAC;AAED,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,OAAOA;AAAA,oBACP,kBAAkB;AAAA,kBACpB,CAAC;AAED,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,kBAAkB;AAAA,kBACpB,CAAC;AAED,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN;AAAA,oBACA;AAAA,oBACA,OAAOA;AAAA,oBACP,kBAAkB;AAAA,kBACpB,CAAC;AAED,iCAAe;AAAA,gBACjB;AAAA,cACF;AAAA,YACF;AAEA,gBAAI,UAAU,gBAAgB,MAAM;AAClC,6BAAe;AAAA,gBACb,SAAS,kCAAkC;AAAA,kBACzC,cAAc,UAAU;AAAA,kBACxB;AAAA,gBACF,CAAC;AAAA,gBACD,KAAK,UAAU;AAAA,cACjB;AAEA,iCAAmB;AAAA,gBACjB,CAAC,mBAAmB,GAAG;AAAA,kBACrB,iBAAgB,WAAM,mBAAN,YAAwB;AAAA,kBACxC,mBAAmB;AAAA,kBACnB,oBAAoB;AAAA,kBACpB,gBAAe,eAAU,kBAAV,YAA2B;AAAA,kBAC1C,eAAe,wCAAiB;AAAA,kBAChC,gBAAe,eAAU,kBAAV,YAA2B;AAAA,kBAC1C;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UAEA,MAAM,YAAY;AAChB,gBAAI,uBAAuB,MAAM;AAC/B,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,cACN,CAAC;AAAA,YACH;AACA,gBAAI,4BAA4B,MAAM;AACpC,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,cACN,CAAC;AAAA,YACH;AAEA,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN;AAAA,cACA,OAAO,+BAA+B,KAAK;AAAA,cAC3C;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,UAAU,EAAE,SAAS,gBAAgB;AAAA,MACrC,SAAS,EAAE,MAAM,KAAK;AAAA,IACxB;AAAA,EACF;AACF;AAqCA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,YAAAC;AACF,GAGwC;AAjhCxC;AAkhCE,MAAI,EAAC,uDAAmB,kBAAiB;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,UAAmC,CAAC;AAE1C,aAAW,SAAS,kBAAkB,iBAAiB;AACrD,QAAI,MAAM,OAAO,MAAM;AAErB,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,IAAIA,YAAW;AAAA,QACf,KAAK,MAAM,IAAI;AAAA,QACf,QAAO,WAAM,IAAI,UAAV,YAAmB;AAAA,MAC5B,CAAC;AAAA,IACH,WAAW,MAAM,SAAS,MAAM;AAE9B,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,IAAIA,YAAW;AAAA;AAAA;AAAA,QAGf,KAAK,MAAM,MAAM;AAAA,QACjB,QAAO,WAAM,MAAM,UAAZ,YAAqB;AAAA,MAC9B,CAAC;AAAA,IACH,WAAW,MAAM,oBAAoB,MAAM;AAEzC,YAAM,MAAM,MAAM,iBAAiB;AACnC,YAAM,kBAAkB,MAAM,iBAAiB;AAE/C,UAAI,QAAQ,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,UAAU,IAAI;AAEpE,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,IAAIA,YAAW;AAAA,UACf,KAAK;AAAA,UACL,QAAO,WAAM,iBAAiB,UAAvB,YAAgC;AAAA,QACzC,CAAC;AAAA,MACH,WAAW,KAAK;AAEd,cAAM,SAAQ,WAAM,iBAAiB,UAAvB,YAAgC;AAC9C,YAAI,YAAY;AAChB,YAAI,WAA+B;AAEnC,YAAI,IAAI,SAAS,MAAM,GAAG;AACxB,sBAAY;AACZ,qBAAW,IAAI,MAAM,GAAG,EAAE,IAAI;AAAA,QAChC,WAAW,IAAI,SAAS,MAAM,GAAG;AAC/B,sBAAY;AACZ,qBAAW,IAAI,MAAM,GAAG,EAAE,IAAI;AAAA,QAChC,WAAW,IAAI,SAAS,OAAO,GAAG;AAChC,sBACE;AACF,qBAAW,IAAI,MAAM,GAAG,EAAE,IAAI;AAAA,QAChC,WAAW,IAAI,SAAS,MAAM,GAAG;AAC/B,sBAAY;AACZ,qBAAW,IAAI,MAAM,GAAG,EAAE,IAAI;AAAA,QAChC,WAAW,IAAI,MAAM,kBAAkB,GAAG;AACxC,sBAAY;AACZ,qBAAW,IAAI,MAAM,GAAG,EAAE,IAAI;AAAA,QAChC,OAAO;AACL,qBAAW,IAAI,MAAM,GAAG,EAAE,IAAI;AAAA,QAChC;AAEA,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,IAAIA,YAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,WAAW,iBAAiB;AAE1B,cAAM,SAAQ,WAAM,iBAAiB,UAAvB,YAAgC;AAC9C,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,IAAIA,YAAW;AAAA,UACf,WAAW;AAAA,UACX;AAAA,UACA,UAAU,gBAAgB,MAAM,GAAG,EAAE,IAAI;AAAA,QAC3C,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,QAAQ,MAAM;AAC7B,UAAI,MAAM,KAAK,KAAK;AAClB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,IAAIA,YAAW;AAAA,UACf,KAAK,MAAM,KAAK;AAAA,UAChB,QAAO,WAAM,KAAK,UAAX,YAAoB;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEO,IAAM,6BAA6B,MACxCC,GAAE,OAAO;AAAA,EACP,kBAAkBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,EAC9C,oBAAoBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,EAChD,kBAAkBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,EAC9C,kBAAkBA,GAAE,OAAO,EAAE,iBAAiBA,GAAE,OAAO,EAAE,CAAC,EAAE,QAAQ;AAAA,EACpE,iBAAiBA,GACd;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,KAAKA,GACF,OAAO,EAAE,KAAKA,GAAE,OAAO,GAAG,OAAOA,GAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EACvD,QAAQ;AAAA,MACX,OAAOA,GACJ,OAAO;AAAA,QACN,WAAWA,GAAE,OAAO;AAAA,QACpB,UAAUA,GAAE,OAAO;AAAA,QACnB,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC1B,QAAQA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAC7B,CAAC,EACA,QAAQ;AAAA,MACX,kBAAkBA,GACf,OAAO;AAAA,QACN,KAAKA,GAAE,OAAO,EAAE,QAAQ;AAAA,QACxB,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC1B,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,QACzB,iBAAiBA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACtC,CAAC,EACA,QAAQ;AAAA,MACX,MAAMA,GACH,OAAO;AAAA,QACN,KAAKA,GAAE,OAAO,EAAE,QAAQ;AAAA,QACxB,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC1B,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,QACzB,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAC9B,CAAC,EACA,QAAQ;AAAA,IACb,CAAC;AAAA,EACH,EACC,QAAQ;AAAA,EACX,mBAAmBA,GAChB;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,SAASA,GACN,OAAO;AAAA,QACN,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC/B,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC7B,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAC3B,CAAC,EACA,QAAQ;AAAA,MACX,cAAcA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACjC,uBAAuBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,MACnD,qBAAqBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,MACjD,kBAAkBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,MAC9C,iBAAiBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,IAC/C,CAAC;AAAA,EACH,EACC,QAAQ;AAAA,EACX,mBAAmBA,GAChB,MAAM;AAAA,IACLA,GAAE,OAAO;AAAA,MACP,0BAA0BA,GAAE,OAAO;AAAA,IACrC,CAAC;AAAA,IACDA,GAAE,OAAO,CAAC,CAAC;AAAA,EACb,CAAC,EACA,QAAQ;AACb,CAAC;AAEH,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EAChC,UAAUA,GAAE,OAAO;AAAA,EACnB,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,WAAWA,GAAE,QAAQ,EAAE,QAAQ;AAAA,EAC/B,WAAWA,GAAE,QAAQ,EAAE,QAAQ;AAAA,EAC/B,cAAcA,GAAE,QAAQ,EAAE,QAAQ;AACpC,CAAC;AAED,IAAM,mBAAmB,MACvBA,GAAE,OAAO;AAAA,EACP,OAAOA,GACJ;AAAA,IACCA,GAAE,MAAM;AAAA;AAAA,MAENA,GAAE,OAAO;AAAA,QACP,cAAcA,GAAE,OAAO;AAAA,UACrB,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,UACzB,MAAMA,GAAE,QAAQ,EAAE,QAAQ;AAAA,UAC1B,aAAaA,GAAE,MAAM,gBAAgB,EAAE,QAAQ;AAAA,UAC/C,cAAcA,GAAE,QAAQ,EAAE,QAAQ;AAAA,QACpC,CAAC;AAAA,QACD,kBAAkBA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACvC,CAAC;AAAA,MACDA,GAAE,OAAO;AAAA,QACP,YAAYA,GAAE,OAAO;AAAA,UACnB,UAAUA,GAAE,OAAO;AAAA,UACnB,MAAMA,GAAE,OAAO;AAAA,QACjB,CAAC;AAAA,QACD,SAASA,GAAE,QAAQ,EAAE,QAAQ;AAAA,QAC7B,kBAAkBA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACvC,CAAC;AAAA,MACDA,GAAE,OAAO;AAAA,QACP,UAAUA,GAAE,OAAO;AAAA,UACjB,UAAUA,GAAE,OAAO;AAAA,UACnB,MAAMA,GAAE,QAAQ,EAAE,QAAQ;AAAA,UAC1B,IAAIA,GAAE,OAAO;AAAA,QACf,CAAC;AAAA,QACD,kBAAkBA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACvC,CAAC;AAAA,MACDA,GAAE,OAAO;AAAA,QACP,cAAcA,GAAE,OAAO;AAAA,UACrB,UAAUA,GAAE,OAAO;AAAA,UACnB,UAAUA,GAAE,QAAQ,EAAE,QAAQ;AAAA,UAC9B,IAAIA,GAAE,OAAO;AAAA,QACf,CAAC;AAAA,QACD,kBAAkBA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACvC,CAAC;AAAA,MACDA,GAAE,OAAO;AAAA,QACP,gBAAgBA,GACb,OAAO;AAAA,UACN,UAAUA,GAAE,OAAO;AAAA,UACnB,MAAMA,GAAE,OAAO;AAAA,QACjB,CAAC,EACA,QAAQ;AAAA,QACX,qBAAqBA,GAClB,OAAO;AAAA,UACN,SAASA,GAAE,OAAO;AAAA,UAClB,QAAQA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC7B,CAAC,EACA,QAAQ;AAAA,QACX,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,QACzB,SAASA,GAAE,QAAQ,EAAE,QAAQ;AAAA,QAC7B,kBAAkBA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACvC,CAAC;AAAA,IACH,CAAC;AAAA,EACH,EACC,QAAQ;AACb,CAAC;AAGH,IAAM,wBAAwB,MAC5BA,GAAE,OAAO;AAAA,EACP,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,kBAAkBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACrC,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAClC,SAASA,GAAE,QAAQ,EAAE,QAAQ;AAC/B,CAAC;AAEH,IAAM,qBAAqBA,GACxB;AAAA,EACCA,GAAE,OAAO;AAAA,IACP,UAAUA,GAAE,OAAO;AAAA,IACnB,YAAYA,GAAE,OAAO;AAAA,EACvB,CAAC;AACH,EACC,QAAQ;AAEX,IAAM,cAAcA,GAAE,OAAO;AAAA,EAC3B,yBAAyBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC5C,oBAAoBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACvC,kBAAkBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACrC,sBAAsBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACzC,iBAAiBA,GAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAEpC,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,EAEhC,qBAAqB;AAAA,EACrB,yBAAyB;AAC3B,CAAC;AAGM,IAAM,8BAA8B,MACzCA,GAAE,OAAO;AAAA,EACP,aAAaA,GACV;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,cAAcA,GAAE,OAAO;AAAA,MACvB,oBAAoBA,GAAE,OAAO;AAAA,IAC/B,CAAC;AAAA,EACH,EACC,QAAQ;AACb,CAAC;AAEH,IAAM,iBAAiBC;AAAA,EAAW,MAChCC;AAAA,IACEF,GAAE,OAAO;AAAA,MACP,YAAYA,GAAE;AAAA,QACZA,GAAE,OAAO;AAAA,UACP,SAAS,iBAAiB,EAAE,QAAQ,EAAE,GAAGA,GAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC;AAAA,UAC9D,cAAcA,GAAE,OAAO,EAAE,QAAQ;AAAA,UACjC,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,UAClC,eAAeA,GAAE,MAAM,sBAAsB,CAAC,EAAE,QAAQ;AAAA,UACxD,mBAAmB,2BAA2B,EAAE,QAAQ;AAAA,UACxD,oBAAoB,4BAA4B,EAAE,QAAQ;AAAA,QAC5D,CAAC;AAAA,MACH;AAAA,MACA,eAAe,YAAY,QAAQ;AAAA,MACnC,gBAAgBA,GACb,OAAO;AAAA,QACN,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAChC,eAAeA,GAAE,MAAM,sBAAsB,CAAC,EAAE,QAAQ;AAAA,MAC1D,CAAC,EACA,QAAQ;AAAA,MACX,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAClC,CAAC;AAAA,EACH;AACF;AA+BA,IAAM,cAAcC;AAAA,EAAW,MAC7BC;AAAA,IACEF,GAAE,OAAO;AAAA,MACP,YAAYA,GACT;AAAA,QACCA,GAAE,OAAO;AAAA,UACP,SAAS,iBAAiB,EAAE,QAAQ;AAAA,UACpC,cAAcA,GAAE,OAAO,EAAE,QAAQ;AAAA,UACjC,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,UAClC,eAAeA,GAAE,MAAM,sBAAsB,CAAC,EAAE,QAAQ;AAAA,UACxD,mBAAmB,2BAA2B,EAAE,QAAQ;AAAA,UACxD,oBAAoB,4BAA4B,EAAE,QAAQ;AAAA,QAC5D,CAAC;AAAA,MACH,EACC,QAAQ;AAAA,MACX,eAAe,YAAY,QAAQ;AAAA,MACnC,gBAAgBA,GACb,OAAO;AAAA,QACN,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAChC,eAAeA,GAAE,MAAM,sBAAsB,CAAC,EAAE,QAAQ;AAAA,MAC1D,CAAC,EACA,QAAQ;AAAA,MACX,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAClC,CAAC;AAAA,EACH;AACF;;;AS/3CA,SAAS,iDAAiD;AAC1D,SAAS,KAAAG,UAAS;AAWX,IAAM,gBAAgB,0CAU3B;AAAA,EACA,IAAI;AAAA,EACJ,aAAaA,GAAE,OAAO;AAAA,IACpB,UAAUA,GAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,IACrE,MAAMA,GAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,EACtD,CAAC;AAAA,EACD,cAAcA,GAAE,OAAO;AAAA,IACrB,SAASA,GACN,OAAO,EACP,SAAS,oDAAoD;AAAA,IAChE,QAAQA,GAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,EACnE,CAAC;AACH,CAAC;;;AClCD;AAAA,EACE;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;AAIX,IAAM,sBAAsB,0BAKjC;AAAA,EACA,IAAI;AAAA,EACJ,aAAaF,YAAW,MAAMC,WAAUC,GAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;;;ACjBD;AAAA,EACE,6BAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;AAGlB,IAAM,2BAA2BA,GAC9B,OAAO;AAAA;AAAA;AAAA;AAAA,EAIN,sBAAsBA,GACnB,MAAMA,GAAE,OAAO,CAAC,EAChB;AAAA,IACC;AAAA,EACF;AAAA;AAAA,EAEF,MAAMA,GACH,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,yDAAyD,EAClE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKZ,gBAAgBA,GACb,OAAO,EACP;AAAA,IACC;AAAA,EACF,EACC,SAAS;AACd,CAAC,EACA,YAAY;AAIf,IAAM,uBAAuBF;AAAA,EAAW,MACtCC,WAAU,wBAAwB;AACpC;AAEO,IAAM,aAAaF,2BAGxB;AAAA,EACA,IAAI;AAAA,EACJ,aAAa;AACf,CAAC;;;AClDD;AAAA,EACE,6BAAAI;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;AAKX,IAAM,aAAaH,2BAAkC;AAAA,EAC1D,IAAI;AAAA,EACJ,aAAaC,YAAW,MAAMC,WAAUC,GAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;;;ACbD;AAAA,EACE,6BAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,KAAAC,WAAS;AAMlB,IAAM,iCAAiCA,IACpC,OAAO;AAAA,EACN,aAAaA,IACV,OAAO;AAAA,IACN,WAAWA,IAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,IACjC,aAAaA,IAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,EACrC,CAAC,EACA,SAAS;AAAA,EAEZ,iBAAiBA,IACd,OAAO;AAAA,IACN,WAAWA,IAAE,OAAO;AAAA,IACpB,SAASA,IAAE,OAAO;AAAA,EACpB,CAAC,EACA,SAAS;AACd,CAAC,EACA,YAAY;AAMf,IAAM,6BAA6BF;AAAA,EAAW,MAC5CC,WAAU,8BAA8B;AAC1C;AAEO,IAAM,eAAeF;AAAA,EAC1B;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,EACf;AACF;;;AC1CA;AAAA,EACE,6BAAAI;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,KAAAC,WAAS;AAEX,IAAM,aAAaH,2BAKxB;AAAA,EACA,IAAI;AAAA,EACJ,aAAaC,aAAW,MAAMC,YAAUC,IAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;;;ACfD,SAAS,6BAAAC,kCAAiC;AAC1C,SAAS,KAAAC,WAAS;AAUX,IAAM,iBAAiBD,2BAa5B;AAAA,EACA,IAAI;AAAA,EACJ,aAAaC,IAAE,OAAO;AAAA,IACpB,WAAWA,IAAE,OAAO;AAAA,IACpB,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC;AACH,CAAC;;;ACtBM,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAKzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AACF;;;ACjEA;AAAA,EACE,kBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,6BAAAC;AAAA,EACA,cAAc;AAAA,EACd,cAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,OAIK;AACP,SAAS,KAAAC,WAAS;AAoBX,IAAM,+BAAN,MAA2D;AAAA,EAmBhE,YACW,SACQ,UACA,QACjB;AAHS;AACQ;AACA;AArBnB,SAAS,uBAAuB;AAAA,EAsB7B;AAAA,EApBH,IAAI,mBAA2B;AAC7B,QAAI,KAAK,SAAS,oBAAoB,MAAM;AAC1C,aAAO,KAAK,SAAS;AAAA,IACvB;AAEA,QAAI,cAAc,KAAK,OAAO,GAAG;AAC/B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAQA,MAAM,WACJ,SAC0D;AAE1D,QAAI,cAAc,KAAK,OAAO,GAAG;AAC/B,aAAO,KAAK,iBAAiB,OAAO;AAAA,IACtC;AACA,WAAO,KAAK,iBAAiB,OAAO;AAAA,EACtC;AAAA,EAEA,MAAc,iBACZ,SAC0D;AA5E9D;AA6EI,UAAM;AAAA,MACJ;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AACJ,UAAM,WAAmC,CAAC;AAG1C,QAAI,SAAS,QAAQ,MAAM,SAAS,GAAG;AACrC,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,UAAM,gBAAgB,MAAMC,sBAAqB;AAAA,MAC/C,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AAEvE,UAAM,aAAsC;AAAA,MAC1C,aAAa;AAAA,IACf;AAEA,QAAI,eAAe,MAAM;AACvB,iBAAW,cAAc;AAAA,IAC3B;AAEA,QAAI,eAAe;AACjB,aAAO,OAAO,YAAY,aAAa;AAAA,IACzC;AAEA,UAAM,OAAO;AAAA,MACX,WAAW,CAAC,EAAE,OAAO,CAAC;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,MAAMC,eAEhD;AAAA,MACD,KAAK,GAAG,KAAK,OAAO,OAAO,WAAW,KAAK,OAAO;AAAA,MAClD,SAASC,gBAAe,MAAMC,SAAQ,KAAK,OAAO,OAAO,GAAG,OAAO;AAAA,MACnE;AAAA,MACA,uBAAuB;AAAA,MACvB,2BAA2BC;AAAA,QACzB;AAAA,MACF;AAAA,MACA;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AACD,WAAO;AAAA,MACL,QAAQ,SAAS,YAAY;AAAA,QAC3B,CAAC,MAAsC,EAAE;AAAA,MAC3C;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,QAChB,QAAQ;AAAA,UACN,QAAQ,SAAS,YAAY,IAAI,OAAO;AAAA;AAAA,UAExC,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,SAC0D;AAxL9D;AAyLI,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AACJ,UAAM,WAAmC,CAAC;AAG1C,QAAI,QAAQ,MAAM;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,QAAQ,IAAI,GAAG;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAGA,UAAM,cAGF,CAAC;AAGL,QAAI,UAAU,MAAM;AAClB,kBAAY,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,IACjD;AAGA,QAAI,SAAS,QAAQ,MAAM,SAAS,GAAG;AACrC,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,SAAS,OAAO;AACvB,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,MAAM,IAAI,IAAI,KAAK,GAAG;AAAA,YACtB,WAAW;AAAA,UACb,CAAC;AAAA,QACH,OAAO;AACL,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,MACE,OAAO,KAAK,SAAS,WACjB,KAAK,OACL,IAAI,WAAW,KAAK,IAAI;AAAA,YAC9B,WAAW,KAAK;AAAA,UAClB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,sBAA6C;AAAA,MACjD,EAAE,MAAM,QAAQ,SAAS,YAAY;AAAA,IACvC;AAGA,UAAM,gBAAgB,IAAI,gCAAgC,KAAK,SAAS;AAAA,MACtE,UAAU,KAAK,OAAO;AAAA,MACtB,SAAS,KAAK,OAAO;AAAA,MACrB,UAAS,UAAK,OAAO,YAAZ,YAAuB,CAAC;AAAA,MACjC,OAAO,KAAK,OAAO;AAAA,MACnB,aAAY,UAAK,OAAO,eAAZ,YAA0B;AAAA,IACxC,CAAC;AAGD,UAAM,SAAS,MAAM,cAAc,WAAW;AAAA,MAC5C,QAAQ;AAAA,MACR;AAAA,MACA,iBAAiB;AAAA,QACf,QAAQ;AAAA,UACN,oBAAoB,CAAC,OAAO;AAAA,UAC5B,aAAa,cACT;AAAA,YACE;AAAA,UAGF,IACA;AAAA,UACJ,IAAK,wDAAiB,WAAjB,YAGC,CAAC;AAAA,QACT;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AAGvE,UAAM,SAAmB,CAAC;AAC1B,eAAW,QAAQ,OAAO,SAAS;AACjC,UAAI,KAAK,SAAS,UAAU,KAAK,UAAU,WAAW,QAAQ,GAAG;AAC/D,eAAO,KAAKC,iBAAgB,KAAK,IAAI,CAAC;AAAA,MACxC;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,QAChB,QAAQ;AAAA,UACN,QAAQ,OAAO,IAAI,OAAO,CAAC,EAAE;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,UAAS,YAAO,aAAP,mBAAiB;AAAA,MAC5B;AAAA,MACA,OAAO,OAAO,QACV;AAAA,QACE,aAAa,OAAO,MAAM,YAAY;AAAA,QACtC,cAAc,OAAO,MAAM,aAAa;AAAA,QACxC,eACG,YAAO,MAAM,YAAY,UAAzB,YAAkC,OAClC,YAAO,MAAM,aAAa,UAA1B,YAAmC;AAAA,MACxC,IACA;AAAA,IACN;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAA0B;AAC/C,SAAO,QAAQ,WAAW,SAAS;AACrC;AAGA,IAAM,4BAA4BC;AAAA,EAAW,MAC3CC;AAAA,IACEC,IAAE,OAAO;AAAA,MACP,aAAaA,IACV,MAAMA,IAAE,OAAO,EAAE,oBAAoBA,IAAE,OAAO,EAAE,CAAC,CAAC,EAClD,QAAQ,CAAC,CAAC;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAIA,IAAM,gCAAgCF;AAAA,EAAW,MAC/CC;AAAA,IACEC,IAAE,OAAO;AAAA,MACP,kBAAkBA,IACf,KAAK,CAAC,cAAc,eAAe,WAAW,CAAC,EAC/C,QAAQ;AAAA,MACX,aAAaA,IAAE,KAAK,CAAC,OAAO,OAAO,OAAO,QAAQ,MAAM,CAAC,EAAE,QAAQ;AAAA,IACrE,CAAC;AAAA,EACH;AACF;;;AClWA;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE,kBAAAC;AAAA,EACA;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,EAEA;AAAA,EACA,cAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,iBAAAC;AAAA,EAEA,WAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,KAAAC,WAAS;AAiCX,IAAM,+BAAN,MAAwE;AAAA,EAY7E,YACW,SACQ,QACjB;AAFS;AACQ;AAbnB,SAAS,uBAAuB;AAAA,EAc7B;AAAA,EAZH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,mBAA2B;AAE7B,WAAO;AAAA,EACT;AAAA,EAOA,MAAM,WACJ,SACuE;AAvE3E;AAwEI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,WAA8B,CAAC;AAErC,UAAM,gBAAiB,MAAMC,sBAAqB;AAAA,MAChD,UAAU;AAAA,MACV,iBAAiB,QAAQ;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,YAA4C,CAAC,CAAC,CAAC;AACrD,UAAM,WAAW,UAAU,CAAC;AAE5B,QAAI,QAAQ,UAAU,MAAM;AAC1B,eAAS,SAAS,QAAQ;AAAA,IAC5B;AAGA,QAAI,QAAQ,SAAS,MAAM;AACzB,UAAI,QAAQ,MAAM,SAAS,OAAO;AAChC,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SACE;AAAA,QACJ,CAAC;AAAA,MACH,OAAO;AACL,cAAM,aACJ,OAAO,QAAQ,MAAM,SAAS,WAC1B,QAAQ,MAAM,OACd,0BAA0B,QAAQ,MAAM,IAAI;AAElD,iBAAS,QAAQ;AAAA,UACf,YAAY;AAAA,YACV,UAAU,QAAQ,MAAM,aAAa;AAAA,YACrC,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,SAAI,+CAAe,oBAAmB,MAAM;AAC1C,eAAS,kBAAkB,cAAc,gBAAgB,IAAI,YAAU;AACrE,YAAI,OAAO,oBAAoB;AAC7B,iBAAO;AAAA,YACL,YAAY;AAAA,cACV,UAAU;AAAA,cACV,MAAM,OAAO;AAAA,YACf;AAAA,UACF;AAAA,QACF,WAAW,OAAO,QAAQ;AACxB,iBAAO;AAAA,YACL,QAAQ,OAAO;AAAA,UACjB;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,UAAM,aAAsC;AAAA,MAC1C,aAAa,QAAQ;AAAA,IACvB;AAEA,QAAI,QAAQ,aAAa;AACvB,iBAAW,cAAc,QAAQ;AAAA,IACnC;AAEA,QAAI,QAAQ,YAAY;AACtB,YAAM,gBAAwC;AAAA,QAC5C,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AACA,iBAAW,aACT,cAAc,QAAQ,UAAU,KAAK,QAAQ;AAAA,IACjD;AAEA,QAAI,QAAQ,UAAU;AACpB,iBAAW,kBAAkB,QAAQ;AAAA,IACvC;AAEA,QAAI,QAAQ,MAAM;AAChB,iBAAW,OAAO,QAAQ;AAAA,IAC5B;AAEA,QAAI,iBAAiB,MAAM;AACzB,YAAM,OAAO;AAEb,UACE,KAAK,qBAAqB,UAC1B,KAAK,qBAAqB,MAC1B;AACA,mBAAW,mBAAmB,KAAK;AAAA,MACrC;AACA,UAAI,KAAK,mBAAmB,UAAa,KAAK,mBAAmB,MAAM;AACrE,mBAAW,iBAAiB,KAAK;AAAA,MACnC;AAEA,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,YACE,CAAC;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,SAAS,GAAG,GACd;AACA,qBAAW,GAAG,IAAI;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,UAAU,IAAI,MAAMC,eAAc;AAAA,MAC/C,KAAK,GAAG,KAAK,OAAO,OAAO,WAAW,KAAK,OAAO;AAAA,MAClD,SAASC;AAAA,QACP,MAAMC,SAAQ,KAAK,OAAO,OAAO;AAAA,QACjC,QAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,MACA,2BAA2BC;AAAA,QACzB;AAAA,MACF;AAAA,MACA,uBAAuB;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,gBAAgB,UAAU;AAChC,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,kBAAiB,oDAAe,mBAAf,YAAiC;AACxD,UAAM,iBAAgB,oDAAe,kBAAf,YAAgC;AAEtD,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI,iBAAiB;AACrB,QAAI;AAEJ,WAAO,CAAC,eAAe,MAAM;AAC3B,UAAI,KAAK,IAAI,IAAI,YAAY,eAAe;AAC1C,cAAM,IAAI,WAAW;AAAA,UACnB,MAAM;AAAA,UACN,SAAS,oCAAoC,aAAa;AAAA,QAC5D,CAAC;AAAA,MACH;AAEA,YAAM,MAAM,cAAc;AAE1B,WAAI,aAAQ,gBAAR,mBAAqB,SAAS;AAChC,cAAM,IAAI,WAAW;AAAA,UACnB,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAEA,YAAM,EAAE,OAAO,iBAAiB,iBAAiB,YAAY,IAC3D,MAAM,WAAW;AAAA,QACf,KAAK,GAAG,KAAK,OAAO,OAAO,IAAI,aAAa;AAAA,QAC5C,SAASF;AAAA,UACP,MAAMC,SAAQ,KAAK,OAAO,OAAO;AAAA,UACjC,QAAQ;AAAA,QACV;AAAA,QACA,2BAA2BC;AAAA,UACzB;AAAA,QACF;AAAA,QACA,uBAAuB;AAAA,QACvB,aAAa,QAAQ;AAAA,QACrB,OAAO,KAAK,OAAO;AAAA,MACrB,CAAC;AAEH,uBAAiB;AACjB,wBAAkB;AAAA,IACpB;AAEA,QAAI,eAAe,OAAO;AACxB,YAAM,IAAI,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,4BAA4B,eAAe,MAAM,OAAO;AAAA,MACnE,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,eAAe;AAChC,QACE,GAAC,0CAAU,0BAAV,mBAAiC,qBAClC,SAAS,sBAAsB,iBAAiB,WAAW,GAC3D;AACA,YAAM,IAAI,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,oCAAoC,KAAK,UAAU,cAAc,CAAC;AAAA,MAC7E,CAAC;AAAA,IACH;AAEA,UAAM,SAAiE,CAAC;AACxE,UAAM,gBAAwC,CAAC;AAG/C,UAAM,kBAAkB,MAAMD,SAAQ,KAAK,OAAO,OAAO;AACzD,UAAM,SAAS,mDAAkB;AAEjC,eAAW,mBAAmB,SAAS,sBACpC,kBAAkB;AACnB,WAAI,qBAAgB,UAAhB,mBAAuB,KAAK;AAE9B,cAAM,cAAc,SAChB,GAAG,gBAAgB,MAAM,GAAG,GAAG,gBAAgB,MAAM,IAAI,SAAS,GAAG,IAAI,MAAM,GAAG,OAAO,MAAM,KAC/F,gBAAgB,MAAM;AAE1B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,KAAK;AAAA,UACL,WAAW;AAAA,QACb,CAAC;AACD,sBAAc,KAAK;AAAA,UACjB,KAAK,gBAAgB,MAAM;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,IAAI,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,MACX;AAAA,MACA,kBAAkB;AAAA,QAChB,QAAQ;AAAA,UACN,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,wBAAwBE,IAAE,OAAO;AAAA,EACrC,MAAMA,IAAE,OAAO,EAAE,QAAQ;AAAA,EACzB,MAAMA,IAAE,QAAQ,EAAE,QAAQ;AAAA,EAC1B,OAAOA,IACJ,OAAO;AAAA,IACN,MAAMA,IAAE,OAAO,EAAE,QAAQ;AAAA,IACzB,SAASA,IAAE,OAAO;AAAA,IAClB,QAAQA,IAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,CAAC,EACA,QAAQ;AAAA,EACX,UAAUA,IACP,OAAO;AAAA,IACN,uBAAuBA,IACpB,OAAO;AAAA,MACN,kBAAkBA,IACf;AAAA,QACCA,IAAE,OAAO;AAAA,UACP,OAAOA,IACJ,OAAO;AAAA,YACN,KAAKA,IAAE,OAAO,EAAE,QAAQ;AAAA,UAC1B,CAAC,EACA,QAAQ;AAAA,QACb,CAAC;AAAA,MACH,EACC,QAAQ;AAAA,IACb,CAAC,EACA,QAAQ;AAAA,EACb,CAAC,EACA,QAAQ;AACb,CAAC;AAED,IAAM,gCAAgCC;AAAA,EAAW,MAC/CC;AAAA,IACEF,IACG,OAAO;AAAA,MACN,gBAAgBA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,MAC9C,eAAeA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,MAC7C,kBAAkBA,IACf,KAAK,CAAC,cAAc,eAAe,WAAW,CAAC,EAC/C,QAAQ;AAAA,MACX,gBAAgBA,IAAE,OAAO,EAAE,QAAQ;AAAA,MACnC,iBAAiBA,IACd;AAAA,QACCA,IAAE,OAAO;AAAA,UACP,oBAAoBA,IAAE,OAAO,EAAE,QAAQ;AAAA,UACvC,QAAQA,IAAE,OAAO,EAAE,QAAQ;AAAA,QAC7B,CAAC;AAAA,MACH,EACC,QAAQ;AAAA,IACb,CAAC,EACA,YAAY;AAAA,EACjB;AACF;;;AvBxPO,SAAS,yBACd,UAA8C,CAAC,GACnB;AA/H9B;AAgIE,QAAM,WACJ,0BAAqB,QAAQ,OAAO,MAApC,YACA;AAEF,QAAM,gBAAe,aAAQ,SAAR,YAAgB;AAErC,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,kBAAkB,WAAW;AAAA,QAC3B,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC;AAAA,MACD,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,iBAAiB,OAAO;AAAA,EAC1B;AAEF,QAAM,kBAAkB,CAAC,YAAoC;AAnJ/D,QAAAG;AAoJI,eAAI,gCAAgC,SAAS;AAAA,MAC3C,UAAU;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT,aAAYA,MAAA,QAAQ,eAAR,OAAAA,MAAsBC;AAAA,MAClC,eAAe,OAAO;AAAA,QACpB,KAAK;AAAA;AAAA;AAAA,UAGH,IAAI,OAAO,IAAI,OAAO,YAAY;AAAA;AAAA,UAElC,IAAI;AAAA,YACF;AAAA,UACF;AAAA,UACA,IAAI,OAAO,gDAAgD;AAAA,QAC7D;AAAA,MACF;AAAA,MACA,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA;AAEH,QAAM,uBAAuB,CAAC,YAC5B,IAAI,iCAAiC,SAAS;AAAA,IAC5C,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,mBAAmB,CACvB,SACA,WAA4C,CAAC,MAE7C,IAAI,6BAA6B,SAAS,UAAU;AAAA,IAClD,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,mBAAmB,CAAC,YAAyC;AA3LrE,QAAAD;AA4LI,eAAI,6BAA6B,SAAS;AAAA,MACxC,UAAU;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,aAAYA,MAAA,QAAQ,eAAR,OAAAA,MAAsBC;AAAA,IACpC,CAAC;AAAA;AAEH,QAAM,WAAW,SAAU,SAAoC;AAC7D,QAAI,YAAY;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,gBAAgB,OAAO;AAAA,EAChC;AAEA,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,eAAe;AACxB,WAAS,YAAY;AACrB,WAAS,iBAAiB;AAC1B,WAAS,gBAAgB;AACzB,WAAS,qBAAqB;AAC9B,WAAS,QAAQ;AACjB,WAAS,aAAa;AACtB,WAAS,QAAQ;AACjB,WAAS,aAAa;AACtB,WAAS,QAAQ;AAEjB,SAAO;AACT;AAKO,IAAM,SAAS,yBAAyB;","names":["generateId","lazySchema","zodSchema","z","lazySchema","zodSchema","z","responseHeaders","response","rawValue","lazySchema","zodSchema","z","combineHeaders","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","resolve","zodSchema","z","_a","_b","_c","_d","lazySchema","zodSchema","z","UnsupportedFunctionalityError","googleTools","functionDeclarations","UnsupportedFunctionalityError","parseProviderOptions","googleTools","combineHeaders","resolve","postJsonToApi","createJsonResponseHandler","generateId","args","generateId","z","lazySchema","zodSchema","z","lazySchema","zodSchema","z","createProviderToolFactory","lazySchema","zodSchema","z","createProviderToolFactory","lazySchema","zodSchema","z","createProviderToolFactory","lazySchema","zodSchema","z","createProviderToolFactory","lazySchema","zodSchema","z","createProviderToolFactory","z","combineHeaders","convertToBase64","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","resolve","zodSchema","z","parseProviderOptions","postJsonToApi","combineHeaders","resolve","createJsonResponseHandler","convertToBase64","lazySchema","zodSchema","z","combineHeaders","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","resolve","zodSchema","z","parseProviderOptions","postJsonToApi","combineHeaders","resolve","createJsonResponseHandler","z","lazySchema","zodSchema","_a","generateId"]}
1
+ {"version":3,"sources":["../src/google-provider.ts","../src/version.ts","../src/google-generative-ai-embedding-model.ts","../src/google-error.ts","../src/google-generative-ai-embedding-options.ts","../src/google-generative-ai-language-model.ts","../src/convert-google-generative-ai-usage.ts","../src/convert-json-schema-to-openapi-schema.ts","../src/convert-to-google-generative-ai-messages.ts","../src/get-model-path.ts","../src/google-generative-ai-options.ts","../src/google-prepare-tools.ts","../src/google-json-accumulator.ts","../src/map-google-generative-ai-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-generative-ai-image-model.ts","../src/google-generative-ai-video-model.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/prepare-google-interactions-tools.ts","../src/interactions/synthesize-google-interactions-agent-stream.ts"],"sourcesContent":["import type {\n EmbeddingModelV3,\n Experimental_VideoModelV3,\n ImageModelV3,\n LanguageModelV3,\n ProviderV3,\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 { GoogleGenerativeAIEmbeddingModel } from './google-generative-ai-embedding-model';\nimport type { GoogleGenerativeAIEmbeddingModelId } from './google-generative-ai-embedding-options';\nimport { GoogleGenerativeAILanguageModel } from './google-generative-ai-language-model';\nimport type { GoogleGenerativeAIModelId } from './google-generative-ai-options';\nimport { googleTools } from './google-tools';\n\nimport type {\n GoogleGenerativeAIImageSettings,\n GoogleGenerativeAIImageModelId,\n} from './google-generative-ai-image-settings';\nimport { GoogleGenerativeAIImageModel } from './google-generative-ai-image-model';\nimport { GoogleGenerativeAIVideoModel } from './google-generative-ai-video-model';\nimport type { GoogleGenerativeAIVideoModelId } from './google-generative-ai-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 GoogleGenerativeAIProvider extends ProviderV3 {\n (modelId: GoogleGenerativeAIModelId): LanguageModelV3;\n\n languageModel(modelId: GoogleGenerativeAIModelId): LanguageModelV3;\n\n chat(modelId: GoogleGenerativeAIModelId): LanguageModelV3;\n\n /**\n * Creates a model for image generation.\n */\n image(\n modelId: GoogleGenerativeAIImageModelId,\n settings?: GoogleGenerativeAIImageSettings,\n ): ImageModelV3;\n\n /**\n * @deprecated Use `chat()` instead.\n */\n generativeAI(modelId: GoogleGenerativeAIModelId): LanguageModelV3;\n\n /**\n * Creates a model for text embeddings.\n */\n embedding(modelId: GoogleGenerativeAIEmbeddingModelId): EmbeddingModelV3;\n\n /**\n * Creates a model for text embeddings.\n */\n embeddingModel(modelId: GoogleGenerativeAIEmbeddingModelId): EmbeddingModelV3;\n\n /**\n * @deprecated Use `embedding` instead.\n */\n textEmbedding(modelId: GoogleGenerativeAIEmbeddingModelId): EmbeddingModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(\n modelId: GoogleGenerativeAIEmbeddingModelId,\n ): EmbeddingModelV3;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: GoogleGenerativeAIVideoModelId): Experimental_VideoModelV3;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(\n modelId: GoogleGenerativeAIVideoModelId,\n ): Experimental_VideoModelV3;\n\n /**\n * Creates a language model targeting the Gemini Interactions API\n * (`POST /v1beta/interactions`). Pass either a model ID (string) or\n * `{ agent: <name> }` to use a Gemini agent preset.\n */\n interactions(\n modelIdOrAgent:\n | GoogleInteractionsModelId\n | { agent: GoogleInteractionsAgentName },\n ): LanguageModelV3;\n\n tools: typeof googleTools;\n}\n\nexport interface GoogleGenerativeAIProviderSettings {\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 Generative AI provider instance.\n */\nexport function createGoogleGenerativeAI(\n options: GoogleGenerativeAIProviderSettings = {},\n): GoogleGenerativeAIProvider {\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: GoogleGenerativeAIModelId) =>\n new GoogleGenerativeAILanguageModel(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: GoogleGenerativeAIEmbeddingModelId) =>\n new GoogleGenerativeAIEmbeddingModel(modelId, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createImageModel = (\n modelId: GoogleGenerativeAIImageModelId,\n settings: GoogleGenerativeAIImageSettings = {},\n ) =>\n new GoogleGenerativeAIImageModel(modelId, settings, {\n provider: providerName,\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: GoogleGenerativeAIVideoModelId) =>\n new GoogleGenerativeAIVideoModel(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 ) =>\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: GoogleGenerativeAIModelId) {\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 = 'v3' 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.interactions = createInteractionsModel;\n provider.tools = googleTools;\n\n return provider as GoogleGenerativeAIProvider;\n}\n\n/**\n * Default Google Generative AI provider instance.\n */\nexport const google = createGoogleGenerativeAI();\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 EmbeddingModelV3,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n resolve,\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 GoogleGenerativeAIEmbeddingModelId,\n} from './google-generative-ai-embedding-options';\n\ntype GoogleGenerativeAIEmbeddingConfig = {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class GoogleGenerativeAIEmbeddingModel implements EmbeddingModelV3 {\n readonly specificationVersion = 'v3';\n readonly modelId: GoogleGenerativeAIEmbeddingModelId;\n readonly maxEmbeddingsPerCall = 2048;\n readonly supportsParallelCalls = true;\n\n private readonly config: GoogleGenerativeAIEmbeddingConfig;\n\n get provider(): string {\n return this.config.provider;\n }\n constructor(\n modelId: GoogleGenerativeAIEmbeddingModelId,\n config: GoogleGenerativeAIEmbeddingConfig,\n ) {\n this.modelId = modelId;\n this.config = config;\n }\n\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions,\n }: Parameters<EmbeddingModelV3['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV3['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 await resolve(this.config.headers),\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 type InferSchema,\n lazySchema,\n zodSchema,\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 type InferSchema,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type GoogleGenerativeAIEmbeddingModelId =\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]);\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 LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3Source,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n JSONObject,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n resolve,\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 convertGoogleGenerativeAIUsage,\n type GoogleGenerativeAIUsageMetadata,\n} from './convert-google-generative-ai-usage';\nimport { convertJSONSchemaToOpenAPISchema } from './convert-json-schema-to-openapi-schema';\nimport { convertToGoogleGenerativeAIMessages } from './convert-to-google-generative-ai-messages';\nimport { getModelPath } from './get-model-path';\nimport { googleFailedResponseHandler } from './google-error';\nimport {\n googleLanguageModelOptions,\n VertexServiceTierMap,\n type GoogleGenerativeAIModelId,\n} from './google-generative-ai-options';\nimport type {\n GoogleGenerativeAIContentPart,\n GoogleGenerativeAIProviderMetadata,\n} from './google-generative-ai-prompt';\nimport { prepareTools } from './google-prepare-tools';\nimport {\n GoogleJSONAccumulator,\n type PartialArg,\n} from './google-json-accumulator';\nimport { mapGoogleGenerativeAIFinishReason } from './map-google-generative-ai-finish-reason';\n\ntype GoogleGenerativeAIConfig = {\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?: () => LanguageModelV3['supportedUrls'];\n};\n\nexport class GoogleGenerativeAILanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\n\n readonly modelId: GoogleGenerativeAIModelId;\n\n private readonly config: GoogleGenerativeAIConfig;\n private readonly generateId: () => string;\n\n constructor(\n modelId: GoogleGenerativeAIModelId,\n config: GoogleGenerativeAIConfig,\n ) {\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 providerOptions,\n }: LanguageModelV3CallOptions,\n { isStreaming = false }: { isStreaming?: boolean } = {},\n ) {\n const warnings: SharedV3Warning[] = [];\n\n const providerOptionsName = this.config.provider.includes('vertex')\n ? 'vertex'\n : 'google';\n let googleOptions = await parseProviderOptions({\n provider: providerOptionsName,\n providerOptions,\n schema: googleLanguageModelOptions,\n });\n\n if (googleOptions == null && providerOptionsName !== '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 // Vertex API requires another service tier format.\n let sanitizedServiceTier: string | undefined = googleOptions?.serviceTier;\n if (googleOptions?.serviceTier && isVertexProvider) {\n sanitizedServiceTier = VertexServiceTierMap[googleOptions.serviceTier];\n }\n\n const isGemmaModel = this.modelId.toLowerCase().startsWith('gemma-');\n const supportsFunctionResponseParts = this.modelId.startsWith('gemini-3');\n\n const { contents, systemInstruction } = convertToGoogleGenerativeAIMessages(\n prompt,\n {\n isGemmaModel,\n providerOptionsName,\n supportsFunctionResponseParts,\n },\n );\n\n const {\n tools: googleTools,\n toolConfig: googleToolConfig,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n modelId: this.modelId,\n });\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: googleOptions?.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: sanitizedServiceTier,\n },\n warnings: [...warnings, ...toolWarnings],\n providerOptionsName,\n };\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const { args, warnings, providerOptionsName } = await this.getArgs(options);\n\n const mergedHeaders = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\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<LanguageModelV3Content> = [];\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 ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n },\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 (\n 'functionCall' in part &&\n part.functionCall.name != null &&\n part.functionCall.args != null\n ) {\n content.push({\n type: 'tool-call' as const,\n toolCallId: this.config.generateId(),\n toolName: part.functionCall.name,\n input: JSON.stringify(part.functionCall.args),\n providerMetadata: part.thoughtSignature\n ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n },\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: 'file' as const,\n data: part.inlineData.data,\n mediaType: part.inlineData.mimeType,\n providerMetadata:\n hasThought || hasThoughtSignature\n ? {\n [providerOptionsName]: {\n ...(hasThought ? { thought: true } : {}),\n ...(hasThoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n },\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 ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n },\n }\n : {\n [providerOptionsName]: {\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n },\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 ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n },\n }\n : {\n [providerOptionsName]: {\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n },\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: mapGoogleGenerativeAIFinishReason({\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: convertGoogleGenerativeAIUsage(usageMetadata),\n warnings,\n providerMetadata: {\n [providerOptionsName]: {\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: response.serviceTier ?? null,\n } satisfies GoogleGenerativeAIProviderMetadata,\n },\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: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const { args, warnings, providerOptionsName } = await this.getArgs(\n options,\n { isStreaming: true },\n );\n\n const headers = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\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: LanguageModelV3FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage: GoogleGenerativeAIUsageMetadata | undefined = undefined;\n let providerMetadata: SharedV3ProviderMetadata | undefined = undefined;\n let lastGroundingMetadata: GroundingMetadataSchema | null = null;\n let lastUrlContextMetadata: UrlContextMetadataSchema | null = null;\n let serviceTier: string | 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?: SharedV3ProviderMetadata;\n }> = [];\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<ChunkSchema>,\n LanguageModelV3StreamPart\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 if (value.serviceTier != null) {\n serviceTier = value.serviceTier;\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 ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n },\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 =\n hasThought || hasThoughtSignature\n ? {\n [providerOptionsName]: {\n ...(hasThought ? { thought: true } : {}),\n ...(hasThoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n },\n }\n : undefined;\n controller.enqueue({\n type: 'file',\n mediaType: part.inlineData.mimeType,\n 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 = {\n [providerOptionsName]: {\n ...(part.thoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n serverToolCallId: toolCallId,\n serverToolType: part.toolCall.toolType,\n },\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 = {\n [providerOptionsName]: {\n ...(part.thoughtSignature\n ? { thoughtSignature: part.thoughtSignature }\n : {}),\n serverToolCallId: responseToolCallId,\n serverToolType: part.toolResponse.toolType,\n },\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 ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n },\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\n if (isStreamingChunk) {\n if (\n part.functionCall.name != null &&\n part.functionCall.willContinue === true\n ) {\n const toolCallId = 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 { textDelta } = accumulator.processPartialArgs(\n part.functionCall.partialArgs as PartialArg[],\n );\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 }\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 { textDelta } = active.accumulator.processPartialArgs(\n part.functionCall.partialArgs as PartialArg[],\n );\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 }\n } else if (\n isTerminalChunk &&\n activeStreamingToolCalls.length > 0\n ) {\n const active = activeStreamingToolCalls.pop()!;\n const { finalJSON, closingDelta } =\n 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 } else if (isCompleteCall) {\n const toolCallId = 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 }\n }\n }\n\n if (candidate.finishReason != null) {\n finishReason = {\n unified: mapGoogleGenerativeAIFinishReason({\n finishReason: candidate.finishReason,\n hasToolCalls,\n }),\n raw: candidate.finishReason,\n };\n\n providerMetadata = {\n [providerOptionsName]: {\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,\n } satisfies GoogleGenerativeAIProviderMetadata,\n };\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: convertGoogleGenerativeAIUsage(usage),\n providerMetadata,\n });\n },\n }),\n ),\n response: { headers: responseHeaders },\n request: { body: args },\n };\n }\n}\n\nfunction getToolCallsFromParts({\n parts,\n generateId,\n providerOptionsName,\n}: {\n parts: ContentSchema['parts'];\n generateId: () => string;\n providerOptionsName: string;\n}) {\n const functionCallParts = parts?.filter(\n part => 'functionCall' in part,\n ) as Array<\n GoogleGenerativeAIContentPart & {\n functionCall: { name: string; args: unknown };\n thoughtSignature?: string | null;\n }\n >;\n\n return functionCallParts == null || functionCallParts.length === 0\n ? undefined\n : functionCallParts.map(part => ({\n type: 'tool-call' as const,\n toolCallId: generateId(),\n toolName: part.functionCall.name,\n args: JSON.stringify(part.functionCall.args),\n providerMetadata: part.thoughtSignature\n ? {\n [providerOptionsName]: {\n thoughtSignature: part.thoughtSignature,\n },\n }\n : undefined,\n }));\n}\n\nfunction extractSources({\n groundingMetadata,\n generateId,\n}: {\n groundingMetadata: GroundingMetadataSchema | undefined | null;\n generateId: () => string;\n}): undefined | LanguageModelV3Source[] {\n if (!groundingMetadata?.groundingChunks) {\n return undefined;\n }\n\n const sources: LanguageModelV3Source[] = [];\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 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 // 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 serviceTier: z.string().nullish(),\n }),\n ),\n);\n\ntype ContentSchema = NonNullable<\n InferSchema<typeof responseSchema>['candidates'][number]['content']\n>;\nexport type GroundingMetadataSchema = NonNullable<\n InferSchema<typeof responseSchema>['candidates'][number]['groundingMetadata']\n>;\n\ntype GroundingChunkSchema = NonNullable<\n GroundingMetadataSchema['groundingChunks']\n>[number];\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 serviceTier: z.string().nullish(),\n }),\n ),\n);\n\ntype ChunkSchema = InferSchema<typeof chunkSchema>;\n","import type { LanguageModelV3Usage } from '@ai-sdk/provider';\n\nexport type GoogleGenerativeAITokenDetail = {\n modality: string;\n tokenCount: number;\n};\n\nexport type GoogleGenerativeAIUsageMetadata = {\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 promptTokensDetails?: GoogleGenerativeAITokenDetail[] | null;\n candidatesTokensDetails?: GoogleGenerativeAITokenDetail[] | null;\n};\n\nexport function convertGoogleGenerativeAIUsage(\n usage: GoogleGenerativeAIUsageMetadata | undefined | null,\n): LanguageModelV3Usage {\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 LanguageModelV3Prompt,\n} from '@ai-sdk/provider';\nimport { convertToBase64 } from '@ai-sdk/provider-utils';\nimport type {\n GoogleGenerativeAIContent,\n GoogleGenerativeAIContentPart,\n GoogleGenerativeAIFunctionResponsePart,\n GoogleGenerativeAIPrompt,\n} from './google-generative-ai-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): GoogleGenerativeAIFunctionResponsePart | 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: GoogleGenerativeAIContentPart[],\n toolName: string,\n outputValue: Array<{\n type: string;\n [key: string]: unknown;\n }>,\n): void {\n const functionResponseParts: GoogleGenerativeAIFunctionResponsePart[] = [];\n const responseTextParts: string[] = [];\n\n for (const contentPart of outputValue) {\n switch (contentPart.type) {\n case 'text': {\n responseTextParts.push(contentPart.text as string);\n break;\n }\n case 'image-data':\n case 'file-data': {\n functionResponseParts.push({\n inlineData: {\n mimeType: contentPart.mediaType as string,\n data: contentPart.data as string,\n },\n });\n break;\n }\n case 'image-url':\n case 'file-url': {\n const functionResponsePart = convertUrlToolResultPart(\n contentPart.url as string,\n );\n\n if (functionResponsePart != null) {\n functionResponseParts.push(functionResponsePart);\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 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: GoogleGenerativeAIContentPart[],\n toolName: string,\n outputValue: Array<{\n type: string;\n [key: string]: unknown;\n }>,\n): void {\n for (const contentPart of outputValue) {\n switch (contentPart.type) {\n case 'text':\n parts.push({\n functionResponse: {\n name: toolName,\n response: {\n name: toolName,\n content: contentPart.text,\n },\n },\n });\n break;\n case 'image-data':\n parts.push(\n {\n inlineData: {\n mimeType: String(contentPart.mediaType),\n data: String(contentPart.data),\n },\n },\n {\n text: 'Tool executed successfully and returned this image as a response',\n },\n );\n break;\n default:\n parts.push({ text: JSON.stringify(contentPart) });\n break;\n }\n }\n}\n\nexport function convertToGoogleGenerativeAIMessages(\n prompt: LanguageModelV3Prompt,\n options?: {\n isGemmaModel?: boolean;\n providerOptionsName?: string;\n supportsFunctionResponseParts?: boolean;\n },\n): GoogleGenerativeAIPrompt {\n const systemInstructionParts: Array<{ text: string }> = [];\n const contents: Array<GoogleGenerativeAIContent> = [];\n let systemMessagesAllowed = true;\n const isGemmaModel = options?.isGemmaModel ?? false;\n const providerOptionsName = options?.providerOptionsName ?? 'google';\n const supportsFunctionResponseParts =\n options?.supportsFunctionResponseParts ?? true;\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: GoogleGenerativeAIContentPart[] = [];\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 // default to image/jpeg for unknown image/* types\n const mediaType =\n part.mediaType === 'image/*' ? 'image/jpeg' : part.mediaType;\n\n parts.push(\n part.data instanceof URL\n ? {\n fileData: {\n mimeType: mediaType,\n fileUri: part.data.toString(),\n },\n }\n : {\n inlineData: {\n mimeType: mediaType,\n data: convertToBase64(part.data),\n },\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 =\n part.providerOptions?.[providerOptionsName] ??\n (providerOptionsName !== 'google'\n ? part.providerOptions?.google\n : part.providerOptions?.vertex);\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 'file': {\n if (part.data instanceof URL) {\n throw new UnsupportedFunctionalityError({\n functionality:\n 'File data URLs in assistant messages are not supported',\n });\n }\n\n return {\n inlineData: {\n mimeType: part.mediaType,\n data: convertToBase64(part.data),\n },\n ...(providerOpts?.thought === true\n ? { thought: true }\n : {}),\n thoughtSignature,\n };\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 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: GoogleGenerativeAIContentPart[] = [];\n\n for (const part of content) {\n if (part.type === 'tool-approval-response') {\n continue;\n }\n\n const partProviderOpts =\n part.providerOptions?.[providerOptionsName] ??\n (providerOptionsName !== 'google'\n ? part.providerOptions?.google\n : part.providerOptions?.vertex);\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(parts, part.toolName, output.value);\n } else {\n appendLegacyToolResultParts(parts, part.toolName, output.value);\n }\n } else {\n parts.push({\n functionResponse: {\n name: part.toolName,\n response: {\n name: part.toolName,\n content:\n output.type === 'execution-denied'\n ? (output.reason ?? 'Tool 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 GoogleGenerativeAIModelId =\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 // 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 Generative AI 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.\n */\n serviceTier: z.enum(['standard', 'flex', 'priority']).optional(),\n }),\n ),\n);\n\nexport type GoogleLanguageModelOptions = InferSchema<\n typeof googleLanguageModelOptions\n>;\n\n// Vertex API requires another service tier format.\nexport const VertexServiceTierMap = {\n standard: 'SERVICE_TIER_STANDARD',\n flex: 'SERVICE_TIER_FLEX',\n priority: 'SERVICE_TIER_PRIORITY',\n} as const;\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV3CallOptions,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport { convertJSONSchemaToOpenAPISchema } from './convert-json-schema-to-openapi-schema';\nimport type { GoogleGenerativeAIModelId } from './google-generative-ai-options';\n\nexport function prepareTools({\n tools,\n toolChoice,\n modelId,\n}: {\n tools: LanguageModelV3CallOptions['tools'];\n toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n modelId: GoogleGenerativeAIModelId;\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: SharedV3Warning[];\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: SharedV3Warning[] = [];\n\n const isLatest = (\n [\n 'gemini-flash-latest',\n 'gemini-flash-lite-latest',\n 'gemini-pro-latest',\n ] as const satisfies GoogleGenerativeAIModelId[]\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 includeServerSideToolInvocations: true,\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 { LanguageModelV3FinishReason } from '@ai-sdk/provider';\n\nexport function mapGoogleGenerativeAIFinishReason({\n finishReason,\n hasToolCalls,\n}: {\n finishReason: string | null | undefined;\n hasToolCalls: boolean;\n}): LanguageModelV3FinishReason['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 { createProviderToolFactoryWithOutputSchema } 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 = createProviderToolFactoryWithOutputSchema<\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 createProviderToolFactory,\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 = createProviderToolFactory<\n {\n // Enterprise Web Search does not have any input schema\n },\n {}\n>({\n id: 'google.enterprise_web_search',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderToolFactory,\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\nconst fileSearchArgsSchema = lazySchema(() =>\n zodSchema(fileSearchArgsBaseSchema),\n);\n\nexport const fileSearch = createProviderToolFactory<\n {},\n GoogleFileSearchToolArgs\n>({\n id: 'google.file_search',\n inputSchema: fileSearchArgsSchema,\n});\n","import {\n createProviderToolFactory,\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 = createProviderToolFactory<{}, {}>({\n id: 'google.google_maps',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n createProviderToolFactory,\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\nconst googleSearchToolArgsSchema = lazySchema(() =>\n zodSchema(googleSearchToolArgsBaseSchema),\n);\n\nexport const googleSearch = createProviderToolFactory<{}, GoogleSearchToolArgs>(\n {\n id: 'google.google_search',\n inputSchema: googleSearchToolArgsSchema,\n },\n);\n","import {\n createProviderToolFactory,\n lazySchema,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const urlContext = createProviderToolFactory<\n {\n // Url context does not have any input schema, it will directly use the url from the prompt\n },\n {}\n>({\n id: 'google.url_context',\n inputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import { createProviderToolFactory } 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 = createProviderToolFactory<\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: z.object({\n ragCorpus: z.string(),\n topK: z.number().optional(),\n }),\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 ImageModelV3,\n LanguageModelV3Prompt,\n SharedV3Warning,\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 zodSchema,\n type FetchFunction,\n type Resolvable,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\nimport type {\n GoogleGenerativeAIImageModelId,\n GoogleGenerativeAIImageSettings,\n} from './google-generative-ai-image-settings';\nimport { GoogleGenerativeAILanguageModel } from './google-generative-ai-language-model';\nimport type { GoogleLanguageModelOptions } from './google-generative-ai-options';\n\ninterface GoogleGenerativeAIImageModelConfig {\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 GoogleGenerativeAIImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\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: GoogleGenerativeAIImageModelId,\n private readonly settings: GoogleGenerativeAIImageSettings,\n private readonly config: GoogleGenerativeAIImageModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['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<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['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<SharedV3Warning> = [];\n\n // Imagen API endpoints do not support image editing\n if (files != null && files.length > 0) {\n throw new Error(\n 'Google Generative AI 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 Generative AI 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(await resolve(this.config.headers), headers),\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<ImageModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<ImageModelV3['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<SharedV3Warning> = [];\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 // Build user message content for language model\n const userContent: Array<\n | { type: 'text'; text: string }\n | { type: 'file'; data: string | Uint8Array | URL; mediaType: string }\n > = [];\n\n // Add text prompt\n if (prompt != null) {\n userContent.push({ type: 'text', text: prompt });\n }\n\n // Add input images for editing\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: new URL(file.url),\n mediaType: 'image/*',\n });\n } else {\n userContent.push({\n type: 'file',\n data:\n typeof file.data === 'string'\n ? file.data\n : new Uint8Array(file.data),\n mediaType: file.mediaType,\n });\n }\n }\n }\n\n const languageModelPrompt: LanguageModelV3Prompt = [\n { role: 'user', content: userContent },\n ];\n\n // Instantiate language model\n const languageModel = new GoogleGenerativeAILanguageModel(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 // Extract images from language model response\n const images: string[] = [];\n for (const part of result.content) {\n if (part.type === 'file' && part.mediaType.startsWith('image/')) {\n images.push(convertToBase64(part.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\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\nconst 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 Experimental_VideoModelV3,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonResponseHandler,\n delay,\n type FetchFunction,\n getFromApi,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n type Resolvable,\n resolve,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { googleFailedResponseHandler } from './google-error';\nimport type { GoogleGenerativeAIVideoModelId } from './google-generative-ai-video-settings';\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\ninterface GoogleGenerativeAIVideoModelConfig {\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 GoogleGenerativeAIVideoModel implements Experimental_VideoModelV3 {\n readonly specificationVersion = 'v3';\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: GoogleGenerativeAIVideoModelId,\n private readonly config: GoogleGenerativeAIVideoModelConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<Experimental_VideoModelV3['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<Experimental_VideoModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\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\nconst 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 LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId as defaultGenerateId,\n parseProviderOptions,\n postJsonToApi,\n resolve,\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 GoogleInteractionsGenerationConfig,\n GoogleInteractionsRequestBody,\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 { 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?: () => LanguageModelV3['supportedUrls'];\n};\n\nexport type GoogleInteractionsModelInput =\n | GoogleInteractionsModelId\n | { agent: string };\n\nexport class GoogleInteractionsLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\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 constructor(\n modelOrAgent: GoogleInteractionsModelInput,\n config: GoogleInteractionsConfig,\n ) {\n if (typeof modelOrAgent === 'string') {\n this.modelId = modelOrAgent;\n this.agent = undefined;\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: LanguageModelV3CallOptions) {\n const warnings: Array<SharedV3Warning> = [];\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 * Structured output mapping (resolves PRD Open Q1).\n *\n * The Interactions API exposes structured output via two top-level body\n * fields: `response_mime_type` (always `'application/json'` here) and\n * `response_format` (typed as `unknown` in the js-genai SDK). Per the\n * canonical sample at\n * `googleapis/js-genai/sdk-samples/interactions_structured_output_json.ts`,\n * `response_format` accepts a **plain JSON Schema** value directly - no\n * wrapping object, no OpenAPI conversion. The js-genai resource type\n * (`src/interactions/resources/interactions.ts:1399`) confirms the field is\n * passed through verbatim. We therefore send the AI SDK\n * `responseFormat.schema` (a `JSONSchema7`) as-is.\n *\n * If a future API revision rejects plain JSON Schema, fall back to\n * `convertJSONSchemaToOpenAPISchema(...)` (already imported by\n * `google-language-model.ts`); empirically that has not been needed.\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 let responseMimeType: string | undefined;\n let responseFormat: unknown | undefined;\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 responseMimeType = 'application/json';\n if (options.responseFormat.schema != null) {\n responseFormat = options.responseFormat.schema;\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. We stay minimal here for TASK-1 - only the AI SDK call-level\n * generation params and the thinking/imageConfig provider options flow\n * into `generation_config`. Tool-related fields land here in later tasks.\n *\n * When an agent is set, none of these fields are accepted by the API. Per\n * PRD US 31 we emit a single `LanguageModelV3CallWarning` listing the\n * dropped field names and continue (do not throw); the agent-only\n * `agent_config` 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 image_config:\n opts?.imageConfig != null\n ? pruneUndefined({\n aspect_ratio: opts.imageConfig.aspectRatio ?? undefined,\n image_size: opts.imageConfig.imageSize ?? undefined,\n })\n : undefined,\n tool_choice: toolChoiceForBody,\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 /*\n * Agent calls require `background: true` on the wire — otherwise the API\n * rejects them with `background=true is required for agent interactions.`\n * The server returns a non-terminal status (`in_progress`/`requires_action`)\n * and the final outputs must be polled via `GET /interactions/{id}`. This\n * is handled internally in `doGenerate` / `doStream` so the user-facing\n * surface stays identical to model-id calls.\n *\n * Model-id calls retain their original synchronous behavior — no\n * `background` field is sent.\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: responseFormat,\n response_mime_type: responseMimeType,\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 ...(isAgent ? { background: true } : {}),\n });\n\n return {\n args,\n warnings,\n isAgent,\n pollingTimeoutMs: opts?.pollingTimeoutMs ?? undefined,\n };\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\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 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 run with `background: true`; the POST returns immediately\n * with a non-terminal status (`in_progress` / `requires_action`). 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 outputs: response.outputs ?? null,\n generateId: this.config.generateId ?? defaultGenerateId,\n interactionId,\n });\n\n const finishReason: LanguageModelV3FinishReason = {\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: SharedV3ProviderMetadata = {\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: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\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 this.config.headers ? await resolve(this.config.headers) : undefined,\n options.headers,\n );\n\n /*\n * Agent calls require `background: true`, which is incompatible with\n * `stream: true` on POST. We drive the agent flow exactly like\n * `doGenerate` (POST background -> poll GET) and synthesize a stream\n * from the final polled outputs. The user-facing stream surface stays\n * identical -- text-start / text-delta / text-end / finish parts are\n * emitted in the same order as a true SSE response.\n */\n if (isAgent) {\n return this.doStreamAgent({\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. Agent calls require\n * `background: true`, which is incompatible with `stream: true` on POST.\n *\n * In principle the API also exposes `GET /interactions/{id}?stream=true`\n * to replay events as the agent runs. In practice the connection is\n * idle for long stretches while the agent thinks (deep-research can run\n * for a minute or more between SSE events), and undici's default body\n * timeout terminates the request mid-flight with `UND_ERR_BODY_TIMEOUT`.\n * Tuning the timeout per-call would require the caller to thread an\n * `undici.Agent` through `fetch`, which contradicts the AI SDK's\n * pluggable-fetch contract.\n *\n * We therefore drive `doStream` exactly like `doGenerate` for agents:\n * POST with `background: true`, poll `GET /interactions/{id}` until\n * terminal, then synthesize the stream from the final outputs. The\n * user-facing surface stays identical -- text-start / text-delta /\n * text-end / finish parts arrive in the same order as a true SSE\n * response, just buffered until the agent completes.\n */\n private async doStreamAgent({\n args,\n warnings,\n url,\n mergedHeaders,\n options,\n pollingTimeoutMs,\n }: {\n args: GoogleInteractionsRequestBody;\n warnings: Array<SharedV3Warning>;\n url: string;\n mergedHeaders: Record<string, string | undefined>;\n options: LanguageModelV3CallOptions;\n pollingTimeoutMs: number | undefined;\n }): Promise<LanguageModelV3StreamResult> {\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 { 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: agent POST response did not include an interaction id; cannot poll for the agent result.',\n );\n }\n\n if (!isTerminalStatus(postResponse.status)) {\n const polled = await pollGoogleInteractionUntilTerminal({\n baseURL: this.config.baseURL,\n interactionId,\n headers: mergedHeaders,\n fetch: this.config.fetch,\n abortSignal: options.abortSignal,\n timeoutMs: pollingTimeoutMs,\n });\n postResponse = polled.response;\n postHeaders = polled.responseHeaders ?? postHeaders;\n }\n\n const stream = synthesizeGoogleInteractionsAgentStream({\n response: postResponse,\n warnings,\n generateId: this.config.generateId ?? defaultGenerateId,\n includeRawChunks: options.includeRawChunks,\n headerServiceTier: postHeaders?.['x-gemini-service-tier'],\n });\n\n return {\n stream,\n request: { body: args },\n response: { headers: postHeaders },\n };\n }\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, LanguageModelV3Usage } from '@ai-sdk/provider';\nimport type { GoogleInteractionsUsage } from './google-interactions-api';\n\nexport function convertGoogleInteractionsUsage(\n usage: GoogleInteractionsUsage | undefined | null,\n): LanguageModelV3Usage {\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 { LanguageModelV3Source } 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 `LanguageModelV3Source`. 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}): LanguageModelV3Source | 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.document_uri ?? a.source ?? 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 * `LanguageModelV3Source` 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<LanguageModelV3Source> {\n const sources: Array<LanguageModelV3Source> = [];\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 source?: string;\n title?: string;\n };\n const uri = entry.document_uri ?? entry.source ?? 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 `LanguageModelV3Source` 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<LanguageModelV3Source> {\n if (annotations == null) return [];\n const seen = new Set<string>();\n const sources: Array<LanguageModelV3Source> = [];\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 { LanguageModelV3FinishReason } from '@ai-sdk/provider';\nimport type { GoogleInteractionsStatus } from './google-interactions-prompt';\n\n/*\n * Mapping is intentionally conservative for TASK-1; later tasks may refine the\n * `incomplete` and `cancelled` cases once we observe their wire-format\n * companions. `tool-calls` is selected when the response includes a\n * client-side function call (the API itself signals this via `requires_action`,\n * but `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}): LanguageModelV3FinishReason['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 LanguageModelV3FinishReason,\n LanguageModelV3Source,\n LanguageModelV3StreamPart,\n SharedV3ProviderMetadata,\n SharedV3Warning,\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 | undefined;\n arguments: Record<string, unknown>;\n signature?: string;\n /**\n * Whether `tool-input-start` has been emitted. Deferred until we know\n * the tool name -- `content.start` for a function_call only carries\n * `type: 'function_call'`; `id`, `name`, and `arguments` arrive on\n * `content.delta`.\n */\n startEmitted: boolean;\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 | { kind: 'unknown'; id: string };\n\n/**\n * Builds a `TransformStream<ParseResult<GoogleInteractionsEvent>, LanguageModelV3StreamPart>`\n * over the seven Interactions SSE event types.\n *\n * Surfaces text + thought (reasoning), function_call, image, built-in tool\n * call/result blocks, and `text_annotation` -> `source` parts.\n */\nexport function buildGoogleInteractionsStreamTransform({\n warnings,\n generateId,\n includeRawChunks,\n serviceTier: headerServiceTier,\n}: {\n warnings: Array<SharedV3Warning>;\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.complete` 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 (matching `google-language-model.ts` commit\n * 1adfb76d2d).\n */\n serviceTier?: string;\n}): TransformStream<\n ParseResult<GoogleInteractionsEvent>,\n LanguageModelV3StreamPart\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 content slots. The Interactions API frames concurrent\n * content blocks (e.g. text alongside thought) by `index`; we track each\n * open slot independently so a text delta at index N never collides with a\n * thought 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: LanguageModelV3Source): 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 LanguageModelV3StreamPart\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.start': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'interaction.start' }\n >;\n const interaction = event.interaction;\n /*\n * The Interactions API returns `id: \"\"` (empty string) on streaming\n * `interaction.start` / `interaction.complete` events when running\n * with `store: false` — there is no server-side record. Treat empty\n * string the same as missing so providerMetadata 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 'content.start': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'content.start' }\n >;\n const block = event.content as\n | {\n type?: string;\n id?: string;\n call_id?: string;\n name?: string;\n arguments?: Record<string, unknown>;\n signature?: string;\n result?: unknown;\n is_error?: boolean;\n annotations?: Array<GoogleInteractionsAnnotation>;\n }\n | undefined;\n const index = event.index;\n const blockId = `${interactionId ?? 'interaction'}:${index}`;\n\n if (block?.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 // text content blocks may already carry annotations on open.\n const initialSources = annotationsToSources({\n annotations: block.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 (block?.type === 'image') {\n const img = block as {\n data?: string;\n mime_type?: string;\n uri?: string;\n };\n openBlocks.set(index, {\n kind: 'image',\n id: blockId,\n ...(img.data != null ? { data: img.data } : {}),\n ...(img.mime_type != null ? { mimeType: img.mime_type } : {}),\n ...(img.uri != null ? { uri: img.uri } : {}),\n });\n } else if (block?.type === 'thought') {\n const signature = (block as { signature?: string }).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 } else if (block?.type === 'function_call') {\n const fc = block;\n const toolCallId = fc.id ?? blockId;\n hasFunctionCall = true;\n const state: Extract<OpenBlockState, { kind: 'function_call' }> = {\n kind: 'function_call',\n id: blockId,\n toolCallId,\n toolName: fc.name,\n arguments: fc.arguments ?? {},\n ...(fc.signature != null ? { signature: fc.signature } : {}),\n startEmitted: false,\n };\n openBlocks.set(index, state);\n if (state.toolName != null) {\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallId,\n toolName: state.toolName,\n });\n state.startEmitted = true;\n }\n } else if (\n block?.type != null &&\n BUILTIN_TOOL_CALL_TYPES.has(block.type)\n ) {\n const toolName =\n block.type === 'mcp_server_tool_call'\n ? (block.name ?? 'mcp_server_tool')\n : builtinToolNameFromCallType(block.type);\n const toolCallId = block.id ?? blockId;\n const state: Extract<\n OpenBlockState,\n { kind: 'builtin_tool_call' }\n > = {\n kind: 'builtin_tool_call',\n id: blockId,\n blockType: block.type,\n toolCallId,\n toolName,\n arguments: block.arguments ?? {},\n callEmitted: false,\n };\n openBlocks.set(index, state);\n } else if (\n block?.type != null &&\n BUILTIN_TOOL_RESULT_TYPES.has(block.type)\n ) {\n const toolName =\n block.type === 'mcp_server_tool_result'\n ? (block.name ?? 'mcp_server_tool')\n : builtinToolNameFromResultType(block.type);\n const callId = block.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: block.type,\n callId,\n toolName,\n result: block.result ?? null,\n ...(block.is_error != null ? { isError: block.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 'content.delta': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'content.delta' }\n >;\n const open = openBlocks.get(event.index);\n if (open == null) break;\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 name?: string;\n arguments?: Record<string, unknown>;\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 }\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 ) {\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 /*\n * `image` ContentDelta carries the entire image payload as a\n * complete object (`data` base64 + `mime_type`, or `uri`) per\n * `googleapis/js-genai`\n * `src/interactions/resources/interactions.ts`\n * `ContentDelta.Image`. Accumulate the latest snapshot; emit the\n * file stream part on `content.stop`.\n */\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 === 'function_call'\n ) {\n /*\n * `function_call` ContentDelta carries the entire call as a\n * complete object (id, name, arguments) per\n * `googleapis/js-genai` `src/interactions/resources/interactions.ts`\n * `ContentDelta.FunctionCall` (line ~458) -- there is no token\n * streaming of the JSON arguments. We accumulate the latest\n * snapshot and emit a single `tool-input-delta` carrying the\n * stringified args at content.stop.\n *\n * The `name` typically arrives here (not on `content.start`), so\n * defer `tool-input-start` emission until we observe it.\n */\n if (delta.id != null) {\n open.toolCallId = delta.id;\n }\n if (delta.name != null) {\n open.toolName = delta.name;\n }\n if (delta.arguments != null) {\n open.arguments = delta.arguments;\n }\n if (delta.signature != null) {\n open.signature = delta.signature;\n }\n if (!open.startEmitted && open.toolName != null) {\n controller.enqueue({\n type: 'tool-input-start',\n id: open.toolCallId,\n toolName: open.toolName,\n });\n open.startEmitted = true;\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 (delta.arguments != null) open.arguments = delta.arguments;\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 'content.stop': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'content.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: open.data,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n } else if (open.uri != null && open.uri.length > 0) {\n /*\n * V3 `LanguageModelV3File` only supports inline data (`string` /\n * `Uint8Array`). URL-only image outputs cannot be represented as\n * a file stream part on the v3 spec; surface the URI through\n * provider metadata so callers can still recover it.\n */\n const uriProviderMetadata = {\n google: {\n ...(interactionId != null ? { interactionId } : {}),\n imageUri: open.uri,\n },\n };\n controller.enqueue({\n type: 'file',\n mediaType: open.mimeType ?? 'image/png',\n data: '',\n providerMetadata: uriProviderMetadata,\n });\n }\n } else if (open.kind === 'function_call') {\n const toolName = open.toolName ?? 'unknown';\n const argsJson = JSON.stringify(open.arguments ?? {});\n if (!open.startEmitted) {\n controller.enqueue({\n type: 'tool-input-start',\n id: open.toolCallId,\n toolName,\n });\n }\n controller.enqueue({\n type: 'tool-input-delta',\n id: open.toolCallId,\n delta: argsJson,\n });\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,\n input: argsJson,\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 const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'interaction.status_update' }\n >;\n finishStatus = event.status;\n break;\n }\n\n case 'interaction.complete': {\n const event = value as Extract<\n GoogleInteractionsEvent,\n { event_type: 'interaction.complete' }\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.complete.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: LanguageModelV3FinishReason = {\n unified: mapGoogleInteractionsFinishReason({\n status: finishStatus,\n hasFunctionCall,\n }),\n raw: finishStatus,\n };\n\n const providerMetadata: SharedV3ProviderMetadata = {\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 LanguageModelV3FilePart,\n LanguageModelV3Prompt,\n LanguageModelV3ToolResultOutput,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport { convertToBase64 } from '@ai-sdk/provider-utils';\nimport type {\n GoogleInteractionsContent,\n GoogleInteractionsFunctionResultContent,\n GoogleInteractionsImageContent,\n GoogleInteractionsInput,\n GoogleInteractionsTextContent,\n GoogleInteractionsTurn,\n} from './google-interactions-prompt';\n\nfunction getTopLevelMediaType(mediaType: string): string {\n const slashIndex = mediaType.indexOf('/');\n return slashIndex === -1 ? mediaType : mediaType.substring(0, slashIndex);\n}\n\nfunction isFullMediaType(mediaType: string): boolean {\n const slashIndex = mediaType.indexOf('/');\n if (slashIndex === -1) {\n return false;\n }\n const subtype = mediaType.substring(slashIndex + 1);\n return subtype.length > 0 && subtype !== '*';\n}\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<SharedV3Warning>;\n};\n\n/**\n * Converts an AI SDK `LanguageModelV3Prompt` into the Gemini Interactions\n * request shape (`{ input, system_instruction }`).\n *\n * Handles text parts, file parts (image / audio / document / video, all four\n * `data.type` shapes), tool-call/tool-result round-tripping, per-block\n * `signature` round-tripping (`thought.signature`, `function_call.signature`),\n * and statefulness compaction (drop assistant/tool turns whose\n * `providerOptions.google.interactionId === previousInteractionId`).\n *\n * NOTE on PRD Open Q3 (empty-text-with-signature carrier hack from the\n * `:generateContent` provider): unnecessary on Interactions because\n * `thought.signature` and `function_call.signature` are explicit fields on\n * the wire (verified against `googleapis/js-genai`\n * `src/interactions/resources/interactions.ts` `ThoughtContent` /\n * `FunctionCallContent`). When an input reasoning part has empty text + a\n * signature, the converter emits a `thought` block with `signature` and an\n * omitted `summary` — no synthetic empty-text carrier needed.\n */\nexport function convertToGoogleInteractionsInput({\n prompt,\n previousInteractionId,\n store,\n mediaResolution,\n}: {\n prompt: LanguageModelV3Prompt;\n previousInteractionId?: string;\n store?: boolean;\n /**\n * Per-block media resolution applied to every image / video input block\n * (the Interactions wire format places `resolution` on the block, not at\n * the top level). See js-genai\n * `src/interactions/resources/interactions.ts` `ImageContent.resolution`\n * and `VideoContent.resolution`.\n */\n mediaResolution?: GoogleInteractionsMediaResolution;\n}): ConvertToGoogleInteractionsInputResult {\n const warnings: Array<SharedV3Warning> = [];\n\n /*\n * Behavior matrix per PRD § \"Public-API contracts\" → \"Configurable behavior\n * matrix\":\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 * The actual `previous_interaction_id` / `store` body fields are emitted in\n * the language model's `getArgs`; this converter only handles the history\n * shape and the warning.\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 turns: Array<GoogleInteractionsTurn> = [];\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<GoogleInteractionsContent> = [];\n for (const part of message.content) {\n if (part.type === 'text') {\n const block: GoogleInteractionsTextContent = {\n type: 'text',\n text: part.text,\n };\n content.push(block);\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 turns.push({ role: 'user', content: merged });\n }\n break;\n }\n case 'assistant': {\n const content: Array<GoogleInteractionsContent> = [];\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 === 'reasoning') {\n const signature = part.providerOptions?.google?.signature as\n | string\n | undefined;\n content.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 === 'tool-call') {\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 content.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 if (content.length > 0) {\n turns.push({ role: 'model', content });\n }\n break;\n }\n case 'tool': {\n /*\n * Tool-result messages are emitted as a `user` turn whose content\n * holds one `function_result` block per tool-result part. Wire shape\n * (verified against `googleapis/js-genai`\n * `samples/interactions_function_calling_client_state.ts` and\n * `src/interactions/resources/interactions.ts` `FunctionResultContent`\n * around line 979 — RESOLVES PRD Open Q2):\n *\n * {\n * role: 'user',\n * content: [\n * {\n * type: 'function_result',\n * call_id: <id from the matching function_call block>,\n * name: <tool name>,\n * result: <string | unknown | Array<TextContent|ImageContent>>,\n * is_error?: boolean,\n * signature?: string,\n * },\n * ],\n * }\n *\n * The `result` field is a discriminated union: a plain string for\n * text-only results, or an array of `text` / `image` content blocks\n * for mixed text/image results. Our converter takes the AI SDK\n * canonical `LanguageModelV3ToolResultOutput` and maps:\n * - `{ type: 'text', value }` → `result: <string>`\n * - `{ type: 'json', value }` → `result: <stringified JSON>`\n * - `{ type: 'error-text', value }` → `result: <string>` + `is_error: true`\n * - `{ type: 'error-json', value }` → `result: <stringified JSON>` + `is_error: true`\n * - `{ type: 'execution-denied', reason }` → `result: <reason>` + `is_error: true`\n * - `{ type: 'content', value: [...] }` → `result: Array<text|image>`\n * where each AI SDK `file` part with `mediaType: image/*` becomes\n * an Interactions `image` block (file-data path matches\n * `convertFilePartToContent` for top-level user images), and `text`\n * parts pass through. Non-image file parts fall back to a warning\n * because `FunctionResultContent.result` only accepts text/image.\n */\n const content: Array<GoogleInteractionsContent> = [];\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 turns.push({ role: 'user', content });\n }\n break;\n }\n }\n }\n\n const systemInstruction =\n systemTexts.length > 0 ? systemTexts.join('\\n\\n') : undefined;\n\n let input: GoogleInteractionsInput;\n if (turns.length === 0) {\n input = '';\n } else if (\n turns.length === 1 &&\n turns[0].role === 'user' &&\n Array.isArray(turns[0].content)\n ) {\n /*\n * Single-turn user prompt: send the bare `Array<Content>` shape per the\n * Interactions API's preferred single-turn format.\n */\n input = turns[0].content;\n } else {\n input = turns;\n }\n\n return { input, systemInstruction, warnings };\n}\n\n/**\n * Maps a single AI SDK `LanguageModelV3FilePart` to a Gemini Interactions\n * content block (`image` / `audio` / `document` / `video`).\n *\n * Rules for the V3 `data` shapes:\n * - `Uint8Array` / `string` (base64) → block with inline `data` (base64) +\n * `mime_type`.\n * - `URL` → block with `uri` set to the URL string verbatim. Files API URIs\n * (e.g. `https://generativelanguage.googleapis.com/v1beta/files/<id>`) and\n * YouTube URLs are passed through the same way.\n */\nfunction convertFilePartToContent({\n part,\n warnings,\n mediaResolution,\n}: {\n part: LanguageModelV3FilePart;\n warnings: Array<SharedV3Warning>;\n mediaResolution?: GoogleInteractionsMediaResolution;\n}): GoogleInteractionsContent | undefined {\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 /*\n * `resolution` is per-block on the wire (`ImageContent.resolution`,\n * `VideoContent.resolution`); only image and video carry it (see\n * `googleapis/js-genai` `src/interactions/resources/interactions.ts`).\n * Audio / document blocks ignore the option silently.\n */\n const resolutionField =\n mediaResolution != null && (kind === 'image' || kind === 'video')\n ? { resolution: mediaResolution }\n : {};\n\n if (part.data instanceof URL) {\n return {\n type: kind,\n uri: part.data.toString(),\n ...(isFullMediaType(part.mediaType) ? { mime_type: part.mediaType } : {}),\n ...resolutionField,\n };\n }\n\n if (!isFullMediaType(part.mediaType)) {\n warnings.push({\n type: 'other',\n message: `google.interactions: inline file data requires a full IANA media type (e.g. \"image/png\"), got \"${part.mediaType}\"; part dropped.`,\n });\n return undefined;\n }\n\n return {\n type: kind,\n data: convertToBase64(part.data),\n mime_type: part.mediaType,\n ...resolutionField,\n };\n}\n\n/*\n * Drops assistant turns that were part of the linked interaction\n * (`previousInteractionId`) so the API doesn't see them re-sent on top of its\n * server-side state. Also drops any subsequent `tool` (tool-result) message\n * whose `tool-result.toolCallId` matches a `tool-call.toolCallId` from the\n * dropped assistant turn — server-state already has the matching tool result\n * baked in, and re-sending it without its paired call would be malformed.\n *\n * An assistant message is considered \"part of the linked interaction\" if any\n * of its content parts carry `providerOptions.google.interactionId ===\n * previousInteractionId`. This is stamped by `parseGoogleInteractionsOutputs`\n * (and the stream transformer) on every output content part.\n *\n * User messages are always kept regardless of where they fell in the prior\n * conversation — only assistant model output and its tool plumbing live on the\n * server. (Note that the AI SDK does not stamp `interactionId` onto user\n * messages, so even if it did, this function would not have a way to identify\n * which user message belongs to which interaction.)\n */\nfunction compactPromptForPreviousInteraction({\n prompt,\n previousInteractionId,\n}: {\n prompt: LanguageModelV3Prompt;\n previousInteractionId: string;\n}): LanguageModelV3Prompt {\n const out: LanguageModelV3Prompt = [];\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: LanguageModelV3ToolResultOutput;\n signature: string | undefined;\n warnings: Array<SharedV3Warning>;\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 === 'image-data') {\n const imageBlock = filePartToImageBlock({\n part: {\n type: 'file',\n mediaType: item.mediaType,\n data: item.data,\n },\n warnings,\n });\n if (imageBlock != null) {\n blocks.push(imageBlock);\n }\n } else if (item.type === 'image-url') {\n const imageBlock = filePartToImageBlock({\n part: {\n type: 'file',\n mediaType: 'image/*',\n data: new URL(item.url),\n },\n warnings,\n });\n if (imageBlock != null) {\n blocks.push(imageBlock);\n }\n } else if (item.type === 'file-data' || item.type === 'file-url') {\n const mediaType =\n item.type === 'file-data' ? item.mediaType : 'application/*';\n const topLevel = getTopLevelMediaType(mediaType);\n if (topLevel !== 'image') {\n warnings.push({\n type: 'other',\n message: `google.interactions: tool-result file with mediaType \"${mediaType}\" is not supported (Interactions \\`function_result.result\\` accepts only text and image content); part dropped.`,\n });\n continue;\n }\n const imageBlock = filePartToImageBlock({\n part:\n item.type === 'file-data'\n ? {\n type: 'file',\n mediaType: item.mediaType,\n data: item.data,\n }\n : {\n type: 'file',\n mediaType,\n data: new URL(item.url),\n },\n warnings,\n });\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: Uint8Array | string | URL;\n filename?: string;\n };\n warnings: Array<SharedV3Warning>;\n}): GoogleInteractionsImageContent | undefined {\n if (part.data instanceof URL) {\n return {\n type: 'image',\n uri: part.data.toString(),\n ...(isFullMediaType(part.mediaType) ? { mime_type: part.mediaType } : {}),\n };\n }\n\n if (!isFullMediaType(part.mediaType)) {\n warnings.push({\n type: 'other',\n message: `google.interactions: tool-result image part requires a full IANA media type (e.g. \"image/png\"), got \"${part.mediaType}\"; part dropped.`,\n });\n return undefined;\n }\n\n return {\n type: 'image',\n data: convertToBase64(part.data),\n mime_type: part.mediaType,\n };\n}\n\n/*\n * Collapses runs of adjacent text content blocks within a single user message\n * into one combined text block, separated by a blank line. The Interactions\n * API has no `text+data` shape, so a `data.type === 'text'` file part is\n * already lowered to a `text` block by `convertFilePartToContent`; merging\n * keeps the wire shape compact and preserves intent when an inline text file\n * sits next to a regular text part. Text blocks carrying `annotations` are\n * left untouched (annotations are tied to specific text spans).\n */\nfunction mergeAdjacentTextContent(\n content: Array<GoogleInteractionsContent>,\n): Array<GoogleInteractionsContent> {\n if (content.length < 2) {\n return content;\n }\n const result: Array<GoogleInteractionsContent> = [];\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 (text + thought) and lenient (`loose()` / `unknown`) on the\n * rest, so subsequent 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 source: 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 * Catch-all content block schema. Specific variants (`text`, `thought`,\n * `function_call`, built-in tool call/result) are narrowly typed; unknown\n * block types fall through `loose()`.\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 thoughtContent = 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 functionCallContent = 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 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 const builtinToolCall = z\n .object({\n type: z.enum([\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 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 builtinToolResult = z\n .object({\n type: z.enum([\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 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 textContent,\n imageContent,\n thoughtContent,\n functionCallContent,\n builtinToolCall,\n builtinToolResult,\n z.object({ type: z.string() }).loose(),\n ]);\n};\n\nexport type GoogleInteractionsContentBlock = z.infer<\n ReturnType<typeof contentBlockSchema>\n>;\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 outputs: z.array(contentBlockSchema()).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 interactionStartEvent = z\n .object({\n event_type: z.literal('interaction.start'),\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 const contentStartEvent = z\n .object({\n event_type: z.literal('content.start'),\n event_id: z.string().nullish(),\n index: z.number(),\n content: contentBlockSchema(),\n })\n .loose();\n\n const contentDeltaText = z\n .object({\n type: z.literal('text'),\n text: z.string(),\n })\n .loose();\n\n const contentDeltaThoughtSummary = z\n .object({\n type: z.literal('thought_summary'),\n content: thoughtSummaryItem.nullish(),\n })\n .loose();\n\n const contentDeltaThoughtSignature = z\n .object({\n type: z.literal('thought_signature'),\n signature: z.string().nullish(),\n })\n .loose();\n\n /*\n * `function_call` content deltas carry the entire call (id + name +\n * arguments) — there is no per-token argument streaming. See js-genai\n * `src/interactions/resources/interactions.ts` `ContentDelta.FunctionCall`.\n */\n const contentDeltaFunctionCall = 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 contentDeltaTextAnnotation = z\n .object({\n type: z.literal('text_annotation'),\n annotations: z.array(annotation).nullish(),\n })\n .loose();\n\n /*\n * `image` content deltas carry the entire image payload (`data` base64 +\n * `mime_type`, or `uri`) — there is no per-byte streaming. See js-genai\n * `src/interactions/resources/interactions.ts` `ContentDelta.Image`.\n */\n const contentDeltaImage = 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 deltas mirror the same shape as their content-block\n * counterparts (full payload per delta -- there is no per-token streaming\n * of arguments). Result deltas carry the populated `result` payload.\n */\n const contentDeltaBuiltinToolCall = z\n .object({\n type: z.enum([\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 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 contentDeltaBuiltinToolResult = z\n .object({\n type: z.enum([\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 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 const contentDeltaUnknown = z.object({ type: z.string() }).loose();\n\n const contentDeltaUnion = z.union([\n contentDeltaText,\n contentDeltaImage,\n contentDeltaThoughtSummary,\n contentDeltaThoughtSignature,\n contentDeltaFunctionCall,\n contentDeltaTextAnnotation,\n contentDeltaBuiltinToolCall,\n contentDeltaBuiltinToolResult,\n contentDeltaUnknown,\n ]);\n\n const contentDeltaEvent = z\n .object({\n event_type: z.literal('content.delta'),\n event_id: z.string().nullish(),\n index: z.number(),\n delta: contentDeltaUnion,\n })\n .loose();\n\n const contentStopEvent = z\n .object({\n event_type: z.literal('content.stop'),\n event_id: z.string().nullish(),\n index: z.number(),\n })\n .loose();\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,\n })\n .loose();\n\n const interactionCompleteEvent = z\n .object({\n event_type: z.literal('interaction.complete'),\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 interactionStartEvent,\n contentStartEvent,\n contentDeltaEvent,\n contentStopEvent,\n interactionStatusUpdateEvent,\n interactionCompleteEvent,\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 | '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 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);\n\nexport type GoogleLanguageModelInteractionsOptions = InferSchema<\n typeof googleInteractionsLanguageModelOptions\n>;\n","import type { JSONValue, LanguageModelV3Content } from '@ai-sdk/provider';\nimport type { GoogleInteractionsContentBlock } 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<LanguageModelV3Content>;\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-block\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\n/**\n * Set of built-in tool *call* discriminators emitted by the Interactions API.\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\n/**\n * Set of built-in tool *result* discriminators.\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 `outputs[]` array of an Interaction response and emits AI SDK\n * `LanguageModelV3Content[]`. Surfaces:\n *\n * - `text` blocks (with annotations -> source parts)\n * - `thought` blocks (reasoning)\n * - `function_call` blocks (client-executed tool calls)\n * - Built-in tool `*_call` / `*_result` blocks (Google Search, Code Execution,\n * URL Context, File Search, Google Maps, MCP Server) as\n * `tool-call`/`tool-result` parts with `providerExecuted: true`.\n * - `text_annotation`-derived sources from the URL / file / place citations\n * carried on text blocks.\n */\nexport function parseGoogleInteractionsOutputs({\n outputs,\n generateId,\n interactionId,\n}: {\n outputs: Array<GoogleInteractionsContentBlock> | 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<LanguageModelV3Content> = [];\n let hasFunctionCall = false;\n\n if (outputs == null) {\n return { content, hasFunctionCall };\n }\n\n for (const block of outputs) {\n if (block == null || typeof block !== 'object') continue;\n const type = (block as { type?: string }).type;\n if (typeof type !== 'string') continue;\n\n switch (type) {\n case 'text': {\n const text = (block as { text?: string }).text ?? '';\n const annotations = (\n block as { annotations?: Array<GoogleInteractionsAnnotation> }\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 break;\n }\n case 'thought': {\n const thought = block 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 '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: image.data,\n ...googleProviderMetadata({ interactionId }),\n });\n } else if (image.uri != null && image.uri.length > 0) {\n /*\n * V3 `LanguageModelV3File` only supports inline data (`string` /\n * `Uint8Array`). URL-only image outputs cannot be represented as a\n * file content part on the v3 spec; surface the URI through provider\n * metadata so callers can still recover it.\n */\n content.push({\n type: 'file',\n mediaType: image.mime_type ?? 'image/png',\n data: '',\n providerMetadata: {\n google: {\n ...(interactionId != null ? { interactionId } : {}),\n imageUri: image.uri,\n },\n },\n });\n }\n break;\n }\n case 'function_call': {\n hasFunctionCall = true;\n const call = block 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 = block 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 = block 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 block 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 type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { googleFailedResponseHandler } from '../google-error';\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 while (true) {\n if (abortSignal?.aborted) {\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}\n","import type {\n LanguageModelV3CallOptions,\n SharedV3Warning,\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<SharedV3Warning>;\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 (TASK-7). 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: LanguageModelV3CallOptions['tools'];\n toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n}): PrepareGoogleInteractionsToolsResult {\n const toolWarnings: Array<SharedV3Warning> = [];\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 type {\n LanguageModelV3FinishReason,\n LanguageModelV3StreamPart,\n SharedV3ProviderMetadata,\n SharedV3Warning,\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 `LanguageModelV3StreamPart` 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<SharedV3Warning>;\n generateId: () => string;\n includeRawChunks?: boolean;\n headerServiceTier?: string;\n}): ReadableStream<LanguageModelV3StreamPart> {\n return new ReadableStream<LanguageModelV3StreamPart>({\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 outputs: response.outputs ?? 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: LanguageModelV3FinishReason = {\n unified: mapGoogleInteractionsFinishReason({\n status: response.status,\n hasFunctionCall,\n }),\n raw: response.status,\n };\n\n const providerMetadata: SharedV3ProviderMetadata = {\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","lazySchema","zodSchema","z","lazySchema","zodSchema","z","responseHeaders","response","rawValue","lazySchema","zodSchema","z","combineHeaders","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","resolve","zodSchema","z","_a","_b","_c","_d","lazySchema","zodSchema","z","UnsupportedFunctionalityError","googleTools","functionDeclarations","UnsupportedFunctionalityError","parseProviderOptions","googleTools","combineHeaders","resolve","postJsonToApi","createJsonResponseHandler","generateId","args","generateId","z","lazySchema","zodSchema","z","lazySchema","zodSchema","z","createProviderToolFactory","lazySchema","zodSchema","z","createProviderToolFactory","lazySchema","zodSchema","z","createProviderToolFactory","lazySchema","zodSchema","z","createProviderToolFactory","lazySchema","zodSchema","z","createProviderToolFactory","z","combineHeaders","convertToBase64","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","resolve","zodSchema","z","parseProviderOptions","postJsonToApi","combineHeaders","resolve","createJsonResponseHandler","convertToBase64","lazySchema","zodSchema","z","combineHeaders","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","resolve","zodSchema","z","parseProviderOptions","postJsonToApi","combineHeaders","resolve","createJsonResponseHandler","z","lazySchema","zodSchema","combineHeaders","createEventSourceResponseHandler","createJsonResponseHandler","defaultGenerateId","parseProviderOptions","postJsonToApi","resolve","generateId","generateId","google","convertToBase64","lazySchema","zodSchema","z","usageSchema","lazySchema","zodSchema","z","google","BUILTIN_TOOL_CALL_TYPES","BUILTIN_TOOL_RESULT_TYPES","builtinToolNameFromCallType","builtinToolNameFromResultType","generateId","createJsonResponseHandler","delay","getFromApi","delay","getFromApi","createJsonResponseHandler","generateId","providerMetadata","parseProviderOptions","combineHeaders","resolve","postJsonToApi","createJsonResponseHandler","defaultGenerateId","createEventSourceResponseHandler","_a","generateId"]}