{"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/cancel-google-interaction.ts","../src/interactions/prepare-google-interactions-tools.ts","../src/interactions/stream-google-interactions.ts","../src/interactions/synthesize-google-interactions-agent-stream.ts"],"sourcesContent":["import type {\n  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:\n   *   - a model ID (string),\n   *   - `{ agent: <name> }` to use a known Gemini agent preset, or\n   *   - `{ managedAgent: <name> }` to use a user-defined agent created via\n   *     the `/v1beta/agents` endpoint.\n   */\n  interactions(\n    modelIdOrAgent:\n      | GoogleInteractionsModelId\n      | { agent: GoogleInteractionsAgentName }\n      | { managedAgent: string },\n  ): 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      | { managedAgent: string },\n  ) =>\n    new GoogleInteractionsLanguageModel(\n      modelIdOrAgent as GoogleInteractionsModelInput,\n      {\n        provider: `${providerName}.interactions`,\n        baseURL,\n        headers: getHeaders,\n        generateId: options.generateId ?? generateId,\n        fetch: options.fetch,\n      },\n    );\n\n  const provider = function (modelId: 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  z.object({\n    fileData: z.object({\n      fileUri: z.string(),\n      mimeType: z.string(),\n    }),\n  }),\n]);\n\nexport const googleEmbeddingModelOptions = lazySchema(() =>\n  zodSchema(\n    z.object({\n      /**\n       * Optional. Optional reduced dimension for the output embedding.\n       * If set, excessive values in the output embedding are truncated from the end.\n       */\n      outputDimensionality: z.number().optional(),\n\n      /**\n       * Optional. Specifies the task type for generating embeddings.\n       * Supported task types:\n       * - SEMANTIC_SIMILARITY: Optimized for text similarity.\n       * - CLASSIFICATION: Optimized for text classification.\n       * - CLUSTERING: Optimized for clustering texts based on similarity.\n       * - RETRIEVAL_DOCUMENT: Optimized for document retrieval.\n       * - RETRIEVAL_QUERY: Optimized for query-based retrieval.\n       * - QUESTION_ANSWERING: Optimized for answering questions.\n       * - FACT_VERIFICATION: Optimized for verifying factual information.\n       * - CODE_RETRIEVAL_QUERY: Optimized for retrieving code blocks based on natural language queries.\n       */\n      taskType: z\n        .enum([\n          'SEMANTIC_SIMILARITY',\n          'CLASSIFICATION',\n          'CLUSTERING',\n          'RETRIEVAL_DOCUMENT',\n          'RETRIEVAL_QUERY',\n          'QUESTION_ANSWERING',\n          'FACT_VERIFICATION',\n          'CODE_RETRIEVAL_QUERY',\n        ])\n        .optional(),\n\n      /**\n       * Optional. Per-value multimodal content parts for embedding non-text\n       * content (images, video, PDF, audio). Each entry corresponds to the\n       * embedding value at the same index and its parts are merged with the\n       * text value in the request. Use `null` for entries that are text-only.\n       *\n       * The array length must match the number of values being embedded. In\n       * the case of a single embedding, the array length must be 1.\n       */\n      content: z\n        .array(z.array(googleEmbeddingContentPartSchema).min(1).nullable())\n        .optional(),\n    }),\n  ),\n);\n\nexport type GoogleEmbeddingModelOptions = InferSchema<\n  typeof googleEmbeddingModelOptions\n>;\n","import type {\n  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  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    if (googleOptions?.serviceTier && isVertexProvider) {\n      warnings.push({\n        type: 'other',\n        message:\n          \"'serviceTier' is a Gemini API option and is not supported on Vertex AI. \" +\n          \"Use 'sharedRequestType' (and optionally 'requestType') instead. See \" +\n          'https://docs.cloud.google.com/vertex-ai/generative-ai/docs/priority-paygo',\n      });\n    }\n    if (\n      (googleOptions?.sharedRequestType || googleOptions?.requestType) &&\n      !isVertexProvider\n    ) {\n      warnings.push({\n        type: 'other',\n        message:\n          \"'sharedRequestType' and 'requestType' are Vertex AI options and \" +\n          `are ignored with the current Google provider (${this.config.provider}).`,\n      });\n    }\n\n    const vertexPaygoHeaders: Record<string, string> | undefined =\n      isVertexProvider &&\n      (googleOptions?.sharedRequestType || googleOptions?.requestType)\n        ? {\n            ...(googleOptions.sharedRequestType && {\n              'X-Vertex-AI-LLM-Shared-Request-Type':\n                googleOptions.sharedRequestType,\n            }),\n            ...(googleOptions.requestType && {\n              'X-Vertex-AI-LLM-Request-Type': googleOptions.requestType,\n            }),\n          }\n        : undefined;\n    const bodyServiceTier = isVertexProvider\n      ? undefined\n      : googleOptions?.serviceTier;\n\n    const isGemmaModel = this.modelId.toLowerCase().startsWith('gemma-');\n    const supportsFunctionResponseParts = this.modelId.startsWith('gemini-3');\n\n    const { contents, systemInstruction } = 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      isVertexProvider,\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: bodyServiceTier,\n      },\n      warnings: [...warnings, ...toolWarnings],\n      providerOptionsName,\n      extraHeaders: vertexPaygoHeaders,\n    };\n  }\n\n  async doGenerate(\n    options: LanguageModelV3CallOptions,\n  ): Promise<LanguageModelV3GenerateResult> {\n    const { args, warnings, providerOptionsName, extraHeaders } =\n      await this.getArgs(options);\n\n    const mergedHeaders = combineHeaders(\n      await resolve(this.config.headers),\n      options.headers,\n      extraHeaders,\n    );\n\n    const {\n      responseHeaders,\n      value: response,\n      rawValue: rawResponse,\n    } = await postJsonToApi({\n      url: `${this.config.baseURL}/${getModelPath(\n        this.modelId,\n      )}:generateContent`,\n      headers: mergedHeaders,\n      body: args,\n      failedResponseHandler: googleFailedResponseHandler,\n      successfulResponseHandler: createJsonResponseHandler(responseSchema),\n      abortSignal: options.abortSignal,\n      fetch: this.config.fetch,\n    });\n\n    const candidate = response.candidates[0];\n    const content: Array<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 ('functionCall' in part && part.functionCall.name != null) {\n        content.push({\n          type: 'tool-call' as const,\n          toolCallId: part.functionCall.id ?? this.config.generateId(),\n          toolName: part.functionCall.name,\n          input: JSON.stringify(part.functionCall.args ?? {}),\n          providerMetadata: part.thoughtSignature\n            ? {\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: usageMetadata?.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, extraHeaders } =\n      await this.getArgs(options, { isStreaming: true });\n\n    const headers = combineHeaders(\n      await resolve(this.config.headers),\n      options.headers,\n      extraHeaders,\n    );\n\n    const { responseHeaders, value: response } = await postJsonToApi({\n      url: `${this.config.baseURL}/${getModelPath(\n        this.modelId,\n      )}:streamGenerateContent?alt=sse`,\n      headers,\n      body: args,\n      failedResponseHandler: googleFailedResponseHandler,\n      successfulResponseHandler: createEventSourceResponseHandler(chunkSchema),\n      abortSignal: options.abortSignal,\n      fetch: this.config.fetch,\n    });\n\n    let finishReason: 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\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    const finishActiveStreamingToolCall = (\n      controller: TransformStreamDefaultController<LanguageModelV3StreamPart>,\n    ) => {\n      const active = activeStreamingToolCalls.pop();\n      if (active == null) {\n        return;\n      }\n\n      const { finalJSON, closingDelta } = active.accumulator.finalize();\n\n      if (closingDelta.length > 0) {\n        controller.enqueue({\n          type: 'tool-input-delta',\n          id: active.toolCallId,\n          delta: closingDelta,\n          providerMetadata: active.providerMetadata,\n        });\n      }\n\n      controller.enqueue({\n        type: 'tool-input-end',\n        id: active.toolCallId,\n        providerMetadata: active.providerMetadata,\n      });\n\n      controller.enqueue({\n        type: 'tool-call',\n        toolCallId: active.toolCallId,\n        toolName: active.toolName,\n        input: finalJSON,\n        providerMetadata: active.providerMetadata,\n      });\n\n      hasToolCalls = true;\n    };\n\n    return {\n      stream: response.pipeThrough(\n        new TransformStream<\n          ParseResult<ChunkSchema>,\n          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            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                // Single-chunk no-args call: `{ name: 'X' }` with no `args`,\n                // `partialArgs`, or `willContinue`. Carries `thoughtSignature`.\n                const isNoArgsCompleteCall =\n                  part.functionCall.name != null &&\n                  part.functionCall.args == null &&\n                  part.functionCall.partialArgs == null &&\n                  part.functionCall.willContinue !== true;\n\n                if (isStreamingChunk) {\n                  if (part.functionCall.name != null) {\n                    const toolCallId = part.functionCall.id ?? generateId();\n                    const accumulator = new GoogleJSONAccumulator();\n                    activeStreamingToolCalls.push({\n                      toolCallId,\n                      toolName: part.functionCall.name,\n                      accumulator,\n                      providerMetadata: providerMeta,\n                    });\n\n                    controller.enqueue({\n                      type: 'tool-input-start',\n                      id: toolCallId,\n                      toolName: part.functionCall.name,\n                      providerMetadata: providerMeta,\n                    });\n\n                    if (part.functionCall.partialArgs != null) {\n                      const partialArgs = part.functionCall\n                        .partialArgs as PartialArg[];\n                      const { textDelta } =\n                        accumulator.processPartialArgs(partialArgs);\n                      if (textDelta.length > 0) {\n                        controller.enqueue({\n                          type: 'tool-input-delta',\n                          id: toolCallId,\n                          delta: textDelta,\n                          providerMetadata: providerMeta,\n                        });\n                      }\n                      if (\n                        part.functionCall.willContinue !== true &&\n                        partialArgs.every(arg => arg.willContinue !== true)\n                      ) {\n                        finishActiveStreamingToolCall(controller);\n                      }\n                    }\n                  } else if (\n                    part.functionCall.partialArgs != null &&\n                    activeStreamingToolCalls.length > 0\n                  ) {\n                    const active =\n                      activeStreamingToolCalls[\n                        activeStreamingToolCalls.length - 1\n                      ];\n                    const partialArgs = part.functionCall\n                      .partialArgs as PartialArg[];\n                    const { textDelta } =\n                      active.accumulator.processPartialArgs(partialArgs);\n                    if (textDelta.length > 0) {\n                      controller.enqueue({\n                        type: 'tool-input-delta',\n                        id: active.toolCallId,\n                        delta: textDelta,\n                        providerMetadata: providerMeta,\n                      });\n                    }\n                    if (\n                      part.functionCall.willContinue !== true &&\n                      partialArgs.every(arg => arg.willContinue !== true)\n                    ) {\n                      finishActiveStreamingToolCall(controller);\n                    }\n                  }\n                } else if (\n                  isTerminalChunk &&\n                  activeStreamingToolCalls.length > 0\n                ) {\n                  finishActiveStreamingToolCall(controller);\n                } else if (isCompleteCall) {\n                  const toolCallId = part.functionCall.id ?? generateId();\n                  const toolName = part.functionCall.name!;\n                  const args =\n                    typeof part.functionCall.args === 'string'\n                      ? part.functionCall.args\n                      : JSON.stringify(part.functionCall.args ?? {});\n\n                  controller.enqueue({\n                    type: 'tool-input-start',\n                    id: toolCallId,\n                    toolName,\n                    providerMetadata: providerMeta,\n                  });\n\n                  controller.enqueue({\n                    type: 'tool-input-delta',\n                    id: toolCallId,\n                    delta: args,\n                    providerMetadata: providerMeta,\n                  });\n\n                  controller.enqueue({\n                    type: 'tool-input-end',\n                    id: toolCallId,\n                    providerMetadata: providerMeta,\n                  });\n\n                  controller.enqueue({\n                    type: 'tool-call',\n                    toolCallId,\n                    toolName,\n                    input: args,\n                    providerMetadata: providerMeta,\n                  });\n\n                  hasToolCalls = true;\n                } else if (isNoArgsCompleteCall) {\n                  const toolCallId = part.functionCall.id ?? generateId();\n                  const toolName = part.functionCall.name!;\n\n                  controller.enqueue({\n                    type: 'tool-input-start',\n                    id: toolCallId,\n                    toolName,\n                    providerMetadata: providerMeta,\n                  });\n\n                  controller.enqueue({\n                    type: 'tool-input-end',\n                    id: toolCallId,\n                    providerMetadata: providerMeta,\n                  });\n\n                  controller.enqueue({\n                    type: 'tool-call',\n                    toolCallId,\n                    toolName,\n                    input: '{}',\n                    providerMetadata: providerMeta,\n                  });\n\n                  hasToolCalls = true;\n                }\n              }\n            }\n\n            if (candidate.finishReason != null) {\n              finishReason = {\n                unified: 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: usage?.serviceTier ?? null,\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              id: z.string().nullish(),\n              name: z.string().nullish(),\n              args: z.unknown().nullish(),\n              partialArgs: z.array(partialArgSchema).nullish(),\n              willContinue: z.boolean().nullish(),\n            }),\n            thoughtSignature: z.string().nullish(),\n          }),\n          z.object({\n            inlineData: z.object({\n              mimeType: z.string(),\n              data: z.string(),\n            }),\n            thought: z.boolean().nullish(),\n            thoughtSignature: z.string().nullish(),\n          }),\n          z.object({\n            toolCall: z.object({\n              toolType: z.string(),\n              args: z.unknown().nullish(),\n              id: z.string(),\n            }),\n            thoughtSignature: z.string().nullish(),\n          }),\n          z.object({\n            toolResponse: z.object({\n              toolType: z.string(),\n              response: z.unknown().nullish(),\n              id: z.string(),\n            }),\n            thoughtSignature: z.string().nullish(),\n          }),\n          z.object({\n            executableCode: z\n              .object({\n                language: z.string(),\n                code: z.string(),\n              })\n              .nullish(),\n            codeExecutionResult: z\n              .object({\n                outcome: z.string(),\n                output: z.string().nullish(),\n              })\n              .nullish(),\n            text: z.string().nullish(),\n            thought: z.boolean().nullish(),\n            thoughtSignature: z.string().nullish(),\n          }),\n        ]),\n      )\n      .nullish(),\n  });\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/configure-safety-filters\nconst getSafetyRatingSchema = () =>\n  z.object({\n    category: z.string().nullish(),\n    probability: z.string().nullish(),\n    probabilityScore: z.number().nullish(),\n    severity: z.string().nullish(),\n    severityScore: z.number().nullish(),\n    blocked: z.boolean().nullish(),\n  });\n\nconst tokenDetailsSchema = z\n  .array(\n    z.object({\n      modality: z.string(),\n      tokenCount: z.number(),\n    }),\n  )\n  .nullish();\n\nconst usageSchema = z.object({\n  cachedContentTokenCount: z.number().nullish(),\n  thoughtsTokenCount: z.number().nullish(),\n  promptTokenCount: z.number().nullish(),\n  candidatesTokenCount: z.number().nullish(),\n  totalTokenCount: z.number().nullish(),\n  // https://cloud.google.com/vertex-ai/generative-ai/docs/reference/rest/v1/GenerateContentResponse#TrafficType\n  trafficType: z.string().nullish(),\n  serviceTier: z.string().nullish(),\n  // https://ai.google.dev/api/generate-content#Modality\n  promptTokensDetails: tokenDetailsSchema,\n  candidatesTokensDetails: tokenDetailsSchema,\n});\n\n// https://ai.google.dev/api/generate-content#UrlRetrievalMetadata\nexport const getUrlContextMetadataSchema = () =>\n  z.object({\n    urlMetadata: z\n      .array(\n        z.object({\n          retrievedUrl: z.string(),\n          urlRetrievalStatus: z.string(),\n        }),\n      )\n      .nullish(),\n  });\n\nconst responseSchema = lazySchema(() =>\n  zodSchema(\n    z.object({\n      candidates: z.array(\n        z.object({\n          content: getContentSchema().nullish().or(z.object({}).strict()),\n          finishReason: z.string().nullish(),\n          finishMessage: z.string().nullish(),\n          safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n          groundingMetadata: getGroundingMetadataSchema().nullish(),\n          urlContextMetadata: getUrlContextMetadataSchema().nullish(),\n        }),\n      ),\n      usageMetadata: usageSchema.nullish(),\n      promptFeedback: z\n        .object({\n          blockReason: z.string().nullish(),\n          safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n        })\n        .nullish(),\n    }),\n  ),\n);\n\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    }),\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  serviceTier?: 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  toolCallId?: string,\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      ...(toolCallId != null ? { id: toolCallId } : {}),\n      name: toolName,\n      response: {\n        name: toolName,\n        content:\n          responseTextParts.length > 0\n            ? responseTextParts.join('\\n')\n            : 'Tool executed successfully.',\n      },\n      ...(functionResponseParts.length > 0\n        ? { parts: functionResponseParts }\n        : {}),\n    },\n  });\n}\n\n/*\n * Appends tool result content parts using a legacy format for pre-Gemini 3\n * models that do not support multimodal parts within functionResponse. Instead,\n * non-text content like images is sent as separate top-level inlineData parts.\n */\nfunction appendLegacyToolResultParts(\n  parts: GoogleGenerativeAIContentPart[],\n  toolName: string,\n  outputValue: Array<{\n    type: string;\n    [key: string]: unknown;\n  }>,\n  toolCallId?: string,\n): void {\n  for (const contentPart of outputValue) {\n    switch (contentPart.type) {\n      case 'text':\n        parts.push({\n          functionResponse: {\n            ...(toolCallId != null ? { id: toolCallId } : {}),\n            name: toolName,\n            response: {\n              name: toolName,\n              content: contentPart.text,\n            },\n          },\n        });\n        break;\n      case '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                      ...(part.toolCallId != null\n                        ? { id: part.toolCallId }\n                        : {}),\n                      name: part.toolName,\n                      args: part.input,\n                    },\n                    thoughtSignature,\n                  };\n                }\n\n                case 'tool-result': {\n                  const serverToolCallId =\n                    providerOpts?.serverToolCallId != null\n                      ? String(providerOpts.serverToolCallId)\n                      : undefined;\n                  const serverToolType =\n                    providerOpts?.serverToolType != null\n                      ? String(providerOpts.serverToolType)\n                      : undefined;\n\n                  if (serverToolCallId && serverToolType) {\n                    return {\n                      toolResponse: {\n                        toolType: serverToolType,\n                        response:\n                          part.output.type === 'json' ? part.output.value : {},\n                        id: serverToolCallId,\n                      },\n                      thoughtSignature,\n                    };\n                  }\n\n                  return undefined;\n                }\n              }\n            })\n            .filter(part => part !== undefined),\n        });\n\n        break;\n      }\n\n      case 'tool': {\n        systemMessagesAllowed = false;\n\n        const parts: 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(\n                parts,\n                part.toolName,\n                output.value,\n                part.toolCallId,\n              );\n            } else {\n              appendLegacyToolResultParts(\n                parts,\n                part.toolName,\n                output.value,\n                part.toolCallId,\n              );\n            }\n          } else {\n            parts.push({\n              functionResponse: {\n                ...(part.toolCallId != null ? { id: part.toolCallId } : {}),\n                name: part.toolName,\n                response: {\n                  name: part.toolName,\n                  content:\n                    output.type === 'execution-denied'\n                      ? (output.reason ?? 'Tool 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  | 'gemini-3.5-flash'\n  // latest version\n  // https://ai.google.dev/gemini-api/docs/models#latest\n  | 'gemini-pro-latest'\n  | 'gemini-flash-latest'\n  | 'gemini-flash-lite-latest'\n  | 'deep-research-pro-preview-12-2025'\n  | 'nano-banana-pro-preview'\n  | 'aqa'\n  // Experimental models\n  // https://ai.google.dev/gemini-api/docs/models/experimental-models\n  | 'gemini-robotics-er-1.5-preview'\n  | 'gemma-3-1b-it'\n  | 'gemma-3-4b-it'\n  | 'gemma-3n-e4b-it'\n  | 'gemma-3n-e2b-it'\n  | 'gemma-3-12b-it'\n  | 'gemma-3-27b-it'\n  | (string & {});\n\nexport const googleLanguageModelOptions = lazySchema(() =>\n  zodSchema(\n    z.object({\n      responseModalities: z.array(z.enum(['TEXT', 'IMAGE'])).optional(),\n\n      thinkingConfig: z\n        .object({\n          thinkingBudget: z.number().optional(),\n          includeThoughts: z.boolean().optional(),\n          // https://ai.google.dev/gemini-api/docs/gemini-3?thinking=high#thinking_level\n          thinkingLevel: z\n            .enum(['minimal', 'low', 'medium', 'high'])\n            .optional(),\n        })\n        .optional(),\n\n      /**\n       * Optional.\n       * The name of the cached content used as context to serve the prediction.\n       * Format: cachedContents/{cachedContent}\n       */\n      cachedContent: z.string().optional(),\n\n      /**\n       * Optional. Enable structured output. Default is true.\n       *\n       * This is useful when the JSON Schema contains elements that are\n       * not supported by the OpenAPI schema version that\n       * Google 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. Sent as the\n       * `serviceTier` body field. Gemini API only.\n       */\n      serviceTier: z.enum(['standard', 'flex', 'priority']).optional(),\n\n      /**\n       * Optional. Vertex AI only. Sent as the\n       * `X-Vertex-AI-LLM-Shared-Request-Type` request header to select a\n       * shared (PayGo) tier. With Provisioned Throughput allocated and\n       * `requestType` unset, the request falls back to this tier only if\n       * PT capacity is exhausted.\n       *\n       * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/priority-paygo\n       * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/flex-paygo\n       */\n      sharedRequestType: z.enum(['priority', 'flex', 'standard']).optional(),\n\n      /**\n       * Optional. Vertex AI only. Sent as the `X-Vertex-AI-LLM-Request-Type`\n       * request header. Set to `'shared'` together with `sharedRequestType`\n       * to bypass Provisioned Throughput entirely.\n       *\n       * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/priority-paygo\n       */\n      requestType: z.enum(['shared']).optional(),\n    }),\n  ),\n);\n\nexport type GoogleLanguageModelOptions = InferSchema<\n  typeof googleLanguageModelOptions\n>;\n","import {\n  UnsupportedFunctionalityError,\n  type 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  isVertexProvider = false,\n}: {\n  tools: LanguageModelV3CallOptions['tools'];\n  toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n  modelId: GoogleGenerativeAIModelId;\n  isVertexProvider?: boolean;\n}): {\n  tools:\n    | Array<\n        | {\n            functionDeclarations: Array<{\n              name: string;\n              description: string;\n              parameters: unknown;\n            }>;\n          }\n        | Record<string, any>\n      >\n    | undefined;\n  toolConfig:\n    | undefined\n    | {\n        functionCallingConfig?: {\n          mode: 'AUTO' | 'NONE' | 'ANY' | 'VALIDATED';\n          allowedFunctionNames?: string[];\n          streamFunctionCallArguments?: boolean;\n        };\n        includeServerSideToolInvocations?: boolean;\n      };\n  toolWarnings: 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        ...(!isVertexProvider && {\n          includeServerSideToolInvocations: true,\n        }),\n      };\n\n      if (toolChoice != null) {\n        switch (toolChoice.type) {\n          case 'auto':\n            break;\n          case 'none':\n            combinedToolConfig.functionCallingConfig = { mode: 'NONE' };\n            break;\n          case 'required':\n            combinedToolConfig.functionCallingConfig = { mode: 'ANY' };\n            break;\n          case 'tool':\n            combinedToolConfig.functionCallingConfig = {\n              mode: 'ANY',\n              allowedFunctionNames: [toolChoice.toolName],\n            };\n            break;\n        }\n      }\n\n      return {\n        tools: [...googleTools, { functionDeclarations }],\n        toolConfig: combinedToolConfig,\n        toolWarnings,\n      };\n    }\n\n    return {\n      tools: googleTools.length > 0 ? googleTools : undefined,\n      toolConfig: undefined,\n      toolWarnings,\n    };\n  }\n\n  const functionDeclarations = [];\n  let hasStrictTools = false;\n  for (const tool of tools) {\n    switch (tool.type) {\n      case 'function':\n        functionDeclarations.push({\n          name: tool.name,\n          description: tool.description ?? '',\n          parameters: convertJSONSchemaToOpenAPISchema(tool.inputSchema),\n        });\n        if (tool.strict === true) {\n          hasStrictTools = true;\n        }\n        break;\n      default:\n        toolWarnings.push({\n          type: 'unsupported',\n          feature: `function tool ${tool.name}`,\n        });\n        break;\n    }\n  }\n\n  if (toolChoice == null) {\n    return {\n      tools: [{ functionDeclarations }],\n      toolConfig: hasStrictTools\n        ? { functionCallingConfig: { mode: 'VALIDATED' } }\n        : undefined,\n      toolWarnings,\n    };\n  }\n\n  const type = toolChoice.type;\n\n  switch (type) {\n    case 'auto':\n      return {\n        tools: [{ functionDeclarations }],\n        toolConfig: {\n          functionCallingConfig: {\n            mode: hasStrictTools ? 'VALIDATED' : 'AUTO',\n          },\n        },\n        toolWarnings,\n      };\n    case 'none':\n      return {\n        tools: [{ functionDeclarations }],\n        toolConfig: { functionCallingConfig: { mode: 'NONE' } },\n        toolWarnings,\n      };\n    case 'required':\n      return {\n        tools: [{ functionDeclarations }],\n        toolConfig: {\n          functionCallingConfig: {\n            mode: hasStrictTools ? 'VALIDATED' : 'ANY',\n          },\n        },\n        toolWarnings,\n      };\n    case 'tool':\n      return {\n        tools: [{ functionDeclarations }],\n        toolConfig: {\n          functionCallingConfig: {\n            mode: hasStrictTools ? 'VALIDATED' : 'ANY',\n            allowedFunctionNames: [toolChoice.toolName],\n          },\n        },\n        toolWarnings,\n      };\n    default: {\n      const _exhaustiveCheck: never = type;\n      throw new UnsupportedFunctionalityError({\n        functionality: `tool choice type: ${_exhaustiveCheck}`,\n      });\n    }\n  }\n}\n","export type PartialArg = {\n  jsonPath: string;\n  stringValue?: string | null;\n  numberValue?: number | null;\n  boolValue?: boolean | null;\n  nullValue?: unknown;\n  willContinue?: boolean | null;\n};\n\ntype PathSegment = string | number;\n\ntype StackEntry = {\n  segment: PathSegment;\n  isArray: boolean;\n  childCount: number;\n};\n\n/**\n * Incrementally builds a JSON object from Google's streaming `partialArgs`\n * chunks emitted during tool-call function calling. Tracks both the structured\n * object and a running JSON text representation so callers can emit text deltas\n * that, when concatenated, form valid nested JSON matching JSON.stringify output.\n *\n * Input: [{jsonPath:\"$.location\",stringValue:\"Boston\"}]\n * Output: '{\"location\":\"Boston\"', then finalize() → closingDelta='}'\n */\nexport class GoogleJSONAccumulator {\n  private accumulatedArgs: Record<string, unknown> = {};\n  private jsonText = '';\n\n  /**\n   * Stack representing the currently \"open\" containers in the JSON output.\n   * Entry 0 is always the root `{` object once the first value is written.\n   */\n  private pathStack: StackEntry[] = [];\n\n  /**\n   * Whether a string value is currently \"open\" (willContinue was true),\n   * meaning the closing quote has not yet been emitted.\n   */\n  private stringOpen = false;\n\n  /**\n   * Input: [{jsonPath:\"$.brightness\",numberValue:50}]\n   * Output: { currentJSON:{brightness:50}, textDelta:'{\"brightness\":50' }\n   */\n  processPartialArgs(partialArgs: PartialArg[]): {\n    currentJSON: Record<string, unknown>;\n    textDelta: string;\n  } {\n    let delta = '';\n\n    for (const arg of partialArgs) {\n      const rawPath = arg.jsonPath.replace(/^\\$\\./, '');\n      if (!rawPath) continue;\n\n      const segments = parsePath(rawPath);\n\n      const existingValue = getNestedValue(this.accumulatedArgs, segments);\n      const isStringContinuation =\n        arg.stringValue != null && existingValue !== undefined;\n\n      if (isStringContinuation) {\n        const escaped = JSON.stringify(arg.stringValue).slice(1, -1);\n        setNestedValue(\n          this.accumulatedArgs,\n          segments,\n          (existingValue as string) + arg.stringValue,\n        );\n        delta += escaped;\n        continue;\n      }\n\n      const resolved = resolvePartialArgValue(arg);\n      if (resolved == null) continue;\n\n      setNestedValue(this.accumulatedArgs, segments, resolved.value);\n      delta += this.emitNavigationTo(segments, arg, resolved.json);\n    }\n\n    this.jsonText += delta;\n\n    return {\n      currentJSON: this.accumulatedArgs,\n      textDelta: delta,\n    };\n  }\n\n  /**\n   * Input: jsonText='{\"brightness\":50', accumulatedArgs={brightness:50}\n   * Output: { finalJSON:'{\"brightness\":50}', closingDelta:'}' }\n   */\n  finalize(): { finalJSON: string; closingDelta: string } {\n    const finalArgs = JSON.stringify(this.accumulatedArgs);\n    const closingDelta = finalArgs.slice(this.jsonText.length);\n    return { finalJSON: finalArgs, closingDelta };\n  }\n\n  /**\n   * Input: pathStack=[] (first call) or pathStack=[root,...] (subsequent calls)\n   * Output: '{' (first call) or '' (subsequent calls)\n   */\n  private ensureRoot(): string {\n    if (this.pathStack.length === 0) {\n      this.pathStack.push({ segment: '', isArray: false, childCount: 0 });\n      return '{';\n    }\n    return '';\n  }\n\n  /**\n   * Emits the JSON text fragment needed to navigate from the current open\n   * path to the new leaf at `targetSegments`, then writes the value.\n   *\n   * Input: targetSegments=[\"recipe\",\"name\"], arg={jsonPath:\"$.recipe.name\",stringValue:\"Lasagna\"}, valueJson='\"Lasagna\"'\n   * Output: '{\"recipe\":{\"name\":\"Lasagna\"'\n   */\n  private emitNavigationTo(\n    targetSegments: PathSegment[],\n    arg: PartialArg,\n    valueJson: string,\n  ): string {\n    let fragment = '';\n\n    if (this.stringOpen) {\n      fragment += '\"';\n      this.stringOpen = false;\n    }\n\n    fragment += this.ensureRoot();\n\n    const targetContainerSegments = targetSegments.slice(0, -1);\n    const leafSegment = targetSegments[targetSegments.length - 1];\n\n    const commonDepth = this.findCommonStackDepth(targetContainerSegments);\n\n    fragment += this.closeDownTo(commonDepth);\n    fragment += this.openDownTo(targetContainerSegments, leafSegment);\n    fragment += this.emitLeaf(leafSegment, arg, valueJson);\n\n    return fragment;\n  }\n\n  /**\n   * Returns the stack depth to preserve when navigating to a new target\n   * container path. Always >= 1 (the root is never popped).\n   *\n   * Input: stack=[root,\"recipe\",\"ingredients\",0], target=[\"recipe\",\"ingredients\",1]\n   * Output: 3 (keep root+\"recipe\"+\"ingredients\")\n   */\n  private findCommonStackDepth(targetContainer: PathSegment[]): number {\n    const maxDepth = Math.min(\n      this.pathStack.length - 1,\n      targetContainer.length,\n    );\n    let common = 0;\n    for (let i = 0; i < maxDepth; i++) {\n      if (this.pathStack[i + 1].segment === targetContainer[i]) {\n        common++;\n      } else {\n        break;\n      }\n    }\n    return common + 1;\n  }\n\n  /**\n   * Closes containers from the current stack depth back down to `targetDepth`.\n   *\n   * Input: this.pathStack=[root,\"recipe\",\"ingredients\",0], targetDepth=3\n   * Output: '}'\n   */\n  private closeDownTo(targetDepth: number): string {\n    let fragment = '';\n    while (this.pathStack.length > targetDepth) {\n      const entry = this.pathStack.pop()!;\n      fragment += entry.isArray ? ']' : '}';\n    }\n    return fragment;\n  }\n\n  /**\n   * Opens containers from the current stack depth down to the full target\n   * container path, emitting opening `{`, `[`, keys, and commas as needed.\n   * `leafSegment` is used to determine if the innermost container is an array.\n   *\n   * Input: this.pathStack=[root], targetContainer=[\"recipe\",\"ingredients\"], leafSegment=0\n   * Output: '\"recipe\":{\"ingredients\":['\n   */\n  private openDownTo(\n    targetContainer: PathSegment[],\n    leafSegment: PathSegment,\n  ): string {\n    let fragment = '';\n\n    const startIdx = this.pathStack.length - 1;\n\n    for (let i = startIdx; i < targetContainer.length; i++) {\n      const seg = targetContainer[i];\n      const parentEntry = this.pathStack[this.pathStack.length - 1];\n\n      if (parentEntry.childCount > 0) {\n        fragment += ',';\n      }\n      parentEntry.childCount++;\n\n      if (typeof seg === 'string') {\n        fragment += `${JSON.stringify(seg)}:`;\n      }\n\n      const childSeg =\n        i + 1 < targetContainer.length ? targetContainer[i + 1] : leafSegment;\n      const isArray = typeof childSeg === 'number';\n\n      fragment += isArray ? '[' : '{';\n\n      this.pathStack.push({ segment: seg, isArray, childCount: 0 });\n    }\n\n    return fragment;\n  }\n\n  /**\n   * Emits the comma, key, and value for a leaf entry in the current container.\n   *\n   * Input: leafSegment=\"name\", arg={stringValue:\"Lasagna\"}, valueJson='\"Lasagna\"'\n   * Output: '\"name\":\"Lasagna\"' (or ',\"name\":\"Lasagna\"' if container.childCount > 0)\n   */\n  private emitLeaf(\n    leafSegment: PathSegment,\n    arg: PartialArg,\n    valueJson: string,\n  ): string {\n    let fragment = '';\n    const container = this.pathStack[this.pathStack.length - 1];\n\n    if (container.childCount > 0) {\n      fragment += ',';\n    }\n    container.childCount++;\n\n    if (typeof leafSegment === 'string') {\n      fragment += `${JSON.stringify(leafSegment)}:`;\n    }\n\n    if (arg.stringValue != null && arg.willContinue) {\n      fragment += valueJson.slice(0, -1);\n      this.stringOpen = true;\n    } else {\n      fragment += valueJson;\n    }\n\n    return fragment;\n  }\n}\n\n/**\n * Splits a dotted/bracketed JSON path like `recipe.ingredients[0].name` into segments.\n *\n * Input: \"recipe.ingredients[0].name\"\n * Output: [\"recipe\", \"ingredients\", 0, \"name\"]\n */\nfunction parsePath(rawPath: string): Array<string | number> {\n  const segments: Array<string | number> = [];\n  for (const part of rawPath.split('.')) {\n    const bracketIdx = part.indexOf('[');\n    if (bracketIdx === -1) {\n      segments.push(part);\n    } else {\n      if (bracketIdx > 0) segments.push(part.slice(0, bracketIdx));\n      for (const m of part.matchAll(/\\[(\\d+)\\]/g)) {\n        segments.push(parseInt(m[1], 10));\n      }\n    }\n  }\n  return segments;\n}\n\n/**\n * Traverses a nested object along the given path segments and returns the leaf value.\n *\n * Input: ({recipe:{name:\"Lasagna\"}}, [\"recipe\",\"name\"])\n * Output: \"Lasagna\"\n */\nfunction getNestedValue(\n  obj: Record<string, unknown>,\n  segments: Array<string | number>,\n): unknown {\n  let current: unknown = obj;\n  for (const seg of segments) {\n    if (current == null || typeof current !== 'object') return undefined;\n    current = (current as Record<string | number, unknown>)[seg];\n  }\n  return current;\n}\n\n/**\n * Sets a value at a nested path, creating intermediate objects or arrays as needed.\n *\n * Input: obj={}, segments=[\"recipe\",\"ingredients\",0,\"name\"], value=\"Noodles\"\n * Output: {recipe:{ingredients:[{name:\"Noodles\"}]}}\n */\nfunction setNestedValue(\n  obj: Record<string, unknown>,\n  segments: Array<string | number>,\n  value: unknown,\n): void {\n  let current: Record<string | number, unknown> = obj;\n  for (let i = 0; i < segments.length - 1; i++) {\n    const seg = segments[i];\n    const nextSeg = segments[i + 1];\n    if (current[seg] == null) {\n      current[seg] = typeof nextSeg === 'number' ? [] : {};\n    }\n    current = current[seg] as Record<string | number, unknown>;\n  }\n  current[segments[segments.length - 1]] = value;\n}\n\n/**\n * Extracts the first non-null typed value from a partial arg and returns it with its JSON representation.\n *\n * Input: arg={stringValue:\"Boston\"} or arg={numberValue:50}\n * Output: {value:\"Boston\", json:'\"Boston\"'} or {value:50, json:'50'}\n */\nfunction resolvePartialArgValue(arg: {\n  stringValue?: string | null;\n  numberValue?: number | null;\n  boolValue?: boolean | null;\n  nullValue?: unknown;\n}): { value: unknown; json: string } | undefined {\n  const value = arg.stringValue ?? arg.numberValue ?? arg.boolValue;\n  if (value != null) return { value, json: JSON.stringify(value) };\n  if ('nullValue' in arg) return { value: null, json: 'null' };\n  return undefined;\n}\n","import type { 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\nexport const googleSearchToolArgsBaseSchema = z\n  .object({\n    searchTypes: z\n      .object({\n        webSearch: z.object({}).optional(),\n        imageSearch: z.object({}).optional(),\n      })\n      .optional(),\n\n    timeRangeFilter: z\n      .object({\n        startTime: z.string(),\n        endTime: z.string(),\n      })\n      .optional(),\n  })\n  .passthrough();\n\nexport type GoogleSearchToolArgs = z.infer<\n  typeof googleSearchToolArgsBaseSchema\n>;\n\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 InferSchema,\n  type Resolvable,\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';\nimport { googleSearchToolArgsBaseSchema } from './tool/google-search';\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      const { googleSearch: imagenGoogleSearch, ...imagenOptions } =\n        googleOptions;\n      if (imagenGoogleSearch != null) {\n        warnings.push({\n          type: 'unsupported',\n          feature: 'googleSearch',\n          details:\n            'Google Search grounding is only supported on Gemini image models.',\n        });\n      }\n      Object.assign(parameters, imagenOptions);\n    }\n\n    const body = {\n      instances: [{ prompt }],\n      parameters,\n    };\n\n    const { responseHeaders, value: response } = await postJsonToApi<{\n      predictions: Array<{ bytesBase64Encoded: string }>;\n    }>({\n      url: `${this.config.baseURL}/models/${this.modelId}:predict`,\n      headers: combineHeaders(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    // Parse image-model-specific provider options so we can map them onto\n    // the underlying language-model call. `googleSearch` is the dedicated\n    // escape hatch for grounding (generateImage has no `tools` parameter).\n    const googleImageOptions = await parseProviderOptions({\n      provider: 'google',\n      providerOptions,\n      schema: googleImageModelOptionsSchema,\n    });\n\n    const { googleSearch: _strippedGoogleSearch, ...passthroughGoogleOptions } =\n      providerOptions?.google ?? {};\n\n    // Instantiate language model\n    const languageModel = new 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          ...(passthroughGoogleOptions as Omit<\n            GoogleLanguageModelOptions,\n            'responseModalities' | 'imageConfig'\n          >),\n        } satisfies GoogleLanguageModelOptions,\n      },\n      tools:\n        googleImageOptions?.googleSearch != null\n          ? [\n              {\n                type: 'provider',\n                id: 'google.google_search',\n                name: 'google_search',\n                args: googleImageOptions.googleSearch,\n              },\n            ]\n          : undefined,\n      headers,\n      abortSignal,\n    });\n\n    const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n    // 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    const languageModelGoogleMetadata =\n      (result.providerMetadata?.google as\n        | Record<string, unknown>\n        | undefined) ?? {};\n\n    return {\n      images,\n      warnings,\n      providerMetadata: {\n        google: {\n          ...languageModelGoogleMetadata,\n          images: images.map(() => ({})),\n        },\n      },\n      response: {\n        timestamp: currentDate,\n        modelId: this.modelId,\n        headers: result.response?.headers,\n      },\n      usage: result.usage\n        ? {\n            inputTokens: result.usage.inputTokens.total,\n            outputTokens: result.usage.outputTokens.total,\n            totalTokens:\n              (result.usage.inputTokens.total ?? 0) +\n              (result.usage.outputTokens.total ?? 0),\n          }\n        : undefined,\n    };\n  }\n}\n\nfunction isGeminiModel(modelId: string): boolean {\n  return modelId.startsWith('gemini-');\n}\n\n// minimal version of the schema\nconst googleImageResponseSchema = lazySchema(() =>\n  zodSchema(\n    z.object({\n      predictions: z\n        .array(z.object({ bytesBase64Encoded: z.string() }))\n        .default([]),\n    }),\n  ),\n);\n\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       * Enable Google Search grounding for Gemini image models. The value is\n       * forwarded as the args of the `google.tools.googleSearch` provider\n       * tool on the underlying language-model call. Pass `{}` for defaults.\n       *\n       * `generateImage` does not accept a `tools` parameter, so this is the\n       * dedicated escape hatch for grounding image generation the same way\n       * `generateText` does.\n       */\n      googleSearch: googleSearchToolArgsBaseSchema.optional(),\n    }),\n  ),\n);\n\nexport type GoogleImageModelOptions = InferSchema<\n  typeof googleImageModelOptionsSchema\n>;\n","import {\n  AISDKError,\n  type 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  GoogleInteractionsEnvironmentSource,\n  GoogleInteractionsGenerationConfig,\n  GoogleInteractionsNetworkAllowlistEntry,\n  GoogleInteractionsNetworkConfig,\n  GoogleInteractionsRequestBody,\n  GoogleInteractionsResponseFormatEntry,\n  GoogleInteractionsTool,\n  GoogleInteractionsToolChoice,\n} from './google-interactions-prompt';\nimport { mapGoogleInteractionsFinishReason } from './map-google-interactions-finish-reason';\nimport { parseGoogleInteractionsOutputs } from './parse-google-interactions-outputs';\nimport {\n  isTerminalStatus,\n  pollGoogleInteractionUntilTerminal,\n} from './poll-google-interactions';\nimport { prepareGoogleInteractionsTools } from './prepare-google-interactions-tools';\nimport { streamGoogleInteractionEvents } from './stream-google-interactions';\nimport { synthesizeGoogleInteractionsAgentStream } from './synthesize-google-interactions-agent-stream';\n\nexport type GoogleInteractionsConfig = {\n  provider: string;\n  baseURL: string;\n  headers?: Resolvable<Record<string, string | undefined>>;\n  fetch?: FetchFunction;\n  generateId: () => string;\n  supportedUrls?: () => LanguageModelV3['supportedUrls'];\n};\n\nexport type GoogleInteractionsModelInput =\n  | GoogleInteractionsModelId\n  | { agent: string }\n  | { managedAgent: 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 if ('managedAgent' in modelOrAgent) {\n      this.modelId = modelOrAgent.managedAgent;\n      this.agent = modelOrAgent.managedAgent;\n    } else {\n      this.modelId = modelOrAgent.agent;\n      this.agent = modelOrAgent.agent;\n    }\n    this.config = config;\n  }\n\n  get provider(): string {\n    return this.config.provider;\n  }\n\n  get supportedUrls() {\n    if (this.config.supportedUrls) {\n      return this.config.supportedUrls();\n    }\n    return {\n      'image/*': [/^https?:\\/\\/.+/],\n      'application/pdf': [/^https?:\\/\\/.+/],\n      'audio/*': [/^https?:\\/\\/.+/],\n      'video/*': [\n        /^https?:\\/\\/(www\\.)?youtube\\.com\\/watch\\?v=.+/,\n        /^https?:\\/\\/youtu\\.be\\/.+/,\n        /^gs:\\/\\/.+/,\n      ],\n    };\n  }\n\n  private async getArgs(options: 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     * `response_format` is a polymorphic array of entries. Three sources\n     * contribute, in order:\n     *\n     *   1. AI SDK call-level `responseFormat: { type: 'json', schema }` →\n     *      `{ type: 'text', mime_type: 'application/json', schema }`.\n     *   2. `providerOptions.google.responseFormat` (primary path) — entries\n     *      are appended verbatim with camelCase → snake_case translation.\n     *   3. `providerOptions.google.imageConfig` (deprecated fallback) — only\n     *      contributes if no `{type:'image'}` entry was already provided via\n     *      sources 1 or 2; emits a deprecation warning when used.\n     *\n     * Agent calls cannot send `generation_config` and (per the API) cannot\n     * combine with structured output — emit a warning and drop the field.\n     */\n    const responseFormatEntries: Array<GoogleInteractionsResponseFormatEntry> =\n      [];\n    if (options.responseFormat?.type === 'json') {\n      if (isAgent) {\n        warnings.push({\n          type: 'other',\n          message:\n            'google.interactions: structured output (responseFormat) is not supported when an agent is set; responseFormat will be ignored.',\n        });\n      } else {\n        const entry: GoogleInteractionsResponseFormatEntry = {\n          type: 'text',\n          mime_type: 'application/json',\n          ...(options.responseFormat.schema != null\n            ? { schema: options.responseFormat.schema }\n            : {}),\n        };\n        responseFormatEntries.push(entry);\n      }\n    }\n\n    if (opts?.responseFormat != null) {\n      for (const entry of opts.responseFormat) {\n        if (entry.type === 'text') {\n          responseFormatEntries.push(\n            pruneUndefined({\n              type: 'text' as const,\n              mime_type: entry.mimeType ?? undefined,\n              schema: entry.schema ?? undefined,\n            }),\n          );\n        } else if (entry.type === 'image') {\n          responseFormatEntries.push(\n            pruneUndefined({\n              type: 'image' as const,\n              mime_type: entry.mimeType ?? undefined,\n              aspect_ratio: entry.aspectRatio ?? undefined,\n              image_size: entry.imageSize ?? undefined,\n            }),\n          );\n        } else if (entry.type === 'audio') {\n          responseFormatEntries.push(\n            pruneUndefined({\n              type: 'audio' as const,\n              mime_type: entry.mimeType ?? undefined,\n            }),\n          );\n        }\n      }\n    }\n\n    const {\n      input,\n      systemInstruction: convertedSystemInstruction,\n      warnings: convWarnings,\n    } = convertToGoogleInteractionsInput({\n      prompt: options.prompt,\n      previousInteractionId: opts?.previousInteractionId ?? undefined,\n      store: opts?.store ?? undefined,\n      mediaResolution: opts?.mediaResolution ?? undefined,\n    });\n\n    warnings.push(...convWarnings);\n\n    let systemInstruction = convertedSystemInstruction;\n    const optionSystemInstruction = opts?.systemInstruction ?? undefined;\n    if (systemInstruction != null && optionSystemInstruction != null) {\n      warnings.push({\n        type: 'other',\n        message:\n          'google.interactions: both AI SDK system message and providerOptions.google.systemInstruction were set; using the AI SDK system message.',\n      });\n    } else if (systemInstruction == null && optionSystemInstruction != null) {\n      systemInstruction = optionSystemInstruction;\n    }\n\n    /*\n     * The Interactions API splits per-call config into `generation_config`\n     * (model branch) and `agent_config` (agent branch); the two are mutually\n     * exclusive. The AI SDK call-level generation params and the thinking /\n     * imageConfig provider options flow into `generation_config`.\n     *\n     * When an agent is set, none of these fields are accepted by the API.\n     * Emit a single `LanguageModelV3CallWarning` listing the dropped field\n     * names and continue (do not throw); the agent-only `agent_config`\n     * field supersedes them.\n     */\n    let generationConfig: GoogleInteractionsGenerationConfig | undefined;\n    if (isAgent) {\n      const droppedFields: Array<string> = [];\n      if (options.temperature != null) droppedFields.push('temperature');\n      if (options.topP != null) droppedFields.push('topP');\n      if (options.seed != null) droppedFields.push('seed');\n      if (options.stopSequences != null && options.stopSequences.length > 0) {\n        droppedFields.push('stopSequences');\n      }\n      if (options.maxOutputTokens != null)\n        droppedFields.push('maxOutputTokens');\n      if (opts?.thinkingLevel != null) droppedFields.push('thinkingLevel');\n      if (opts?.thinkingSummaries != null) {\n        droppedFields.push('thinkingSummaries');\n      }\n      if (opts?.imageConfig != null) droppedFields.push('imageConfig');\n      if (droppedFields.length > 0) {\n        warnings.push({\n          type: 'other',\n          message: `google.interactions: ${droppedFields.join(', ')} ${droppedFields.length === 1 ? 'is' : 'are'} not supported when an agent is set; use providerOptions.google.agentConfig instead. Dropped from the request body.`,\n        });\n      }\n      generationConfig = undefined;\n    } else {\n      generationConfig = pruneUndefined({\n        temperature: options.temperature ?? undefined,\n        top_p: options.topP ?? undefined,\n        seed: options.seed ?? undefined,\n        stop_sequences:\n          options.stopSequences != null && options.stopSequences.length > 0\n            ? options.stopSequences\n            : undefined,\n        max_output_tokens: options.maxOutputTokens ?? undefined,\n        thinking_level: opts?.thinkingLevel ?? undefined,\n        thinking_summaries: opts?.thinkingSummaries ?? undefined,\n        tool_choice: toolChoiceForBody,\n      });\n\n      /*\n       * Deprecated fallback path: `imageConfig` contributes an image entry\n       * only when none was supplied via `responseFormat`. A warning is\n       * always emitted when `imageConfig` is set so callers migrate to the\n       * `responseFormat` shape.\n       */\n      if (opts?.imageConfig != null) {\n        const alreadyHasImageEntry = responseFormatEntries.some(\n          entry => entry.type === 'image',\n        );\n        warnings.push({\n          type: 'other',\n          message: alreadyHasImageEntry\n            ? 'google.interactions: providerOptions.google.imageConfig is deprecated and was ignored because providerOptions.google.responseFormat already supplies an image entry. Use responseFormat exclusively.'\n            : 'google.interactions: providerOptions.google.imageConfig is deprecated. Use providerOptions.google.responseFormat with a { type: \"image\", ... } entry instead.',\n        });\n        if (!alreadyHasImageEntry) {\n          responseFormatEntries.push({\n            type: 'image',\n            mime_type: 'image/png',\n            ...(opts.imageConfig.aspectRatio != null\n              ? { aspect_ratio: opts.imageConfig.aspectRatio }\n              : {}),\n            ...(opts.imageConfig.imageSize != null\n              ? { image_size: opts.imageConfig.imageSize }\n              : {}),\n          });\n        }\n      }\n    }\n\n    let agentConfig: GoogleInteractionsAgentConfig | undefined;\n    if (isAgent && opts?.agentConfig != null) {\n      const ac = opts.agentConfig;\n      if (ac.type === 'deep-research') {\n        agentConfig = pruneUndefined({\n          type: 'deep-research',\n          thinking_summaries: ac.thinkingSummaries ?? undefined,\n          visualization: ac.visualization ?? undefined,\n          collaborative_planning: ac.collaborativePlanning ?? undefined,\n        }) as GoogleInteractionsAgentConfig;\n      } else if (ac.type === 'dynamic') {\n        agentConfig = { type: 'dynamic' };\n      }\n    }\n\n    let environment: GoogleInteractionsRequestBody['environment'];\n    if (opts?.environment != null) {\n      if (!isAgent) {\n        warnings.push({\n          type: 'other',\n          message:\n            'google.interactions: environment is only supported when an agent is set; environment will be omitted from the request body.',\n        });\n      } else if (typeof opts.environment === 'string') {\n        environment = opts.environment;\n      } else {\n        const env = opts.environment;\n        const sources: Array<GoogleInteractionsEnvironmentSource> | undefined =\n          env.sources?.map(s => {\n            if (s.type === 'inline') {\n              return {\n                type: 'inline' as const,\n                content: s.content,\n                target: s.target,\n              };\n            }\n            return pruneUndefined({\n              type: s.type,\n              source: s.source,\n              target: s.target ?? undefined,\n            }) as GoogleInteractionsEnvironmentSource;\n          });\n        let network: GoogleInteractionsNetworkConfig | undefined;\n        if (env.network === 'disabled') {\n          network = 'disabled';\n        } else if (env.network != null) {\n          network = {\n            allowlist: env.network.allowlist.map(entry =>\n              pruneUndefined({\n                domain: entry.domain,\n                transform: entry.transform ?? undefined,\n              }),\n            ) as Array<GoogleInteractionsNetworkAllowlistEntry>,\n          };\n        }\n        environment = pruneUndefined({\n          type: 'remote' as const,\n          sources: sources != null && sources.length > 0 ? sources : undefined,\n          network,\n        });\n      }\n    }\n\n    /*\n     * `background` is opt-in via `providerOptions.google.background`. Some\n     * agents require it because their server-side workflow cannot complete\n     * within a single request; others reject it. When `background: true`, the\n     * POST returns a non-terminal status and the SDK polls\n     * `GET /interactions/{id}` until the work completes.\n     */\n    const args: GoogleInteractionsRequestBody = pruneUndefined({\n      ...(isAgent ? { agent: this.agent } : { model: this.modelId }),\n      input,\n      system_instruction: systemInstruction,\n      tools: toolsForBody,\n      response_format:\n        responseFormatEntries.length > 0 ? responseFormatEntries : undefined,\n      response_modalities:\n        opts?.responseModalities != null\n          ? (opts.responseModalities as Array<\n              'text' | 'image' | 'audio' | 'video' | 'document'\n            >)\n          : undefined,\n      previous_interaction_id: opts?.previousInteractionId ?? undefined,\n      service_tier: opts?.serviceTier ?? undefined,\n      store: opts?.store ?? undefined,\n      generation_config:\n        generationConfig != null && Object.keys(generationConfig).length > 0\n          ? generationConfig\n          : undefined,\n      agent_config: agentConfig,\n      environment,\n      background: opts?.background ?? undefined,\n    });\n\n    return {\n      args,\n      warnings,\n      isAgent,\n      isBackground: opts?.background === true,\n      pollingTimeoutMs: opts?.pollingTimeoutMs ?? undefined,\n    };\n  }\n\n  async doGenerate(\n    options: 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      INTERACTIONS_API_REVISION_HEADER,\n      this.config.headers ? await resolve(this.config.headers) : undefined,\n      options.headers,\n    );\n\n    const postResult = await postJsonToApi({\n      url,\n      headers: mergedHeaders,\n      body: args,\n      failedResponseHandler: googleFailedResponseHandler,\n      successfulResponseHandler: createJsonResponseHandler(\n        googleInteractionsResponseSchema,\n      ),\n      abortSignal: options.abortSignal,\n      fetch: this.config.fetch,\n    });\n\n    let {\n      responseHeaders,\n      value: response,\n      rawValue: rawResponse,\n    } = postResult;\n\n    /*\n     * Agent calls may return a non-terminal status (`in_progress` /\n     * `requires_action`) when invoked with `background: true`. Poll\n     * `GET /interactions/{id}` until terminal so the user-facing surface\n     * matches a synchronous call.\n     */\n    if (isAgent && !isTerminalStatus(response.status)) {\n      const polled = await pollGoogleInteractionUntilTerminal({\n        baseURL: this.config.baseURL,\n        interactionId: response.id,\n        headers: mergedHeaders,\n        fetch: this.config.fetch,\n        abortSignal: options.abortSignal,\n        timeoutMs: pollingTimeoutMs,\n      });\n      response = polled.response;\n      rawResponse = polled.rawResponse;\n      responseHeaders = polled.responseHeaders ?? responseHeaders;\n    }\n\n    /*\n     * `response.id` is omitted when `store: false` (fully stateless mode), and\n     * the stream surface returns `id: \"\"` (empty string) for the same case.\n     * Normalize both to `undefined` so downstream stamping does not pollute\n     * provider metadata with an empty/missing identifier.\n     */\n    const interactionId =\n      typeof response.id === 'string' && response.id.length > 0\n        ? response.id\n        : undefined;\n\n    const { content, hasFunctionCall } = parseGoogleInteractionsOutputs({\n      steps: response.steps ?? null,\n      generateId: this.config.generateId ?? defaultGenerateId,\n      interactionId,\n    });\n\n    const finishReason: 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, isBackground, pollingTimeoutMs } =\n      await this.getArgs(options);\n\n    const url = `${this.config.baseURL}/interactions`;\n\n    const mergedHeaders = combineHeaders(\n      INTERACTIONS_API_REVISION_HEADER,\n      this.config.headers ? await resolve(this.config.headers) : undefined,\n      options.headers,\n    );\n\n    /*\n     * `background: true` is incompatible with `stream: true` on POST. Drive\n     * background calls via POST background -> GET stream (with terminal-status\n     * short-circuit). The user-facing stream surface stays identical --\n     * text-start / text-delta / text-end / finish parts are emitted in the\n     * same order as a true SSE response.\n     */\n    if (isBackground) {\n      return this.doStreamBackground({\n        args,\n        warnings,\n        url,\n        mergedHeaders,\n        options,\n        pollingTimeoutMs,\n      });\n    }\n\n    const body = { ...args, stream: true };\n\n    const { responseHeaders, value: response } = await postJsonToApi({\n      url,\n      headers: mergedHeaders,\n      body,\n      failedResponseHandler: googleFailedResponseHandler,\n      successfulResponseHandler: createEventSourceResponseHandler(\n        googleInteractionsEventSchema,\n      ),\n      abortSignal: options.abortSignal,\n      fetch: this.config.fetch,\n    });\n\n    /*\n     * Google's API surfaces the applied service tier in the\n     * `x-gemini-service-tier` HTTP response header, not in the response body.\n     * Mirror the canonical pattern from `google-language-model.ts` (commit\n     * 1adfb76d2d) and pipe it through the stream transformer so the `finish`\n     * part's `providerMetadata.google.serviceTier` is sourced from the header.\n     */\n    const headerServiceTier = responseHeaders?.['x-gemini-service-tier'];\n\n    const transform = buildGoogleInteractionsStreamTransform({\n      warnings,\n      generateId: this.config.generateId ?? defaultGenerateId,\n      includeRawChunks: options.includeRawChunks,\n      serviceTier: headerServiceTier,\n    });\n\n    return {\n      stream: response.pipeThrough(transform),\n      request: { body },\n      response: { headers: responseHeaders },\n    };\n  }\n\n  /*\n   * Drive the streaming surface for agent calls. Agents require\n   * `background: true`, which is incompatible with `stream: true` on POST.\n   *\n   * Approach:\n   *   1. POST `/interactions` with `background: true`. The response includes\n   *      the interaction id and an initial (usually non-terminal) status.\n   *   2. If the POST status is already terminal (rare), synthesize a stream\n   *      from the polled outputs and we're done.\n   *   3. Otherwise open `GET /interactions/{id}?stream=true` and pipe the\n   *      SSE events through `buildGoogleInteractionsStreamTransform` so the\n   *      consumer receives text deltas / thinking summaries / tool events as\n   *      they happen instead of all at once at the end.\n   *\n   * The SSE connection can drop while the agent idles between events\n   * (`UND_ERR_BODY_TIMEOUT`); `streamGoogleInteractionEvents` handles the\n   * reconnect-with-`last_event_id` loop transparently.\n   */\n  private async doStreamBackground({\n    args,\n    warnings,\n    url,\n    mergedHeaders,\n    options,\n    pollingTimeoutMs,\n  }: {\n    args: GoogleInteractionsRequestBody;\n    warnings: Array<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    const { responseHeaders: postHeaders, value: postResponse } = postResult;\n    const interactionId = postResponse.id;\n\n    if (interactionId == null || interactionId.length === 0) {\n      throw new Error(\n        'google.interactions: background POST response did not include an interaction id; cannot stream the result.',\n      );\n    }\n\n    const headerServiceTier = postHeaders?.['x-gemini-service-tier'];\n\n    /*\n     * If the POST already returned a terminal status (e.g. cached, immediate\n     * failure, or `incomplete`), there is nothing to stream from the GET --\n     * synthesize directly from the response so the caller still gets a\n     * complete stream.\n     */\n    if (isTerminalStatus(postResponse.status)) {\n      const synthesized = synthesizeGoogleInteractionsAgentStream({\n        response: postResponse,\n        warnings,\n        generateId: this.config.generateId ?? defaultGenerateId,\n        includeRawChunks: options.includeRawChunks,\n        headerServiceTier,\n      });\n      return {\n        stream: synthesized,\n        request: { body: args },\n        response: { headers: postHeaders },\n      };\n    }\n\n    /*\n     * `pollingTimeoutMs` is unused on the live-SSE path -- there's no poll\n     * loop to time out -- but we surface it as the per-attempt timeout for\n     * the AbortSignal-driven cancel that the caller already controls. Future\n     * iterations may use it as a backstop if the SSE+resume loop spins\n     * indefinitely.\n     */\n    void pollingTimeoutMs;\n\n    const events = streamGoogleInteractionEvents({\n      baseURL: this.config.baseURL,\n      interactionId,\n      headers: mergedHeaders,\n      fetch: this.config.fetch,\n      abortSignal: options.abortSignal,\n    });\n\n    const transform = buildGoogleInteractionsStreamTransform({\n      warnings,\n      generateId: this.config.generateId ?? defaultGenerateId,\n      includeRawChunks: options.includeRawChunks,\n      serviceTier: headerServiceTier,\n    });\n\n    return {\n      stream: events.pipeThrough(transform),\n      request: { body: args },\n      response: { headers: postHeaders },\n    };\n  }\n}\n\n/*\n * Pins the Interactions API revision the SDK targets. Sent on every request\n * the model issues so model-id calls, agent calls, polling, SSE reconnects,\n * and cancellation all hit the same schema.\n */\nconst INTERACTIONS_API_REVISION_HEADER: Record<string, string> = {\n  'Api-Revision': '2026-05-20',\n};\n\nfunction pruneUndefined<T extends Record<string, unknown>>(obj: T): T {\n  const result: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(obj)) {\n    if (value === undefined) continue;\n    result[key] = value;\n  }\n  return result as T;\n}\n","import type { JSONObject, 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.url ?? a.document_uri ?? a.file_name;\n      if (uri == null || uri.length === 0) return undefined;\n      if (uri.startsWith('http://') || uri.startsWith('https://')) {\n        return {\n          type: 'source',\n          sourceType: 'url',\n          id: generateId(),\n          url: uri,\n          ...(a.file_name != null ? { title: a.file_name } : {}),\n        };\n      }\n      const filename = a.file_name ?? basename(uri);\n      const mediaType = inferDocMediaType(uri);\n      return {\n        type: 'source',\n        sourceType: 'document',\n        id: generateId(),\n        mediaType,\n        title: a.file_name ?? filename ?? uri,\n        ...(filename != null ? { filename } : {}),\n      };\n    }\n    case 'place_citation': {\n      const a = annotation as GoogleInteractionsPlaceCitation;\n      if (a.url == null || a.url.length === 0) return undefined;\n      return {\n        type: 'source',\n        sourceType: 'url',\n        id: generateId(),\n        url: a.url,\n        ...(a.name != null ? { title: a.name } : {}),\n      };\n    }\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Maps a built-in tool *result* content block to zero or more\n * `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          url?: string;\n          title?: string;\n        };\n        const uri = entry.url ?? entry.document_uri ?? entry.file_name;\n        if (uri == null || uri.length === 0) continue;\n        if (uri.startsWith('http://') || uri.startsWith('https://')) {\n          sources.push({\n            type: 'source',\n            sourceType: 'url',\n            id: generateId(),\n            url: uri,\n            ...(entry.title != null ? { title: entry.title } : {}),\n          });\n          continue;\n        }\n        const filename = entry.file_name ?? basename(uri);\n        const mediaType = inferDocMediaType(uri);\n        sources.push({\n          type: 'source',\n          sourceType: 'document',\n          id: generateId(),\n          mediaType,\n          title: entry.title ?? entry.file_name ?? filename ?? uri,\n          ...(filename != null ? { filename } : {}),\n        });\n      }\n      break;\n    }\n    default:\n      break;\n  }\n\n  return sources;\n}\n\n/**\n * Given a list of annotations attached to a single `text` content block,\n * returns the corresponding `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 * `tool-calls` is selected when the response includes a client-side function\n * call. The API itself signals this via `requires_action`, but\n * `completed + hasFunctionCall` also occurs in practice.\n */\nexport function mapGoogleInteractionsFinishReason({\n  status,\n  hasFunctionCall,\n}: {\n  status: GoogleInteractionsStatus | string | null | undefined;\n  hasFunctionCall: boolean;\n}): 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;\n      /**\n       * Accumulator for partial JSON arguments. Arguments stream as a\n       * sequence of `arguments_delta` substrings on `step.delta`; each one is\n       * appended verbatim and surfaced as a `tool-input-delta`. On\n       * `step.stop` the accumulated string is parsed to recover the full\n       * arguments object for the final `tool-call` event.\n       */\n      argumentsAccum: string;\n      signature?: string;\n    }\n  | {\n      kind: 'builtin_tool_call';\n      id: string;\n      blockType: string;\n      toolCallId: string;\n      toolName: string;\n      arguments: Record<string, unknown>;\n      callEmitted: boolean;\n    }\n  | {\n      kind: 'builtin_tool_result';\n      id: string;\n      blockType: string;\n      callId: string;\n      toolName: string;\n      result: unknown;\n      isError?: boolean;\n      resultEmitted: boolean;\n    }\n  /**\n   * A `model_output` step whose inner content-block kind has not yet been\n   * disambiguated. `step.start` may arrive bare (`{type: 'model_output'}`,\n   * no content payload); the first `step.delta` reveals whether the block\n   * is text or image. The block opens in this transitional state and swaps\n   * to `text` / `image` on the first matching delta.\n   */\n  | { kind: 'pending_model_output'; id: string }\n  | { kind: 'unknown'; id: string };\n\n/**\n * Builds a `TransformStream<ParseResult<GoogleInteractionsEvent>, LanguageModelV3StreamPart>`\n * over the Interactions API SSE event stream.\n *\n * Surfaces text + thought (reasoning), function_call, image, built-in tool\n * call/result steps, and `text_annotation` -> `source` parts.\n */\nexport function buildGoogleInteractionsStreamTransform({\n  warnings,\n  generateId,\n  includeRawChunks,\n  serviceTier: headerServiceTier,\n}: {\n  warnings: Array<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.completed` event body (see `service_tier` below); this\n   * parameter exists so we still surface a tier if the API later starts\n   * sending the header.\n   */\n  serviceTier?: string;\n}): TransformStream<\n  ParseResult<GoogleInteractionsEvent>,\n  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 step slots. The Interactions API frames concurrent steps\n   * (e.g. text alongside thought) by `index`; we track each open slot\n   * independently so a text delta at index N never collides with a thought\n   * delta at index M.\n   */\n  const openBlocks = new Map<number, OpenBlockState>();\n\n  /*\n   * De-duplicate sources across the whole stream. Citations often re-appear\n   * across multiple `text_annotation` deltas as the model's text grows;\n   * surface each unique URL once.\n   */\n  const emittedSourceKeys = new Set<string>();\n\n  function sourceKey(source: 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.created': {\n          const event = value as Extract<\n            GoogleInteractionsEvent,\n            { event_type: 'interaction.created' }\n          >;\n          const interaction = event.interaction;\n          /*\n           * The Interactions API returns `id: \"\"` (empty string) on streaming\n           * events when running with `store: false` — there is no server-side\n           * record. Treat empty string the same as missing so providerMetadata\n           * stays clean.\n           */\n          interactionId =\n            interaction?.id != null && interaction.id.length > 0\n              ? interaction.id\n              : undefined;\n\n          const created = (interaction as { created?: string } | undefined)\n            ?.created;\n          let timestamp: Date | undefined;\n          if (typeof created === 'string') {\n            const parsed = new Date(created);\n            if (!Number.isNaN(parsed.getTime())) {\n              timestamp = parsed;\n            }\n          }\n\n          controller.enqueue({\n            type: 'response-metadata',\n            ...(interactionId != null ? { id: interactionId } : {}),\n            modelId: (interaction as { model?: string } | undefined)?.model,\n            ...(timestamp ? { timestamp } : {}),\n          });\n          break;\n        }\n\n        case 'step.start': {\n          const event = value as Extract<\n            GoogleInteractionsEvent,\n            { event_type: 'step.start' }\n          >;\n          const step = event.step as\n            | {\n                type?: string;\n                id?: string;\n                call_id?: string;\n                name?: string;\n                arguments?: Record<string, unknown>;\n                signature?: string;\n                summary?: Array<{ type?: string; text?: string }>;\n                result?: unknown;\n                is_error?: boolean;\n                content?: Array<{\n                  type?: string;\n                  text?: string;\n                  data?: string;\n                  mime_type?: string;\n                  uri?: string;\n                  annotations?: Array<GoogleInteractionsAnnotation>;\n                }>;\n              }\n            | undefined;\n          const index = event.index;\n          const blockId = `${interactionId ?? 'interaction'}:${index}`;\n          const stepType = step?.type;\n\n          if (stepType === 'model_output') {\n            /*\n             * `step.start` for a `model_output` step often carries only the\n             * type discriminator — content/image payloads then arrive on\n             * subsequent `step.delta` events. Open in a transitional\n             * `pending_model_output` state; the first delta promotes it to\n             * either `text` (and emits `text-start`) or `image`.\n             *\n             * `step.content[0]` may also arrive populated as a hint; when\n             * present, promote eagerly.\n             */\n            const initial = step?.content?.[0] as\n              | {\n                  type?: string;\n                  text?: string;\n                  data?: string;\n                  mime_type?: string;\n                  uri?: string;\n                  annotations?: Array<GoogleInteractionsAnnotation>;\n                }\n              | undefined;\n            if (initial?.type === 'text') {\n              openBlocks.set(index, {\n                kind: 'text',\n                id: blockId,\n                emittedSourceKeys: new Set<string>(),\n              });\n              controller.enqueue({ type: 'text-start', id: blockId });\n\n              const initialSources = annotationsToSources({\n                annotations: initial.annotations,\n                generateId,\n              });\n              for (const source of initialSources) {\n                const key = sourceKey(source);\n                if (emittedSourceKeys.has(key)) continue;\n                emittedSourceKeys.add(key);\n                controller.enqueue(source);\n              }\n            } else if (initial?.type === 'image') {\n              openBlocks.set(index, {\n                kind: 'image',\n                id: blockId,\n                ...(initial.data != null ? { data: initial.data } : {}),\n                ...(initial.mime_type != null\n                  ? { mimeType: initial.mime_type }\n                  : {}),\n                ...(initial.uri != null ? { uri: initial.uri } : {}),\n              });\n            } else {\n              openBlocks.set(index, {\n                kind: 'pending_model_output',\n                id: blockId,\n              });\n            }\n          } else if (stepType === 'thought') {\n            const signature = step?.signature;\n            openBlocks.set(index, {\n              kind: 'reasoning',\n              id: blockId,\n              ...(signature != null ? { signature } : {}),\n            });\n            controller.enqueue({ type: 'reasoning-start', id: blockId });\n            /*\n             * A `thought` step's initial `summary[]` may already contain text\n             * items on `step.start` — emit those as reasoning deltas so the\n             * consumer's reasoning buffer is up to date before any delta\n             * arrives.\n             */\n            if (Array.isArray(step?.summary)) {\n              for (const item of step.summary) {\n                if (item?.type === 'text' && typeof item.text === 'string') {\n                  controller.enqueue({\n                    type: 'reasoning-delta',\n                    id: blockId,\n                    delta: item.text,\n                  });\n                }\n              }\n            }\n          } else if (stepType === 'function_call') {\n            const toolCallId = step?.id ?? blockId;\n            const toolName = step?.name ?? 'unknown';\n            hasFunctionCall = true;\n            const state: Extract<OpenBlockState, { kind: 'function_call' }> = {\n              kind: 'function_call',\n              id: blockId,\n              toolCallId,\n              toolName,\n              argumentsAccum: '',\n              ...(step?.signature != null ? { signature: step.signature } : {}),\n            };\n            openBlocks.set(index, state);\n            controller.enqueue({\n              type: 'tool-input-start',\n              id: toolCallId,\n              toolName,\n            });\n          } else if (\n            stepType != null &&\n            BUILTIN_TOOL_CALL_TYPES.has(stepType)\n          ) {\n            const toolName =\n              stepType === 'mcp_server_tool_call'\n                ? (step?.name ?? 'mcp_server_tool')\n                : builtinToolNameFromCallType(stepType);\n            const toolCallId = step?.id ?? blockId;\n            const state: Extract<\n              OpenBlockState,\n              { kind: 'builtin_tool_call' }\n            > = {\n              kind: 'builtin_tool_call',\n              id: blockId,\n              blockType: stepType,\n              toolCallId,\n              toolName,\n              arguments: step?.arguments ?? {},\n              callEmitted: false,\n            };\n            openBlocks.set(index, state);\n          } else if (\n            stepType != null &&\n            BUILTIN_TOOL_RESULT_TYPES.has(stepType)\n          ) {\n            const toolName =\n              stepType === 'mcp_server_tool_result'\n                ? (step?.name ?? 'mcp_server_tool')\n                : builtinToolNameFromResultType(stepType);\n            const callId = step?.call_id ?? blockId;\n            const state: Extract<\n              OpenBlockState,\n              { kind: 'builtin_tool_result' }\n            > = {\n              kind: 'builtin_tool_result',\n              id: blockId,\n              blockType: stepType,\n              callId,\n              toolName,\n              result: step?.result ?? null,\n              ...(step?.is_error != null ? { isError: step.is_error } : {}),\n              resultEmitted: false,\n            };\n            openBlocks.set(index, state);\n          } else {\n            openBlocks.set(index, { kind: 'unknown', id: blockId });\n          }\n          break;\n        }\n\n        case 'step.delta': {\n          const event = value as Extract<\n            GoogleInteractionsEvent,\n            { event_type: 'step.delta' }\n          >;\n          let open = openBlocks.get(event.index);\n          if (open == null) break;\n\n          const dtype = (event.delta as { type?: string } | undefined)?.type;\n\n          /*\n           * Promote a pending model_output block to `text` on the first\n           * text-shaped delta. Image deltas are emitted inline below — a\n           * model_output step can interleave text and image deltas, so the\n           * text \"open block\" stays in place across image emissions instead\n           * of being swapped for an image state.\n           */\n          if (open.kind === 'pending_model_output') {\n            if (\n              dtype === 'text' ||\n              dtype === 'text_annotation' ||\n              dtype === 'text_annotation_delta'\n            ) {\n              const promoted: Extract<OpenBlockState, { kind: 'text' }> = {\n                kind: 'text',\n                id: open.id,\n                emittedSourceKeys: new Set<string>(),\n              };\n              openBlocks.set(event.index, promoted);\n              open = promoted;\n              controller.enqueue({ type: 'text-start', id: promoted.id });\n            }\n          }\n\n          /*\n           * Image deltas inside `model_output` carry the full payload in a\n           * single chunk (no per-byte streaming). Emit the `file` part as\n           * soon as the delta arrives so it surfaces regardless of whether\n           * a text block is currently open at the same index.\n           */\n          if (\n            dtype === 'image' &&\n            (open.kind === 'pending_model_output' ||\n              open.kind === 'text' ||\n              open.kind === 'image')\n          ) {\n            const img = event.delta as\n              | { data?: string; mime_type?: string; uri?: string }\n              | undefined;\n            const google: Record<string, string> = {};\n            if (interactionId != null) google.interactionId = interactionId;\n            const providerMetadata =\n              Object.keys(google).length > 0 ? { google } : undefined;\n            if (img?.data != null && img.data.length > 0) {\n              controller.enqueue({\n                type: 'file',\n                mediaType: img.mime_type ?? 'image/png',\n                data: img.data,\n                ...(providerMetadata ? { providerMetadata } : {}),\n              });\n            } else if (img?.uri != null && img.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: img.uri,\n                },\n              };\n              controller.enqueue({\n                type: 'file',\n                mediaType: img.mime_type ?? 'image/png',\n                data: '',\n                providerMetadata: uriProviderMetadata,\n              });\n            }\n            // The file part was emitted inline; clear any data on an\n            // eagerly-promoted image OpenBlockState so the `step.stop`\n            // handler does not emit a duplicate.\n            if (open.kind === 'image') {\n              open.data = undefined;\n              open.uri = undefined;\n            }\n            break;\n          }\n\n          const delta = event.delta as\n            | {\n                type?: string;\n                text?: string;\n                signature?: string;\n                content?: { type?: string; text?: string };\n                id?: string;\n                /*\n                 * `arguments` carries different shapes per delta kind:\n                 * - `type: 'arguments_delta'` → `string` (partial JSON)\n                 * - `type: '<builtin>_tool_call'` → `Record<string, unknown>`\n                 * The branch handler reads it with the matching type.\n                 */\n                arguments?: Record<string, unknown> | string;\n                annotations?: Array<GoogleInteractionsAnnotation>;\n                call_id?: string;\n                result?: unknown;\n                is_error?: boolean;\n                data?: string;\n                mime_type?: string;\n                uri?: string;\n                name?: string;\n              }\n            | undefined;\n\n          if (open.kind === 'text' && delta?.type === 'text') {\n            const text = delta.text ?? '';\n            if (text.length > 0) {\n              controller.enqueue({\n                type: 'text-delta',\n                id: open.id,\n                delta: text,\n              });\n            }\n          } else if (\n            open.kind === 'text' &&\n            (delta?.type === 'text_annotation' ||\n              delta?.type === 'text_annotation_delta')\n          ) {\n            const sources = annotationsToSources({\n              annotations: delta.annotations,\n              generateId,\n            });\n            for (const source of sources) {\n              const key = sourceKey(source);\n              if (emittedSourceKeys.has(key)) continue;\n              emittedSourceKeys.add(key);\n              open.emittedSourceKeys.add(key);\n              controller.enqueue(source);\n            }\n          } else if (open.kind === 'image' && delta?.type === 'image') {\n            if (delta.data != null) open.data = delta.data;\n            if (delta.mime_type != null) open.mimeType = delta.mime_type;\n            if (delta.uri != null) open.uri = delta.uri;\n          } else if (open.kind === 'reasoning') {\n            if (delta?.type === 'thought_summary') {\n              const item = delta.content;\n              if (item?.type === 'text' && typeof item.text === 'string') {\n                controller.enqueue({\n                  type: 'reasoning-delta',\n                  id: open.id,\n                  delta: item.text,\n                });\n              }\n            } else if (delta?.type === 'thought_signature') {\n              const signature = delta.signature;\n              if (signature != null) {\n                open.signature = signature;\n              }\n            }\n          } else if (\n            open.kind === 'function_call' &&\n            delta?.type === 'arguments_delta'\n          ) {\n            /*\n             * Partial JSON arguments arrive as `arguments_delta` events.\n             * The partial JSON string lives in `delta.arguments` (a string,\n             * not the parsed object — the `arguments_delta` name applies to\n             * the discriminator only). Append to the accumulator and surface\n             * each chunk as a `tool-input-delta`; the full arguments object\n             * is emitted at `step.stop`.\n             */\n            const slice =\n              typeof delta.arguments === 'string' ? delta.arguments : '';\n            if (slice.length > 0) {\n              open.argumentsAccum += slice;\n              controller.enqueue({\n                type: 'tool-input-delta',\n                id: open.toolCallId,\n                delta: slice,\n              });\n            }\n            if (delta.id != null) {\n              open.toolCallId = delta.id;\n            }\n            if (delta.signature != null) {\n              open.signature = delta.signature;\n            }\n            hasFunctionCall = true;\n          } else if (\n            open.kind === 'builtin_tool_call' &&\n            delta?.type === open.blockType\n          ) {\n            if (delta.id != null) open.toolCallId = delta.id;\n            if (\n              delta.arguments != null &&\n              typeof delta.arguments === 'object'\n            ) {\n              open.arguments = delta.arguments;\n            }\n            if (\n              delta.name != null &&\n              open.blockType === 'mcp_server_tool_call'\n            ) {\n              open.toolName = delta.name;\n            }\n          } else if (\n            open.kind === 'builtin_tool_result' &&\n            delta?.type === open.blockType\n          ) {\n            if (delta.call_id != null) open.callId = delta.call_id;\n            if (delta.result !== undefined) open.result = delta.result;\n            if (delta.is_error != null) open.isError = delta.is_error;\n            if (\n              delta.name != null &&\n              open.blockType === 'mcp_server_tool_result'\n            ) {\n              open.toolName = delta.name;\n            }\n          }\n          break;\n        }\n\n        case 'step.stop': {\n          const event = value as Extract<\n            GoogleInteractionsEvent,\n            { event_type: 'step.stop' }\n          >;\n          const open = openBlocks.get(event.index);\n          if (open == null) break;\n\n          if (open.kind === 'text') {\n            const textProviderMetadata =\n              interactionId != null ? { google: { interactionId } } : undefined;\n            controller.enqueue({\n              type: 'text-end',\n              id: open.id,\n              ...(textProviderMetadata\n                ? { providerMetadata: textProviderMetadata }\n                : {}),\n            });\n          } else if (open.kind === 'reasoning') {\n            const google: Record<string, string> = {};\n            if (open.signature != null) google.signature = open.signature;\n            if (interactionId != null) google.interactionId = interactionId;\n            const providerMetadata =\n              Object.keys(google).length > 0 ? { google } : undefined;\n            controller.enqueue({\n              type: 'reasoning-end',\n              id: open.id,\n              ...(providerMetadata ? { providerMetadata } : {}),\n            });\n          } else if (open.kind === 'image') {\n            const google: Record<string, string> = {};\n            if (interactionId != null) google.interactionId = interactionId;\n            const providerMetadata =\n              Object.keys(google).length > 0 ? { google } : undefined;\n            if (open.data != null && open.data.length > 0) {\n              controller.enqueue({\n                type: 'file',\n                mediaType: open.mimeType ?? 'image/png',\n                data: 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 accumulated =\n              open.argumentsAccum.length > 0 ? open.argumentsAccum : '{}';\n            controller.enqueue({\n              type: 'tool-input-end',\n              id: open.toolCallId,\n            });\n            const google: Record<string, string> = {};\n            if (open.signature != null) google.signature = open.signature;\n            if (interactionId != null) google.interactionId = interactionId;\n            const providerMetadata =\n              Object.keys(google).length > 0 ? { google } : undefined;\n            controller.enqueue({\n              type: 'tool-call',\n              toolCallId: open.toolCallId,\n              toolName: open.toolName,\n              input: accumulated,\n              ...(providerMetadata ? { providerMetadata } : {}),\n            });\n          } else if (open.kind === 'builtin_tool_call' && !open.callEmitted) {\n            controller.enqueue({\n              type: 'tool-call',\n              toolCallId: open.toolCallId,\n              toolName: open.toolName,\n              input: JSON.stringify(open.arguments ?? {}),\n              providerExecuted: true,\n            });\n            open.callEmitted = true;\n          } else if (\n            open.kind === 'builtin_tool_result' &&\n            !open.resultEmitted\n          ) {\n            controller.enqueue({\n              type: 'tool-result',\n              toolCallId: open.callId,\n              toolName: open.toolName,\n              result: (open.result ?? null) as NonNullable<JSONValue>,\n            });\n            open.resultEmitted = true;\n\n            const sources = builtinToolResultToSources({\n              block: {\n                type: open.blockType,\n                call_id: open.callId,\n                result: open.result,\n              } as unknown as GoogleInteractionsBuiltinToolResultContent,\n              generateId,\n            });\n            for (const source of sources) {\n              const key = sourceKey(source);\n              if (emittedSourceKeys.has(key)) continue;\n              emittedSourceKeys.add(key);\n              controller.enqueue(source);\n            }\n          }\n          openBlocks.delete(event.index);\n          break;\n        }\n\n        case 'interaction.status_update':\n        case 'interaction.in_progress':\n        case 'interaction.requires_action': {\n          const event = value as Extract<\n            GoogleInteractionsEvent,\n            {\n              event_type:\n                | 'interaction.status_update'\n                | 'interaction.in_progress'\n                | 'interaction.requires_action';\n            }\n          >;\n          if (event.status != null) {\n            finishStatus = event.status;\n          } else if (eventType === 'interaction.requires_action') {\n            finishStatus = 'requires_action';\n          } else {\n            finishStatus = 'in_progress';\n          }\n          break;\n        }\n\n        case 'interaction.completed': {\n          const event = value as Extract<\n            GoogleInteractionsEvent,\n            { event_type: 'interaction.completed' }\n          >;\n          const interaction = event.interaction as {\n            id?: string;\n            status?: GoogleInteractionsStatus;\n            usage?: GoogleInteractionsUsage;\n            service_tier?: string;\n          };\n          if (interaction?.id != null && interaction.id.length > 0) {\n            interactionId = interaction.id;\n          }\n          if (interaction?.status != null) {\n            finishStatus = interaction.status;\n          }\n          if (interaction?.usage != null) {\n            usage = interaction.usage;\n          }\n          /*\n           * The Interactions API surfaces the applied service tier on\n           * `interaction.completed.interaction.service_tier` (NOT on the\n           * `x-gemini-service-tier` HTTP header that `:generateContent`\n           * uses). Body wins over header fallback.\n           */\n          if (interaction?.service_tier != null) {\n            serviceTier = interaction.service_tier;\n          }\n          break;\n        }\n\n        case 'error': {\n          const event = value as Extract<\n            GoogleInteractionsEvent,\n            { event_type: 'error' }\n          >;\n          finishStatus = 'failed';\n          const errorPayload = event.error ?? {\n            message: 'Unknown interaction error',\n          };\n          controller.enqueue({ type: 'error', error: errorPayload });\n          break;\n        }\n\n        default:\n          break;\n      }\n    },\n\n    flush(controller) {\n      const finishReason: 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  GoogleInteractionsContentBlock,\n  GoogleInteractionsFunctionResultContent,\n  GoogleInteractionsImageContent,\n  GoogleInteractionsInput,\n  GoogleInteractionsStep,\n  GoogleInteractionsTextContent,\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: Array<Step>, system_instruction }`).\n *\n * Prior assistant content round-trips as discrete steps:\n *   - text / image content → `model_output` step with a single `content` array\n *   - reasoning → `thought` step (`signature` + `summary`)\n *   - tool-call → `function_call` step\n * User turns (and tool-result turns from the previous round) are sent as\n * `user_input` steps whose `content[]` holds the user's parts (text, files,\n * and — for tool-result turns — `function_result` blocks).\n *\n * Handles text parts, file parts (image / audio / document / video, all four\n * `data.type` shapes), tool-call/tool-result round-tripping, per-step\n * `signature` round-tripping, and statefulness compaction (drop assistant/tool\n * turns whose `providerOptions.google.interactionId === previousInteractionId`).\n */\nexport function convertToGoogleInteractionsInput({\n  prompt,\n  previousInteractionId,\n  store,\n  mediaResolution,\n}: {\n  prompt: LanguageModelV3Prompt;\n  previousInteractionId?: string;\n  store?: boolean;\n  mediaResolution?: GoogleInteractionsMediaResolution;\n}): ConvertToGoogleInteractionsInputResult {\n  const warnings: Array<SharedV3Warning> = [];\n\n  /*\n   * Behavior matrix for compaction:\n   *\n   * - `previousInteractionId` set + `store !== false` → compact history (drop\n   *   assistant/tool turns whose `providerMetadata.google.interactionId`\n   *   matches), emit `previous_interaction_id`.\n   * - `previousInteractionId` set + `store === false` → emit warning\n   *   (incoherent combo), still send full history (NO compaction).\n   * - `store === false`, no `previousInteractionId` → no compaction.\n   * - Default → no compaction.\n   */\n  const incoherentCombo = previousInteractionId != null && store === false;\n  const shouldCompact = previousInteractionId != null && store !== false;\n  if (incoherentCombo) {\n    warnings.push({\n      type: 'other',\n      message:\n        'google.interactions: providerOptions.google.previousInteractionId was set together with store: false. These are incoherent (the prior interaction cannot be referenced when nothing was stored on the server); the full history will be sent and previous_interaction_id will still be emitted.',\n    });\n  }\n\n  const compactedPrompt = shouldCompact\n    ? compactPromptForPreviousInteraction({\n        prompt,\n        previousInteractionId,\n      })\n    : prompt;\n\n  const systemTexts: Array<string> = [];\n  const steps: Array<GoogleInteractionsStep> = [];\n\n  for (const message of compactedPrompt) {\n    switch (message.role) {\n      case 'system': {\n        systemTexts.push(message.content);\n        break;\n      }\n      case 'user': {\n        const content: Array<GoogleInteractionsContentBlock> = [];\n        for (const part of message.content) {\n          if (part.type === 'text') {\n            content.push({ type: 'text', text: part.text });\n          } else if (part.type === 'file') {\n            const fileBlock = convertFilePartToContent({\n              part,\n              warnings,\n              mediaResolution,\n            });\n            if (fileBlock != null) {\n              content.push(fileBlock);\n            }\n          }\n        }\n        const merged = mergeAdjacentTextContent(content);\n        if (merged.length > 0) {\n          steps.push({ type: 'user_input', content: merged });\n        }\n        break;\n      }\n      case 'assistant': {\n        /*\n         * Prior assistant content fans out into one step per logical block.\n         * Adjacent text/image content blocks are coalesced into a single\n         * `model_output` step (matching how the API emits them on output);\n         * reasoning and tool-calls each become their own step.\n         */\n        let pendingModelOutput: Array<GoogleInteractionsContentBlock> = [];\n        const flushModelOutput = () => {\n          if (pendingModelOutput.length > 0) {\n            steps.push({ type: 'model_output', content: pendingModelOutput });\n            pendingModelOutput = [];\n          }\n        };\n\n        for (const part of message.content) {\n          if (part.type === 'text') {\n            pendingModelOutput.push({ type: 'text', text: part.text });\n          } else if (part.type === 'reasoning') {\n            flushModelOutput();\n            const signature = part.providerOptions?.google?.signature as\n              | string\n              | undefined;\n            steps.push({\n              type: 'thought',\n              ...(signature != null ? { signature } : {}),\n              summary:\n                part.text.length > 0\n                  ? [{ type: 'text', text: part.text }]\n                  : undefined,\n            });\n          } else if (part.type === 'file') {\n            const fileBlock = convertFilePartToContent({\n              part,\n              warnings,\n              mediaResolution,\n            });\n            if (fileBlock != null) {\n              pendingModelOutput.push(fileBlock);\n            }\n          } else if (part.type === 'tool-call') {\n            flushModelOutput();\n            const signature = part.providerOptions?.google?.signature as\n              | string\n              | undefined;\n            const args =\n              typeof part.input === 'string'\n                ? safeParseToolArgs(part.input)\n                : ((part.input ?? {}) as Record<string, unknown>);\n            steps.push({\n              type: 'function_call',\n              id: part.toolCallId,\n              name: part.toolName,\n              arguments: args,\n              ...(signature != null ? { signature } : {}),\n            });\n          } else {\n            warnings.push({\n              type: 'other',\n              message: `google.interactions: unsupported assistant content part type \"${part.type}\"; part dropped.`,\n            });\n          }\n        }\n        flushModelOutput();\n        break;\n      }\n      case 'tool': {\n        /*\n         * Tool-result messages are emitted as a `user_input` step whose\n         * content holds one `function_result` block per tool-result part.\n         * `function_result` remains a content-block type (it sits inside\n         * a step), not a top-level step type.\n         */\n        const content: Array<GoogleInteractionsContentBlock> = [];\n        for (const part of message.content) {\n          if (part.type !== 'tool-result') {\n            warnings.push({\n              type: 'other',\n              message: `google.interactions: unsupported tool message part type \"${part.type}\"; part dropped.`,\n            });\n            continue;\n          }\n          const block = convertToolResultPart({\n            toolCallId: part.toolCallId,\n            toolName: part.toolName,\n            output: part.output,\n            signature: part.providerOptions?.google?.signature as\n              | string\n              | undefined,\n            warnings,\n          });\n          content.push(block);\n        }\n        if (content.length > 0) {\n          steps.push({ type: 'user_input', content });\n        }\n        break;\n      }\n    }\n  }\n\n  const systemInstruction =\n    systemTexts.length > 0 ? systemTexts.join('\\n\\n') : undefined;\n\n  return { input: steps, systemInstruction, warnings };\n}\n\n/**\n * Maps a single AI SDK `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  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 messages that were part of the linked interaction\n * (`previousInteractionId`). Tool-result turns whose tool-call counterpart\n * was dropped are also pruned to keep the message stream well-formed.\n */\nfunction compactPromptForPreviousInteraction({\n  prompt,\n  previousInteractionId,\n}: {\n  prompt: 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 step\n * into one combined text block, separated by a blank line. Text blocks\n * carrying `annotations` are left untouched (annotations are tied to specific\n * text spans).\n */\nfunction mergeAdjacentTextContent(\n  content: Array<GoogleInteractionsContentBlock>,\n): Array<GoogleInteractionsContentBlock> {\n  if (content.length < 2) {\n    return content;\n  }\n  const result: Array<GoogleInteractionsContentBlock> = [];\n  for (const block of content) {\n    const last = result[result.length - 1];\n    if (\n      block.type === 'text' &&\n      last != null &&\n      last.type === 'text' &&\n      (last as GoogleInteractionsTextContent).annotations == null &&\n      (block as GoogleInteractionsTextContent).annotations == null\n    ) {\n      const merged: GoogleInteractionsTextContent = {\n        type: 'text',\n        text: `${(last as GoogleInteractionsTextContent).text}\\n\\n${(block as GoogleInteractionsTextContent).text}`,\n      };\n      result[result.length - 1] = merged;\n      continue;\n    }\n    result.push(block);\n  }\n  return result;\n}\n","import {\n  lazySchema,\n  zodSchema,\n  type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/*\n * Zod schemas for the Gemini Interactions API wire format.\n *\n * Helpers are defined as factories (invoked only inside the exported\n * `lazySchema(() => ...)` callbacks) so no `z.object(...)` / `z.union(...)`\n * runs at module import. Schemas are intentionally narrow on the fields the\n * SDK consumes and lenient (`loose()` / `unknown`) on the rest, so subsequent\n * additions can widen without breaking the basic path.\n */\n\nconst tokenByModalitySchema = () =>\n  z\n    .object({\n      modality: z.string().nullish(),\n      tokens: z.number().nullish(),\n    })\n    .loose();\n\nconst usageSchema = () =>\n  z\n    .object({\n      total_input_tokens: z.number().nullish(),\n      total_output_tokens: z.number().nullish(),\n      total_thought_tokens: z.number().nullish(),\n      total_cached_tokens: z.number().nullish(),\n      total_tool_use_tokens: z.number().nullish(),\n      total_tokens: z.number().nullish(),\n      input_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n      output_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n      cached_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n      tool_use_tokens_by_modality: z.array(tokenByModalitySchema()).nullish(),\n      grounding_tool_count: z\n        .array(\n          z\n            .object({\n              type: z.string().nullish(),\n              count: z.number().nullish(),\n            })\n            .loose(),\n        )\n        .nullish(),\n    })\n    .loose();\n\nexport type GoogleInteractionsUsage = z.infer<ReturnType<typeof usageSchema>>;\n\nconst interactionStatusSchema = () =>\n  z.enum([\n    'in_progress',\n    'requires_action',\n    'completed',\n    'failed',\n    'cancelled',\n    'incomplete',\n  ]);\n\nconst annotationSchema = () => {\n  const urlCitation = z\n    .object({\n      type: z.literal('url_citation'),\n      url: z.string().nullish(),\n      title: z.string().nullish(),\n      start_index: z.number().nullish(),\n      end_index: z.number().nullish(),\n    })\n    .loose();\n\n  const fileCitation = z\n    .object({\n      type: z.literal('file_citation'),\n      file_name: z.string().nullish(),\n      document_uri: z.string().nullish(),\n      url: z.string().nullish(),\n      page_number: z.number().nullish(),\n      media_id: z.string().nullish(),\n      start_index: z.number().nullish(),\n      end_index: z.number().nullish(),\n      custom_metadata: z.record(z.string(), z.unknown()).nullish(),\n    })\n    .loose();\n\n  const placeCitation = z\n    .object({\n      type: z.literal('place_citation'),\n      name: z.string().nullish(),\n      url: z.string().nullish(),\n      place_id: z.string().nullish(),\n      start_index: z.number().nullish(),\n      end_index: z.number().nullish(),\n    })\n    .loose();\n\n  return z.union([\n    urlCitation,\n    fileCitation,\n    placeCitation,\n    z.object({ type: z.string() }).loose(),\n  ]);\n};\n\nconst thoughtSummaryItemSchema = () =>\n  z\n    .object({\n      type: z.string(),\n      text: z.string().nullish(),\n      data: z.string().nullish(),\n      mime_type: z.string().nullish(),\n    })\n    .loose();\n\n/*\n * Content block schemas — these populate the `content` array of a\n * `model_output` step. Function calls, thoughts, and built-in tool\n * call/result blocks are top-level step types (see `stepSchema` below), not\n * content blocks.\n */\nconst contentBlockSchema = () => {\n  const textContent = z\n    .object({\n      type: z.literal('text'),\n      text: z.string(),\n      annotations: z.array(annotationSchema()).nullish(),\n    })\n    .loose();\n\n  const imageContent = z\n    .object({\n      type: z.literal('image'),\n      data: z.string().nullish(),\n      mime_type: z.string().nullish(),\n      resolution: z.enum(['low', 'medium', 'high', 'ultra_high']).nullish(),\n      uri: z.string().nullish(),\n    })\n    .loose();\n\n  return z.union([\n    textContent,\n    imageContent,\n    z.object({ type: z.string() }).loose(),\n  ]);\n};\n\nexport type GoogleInteractionsContentBlock = z.infer<\n  ReturnType<typeof contentBlockSchema>\n>;\n\nconst BUILTIN_TOOL_CALL_STEP_TYPES = [\n  'google_search_call',\n  'code_execution_call',\n  'url_context_call',\n  'file_search_call',\n  'google_maps_call',\n  'mcp_server_tool_call',\n] as const;\n\nconst BUILTIN_TOOL_RESULT_STEP_TYPES = [\n  'google_search_result',\n  'code_execution_result',\n  'url_context_result',\n  'file_search_result',\n  'google_maps_result',\n  'mcp_server_tool_result',\n] as const;\n\n/*\n * Step schema union — elements of `response.steps[]` and the `step` field on\n * `step.start` SSE events.\n *\n * - `user_input` echoes a turn the client sent; only appears on\n *   `GET /interactions/{id}` (the full timeline). The SDK skips it.\n * - `model_output` wraps the model's text/image content in `step.content[]`.\n * - `function_call`, `thought`, and the built-in `*_call`/`*_result` steps\n *   carry their payload directly on the step (no `content` indirection).\n */\nconst stepSchema = () => {\n  const userInputStep = z\n    .object({\n      type: z.literal('user_input'),\n      content: z.array(contentBlockSchema()).nullish(),\n    })\n    .loose();\n\n  const modelOutputStep = z\n    .object({\n      type: z.literal('model_output'),\n      content: z.array(contentBlockSchema()).nullish(),\n    })\n    .loose();\n\n  const functionCallStep = z\n    .object({\n      type: z.literal('function_call'),\n      id: z.string(),\n      name: z.string(),\n      arguments: z.record(z.string(), z.unknown()).nullish(),\n      signature: z.string().nullish(),\n    })\n    .loose();\n\n  const thoughtStep = z\n    .object({\n      type: z.literal('thought'),\n      signature: z.string().nullish(),\n      summary: z.array(thoughtSummaryItemSchema()).nullish(),\n    })\n    .loose();\n\n  const builtinToolCallStep = z\n    .object({\n      type: z.enum(BUILTIN_TOOL_CALL_STEP_TYPES),\n      id: z.string(),\n      arguments: z.record(z.string(), z.unknown()).nullish(),\n      name: z.string().nullish(),\n      server_name: z.string().nullish(),\n      search_type: z.string().nullish(),\n      signature: z.string().nullish(),\n    })\n    .loose();\n\n  const builtinToolResultStep = z\n    .object({\n      type: z.enum(BUILTIN_TOOL_RESULT_STEP_TYPES),\n      call_id: z.string(),\n      result: z.unknown().nullish(),\n      is_error: z.boolean().nullish(),\n      name: z.string().nullish(),\n      server_name: z.string().nullish(),\n      signature: z.string().nullish(),\n    })\n    .loose();\n\n  return z.union([\n    userInputStep,\n    modelOutputStep,\n    functionCallStep,\n    thoughtStep,\n    builtinToolCallStep,\n    builtinToolResultStep,\n    z.object({ type: z.string() }).loose(),\n  ]);\n};\n\nexport type GoogleInteractionsStep = z.infer<ReturnType<typeof stepSchema>>;\n\nexport const googleInteractionsResponseSchema = lazySchema(() =>\n  zodSchema(\n    z\n      .object({\n        /*\n         * `id` is omitted from the response body when `store: false` (fully\n         * stateless mode) — there is no server-side interaction record for the\n         * client to reference. `nullish` lets the schema accept that shape.\n         */\n        id: z.string().nullish(),\n        created: z.string().nullish(),\n        updated: z.string().nullish(),\n        status: interactionStatusSchema(),\n        model: z.string().nullish(),\n        agent: z.string().nullish(),\n        steps: z.array(stepSchema()).nullish(),\n        usage: usageSchema().nullish(),\n        service_tier: z.string().nullish(),\n        previous_interaction_id: z.string().nullish(),\n        response_modalities: z.array(z.string()).nullish(),\n      })\n      .loose(),\n  ),\n);\n\nexport type GoogleInteractionsResponse = InferSchema<\n  typeof googleInteractionsResponseSchema\n>;\n\nexport const googleInteractionsEventSchema = lazySchema(() =>\n  zodSchema(\n    (() => {\n      const status = interactionStatusSchema();\n      const annotation = annotationSchema();\n      const thoughtSummaryItem = thoughtSummaryItemSchema();\n\n      const interactionCreatedEvent = z\n        .object({\n          event_type: z.literal('interaction.created'),\n          event_id: z.string().nullish(),\n          interaction: z\n            .object({\n              /*\n               * `id` is omitted when `store: false` (fully stateless mode);\n               * see the matching note on `googleInteractionsResponseSchema.id`.\n               */\n              id: z.string().nullish(),\n              created: z.string().nullish(),\n              model: z.string().nullish(),\n              agent: z.string().nullish(),\n              status: status.nullish(),\n            })\n            .loose(),\n        })\n        .loose();\n\n      /*\n       * `step.start` carries the discriminated step shape under `step`. For\n       * `function_call` steps the `name` is included here; for `thought`\n       * steps the initial `signature` and `summary` arrive here when set.\n       */\n      const stepStartEvent = z\n        .object({\n          event_type: z.literal('step.start'),\n          event_id: z.string().nullish(),\n          index: z.number(),\n          step: stepSchema(),\n        })\n        .loose();\n\n      const stepDeltaText = z\n        .object({\n          type: z.literal('text'),\n          text: z.string(),\n        })\n        .loose();\n\n      const stepDeltaThoughtSummary = z\n        .object({\n          type: z.literal('thought_summary'),\n          content: thoughtSummaryItem.nullish(),\n        })\n        .loose();\n\n      const stepDeltaThoughtSignature = z\n        .object({\n          type: z.literal('thought_signature'),\n          signature: z.string().nullish(),\n        })\n        .loose();\n\n      /*\n       * `function_call` step deltas stream the JSON arguments as a partial\n       * string. Wire shape:\n       *   { type: 'arguments_delta', arguments: '<partial-json-string>' }\n       * The partial JSON lives in `arguments` (a string), not in a separate\n       * `arguments_delta` field — the discriminator name is the only place\n       * `arguments_delta` appears. Consumers accumulate the substrings and\n       * parse on `step.stop`.\n       */\n      const stepDeltaArgumentsDelta = z\n        .object({\n          type: z.literal('arguments_delta'),\n          arguments: z.string().nullish(),\n          id: z.string().nullish(),\n          signature: z.string().nullish(),\n        })\n        .loose();\n\n      /*\n       * URL/file/place-citation deltas. The discriminator is\n       * `text_annotation_delta` (matching the `_delta` suffix used by\n       * `arguments_delta`); `text_annotation` is also accepted as an alias.\n       */\n      const stepDeltaTextAnnotation = z\n        .object({\n          type: z.enum(['text_annotation_delta', 'text_annotation']),\n          annotations: z.array(annotation).nullish(),\n        })\n        .loose();\n\n      /*\n       * `image` deltas carry the entire payload per delta (`data` base64 +\n       * `mime_type`, or `uri`) — there is no per-byte streaming.\n       */\n      const stepDeltaImage = z\n        .object({\n          type: z.literal('image'),\n          data: z.string().nullish(),\n          mime_type: z.string().nullish(),\n          resolution: z.enum(['low', 'medium', 'high', 'ultra_high']).nullish(),\n          uri: z.string().nullish(),\n        })\n        .loose();\n\n      /*\n       * Built-in tool call/result step deltas mirror the shape of their step\n       * counterparts (full payload per delta — there is no per-token\n       * streaming of arguments). Result deltas carry the populated `result`\n       * payload.\n       */\n      const stepDeltaBuiltinToolCall = z\n        .object({\n          type: z.enum(BUILTIN_TOOL_CALL_STEP_TYPES),\n          id: z.string().nullish(),\n          arguments: z.record(z.string(), z.unknown()).nullish(),\n          name: z.string().nullish(),\n          server_name: z.string().nullish(),\n          search_type: z.string().nullish(),\n          signature: z.string().nullish(),\n        })\n        .loose();\n\n      const stepDeltaBuiltinToolResult = z\n        .object({\n          type: z.enum(BUILTIN_TOOL_RESULT_STEP_TYPES),\n          call_id: z.string().nullish(),\n          result: z.unknown().nullish(),\n          is_error: z.boolean().nullish(),\n          name: z.string().nullish(),\n          server_name: z.string().nullish(),\n          signature: z.string().nullish(),\n        })\n        .loose();\n\n      const stepDeltaUnknown = z.object({ type: z.string() }).loose();\n\n      const stepDeltaUnion = z.union([\n        stepDeltaText,\n        stepDeltaImage,\n        stepDeltaThoughtSummary,\n        stepDeltaThoughtSignature,\n        stepDeltaArgumentsDelta,\n        stepDeltaTextAnnotation,\n        stepDeltaBuiltinToolCall,\n        stepDeltaBuiltinToolResult,\n        stepDeltaUnknown,\n      ]);\n\n      const stepDeltaEvent = z\n        .object({\n          event_type: z.literal('step.delta'),\n          event_id: z.string().nullish(),\n          index: z.number(),\n          delta: stepDeltaUnion,\n        })\n        .loose();\n\n      const stepStopEvent = z\n        .object({\n          event_type: z.literal('step.stop'),\n          event_id: z.string().nullish(),\n          index: z.number(),\n        })\n        .loose();\n\n      /*\n       * Status-transition events. The API emits `interaction.status_update`\n       * for in-progress and requires-action transitions; the more specific\n       * `interaction.in_progress` and `interaction.requires_action` shapes\n       * are accepted so all three route through the same handler.\n       */\n      const interactionStatusUpdateEvent = z\n        .object({\n          event_type: z.literal('interaction.status_update'),\n          event_id: z.string().nullish(),\n          interaction_id: z.string().nullish(),\n          status: status.nullish(),\n        })\n        .loose();\n\n      const interactionInProgressEvent = z\n        .object({\n          event_type: z.literal('interaction.in_progress'),\n          event_id: z.string().nullish(),\n          interaction_id: z.string().nullish(),\n          status: status.nullish(),\n        })\n        .loose();\n\n      const interactionRequiresActionEvent = z\n        .object({\n          event_type: z.literal('interaction.requires_action'),\n          event_id: z.string().nullish(),\n          interaction_id: z.string().nullish(),\n          status: status.nullish(),\n        })\n        .loose();\n\n      const interactionCompletedEvent = z\n        .object({\n          event_type: z.literal('interaction.completed'),\n          event_id: z.string().nullish(),\n          interaction: z\n            .object({\n              id: z.string().nullish(),\n              status: status.nullish(),\n              usage: usageSchema().nullish(),\n              service_tier: z.string().nullish(),\n            })\n            .loose(),\n        })\n        .loose();\n\n      const errorEvent = z\n        .object({\n          event_type: z.literal('error'),\n          event_id: z.string().nullish(),\n          error: z\n            .object({\n              code: z.string().nullish(),\n              message: z.string().nullish(),\n            })\n            .loose()\n            .nullish(),\n        })\n        .loose();\n\n      const unknownEvent = z.object({ event_type: z.string() }).loose();\n\n      return z.union([\n        interactionCreatedEvent,\n        stepStartEvent,\n        stepDeltaEvent,\n        stepStopEvent,\n        interactionStatusUpdateEvent,\n        interactionInProgressEvent,\n        interactionRequiresActionEvent,\n        interactionCompletedEvent,\n        errorEvent,\n        unknownEvent,\n      ]);\n    })(),\n  ),\n);\n\nexport type GoogleInteractionsEvent = InferSchema<\n  typeof googleInteractionsEventSchema\n>;\n","import {\n  lazySchema,\n  zodSchema,\n  type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Type-only union of Gemini model IDs that the Interactions API accepts via\n * `model:`. Mirrors `Model` from `googleapis/js-genai`\n * `src/interactions/resources/interactions.ts`.\n *\n * Kept as a separate type from `GoogleModelId` even though most IDs overlap;\n * the two surfaces (`:generateContent` vs `/interactions`) are independent and\n * may diverge over time.\n */\nexport type GoogleInteractionsModelId =\n  | 'gemini-2.5-computer-use-preview-10-2025'\n  | 'gemini-2.5-flash'\n  | 'gemini-2.5-flash-image'\n  | 'gemini-2.5-flash-lite'\n  | 'gemini-2.5-flash-lite-preview-09-2025'\n  | 'gemini-2.5-flash-native-audio-preview-12-2025'\n  | 'gemini-2.5-flash-preview-09-2025'\n  | 'gemini-2.5-flash-preview-tts'\n  | 'gemini-2.5-pro'\n  | 'gemini-2.5-pro-preview-tts'\n  | 'gemini-3-flash-preview'\n  | 'gemini-3-pro-image-preview'\n  | 'gemini-3-pro-preview'\n  | 'gemini-3.1-pro-preview'\n  | 'gemini-3.1-flash-image-preview'\n  | 'gemini-3.1-flash-lite-preview'\n  | 'gemini-3.1-flash-tts-preview'\n  | 'gemini-3.5-flash'\n  | 'lyria-3-clip-preview'\n  | 'lyria-3-pro-preview'\n  | (string & {});\n\n/**\n * Provider-options schema for `google.interactions(...)` calls. Read from the\n * shared `providerOptions.google.*` namespace (per PRD); per-call options that\n * the AI SDK doesn't natively expose live here.\n *\n * All fields are `.nullish()` per the existing google provider convention.\n */\nexport const googleInteractionsLanguageModelOptions = lazySchema(() =>\n  zodSchema(\n    z.object({\n      previousInteractionId: z.string().nullish(),\n      store: z.boolean().nullish(),\n\n      agent: z.string().nullish(),\n      agentConfig: z\n        .union([\n          z\n            .object({\n              type: z.literal('dynamic'),\n            })\n            .loose(),\n          z.object({\n            type: z.literal('deep-research'),\n            thinkingSummaries: z.enum(['auto', 'none']).nullish(),\n            visualization: z.enum(['off', 'auto']).nullish(),\n            collaborativePlanning: z.boolean().nullish(),\n          }),\n        ])\n        .nullish(),\n\n      thinkingLevel: z.enum(['minimal', 'low', 'medium', 'high']).nullish(),\n      thinkingSummaries: z.enum(['auto', 'none']).nullish(),\n\n      /**\n       * Output-format entries that map directly to the API's `response_format`\n       * array. Use this to request image, audio, or non-JSON text outputs\n       * with full control over `mime_type`, `aspect_ratio`, and `image_size`.\n       *\n       * Entries are sent in order. The AI SDK call-level `responseFormat: {\n       * type: 'json', schema }` still drives JSON-mode and adds a matching\n       * text entry automatically; entries listed here are appended.\n       */\n      responseFormat: z\n        .array(\n          z.union([\n            z\n              .object({\n                type: z.literal('text'),\n                mimeType: z.string().nullish(),\n                schema: z.unknown().nullish(),\n              })\n              .loose(),\n            z\n              .object({\n                type: z.literal('image'),\n                mimeType: z.string().nullish(),\n                aspectRatio: z\n                  .enum([\n                    '1:1',\n                    '2:3',\n                    '3:2',\n                    '3:4',\n                    '4:3',\n                    '4:5',\n                    '5:4',\n                    '9:16',\n                    '16:9',\n                    '21:9',\n                    '1:8',\n                    '8:1',\n                    '1:4',\n                    '4:1',\n                  ])\n                  .nullish(),\n                imageSize: z.enum(['1K', '2K', '4K', '512']).nullish(),\n              })\n              .loose(),\n            z\n              .object({\n                type: z.literal('audio'),\n                mimeType: z.string().nullish(),\n              })\n              .loose(),\n          ]),\n        )\n        .nullish(),\n\n      /**\n       * @deprecated Use `responseFormat` with a `{ type: 'image', ... }`\n       * entry instead. Retained for backwards compatibility; the SDK\n       * translates it into a matching `response_format` image entry and\n       * emits a warning when set.\n       */\n      imageConfig: z\n        .object({\n          aspectRatio: z\n            .enum([\n              '1:1',\n              '2:3',\n              '3:2',\n              '3:4',\n              '4:3',\n              '4:5',\n              '5:4',\n              '9:16',\n              '16:9',\n              '21:9',\n              '1:8',\n              '8:1',\n              '1:4',\n              '4:1',\n            ])\n            .nullish(),\n          imageSize: z.enum(['1K', '2K', '4K', '512']).nullish(),\n        })\n        .nullish(),\n      mediaResolution: z\n        .enum(['low', 'medium', 'high', 'ultra_high'])\n        .nullish(),\n\n      responseModalities: z\n        .array(z.enum(['text', 'image', 'audio', 'video', 'document']))\n        .nullish(),\n      serviceTier: z.enum(['flex', 'standard', 'priority']).nullish(),\n\n      /**\n       * Alternative to AI SDK `system` message. If both are set, the AI SDK\n       * `system` message wins and a warning is emitted.\n       */\n      systemInstruction: z.string().nullish(),\n\n      /**\n       * Per-block signature for round-tripping `thought.signature` and\n       * `function_call.signature` blocks. Set by the SDK on output reasoning /\n       * tool-call parts; passed back unchanged on input parts so the API\n       * accepts the prior turn.\n       */\n      signature: z.string().nullish(),\n\n      /**\n       * Set by the SDK on output assistant messages. The converter uses it to\n       * decide which messages to drop when compacting under\n       * `previousInteractionId`.\n       */\n      interactionId: z.string().nullish(),\n\n      /**\n       * Maximum time, in milliseconds, to poll a background interaction (agent\n       * call) before giving up. Defaults to 30 minutes. Long-running agents\n       * such as deep research can take tens of minutes — increase if needed.\n       */\n      pollingTimeoutMs: z.number().int().positive().nullish(),\n\n      /**\n       * Run the interaction in the background. Required for agents whose\n       * server-side workflow cannot complete within a single request/response.\n       * When `true`, the POST returns with a non-terminal status and the SDK\n       * polls `GET /interactions/{id}` until the work completes. Some agents\n       * reject `true`; see the agent's documentation for which mode it\n       * requires.\n       */\n      background: z.boolean().nullish(),\n\n      /**\n       * Environment configuration for the agent sandbox. Only applies to agent\n       * calls (`google.interactions({ agent })`); ignored on model-id calls.\n       *\n       *   - `\"remote\"`: provision a fresh sandbox for this call.\n       *   - any other string: an existing `environment_id` to reuse.\n       *   - object: provision a fresh sandbox and optionally preload `sources`\n       *     and/or constrain outbound traffic via `network`.\n       */\n      environment: z\n        .union([\n          z.string(),\n          z.object({\n            type: z.literal('remote'),\n            sources: z\n              .array(\n                z.union([\n                  z.object({\n                    type: z.literal('gcs'),\n                    source: z.string(),\n                    target: z.string().nullish(),\n                  }),\n                  z.object({\n                    type: z.literal('repository'),\n                    source: z.string(),\n                    target: z.string().nullish(),\n                  }),\n                  z.object({\n                    type: z.literal('inline'),\n                    content: z.string(),\n                    target: z.string(),\n                  }),\n                ]),\n              )\n              .nullish(),\n            network: z\n              .union([\n                z.literal('disabled'),\n                z.object({\n                  allowlist: z.array(\n                    z.object({\n                      domain: z.string(),\n                      transform: z\n                        .array(z.record(z.string(), z.string()))\n                        .nullish(),\n                    }),\n                  ),\n                }),\n              ])\n              .nullish(),\n          }),\n        ])\n        .nullish(),\n    }),\n  ),\n);\n\nexport type GoogleLanguageModelInteractionsOptions = InferSchema<\n  typeof googleInteractionsLanguageModelOptions\n>;\n","import type { JSONValue, LanguageModelV3Content } from '@ai-sdk/provider';\nimport type { GoogleInteractionsStep } from './google-interactions-api';\nimport {\n  annotationsToSources,\n  builtinToolResultToSources,\n} from './extract-google-interactions-sources';\nimport type {\n  GoogleInteractionsAnnotation,\n  GoogleInteractionsBuiltinToolResultContent,\n} from './google-interactions-prompt';\n\nexport type ParseGoogleInteractionsOutputsResult = {\n  content: Array<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-step\n * `signature` (round-trip) and the parent `interactionId` (history compaction\n * under `previousInteractionId`).\n */\nfunction googleProviderMetadata({\n  signature,\n  interactionId,\n}: {\n  signature?: string | null;\n  interactionId?: string;\n}): { providerMetadata: { google: Record<string, string> } } | object {\n  const google: Record<string, string> = {};\n  if (signature != null) {\n    google.signature = signature;\n  }\n  if (interactionId != null) {\n    google.interactionId = interactionId;\n  }\n  return Object.keys(google).length > 0 ? { providerMetadata: { google } } : {};\n}\n\nconst BUILTIN_TOOL_CALL_TYPES = new Set([\n  'google_search_call',\n  'code_execution_call',\n  'url_context_call',\n  'file_search_call',\n  'google_maps_call',\n  'mcp_server_tool_call',\n]);\n\nconst BUILTIN_TOOL_RESULT_TYPES = new Set([\n  'google_search_result',\n  'code_execution_result',\n  'url_context_result',\n  'file_search_result',\n  'google_maps_result',\n  'mcp_server_tool_result',\n]);\n\nfunction builtinToolNameFromCallType(type: string): string {\n  return type.replace(/_call$/, '');\n}\n\nfunction builtinToolNameFromResultType(type: string): string {\n  return type.replace(/_result$/, '');\n}\n\n/**\n * Walks the `steps[]` array of an Interactions response and emits AI SDK\n * `LanguageModelV3Content[]`. Surfaces:\n *\n * - `model_output` steps: iterates `step.content[]` for `text` (with\n *   annotations → source parts) and `image` content blocks.\n * - `thought` steps: emits a single `reasoning` part from `summary[*]`.\n * - `function_call` steps: emits a `tool-call` part directly.\n * - Built-in tool `*_call` / `*_result` steps (Google Search, Code Execution,\n *   URL Context, File Search, Google Maps, MCP Server): emits\n *   `tool-call`/`tool-result` parts with `providerExecuted: true`.\n * - `user_input` steps are skipped (they echo the client's input).\n */\nexport function parseGoogleInteractionsOutputs({\n  steps,\n  generateId,\n  interactionId,\n}: {\n  steps: Array<GoogleInteractionsStep> | null | undefined;\n  generateId: () => string;\n  /**\n   * Top-level `Interaction.id` on the response. Stamped onto each output\n   * part's `providerMetadata.google.interactionId` so the converter can drop\n   * matching assistant turns when `previousInteractionId` is used on the\n   * next turn (compaction).\n   */\n  interactionId?: string;\n}): ParseGoogleInteractionsOutputsResult {\n  const content: Array<LanguageModelV3Content> = [];\n  let hasFunctionCall = false;\n\n  if (steps == null) {\n    return { content, hasFunctionCall };\n  }\n\n  for (const step of steps) {\n    if (step == null || typeof step !== 'object') continue;\n    const type = (step as { type?: string }).type;\n    if (typeof type !== 'string') continue;\n\n    switch (type) {\n      case 'user_input': {\n        break;\n      }\n      case 'model_output': {\n        const blocks =\n          (step as { content?: Array<{ type?: string; [k: string]: unknown }> })\n            .content ?? [];\n        for (const block of blocks) {\n          if (block == null || typeof block !== 'object') continue;\n          const blockType = block.type;\n          if (blockType === 'text') {\n            const text = (block as { text?: string }).text ?? '';\n            const annotations = (\n              block as {\n                annotations?: Array<GoogleInteractionsAnnotation>;\n              }\n            ).annotations;\n            content.push({\n              type: 'text',\n              text,\n              ...googleProviderMetadata({ interactionId }),\n            });\n            const sources = annotationsToSources({ annotations, generateId });\n            for (const source of sources) {\n              content.push(source);\n            }\n          } else if (blockType === 'image') {\n            const image = block as {\n              data?: string;\n              mime_type?: string;\n              uri?: string;\n            };\n            if (image.data != null && image.data.length > 0) {\n              content.push({\n                type: 'file',\n                mediaType: image.mime_type ?? 'image/png',\n                data: 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\n               * a file content part on the v3 spec; surface the URI through\n               * provider 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          }\n        }\n        break;\n      }\n      case 'thought': {\n        const thought = step as {\n          signature?: string;\n          summary?: Array<{ type: string; text?: string }>;\n        };\n        const summary = Array.isArray(thought.summary) ? thought.summary : [];\n        const text = summary\n          .filter(\n            item => item?.type === 'text' && typeof item.text === 'string',\n          )\n          .map(item => item.text as string)\n          .join('\\n');\n        content.push({\n          type: 'reasoning',\n          text,\n          ...googleProviderMetadata({\n            signature: thought.signature,\n            interactionId,\n          }),\n        });\n        break;\n      }\n      case 'function_call': {\n        hasFunctionCall = true;\n        const call = step as {\n          id: string;\n          name: string;\n          arguments?: Record<string, unknown> | null;\n          signature?: string | null;\n        };\n        content.push({\n          type: 'tool-call',\n          toolCallId: call.id,\n          toolName: call.name,\n          input: JSON.stringify(call.arguments ?? {}),\n          ...googleProviderMetadata({\n            signature: call.signature,\n            interactionId,\n          }),\n        });\n        break;\n      }\n      default: {\n        if (BUILTIN_TOOL_CALL_TYPES.has(type)) {\n          const call = step as {\n            id?: string;\n            arguments?: Record<string, unknown>;\n            name?: string;\n            server_name?: string;\n          };\n          const toolName =\n            type === 'mcp_server_tool_call'\n              ? (call.name ?? 'mcp_server_tool')\n              : builtinToolNameFromCallType(type);\n          const input = JSON.stringify(call.arguments ?? {});\n          content.push({\n            type: 'tool-call',\n            toolCallId: call.id ?? generateId(),\n            toolName,\n            input,\n            providerExecuted: true,\n          });\n        } else if (BUILTIN_TOOL_RESULT_TYPES.has(type)) {\n          const result = step as {\n            call_id?: string;\n            result?: unknown;\n            is_error?: boolean;\n            name?: string;\n          };\n          const toolName =\n            type === 'mcp_server_tool_result'\n              ? (result.name ?? 'mcp_server_tool')\n              : builtinToolNameFromResultType(type);\n          content.push({\n            type: 'tool-result',\n            toolCallId: result.call_id ?? generateId(),\n            toolName,\n            result: (result.result ?? null) as NonNullable<JSONValue>,\n          });\n          const sources = builtinToolResultToSources({\n            block:\n              step as unknown as GoogleInteractionsBuiltinToolResultContent,\n            generateId,\n          });\n          for (const source of sources) {\n            content.push(source);\n          }\n        }\n        break;\n      }\n    }\n  }\n\n  return { content, hasFunctionCall };\n}\n","import {\n  createJsonResponseHandler,\n  delay,\n  getFromApi,\n  isAbortError,\n  type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { googleFailedResponseHandler } from '../google-error';\nimport { cancelGoogleInteraction } from './cancel-google-interaction';\nimport {\n  googleInteractionsResponseSchema,\n  type GoogleInteractionsResponse,\n} from './google-interactions-api';\nimport type { GoogleInteractionsStatus } from './google-interactions-prompt';\n\nconst TERMINAL_STATUSES: ReadonlySet<GoogleInteractionsStatus | string> =\n  new Set(['completed', 'failed', 'cancelled', 'incomplete']);\n\nexport function isTerminalStatus(\n  status: GoogleInteractionsStatus | string | null | undefined,\n): boolean {\n  return status != null && TERMINAL_STATUSES.has(status);\n}\n\n/*\n * Default polling cadence for background interactions. Starts at 1 s, doubles\n * each tick up to a 10 s ceiling, and gives up after 30 minutes -- agent runs\n * such as deep research can take tens of minutes server-side, so we err on\n * the long side rather than truncate a real run. Override per-call via\n * `providerOptions.google.pollingTimeoutMs`.\n */\nconst DEFAULT_INITIAL_DELAY_MS = 1000;\nconst DEFAULT_MAX_DELAY_MS = 10000;\nconst DEFAULT_TIMEOUT_MS = 30 * 60 * 1000;\n\nexport type PollGoogleInteractionResult = {\n  response: GoogleInteractionsResponse;\n  rawResponse: unknown;\n  responseHeaders: Record<string, string> | undefined;\n};\n\n/**\n * Polls `GET {baseURL}/interactions/{id}` until the response status is\n * terminal (`completed` / `failed` / `cancelled` / `incomplete`). Throws if\n * the polling loop exceeds `timeoutMs`, the response has no `id` to poll on,\n * or the abort signal fires.\n */\nexport async function pollGoogleInteractionUntilTerminal({\n  baseURL,\n  interactionId,\n  headers,\n  fetch,\n  abortSignal,\n  initialDelayMs = DEFAULT_INITIAL_DELAY_MS,\n  maxDelayMs = DEFAULT_MAX_DELAY_MS,\n  timeoutMs = DEFAULT_TIMEOUT_MS,\n}: {\n  baseURL: string;\n  interactionId: string | null | undefined;\n  headers: Record<string, string | undefined>;\n  fetch?: FetchFunction;\n  abortSignal?: AbortSignal;\n  initialDelayMs?: number;\n  maxDelayMs?: number;\n  timeoutMs?: number;\n}): Promise<PollGoogleInteractionResult> {\n  if (interactionId == null || interactionId.length === 0) {\n    throw new Error(\n      'google.interactions: cannot poll a background interaction without an id. ' +\n        'The POST response did not include an interaction id.',\n    );\n  }\n\n  const startedAt = Date.now();\n  let nextDelayMs = initialDelayMs;\n  const url = `${baseURL}/interactions/${encodeURIComponent(interactionId)}`;\n\n  /*\n   * When the caller aborts, fire a best-effort `POST /interactions/{id}/cancel`\n   * so the run stops billing on Google's side. Wrap every exit path that's\n   * triggered by an abort -- the explicit `abortSignal.aborted` check, the\n   * AbortError thrown by `delay()`, and any AbortError thrown by `getFromApi`.\n   */\n  const cancelOnServer = () =>\n    cancelGoogleInteraction({ baseURL, interactionId, headers, fetch });\n\n  try {\n    while (true) {\n      if (abortSignal?.aborted) {\n        await cancelOnServer();\n        throw new DOMException('Polling was aborted', 'AbortError');\n      }\n\n      if (Date.now() - startedAt > timeoutMs) {\n        throw new Error(\n          `google.interactions: timed out polling interaction ${interactionId} after ${timeoutMs}ms.`,\n        );\n      }\n\n      await delay(nextDelayMs, { abortSignal });\n\n      const {\n        value: response,\n        rawValue: rawResponse,\n        responseHeaders,\n      } = await getFromApi({\n        url,\n        headers,\n        failedResponseHandler: googleFailedResponseHandler,\n        successfulResponseHandler: createJsonResponseHandler(\n          googleInteractionsResponseSchema,\n        ),\n        abortSignal,\n        fetch,\n      });\n\n      if (isTerminalStatus(response.status)) {\n        return { response, rawResponse, responseHeaders };\n      }\n\n      nextDelayMs = Math.min(nextDelayMs * 2, maxDelayMs);\n    }\n  } catch (error) {\n    if (isAbortError(error)) {\n      await cancelOnServer();\n    }\n    throw error;\n  }\n}\n","import {\n  combineHeaders,\n  getRuntimeEnvironmentUserAgent,\n  withUserAgentSuffix,\n  type FetchFunction,\n} from '@ai-sdk/provider-utils';\n\nconst getOriginalFetch = () => globalThis.fetch;\n\n/**\n * Best-effort `POST /interactions/{id}/cancel` to stop a background interaction\n * on Google's side after the caller has aborted locally. Errors and non-2xx\n * responses are swallowed so a cancel failure cannot mask the original abort.\n *\n * Skips the request entirely if `interactionId` is missing/empty -- e.g. when\n * the interaction was created with `store: false` and the API did not return an\n * id.\n */\nexport async function cancelGoogleInteraction({\n  baseURL,\n  interactionId,\n  headers,\n  fetch = getOriginalFetch(),\n}: {\n  baseURL: string;\n  interactionId: string | null | undefined;\n  headers: Record<string, string | undefined>;\n  fetch?: FetchFunction;\n}): Promise<void> {\n  if (interactionId == null || interactionId.length === 0) {\n    return;\n  }\n\n  const url = `${baseURL}/interactions/${encodeURIComponent(interactionId)}/cancel`;\n\n  try {\n    const response = await fetch(url, {\n      method: 'POST',\n      headers: withUserAgentSuffix(\n        combineHeaders({ 'Content-Type': 'application/json' }, headers),\n        getRuntimeEnvironmentUserAgent(),\n      ),\n      body: '{}',\n    });\n\n    /*\n     * Drain the body so undici/Node can return the connection to the pool.\n     * Errors (e.g. non-2xx, network failure) are intentionally ignored: this\n     * is a best-effort cleanup and must not throw past the caller, which is\n     * already handling an aborted/failed run.\n     */\n    try {\n      await response.text();\n    } catch {\n      // ignore\n    }\n  } catch {\n    // ignore -- cancel is best-effort\n  }\n}\n","import type {\n  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. 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 {\n  createEventSourceResponseHandler,\n  delay,\n  getFromApi,\n  isAbortError,\n  type FetchFunction,\n  type ParseResult,\n} from '@ai-sdk/provider-utils';\nimport { googleFailedResponseHandler } from '../google-error';\nimport { cancelGoogleInteraction } from './cancel-google-interaction';\nimport {\n  googleInteractionsEventSchema,\n  type GoogleInteractionsEvent,\n} from './google-interactions-api';\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_DELAY_MS = 500;\n\n/**\n * Connects to `GET {baseURL}/interactions/{id}?stream=true` and surfaces the\n * server-sent events as a `ReadableStream<ParseResult<GoogleInteractionsEvent>>`\n * so the existing `buildGoogleInteractionsStreamTransform` can consume them\n * unchanged.\n *\n * The connection can drop mid-run: long-running agents idle for long\n * stretches between SSE events and undici's default body timeout terminates\n * the request with `UND_ERR_BODY_TIMEOUT`. We track the last seen `event_id`\n * and reconnect with `?last_event_id=<id>` on any unexpected end. After\n * `maxRetries` consecutive failures the stream errors out so the caller can\n * decide whether to fall back to polling.\n *\n * The stream completes cleanly when an `interaction.complete` event with a\n * terminal status arrives, or when an `error` event arrives.\n */\nexport function streamGoogleInteractionEvents({\n  baseURL,\n  interactionId,\n  headers,\n  fetch,\n  abortSignal,\n  maxRetries = DEFAULT_MAX_RETRIES,\n  retryDelayMs = DEFAULT_RETRY_DELAY_MS,\n}: {\n  baseURL: string;\n  interactionId: string;\n  headers: Record<string, string | undefined>;\n  fetch?: FetchFunction;\n  abortSignal?: AbortSignal;\n  maxRetries?: number;\n  retryDelayMs?: number;\n}): ReadableStream<ParseResult<GoogleInteractionsEvent>> {\n  if (interactionId.length === 0) {\n    throw new Error(\n      'google.interactions: cannot stream a background interaction without an id.',\n    );\n  }\n\n  const eventSourceHeaders = {\n    ...headers,\n    accept: 'text/event-stream',\n  };\n\n  let lastEventId: string | undefined;\n  let complete = false;\n  let attempt = 0;\n  let receivedAnyEventThisAttempt = false;\n  let currentReader:\n    | ReadableStreamDefaultReader<ParseResult<GoogleInteractionsEvent>>\n    | undefined;\n\n  /*\n   * Forwards `cancel()` from the consumer (and the upstream `abortSignal`) to\n   * any in-flight `getFromApi` or `delay` so the loop unblocks immediately\n   * instead of waiting for the next iteration to notice a flag.\n   */\n  const internalAbort = new AbortController();\n  const upstreamAbortHandler = () => internalAbort.abort();\n  if (abortSignal != null) {\n    if (abortSignal.aborted) {\n      internalAbort.abort();\n    } else {\n      abortSignal.addEventListener('abort', upstreamAbortHandler, {\n        once: true,\n      });\n    }\n  }\n  const effectiveSignal = internalAbort.signal;\n\n  function buildUrl(): string {\n    const base = `${baseURL}/interactions/${encodeURIComponent(interactionId)}`;\n    const params = new URLSearchParams({ stream: 'true' });\n    if (lastEventId != null) {\n      params.set('last_event_id', lastEventId);\n    }\n    return `${base}?${params.toString()}`;\n  }\n\n  async function openReader() {\n    const { value: stream } = await getFromApi({\n      url: buildUrl(),\n      headers: eventSourceHeaders,\n      failedResponseHandler: googleFailedResponseHandler,\n      successfulResponseHandler: createEventSourceResponseHandler(\n        googleInteractionsEventSchema,\n      ),\n      abortSignal: effectiveSignal,\n      fetch,\n    });\n    return stream.getReader();\n  }\n\n  return new ReadableStream<ParseResult<GoogleInteractionsEvent>>({\n    async start(controller) {\n      try {\n        while (!complete && !effectiveSignal.aborted) {\n          if (currentReader == null) {\n            try {\n              currentReader = await openReader();\n              receivedAnyEventThisAttempt = false;\n            } catch (error) {\n              if (isAbortError(error) || effectiveSignal.aborted) {\n                controller.error(error);\n                return;\n              }\n              attempt++;\n              if (attempt >= maxRetries) {\n                controller.error(error);\n                return;\n              }\n              await delay(retryDelayMs * attempt, {\n                abortSignal: effectiveSignal,\n              });\n              continue;\n            }\n          }\n\n          try {\n            const { done, value } = await currentReader.read();\n            if (done) {\n              /*\n               * Underlying stream ended. If we already saw the terminal event\n               * we exit cleanly; otherwise this is an unexpected disconnect\n               * and we'll reconnect with `last_event_id`.\n               *\n               * If the connection closed without producing any events at all\n               * this attempt, count it as a failed attempt -- otherwise an\n               * empty/misbehaving server response would loop forever.\n               */\n              currentReader = undefined;\n              if (complete) break;\n              if (!receivedAnyEventThisAttempt) {\n                attempt++;\n                if (attempt >= maxRetries) {\n                  controller.error(\n                    new Error(\n                      'google.interactions: SSE stream closed without producing any events.',\n                    ),\n                  );\n                  return;\n                }\n                await delay(retryDelayMs * attempt, {\n                  abortSignal: effectiveSignal,\n                });\n              } else {\n                attempt = 0;\n              }\n              continue;\n            }\n\n            receivedAnyEventThisAttempt = true;\n\n            if (value.success) {\n              const ev = value.value as {\n                event_id?: string;\n                event_type?: string;\n              };\n              if (typeof ev.event_id === 'string' && ev.event_id.length > 0) {\n                lastEventId = ev.event_id;\n              }\n              if (\n                ev.event_type === 'interaction.completed' ||\n                ev.event_type === 'error'\n              ) {\n                complete = true;\n              }\n            }\n\n            controller.enqueue(value);\n          } catch (error) {\n            if (isAbortError(error) || effectiveSignal.aborted) {\n              controller.error(error);\n              return;\n            }\n            currentReader = undefined;\n            attempt++;\n            if (attempt >= maxRetries) {\n              controller.error(error);\n              return;\n            }\n            await delay(retryDelayMs * attempt, {\n              abortSignal: effectiveSignal,\n            });\n          }\n        }\n        controller.close();\n      } catch (error) {\n        controller.error(error);\n      } finally {\n        if (abortSignal != null) {\n          abortSignal.removeEventListener('abort', upstreamAbortHandler);\n        }\n        currentReader?.cancel().catch(() => {});\n        currentReader = undefined;\n\n        /*\n         * If we're exiting because the caller aborted (or the consumer\n         * cancelled the stream) before the agent finished, fire\n         * `POST /interactions/{id}/cancel` so the run stops billing on\n         * Google's side. Skipped when `complete` is set -- the agent already\n         * reported terminal status via `interaction.complete` / `error`.\n         */\n        if (effectiveSignal.aborted && !complete) {\n          await cancelGoogleInteraction({\n            baseURL,\n            interactionId,\n            headers,\n            fetch,\n          });\n        }\n      }\n    },\n\n    cancel() {\n      internalAbort.abort();\n      currentReader?.cancel().catch(() => {});\n      currentReader = undefined;\n    },\n  });\n}\n","import type {\n  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        steps: response.steps ?? null,\n        generateId,\n        interactionId,\n      });\n\n      let blockCounter = 0;\n      const nextBlockId = () => `${interactionId ?? 'agent'}:${blockCounter++}`;\n\n      for (const part of content) {\n        switch (part.type) {\n          case 'text': {\n            const id = nextBlockId();\n            const providerMetadata = part.providerMetadata;\n            controller.enqueue({ type: 'text-start', id });\n            if (part.text.length > 0) {\n              controller.enqueue({ type: 'text-delta', id, delta: part.text });\n            }\n            controller.enqueue({\n              type: 'text-end',\n              id,\n              ...(providerMetadata ? { providerMetadata } : {}),\n            });\n            break;\n          }\n          case 'reasoning': {\n            const id = nextBlockId();\n            const providerMetadata = part.providerMetadata;\n            controller.enqueue({ type: 'reasoning-start', id });\n            if (part.text.length > 0) {\n              controller.enqueue({\n                type: 'reasoning-delta',\n                id,\n                delta: part.text,\n              });\n            }\n            controller.enqueue({\n              type: 'reasoning-end',\n              id,\n              ...(providerMetadata ? { providerMetadata } : {}),\n            });\n            break;\n          }\n          case 'tool-call': {\n            const providerMetadata = part.providerMetadata;\n            controller.enqueue({\n              type: 'tool-input-start',\n              id: part.toolCallId,\n              toolName: part.toolName,\n              ...(part.providerExecuted\n                ? { providerExecuted: part.providerExecuted }\n                : {}),\n            });\n            controller.enqueue({\n              type: 'tool-input-delta',\n              id: part.toolCallId,\n              delta: part.input,\n            });\n            controller.enqueue({\n              type: 'tool-input-end',\n              id: part.toolCallId,\n            });\n            controller.enqueue({\n              type: 'tool-call',\n              toolCallId: part.toolCallId,\n              toolName: part.toolName,\n              input: part.input,\n              ...(part.providerExecuted\n                ? { providerExecuted: part.providerExecuted }\n                : {}),\n              ...(providerMetadata ? { providerMetadata } : {}),\n            });\n            break;\n          }\n          case 'tool-result': {\n            controller.enqueue({\n              type: 'tool-result',\n              toolCallId: part.toolCallId,\n              toolName: part.toolName,\n              result: part.result,\n            });\n            break;\n          }\n          case 'source':\n          case 'file': {\n            controller.enqueue(part);\n            break;\n          }\n          default:\n            break;\n        }\n      }\n\n      const serviceTier = response.service_tier ?? headerServiceTier;\n\n      const finishReason: 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","withUserAgentSuffix","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","combineHeaders","delay","getFromApi","createJsonResponseHandler","createEventSourceResponseHandler","delay","getFromApi","isAbortError","getFromApi","createEventSourceResponseHandler","isAbortError","delay","generateId","providerMetadata","parseProviderOptions","_a","combineHeaders","resolve","postJsonToApi","createJsonResponseHandler","defaultGenerateId","createEventSourceResponseHandler","withUserAgentSuffix","_a","generateId"]}