{"version":3,"sources":["../../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-error.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"],"sourcesContent":["import {\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  FetchFunction,\n  generateId,\n  InferSchema,\n  lazySchema,\n  parseProviderOptions,\n  ParseResult,\n  postJsonToApi,\n  Resolvable,\n  resolve,\n  zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n  convertGoogleGenerativeAIUsage,\n  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  GoogleGenerativeAIModelId,\n  googleLanguageModelOptions,\n  VertexServiceTierMap,\n} from './google-generative-ai-options';\nimport {\n  GoogleGenerativeAIContentPart,\n  GoogleGenerativeAIProviderMetadata,\n} from './google-generative-ai-prompt';\nimport { prepareTools } from './google-prepare-tools';\nimport { GoogleJSONAccumulator, PartialArg } from './google-json-accumulator';\nimport { mapGoogleGenerativeAIFinishReason } from './map-google-generative-ai-finish-reason';\n\ntype GoogleGenerativeAIConfig = {\n  provider: string;\n  baseURL: string;\n  headers: Resolvable<Record<string, string | undefined>>;\n  fetch?: FetchFunction;\n  generateId: () => string;\n\n  /**\n   * The supported URLs for the model.\n   */\n  supportedUrls?: () => LanguageModelV3['supportedUrls'];\n};\n\nexport class GoogleGenerativeAILanguageModel implements LanguageModelV3 {\n  readonly specificationVersion = 'v3';\n\n  readonly modelId: GoogleGenerativeAIModelId;\n\n  private readonly config: GoogleGenerativeAIConfig;\n  private readonly generateId: () => string;\n\n  constructor(\n    modelId: GoogleGenerativeAIModelId,\n    config: GoogleGenerativeAIConfig,\n  ) {\n    this.modelId = modelId;\n    this.config = config;\n    this.generateId = config.generateId ?? generateId;\n  }\n\n  get provider(): string {\n    return this.config.provider;\n  }\n\n  get supportedUrls() {\n    return this.config.supportedUrls?.() ?? {};\n  }\n\n  private async getArgs(\n    {\n      prompt,\n      maxOutputTokens,\n      temperature,\n      topP,\n      topK,\n      frequencyPenalty,\n      presencePenalty,\n      stopSequences,\n      responseFormat,\n      seed,\n      tools,\n      toolChoice,\n      providerOptions,\n    }: LanguageModelV3CallOptions,\n    { isStreaming = false }: { isStreaming?: boolean } = {},\n  ) {\n    const warnings: SharedV3Warning[] = [];\n\n    const providerOptionsName = this.config.provider.includes('vertex')\n      ? 'vertex'\n      : 'google';\n    let googleOptions = await parseProviderOptions({\n      provider: providerOptionsName,\n      providerOptions,\n      schema: googleLanguageModelOptions,\n    });\n\n    if (googleOptions == null && providerOptionsName !== 'google') {\n      googleOptions = await parseProviderOptions({\n        provider: 'google',\n        providerOptions,\n        schema: googleLanguageModelOptions,\n      });\n    }\n\n    // Add warning if Vertex rag tools are used with a non-Vertex Google provider\n    const isVertexProvider = this.config.provider.startsWith('google.vertex.');\n\n    if (\n      tools?.some(\n        tool =>\n          tool.type === 'provider' && tool.id === 'google.vertex_rag_store',\n      ) &&\n      !isVertexProvider\n    ) {\n      warnings.push({\n        type: 'other',\n        message:\n          \"The 'vertex_rag_store' tool is only supported with the Google Vertex provider \" +\n          'and might not be supported or could behave unexpectedly with the current Google provider ' +\n          `(${this.config.provider}).`,\n      });\n    }\n\n    if (googleOptions?.streamFunctionCallArguments && !isVertexProvider) {\n      warnings.push({\n        type: 'other',\n        message:\n          \"'streamFunctionCallArguments' is only supported on the Vertex AI API \" +\n          'and will be ignored with the current Google provider ' +\n          `(${this.config.provider}). See https://docs.cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling#streaming-fc`,\n      });\n    }\n\n    // Vertex API requires another service tier format.\n    let sanitizedServiceTier: string | undefined = googleOptions?.serviceTier;\n    if (googleOptions?.serviceTier && isVertexProvider) {\n      sanitizedServiceTier = VertexServiceTierMap[googleOptions.serviceTier];\n    }\n\n    const isGemmaModel = this.modelId.toLowerCase().startsWith('gemma-');\n    const supportsFunctionResponseParts = this.modelId.startsWith('gemini-3');\n\n    const { contents, systemInstruction } = convertToGoogleGenerativeAIMessages(\n      prompt,\n      {\n        isGemmaModel,\n        providerOptionsName,\n        supportsFunctionResponseParts,\n      },\n    );\n\n    const {\n      tools: googleTools,\n      toolConfig: googleToolConfig,\n      toolWarnings,\n    } = prepareTools({\n      tools,\n      toolChoice,\n      modelId: this.modelId,\n    });\n\n    const streamFunctionCallArguments =\n      isStreaming && isVertexProvider\n        ? (googleOptions?.streamFunctionCallArguments ?? false)\n        : undefined;\n\n    const toolConfig =\n      googleToolConfig ||\n      streamFunctionCallArguments ||\n      googleOptions?.retrievalConfig\n        ? {\n            ...googleToolConfig,\n            ...(streamFunctionCallArguments && {\n              functionCallingConfig: {\n                ...googleToolConfig?.functionCallingConfig,\n                streamFunctionCallArguments: true as const,\n              },\n            }),\n            ...(googleOptions?.retrievalConfig && {\n              retrievalConfig: googleOptions.retrievalConfig,\n            }),\n          }\n        : undefined;\n\n    return {\n      args: {\n        generationConfig: {\n          // standardized settings:\n          maxOutputTokens,\n          temperature,\n          topK,\n          topP,\n          frequencyPenalty,\n          presencePenalty,\n          stopSequences,\n          seed,\n\n          // response format:\n          responseMimeType:\n            responseFormat?.type === 'json' ? 'application/json' : undefined,\n          responseSchema:\n            responseFormat?.type === 'json' &&\n            responseFormat.schema != null &&\n            // Google GenAI does not support all OpenAPI Schema features,\n            // so this is needed as an escape hatch:\n            // TODO convert into provider option\n            (googleOptions?.structuredOutputs ?? true)\n              ? convertJSONSchemaToOpenAPISchema(responseFormat.schema)\n              : undefined,\n          ...(googleOptions?.audioTimestamp && {\n            audioTimestamp: googleOptions.audioTimestamp,\n          }),\n\n          // provider options:\n          responseModalities: googleOptions?.responseModalities,\n          thinkingConfig: googleOptions?.thinkingConfig,\n          ...(googleOptions?.mediaResolution && {\n            mediaResolution: googleOptions.mediaResolution,\n          }),\n          ...(googleOptions?.imageConfig && {\n            imageConfig: googleOptions.imageConfig,\n          }),\n        },\n        contents,\n        systemInstruction: isGemmaModel ? undefined : systemInstruction,\n        safetySettings: googleOptions?.safetySettings,\n        tools: googleTools,\n        toolConfig,\n        cachedContent: googleOptions?.cachedContent,\n        labels: googleOptions?.labels,\n        serviceTier: sanitizedServiceTier,\n      },\n      warnings: [...warnings, ...toolWarnings],\n      providerOptionsName,\n    };\n  }\n\n  async doGenerate(\n    options: LanguageModelV3CallOptions,\n  ): Promise<LanguageModelV3GenerateResult> {\n    const { args, warnings, providerOptionsName } = await this.getArgs(options);\n\n    const mergedHeaders = combineHeaders(\n      await resolve(this.config.headers),\n      options.headers,\n    );\n\n    const {\n      responseHeaders,\n      value: response,\n      rawValue: rawResponse,\n    } = await postJsonToApi({\n      url: `${this.config.baseURL}/${getModelPath(\n        this.modelId,\n      )}:generateContent`,\n      headers: mergedHeaders,\n      body: args,\n      failedResponseHandler: googleFailedResponseHandler,\n      successfulResponseHandler: createJsonResponseHandler(responseSchema),\n      abortSignal: options.abortSignal,\n      fetch: this.config.fetch,\n    });\n\n    const candidate = response.candidates[0];\n    const content: Array<LanguageModelV3Content> = [];\n\n    // map ordered parts to content:\n    const parts = candidate.content?.parts ?? [];\n\n    const usageMetadata = response.usageMetadata;\n\n    // Associates a code execution result with its preceding call.\n    let lastCodeExecutionToolCallId: string | undefined;\n    // Associates a server-side tool response with its preceding call (tool combination).\n    let lastServerToolCallId: string | undefined;\n\n    // Build content array from all parts\n    for (const part of parts) {\n      if ('executableCode' in part && part.executableCode?.code) {\n        const toolCallId = this.config.generateId();\n        lastCodeExecutionToolCallId = toolCallId;\n\n        content.push({\n          type: 'tool-call',\n          toolCallId,\n          toolName: 'code_execution',\n          input: JSON.stringify(part.executableCode),\n          providerExecuted: true,\n        });\n      } else if ('codeExecutionResult' in part && part.codeExecutionResult) {\n        content.push({\n          type: 'tool-result',\n          // Assumes a result directly follows its corresponding call part.\n          toolCallId: lastCodeExecutionToolCallId!,\n          toolName: 'code_execution',\n          result: {\n            outcome: part.codeExecutionResult.outcome,\n            output: part.codeExecutionResult.output ?? '',\n          },\n        });\n        // Clear the ID after use to avoid accidental reuse.\n        lastCodeExecutionToolCallId = undefined;\n      } else if ('text' in part && part.text != null) {\n        const thoughtSignatureMetadata = part.thoughtSignature\n          ? {\n              [providerOptionsName]: {\n                thoughtSignature: part.thoughtSignature,\n              },\n            }\n          : undefined;\n\n        if (part.text.length === 0) {\n          if (thoughtSignatureMetadata != null && content.length > 0) {\n            const lastContent = content[content.length - 1];\n            lastContent.providerMetadata = thoughtSignatureMetadata;\n          }\n        } else {\n          content.push({\n            type: part.thought === true ? 'reasoning' : 'text',\n            text: part.text,\n            providerMetadata: thoughtSignatureMetadata,\n          });\n        }\n      } else if (\n        'functionCall' in part &&\n        part.functionCall.name != null &&\n        part.functionCall.args != null\n      ) {\n        content.push({\n          type: 'tool-call' as const,\n          toolCallId: this.config.generateId(),\n          toolName: part.functionCall.name,\n          input: JSON.stringify(part.functionCall.args),\n          providerMetadata: part.thoughtSignature\n            ? {\n                [providerOptionsName]: {\n                  thoughtSignature: part.thoughtSignature,\n                },\n              }\n            : undefined,\n        });\n      } else if ('inlineData' in part) {\n        const hasThought = part.thought === true;\n        const hasThoughtSignature = !!part.thoughtSignature;\n        content.push({\n          type: 'file' as const,\n          data: part.inlineData.data,\n          mediaType: part.inlineData.mimeType,\n          providerMetadata:\n            hasThought || hasThoughtSignature\n              ? {\n                  [providerOptionsName]: {\n                    ...(hasThought ? { thought: true } : {}),\n                    ...(hasThoughtSignature\n                      ? { thoughtSignature: part.thoughtSignature }\n                      : {}),\n                  },\n                }\n              : undefined,\n        });\n      } else if ('toolCall' in part && part.toolCall) {\n        const toolCallId = part.toolCall.id ?? this.config.generateId();\n        lastServerToolCallId = toolCallId;\n        content.push({\n          type: 'tool-call',\n          toolCallId,\n          toolName: `server:${part.toolCall.toolType}`,\n          input: JSON.stringify(part.toolCall.args ?? {}),\n          providerExecuted: true,\n          dynamic: true,\n          providerMetadata: part.thoughtSignature\n            ? {\n                [providerOptionsName]: {\n                  thoughtSignature: part.thoughtSignature,\n                  serverToolCallId: toolCallId,\n                  serverToolType: part.toolCall.toolType,\n                },\n              }\n            : {\n                [providerOptionsName]: {\n                  serverToolCallId: toolCallId,\n                  serverToolType: part.toolCall.toolType,\n                },\n              },\n        });\n      } else if ('toolResponse' in part && part.toolResponse) {\n        const responseToolCallId =\n          lastServerToolCallId ??\n          part.toolResponse.id ??\n          this.config.generateId();\n        content.push({\n          type: 'tool-result',\n          toolCallId: responseToolCallId,\n          toolName: `server:${part.toolResponse.toolType}`,\n          result: (part.toolResponse.response ?? {}) as JSONObject,\n          providerMetadata: part.thoughtSignature\n            ? {\n                [providerOptionsName]: {\n                  thoughtSignature: part.thoughtSignature,\n                  serverToolCallId: responseToolCallId,\n                  serverToolType: part.toolResponse.toolType,\n                },\n              }\n            : {\n                [providerOptionsName]: {\n                  serverToolCallId: responseToolCallId,\n                  serverToolType: part.toolResponse.toolType,\n                },\n              },\n        });\n        lastServerToolCallId = undefined;\n      }\n    }\n\n    const sources =\n      extractSources({\n        groundingMetadata: candidate.groundingMetadata,\n        generateId: this.config.generateId,\n      }) ?? [];\n    for (const source of sources) {\n      content.push(source);\n    }\n\n    return {\n      content,\n      finishReason: {\n        unified: mapGoogleGenerativeAIFinishReason({\n          finishReason: candidate.finishReason,\n          // Only count client-executed tool calls for finish reason determination.\n          hasToolCalls: content.some(\n            part => part.type === 'tool-call' && !part.providerExecuted,\n          ),\n        }),\n        raw: candidate.finishReason ?? undefined,\n      },\n      usage: convertGoogleGenerativeAIUsage(usageMetadata),\n      warnings,\n      providerMetadata: {\n        [providerOptionsName]: {\n          promptFeedback: response.promptFeedback ?? null,\n          groundingMetadata: candidate.groundingMetadata ?? null,\n          urlContextMetadata: candidate.urlContextMetadata ?? null,\n          safetyRatings: candidate.safetyRatings ?? null,\n          usageMetadata: usageMetadata ?? null,\n          finishMessage: candidate.finishMessage ?? null,\n          serviceTier: response.serviceTier ?? null,\n        } satisfies GoogleGenerativeAIProviderMetadata,\n      },\n      request: { body: args },\n      response: {\n        // TODO timestamp, model id, id\n        headers: responseHeaders,\n        body: rawResponse,\n      },\n    };\n  }\n\n  async doStream(\n    options: LanguageModelV3CallOptions,\n  ): Promise<LanguageModelV3StreamResult> {\n    const { args, warnings, providerOptionsName } = await this.getArgs(\n      options,\n      { isStreaming: true },\n    );\n\n    const headers = combineHeaders(\n      await resolve(this.config.headers),\n      options.headers,\n    );\n\n    const { responseHeaders, value: response } = await postJsonToApi({\n      url: `${this.config.baseURL}/${getModelPath(\n        this.modelId,\n      )}:streamGenerateContent?alt=sse`,\n      headers,\n      body: args,\n      failedResponseHandler: googleFailedResponseHandler,\n      successfulResponseHandler: createEventSourceResponseHandler(chunkSchema),\n      abortSignal: options.abortSignal,\n      fetch: this.config.fetch,\n    });\n\n    let finishReason: LanguageModelV3FinishReason = {\n      unified: 'other',\n      raw: undefined,\n    };\n    let usage: GoogleGenerativeAIUsageMetadata | undefined = undefined;\n    let providerMetadata: SharedV3ProviderMetadata | undefined = undefined;\n    let lastGroundingMetadata: GroundingMetadataSchema | null = null;\n    let lastUrlContextMetadata: UrlContextMetadataSchema | null = null;\n    let serviceTier: string | null = null;\n\n    const generateId = this.config.generateId;\n    let hasToolCalls = false;\n\n    // Track active blocks to group consecutive parts of same type\n    let currentTextBlockId: string | null = null;\n    let currentReasoningBlockId: string | null = null;\n    let blockCounter = 0;\n\n    // Track emitted sources to prevent duplicates\n    const emittedSourceUrls = new Set<string>();\n    // Associates a code execution result with its preceding call.\n    let lastCodeExecutionToolCallId: string | undefined;\n    // Associates a server-side tool response with its preceding call (tool combination).\n    let lastServerToolCallId: string | undefined;\n\n    const activeStreamingToolCalls: Array<{\n      toolCallId: string;\n      toolName: string;\n      accumulator: GoogleJSONAccumulator;\n      providerMetadata?: SharedV3ProviderMetadata;\n    }> = [];\n\n    return {\n      stream: response.pipeThrough(\n        new TransformStream<\n          ParseResult<ChunkSchema>,\n          LanguageModelV3StreamPart\n        >({\n          start(controller) {\n            controller.enqueue({ type: 'stream-start', warnings });\n          },\n\n          transform(chunk, controller) {\n            if (options.includeRawChunks) {\n              controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n            }\n\n            if (!chunk.success) {\n              controller.enqueue({ type: 'error', error: chunk.error });\n              return;\n            }\n\n            const value = chunk.value;\n\n            const usageMetadata = value.usageMetadata;\n\n            if (usageMetadata != null) {\n              usage = usageMetadata;\n            }\n\n            if (value.serviceTier != null) {\n              serviceTier = value.serviceTier;\n            }\n\n            const candidate = value.candidates?.[0];\n\n            // sometimes the API returns an empty candidates array\n            if (candidate == null) {\n              return;\n            }\n\n            const content = candidate.content;\n\n            if (candidate.groundingMetadata != null) {\n              lastGroundingMetadata = candidate.groundingMetadata;\n            }\n            if (candidate.urlContextMetadata != null) {\n              lastUrlContextMetadata = candidate.urlContextMetadata;\n            }\n\n            const sources = extractSources({\n              groundingMetadata: candidate.groundingMetadata,\n              generateId,\n            });\n            if (sources != null) {\n              for (const source of sources) {\n                if (\n                  source.sourceType === 'url' &&\n                  !emittedSourceUrls.has(source.url)\n                ) {\n                  emittedSourceUrls.add(source.url);\n                  controller.enqueue(source);\n                }\n              }\n            }\n\n            // Process tool call's parts before determining finishReason to ensure hasToolCalls is properly set\n            if (content != null) {\n              // Process all parts in a single loop to preserve original order\n              const parts = content.parts ?? [];\n              for (const part of parts) {\n                if ('executableCode' in part && part.executableCode?.code) {\n                  const toolCallId = generateId();\n                  lastCodeExecutionToolCallId = toolCallId;\n\n                  controller.enqueue({\n                    type: 'tool-call',\n                    toolCallId,\n                    toolName: 'code_execution',\n                    input: JSON.stringify(part.executableCode),\n                    providerExecuted: true,\n                  });\n                } else if (\n                  'codeExecutionResult' in part &&\n                  part.codeExecutionResult\n                ) {\n                  // Assumes a result directly follows its corresponding call part.\n                  const toolCallId = lastCodeExecutionToolCallId;\n\n                  if (toolCallId) {\n                    controller.enqueue({\n                      type: 'tool-result',\n                      toolCallId,\n                      toolName: 'code_execution',\n                      result: {\n                        outcome: part.codeExecutionResult.outcome,\n                        output: part.codeExecutionResult.output ?? '',\n                      },\n                    });\n                    // Clear the ID after use.\n                    lastCodeExecutionToolCallId = undefined;\n                  }\n                } else if ('text' in part && part.text != null) {\n                  const thoughtSignatureMetadata = part.thoughtSignature\n                    ? {\n                        [providerOptionsName]: {\n                          thoughtSignature: part.thoughtSignature,\n                        },\n                      }\n                    : undefined;\n\n                  if (part.text.length === 0) {\n                    if (\n                      thoughtSignatureMetadata != null &&\n                      currentTextBlockId !== null\n                    ) {\n                      controller.enqueue({\n                        type: 'text-delta',\n                        id: currentTextBlockId,\n                        delta: '',\n                        providerMetadata: thoughtSignatureMetadata,\n                      });\n                    }\n                  } else if (part.thought === true) {\n                    // End any active text block before starting reasoning\n                    if (currentTextBlockId !== null) {\n                      controller.enqueue({\n                        type: 'text-end',\n                        id: currentTextBlockId,\n                      });\n                      currentTextBlockId = null;\n                    }\n\n                    // Start new reasoning block if not already active\n                    if (currentReasoningBlockId === null) {\n                      currentReasoningBlockId = String(blockCounter++);\n                      controller.enqueue({\n                        type: 'reasoning-start',\n                        id: currentReasoningBlockId,\n                        providerMetadata: thoughtSignatureMetadata,\n                      });\n                    }\n\n                    controller.enqueue({\n                      type: 'reasoning-delta',\n                      id: currentReasoningBlockId,\n                      delta: part.text,\n                      providerMetadata: thoughtSignatureMetadata,\n                    });\n                  } else {\n                    if (currentReasoningBlockId !== null) {\n                      controller.enqueue({\n                        type: 'reasoning-end',\n                        id: currentReasoningBlockId,\n                      });\n                      currentReasoningBlockId = null;\n                    }\n\n                    if (currentTextBlockId === null) {\n                      currentTextBlockId = String(blockCounter++);\n                      controller.enqueue({\n                        type: 'text-start',\n                        id: currentTextBlockId,\n                        providerMetadata: thoughtSignatureMetadata,\n                      });\n                    }\n\n                    controller.enqueue({\n                      type: 'text-delta',\n                      id: currentTextBlockId,\n                      delta: part.text,\n                      providerMetadata: thoughtSignatureMetadata,\n                    });\n                  }\n                } else if ('inlineData' in part) {\n                  // End any active text or reasoning block before starting file output.\n                  // Relevant for multimodal output models.\n                  if (currentTextBlockId !== null) {\n                    controller.enqueue({\n                      type: 'text-end',\n                      id: currentTextBlockId,\n                    });\n                    currentTextBlockId = null;\n                  }\n                  if (currentReasoningBlockId !== null) {\n                    controller.enqueue({\n                      type: 'reasoning-end',\n                      id: currentReasoningBlockId,\n                    });\n                    currentReasoningBlockId = null;\n                  }\n\n                  const hasThought = part.thought === true;\n                  const hasThoughtSignature = !!part.thoughtSignature;\n                  const fileMeta =\n                    hasThought || hasThoughtSignature\n                      ? {\n                          [providerOptionsName]: {\n                            ...(hasThought ? { thought: true } : {}),\n                            ...(hasThoughtSignature\n                              ? { thoughtSignature: part.thoughtSignature }\n                              : {}),\n                          },\n                        }\n                      : undefined;\n                  controller.enqueue({\n                    type: 'file',\n                    mediaType: part.inlineData.mimeType,\n                    data: part.inlineData.data,\n                    providerMetadata: fileMeta,\n                  });\n                } else if ('toolCall' in part && part.toolCall) {\n                  const toolCallId = part.toolCall.id ?? generateId();\n                  lastServerToolCallId = toolCallId;\n                  const serverMeta = {\n                    [providerOptionsName]: {\n                      ...(part.thoughtSignature\n                        ? { thoughtSignature: part.thoughtSignature }\n                        : {}),\n                      serverToolCallId: toolCallId,\n                      serverToolType: part.toolCall.toolType,\n                    },\n                  };\n\n                  controller.enqueue({\n                    type: 'tool-call',\n                    toolCallId,\n                    toolName: `server:${part.toolCall.toolType}`,\n                    input: JSON.stringify(part.toolCall.args ?? {}),\n                    providerExecuted: true,\n                    dynamic: true,\n                    providerMetadata: serverMeta,\n                  });\n                } else if ('toolResponse' in part && part.toolResponse) {\n                  const responseToolCallId =\n                    lastServerToolCallId ??\n                    part.toolResponse.id ??\n                    generateId();\n                  const serverMeta = {\n                    [providerOptionsName]: {\n                      ...(part.thoughtSignature\n                        ? { thoughtSignature: part.thoughtSignature }\n                        : {}),\n                      serverToolCallId: responseToolCallId,\n                      serverToolType: part.toolResponse.toolType,\n                    },\n                  };\n\n                  controller.enqueue({\n                    type: 'tool-result',\n                    toolCallId: responseToolCallId,\n                    toolName: `server:${part.toolResponse.toolType}`,\n                    result: (part.toolResponse.response ?? {}) as JSONObject,\n                    providerMetadata: serverMeta,\n                  });\n                  lastServerToolCallId = undefined;\n                }\n              }\n\n              // Handle streaming and complete function calls\n              for (const part of parts) {\n                if (!('functionCall' in part)) continue;\n\n                const providerMeta = part.thoughtSignature\n                  ? {\n                      [providerOptionsName]: {\n                        thoughtSignature: part.thoughtSignature,\n                      },\n                    }\n                  : undefined;\n\n                const isStreamingChunk =\n                  part.functionCall.partialArgs != null ||\n                  (part.functionCall.name != null &&\n                    part.functionCall.willContinue === true);\n                const isTerminalChunk =\n                  part.functionCall.name == null &&\n                  part.functionCall.args == null &&\n                  part.functionCall.partialArgs == null &&\n                  part.functionCall.willContinue == null;\n                const isCompleteCall =\n                  part.functionCall.name != null &&\n                  part.functionCall.args != null &&\n                  part.functionCall.partialArgs == null;\n\n                if (isStreamingChunk) {\n                  if (\n                    part.functionCall.name != null &&\n                    part.functionCall.willContinue === true\n                  ) {\n                    const toolCallId = generateId();\n                    const accumulator = new GoogleJSONAccumulator();\n                    activeStreamingToolCalls.push({\n                      toolCallId,\n                      toolName: part.functionCall.name,\n                      accumulator,\n                      providerMetadata: providerMeta,\n                    });\n\n                    controller.enqueue({\n                      type: 'tool-input-start',\n                      id: toolCallId,\n                      toolName: part.functionCall.name,\n                      providerMetadata: providerMeta,\n                    });\n\n                    if (part.functionCall.partialArgs != null) {\n                      const { textDelta } = accumulator.processPartialArgs(\n                        part.functionCall.partialArgs as PartialArg[],\n                      );\n                      if (textDelta.length > 0) {\n                        controller.enqueue({\n                          type: 'tool-input-delta',\n                          id: toolCallId,\n                          delta: textDelta,\n                          providerMetadata: providerMeta,\n                        });\n                      }\n                    }\n                  } else if (\n                    part.functionCall.partialArgs != null &&\n                    activeStreamingToolCalls.length > 0\n                  ) {\n                    const active =\n                      activeStreamingToolCalls[\n                        activeStreamingToolCalls.length - 1\n                      ];\n                    const { textDelta } = active.accumulator.processPartialArgs(\n                      part.functionCall.partialArgs as PartialArg[],\n                    );\n                    if (textDelta.length > 0) {\n                      controller.enqueue({\n                        type: 'tool-input-delta',\n                        id: active.toolCallId,\n                        delta: textDelta,\n                        providerMetadata: providerMeta,\n                      });\n                    }\n                  }\n                } else if (\n                  isTerminalChunk &&\n                  activeStreamingToolCalls.length > 0\n                ) {\n                  const active = activeStreamingToolCalls.pop()!;\n                  const { finalJSON, closingDelta } =\n                    active.accumulator.finalize();\n\n                  if (closingDelta.length > 0) {\n                    controller.enqueue({\n                      type: 'tool-input-delta',\n                      id: active.toolCallId,\n                      delta: closingDelta,\n                      providerMetadata: active.providerMetadata,\n                    });\n                  }\n\n                  controller.enqueue({\n                    type: 'tool-input-end',\n                    id: active.toolCallId,\n                    providerMetadata: active.providerMetadata,\n                  });\n\n                  controller.enqueue({\n                    type: 'tool-call',\n                    toolCallId: active.toolCallId,\n                    toolName: active.toolName,\n                    input: finalJSON,\n                    providerMetadata: active.providerMetadata,\n                  });\n\n                  hasToolCalls = true;\n                } else if (isCompleteCall) {\n                  const toolCallId = generateId();\n                  const toolName = part.functionCall.name!;\n                  const args =\n                    typeof part.functionCall.args === 'string'\n                      ? part.functionCall.args\n                      : JSON.stringify(part.functionCall.args ?? {});\n\n                  controller.enqueue({\n                    type: 'tool-input-start',\n                    id: toolCallId,\n                    toolName,\n                    providerMetadata: providerMeta,\n                  });\n\n                  controller.enqueue({\n                    type: 'tool-input-delta',\n                    id: toolCallId,\n                    delta: args,\n                    providerMetadata: providerMeta,\n                  });\n\n                  controller.enqueue({\n                    type: 'tool-input-end',\n                    id: toolCallId,\n                    providerMetadata: providerMeta,\n                  });\n\n                  controller.enqueue({\n                    type: 'tool-call',\n                    toolCallId,\n                    toolName,\n                    input: args,\n                    providerMetadata: providerMeta,\n                  });\n\n                  hasToolCalls = true;\n                }\n              }\n            }\n\n            if (candidate.finishReason != null) {\n              finishReason = {\n                unified: mapGoogleGenerativeAIFinishReason({\n                  finishReason: candidate.finishReason,\n                  hasToolCalls,\n                }),\n                raw: candidate.finishReason,\n              };\n\n              providerMetadata = {\n                [providerOptionsName]: {\n                  promptFeedback: value.promptFeedback ?? null,\n                  groundingMetadata: lastGroundingMetadata,\n                  urlContextMetadata: lastUrlContextMetadata,\n                  safetyRatings: candidate.safetyRatings ?? null,\n                  usageMetadata: usageMetadata ?? null,\n                  finishMessage: candidate.finishMessage ?? null,\n                  serviceTier,\n                } satisfies GoogleGenerativeAIProviderMetadata,\n              };\n            }\n          },\n\n          flush(controller) {\n            if (currentTextBlockId !== null) {\n              controller.enqueue({\n                type: 'text-end',\n                id: currentTextBlockId,\n              });\n            }\n            if (currentReasoningBlockId !== null) {\n              controller.enqueue({\n                type: 'reasoning-end',\n                id: currentReasoningBlockId,\n              });\n            }\n\n            controller.enqueue({\n              type: 'finish',\n              finishReason,\n              usage: convertGoogleGenerativeAIUsage(usage),\n              providerMetadata,\n            });\n          },\n        }),\n      ),\n      response: { headers: responseHeaders },\n      request: { body: args },\n    };\n  }\n}\n\nfunction getToolCallsFromParts({\n  parts,\n  generateId,\n  providerOptionsName,\n}: {\n  parts: ContentSchema['parts'];\n  generateId: () => string;\n  providerOptionsName: string;\n}) {\n  const functionCallParts = parts?.filter(\n    part => 'functionCall' in part,\n  ) as Array<\n    GoogleGenerativeAIContentPart & {\n      functionCall: { name: string; args: unknown };\n      thoughtSignature?: string | null;\n    }\n  >;\n\n  return functionCallParts == null || functionCallParts.length === 0\n    ? undefined\n    : functionCallParts.map(part => ({\n        type: 'tool-call' as const,\n        toolCallId: generateId(),\n        toolName: part.functionCall.name,\n        args: JSON.stringify(part.functionCall.args),\n        providerMetadata: part.thoughtSignature\n          ? {\n              [providerOptionsName]: {\n                thoughtSignature: part.thoughtSignature,\n              },\n            }\n          : undefined,\n      }));\n}\n\nfunction extractSources({\n  groundingMetadata,\n  generateId,\n}: {\n  groundingMetadata: GroundingMetadataSchema | undefined | null;\n  generateId: () => string;\n}): undefined | LanguageModelV3Source[] {\n  if (!groundingMetadata?.groundingChunks) {\n    return undefined;\n  }\n\n  const sources: LanguageModelV3Source[] = [];\n\n  for (const chunk of groundingMetadata.groundingChunks) {\n    if (chunk.web != null) {\n      // Handle web chunks as URL sources\n      sources.push({\n        type: 'source',\n        sourceType: 'url',\n        id: generateId(),\n        url: chunk.web.uri,\n        title: chunk.web.title ?? undefined,\n      });\n    } else if (chunk.image != null) {\n      // Handle image chunks as image sources\n      sources.push({\n        type: 'source',\n        sourceType: 'url',\n        id: generateId(),\n        // Google requires attribution to the source URI, not the actual image URI.\n        // TODO: add another type in v7 to allow both the image and source URL to be included separately\n        url: chunk.image.sourceUri,\n        title: chunk.image.title ?? undefined,\n      });\n    } else if (chunk.retrievedContext != null) {\n      // Handle retrievedContext chunks from RAG operations\n      const uri = chunk.retrievedContext.uri;\n      const fileSearchStore = chunk.retrievedContext.fileSearchStore;\n\n      if (uri && (uri.startsWith('http://') || uri.startsWith('https://'))) {\n        // Old format: Google Search with HTTP/HTTPS URL\n        sources.push({\n          type: 'source',\n          sourceType: 'url',\n          id: generateId(),\n          url: uri,\n          title: chunk.retrievedContext.title ?? undefined,\n        });\n      } else if (uri) {\n        // Old format: Document with file path (gs://, etc.)\n        const title = chunk.retrievedContext.title ?? 'Unknown Document';\n        let mediaType = 'application/octet-stream';\n        let filename: string | undefined = undefined;\n\n        if (uri.endsWith('.pdf')) {\n          mediaType = 'application/pdf';\n          filename = uri.split('/').pop();\n        } else if (uri.endsWith('.txt')) {\n          mediaType = 'text/plain';\n          filename = uri.split('/').pop();\n        } else if (uri.endsWith('.docx')) {\n          mediaType =\n            'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n          filename = uri.split('/').pop();\n        } else if (uri.endsWith('.doc')) {\n          mediaType = 'application/msword';\n          filename = uri.split('/').pop();\n        } else if (uri.match(/\\.(md|markdown)$/)) {\n          mediaType = 'text/markdown';\n          filename = uri.split('/').pop();\n        } else {\n          filename = uri.split('/').pop();\n        }\n\n        sources.push({\n          type: 'source',\n          sourceType: 'document',\n          id: generateId(),\n          mediaType,\n          title,\n          filename,\n        });\n      } else if (fileSearchStore) {\n        // New format: File Search with fileSearchStore (no uri)\n        const title = chunk.retrievedContext.title ?? 'Unknown Document';\n        sources.push({\n          type: 'source',\n          sourceType: 'document',\n          id: generateId(),\n          mediaType: 'application/octet-stream',\n          title,\n          filename: fileSearchStore.split('/').pop(),\n        });\n      }\n    } else if (chunk.maps != null) {\n      if (chunk.maps.uri) {\n        sources.push({\n          type: 'source',\n          sourceType: 'url',\n          id: generateId(),\n          url: chunk.maps.uri,\n          title: chunk.maps.title ?? undefined,\n        });\n      }\n    }\n  }\n\n  return sources.length > 0 ? sources : undefined;\n}\n\nexport const getGroundingMetadataSchema = () =>\n  z.object({\n    webSearchQueries: z.array(z.string()).nullish(),\n    imageSearchQueries: z.array(z.string()).nullish(),\n    retrievalQueries: z.array(z.string()).nullish(),\n    searchEntryPoint: z.object({ renderedContent: z.string() }).nullish(),\n    groundingChunks: z\n      .array(\n        z.object({\n          web: z\n            .object({ uri: z.string(), title: z.string().nullish() })\n            .nullish(),\n          image: z\n            .object({\n              sourceUri: z.string(),\n              imageUri: z.string(),\n              title: z.string().nullish(),\n              domain: z.string().nullish(),\n            })\n            .nullish(),\n          retrievedContext: z\n            .object({\n              uri: z.string().nullish(),\n              title: z.string().nullish(),\n              text: z.string().nullish(),\n              fileSearchStore: z.string().nullish(),\n            })\n            .nullish(),\n          maps: z\n            .object({\n              uri: z.string().nullish(),\n              title: z.string().nullish(),\n              text: z.string().nullish(),\n              placeId: z.string().nullish(),\n            })\n            .nullish(),\n        }),\n      )\n      .nullish(),\n    groundingSupports: z\n      .array(\n        z.object({\n          segment: z\n            .object({\n              startIndex: z.number().nullish(),\n              endIndex: z.number().nullish(),\n              text: z.string().nullish(),\n            })\n            .nullish(),\n          segment_text: z.string().nullish(),\n          groundingChunkIndices: z.array(z.number()).nullish(),\n          supportChunkIndices: z.array(z.number()).nullish(),\n          confidenceScores: z.array(z.number()).nullish(),\n          confidenceScore: z.array(z.number()).nullish(),\n        }),\n      )\n      .nullish(),\n    retrievalMetadata: z\n      .union([\n        z.object({\n          webDynamicRetrievalScore: z.number(),\n        }),\n        z.object({}),\n      ])\n      .nullish(),\n  });\n\nconst partialArgSchema = z.object({\n  jsonPath: z.string(),\n  stringValue: z.string().nullish(),\n  numberValue: z.number().nullish(),\n  boolValue: z.boolean().nullish(),\n  nullValue: z.unknown().nullish(),\n  willContinue: z.boolean().nullish(),\n});\n\nconst getContentSchema = () =>\n  z.object({\n    parts: z\n      .array(\n        z.union([\n          // note: order matters since text can be fully empty\n          z.object({\n            functionCall: z.object({\n              name: z.string().nullish(),\n              args: z.unknown().nullish(),\n              partialArgs: z.array(partialArgSchema).nullish(),\n              willContinue: z.boolean().nullish(),\n            }),\n            thoughtSignature: z.string().nullish(),\n          }),\n          z.object({\n            inlineData: z.object({\n              mimeType: z.string(),\n              data: z.string(),\n            }),\n            thought: z.boolean().nullish(),\n            thoughtSignature: z.string().nullish(),\n          }),\n          z.object({\n            toolCall: z.object({\n              toolType: z.string(),\n              args: z.unknown().nullish(),\n              id: z.string(),\n            }),\n            thoughtSignature: z.string().nullish(),\n          }),\n          z.object({\n            toolResponse: z.object({\n              toolType: z.string(),\n              response: z.unknown().nullish(),\n              id: z.string(),\n            }),\n            thoughtSignature: z.string().nullish(),\n          }),\n          z.object({\n            executableCode: z\n              .object({\n                language: z.string(),\n                code: z.string(),\n              })\n              .nullish(),\n            codeExecutionResult: z\n              .object({\n                outcome: z.string(),\n                output: z.string().nullish(),\n              })\n              .nullish(),\n            text: z.string().nullish(),\n            thought: z.boolean().nullish(),\n            thoughtSignature: z.string().nullish(),\n          }),\n        ]),\n      )\n      .nullish(),\n  });\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/configure-safety-filters\nconst getSafetyRatingSchema = () =>\n  z.object({\n    category: z.string().nullish(),\n    probability: z.string().nullish(),\n    probabilityScore: z.number().nullish(),\n    severity: z.string().nullish(),\n    severityScore: z.number().nullish(),\n    blocked: z.boolean().nullish(),\n  });\n\nconst tokenDetailsSchema = z\n  .array(\n    z.object({\n      modality: z.string(),\n      tokenCount: z.number(),\n    }),\n  )\n  .nullish();\n\nconst usageSchema = z.object({\n  cachedContentTokenCount: z.number().nullish(),\n  thoughtsTokenCount: z.number().nullish(),\n  promptTokenCount: z.number().nullish(),\n  candidatesTokenCount: z.number().nullish(),\n  totalTokenCount: z.number().nullish(),\n  // https://cloud.google.com/vertex-ai/generative-ai/docs/reference/rest/v1/GenerateContentResponse#TrafficType\n  trafficType: z.string().nullish(),\n  // https://ai.google.dev/api/generate-content#Modality\n  promptTokensDetails: tokenDetailsSchema,\n  candidatesTokensDetails: tokenDetailsSchema,\n});\n\n// https://ai.google.dev/api/generate-content#UrlRetrievalMetadata\nexport const getUrlContextMetadataSchema = () =>\n  z.object({\n    urlMetadata: z\n      .array(\n        z.object({\n          retrievedUrl: z.string(),\n          urlRetrievalStatus: z.string(),\n        }),\n      )\n      .nullish(),\n  });\n\nconst responseSchema = lazySchema(() =>\n  zodSchema(\n    z.object({\n      candidates: z.array(\n        z.object({\n          content: getContentSchema().nullish().or(z.object({}).strict()),\n          finishReason: z.string().nullish(),\n          finishMessage: z.string().nullish(),\n          safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n          groundingMetadata: getGroundingMetadataSchema().nullish(),\n          urlContextMetadata: getUrlContextMetadataSchema().nullish(),\n        }),\n      ),\n      usageMetadata: usageSchema.nullish(),\n      promptFeedback: z\n        .object({\n          blockReason: z.string().nullish(),\n          safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n        })\n        .nullish(),\n      serviceTier: z.string().nullish(),\n    }),\n  ),\n);\n\ntype ContentSchema = NonNullable<\n  InferSchema<typeof responseSchema>['candidates'][number]['content']\n>;\nexport type GroundingMetadataSchema = NonNullable<\n  InferSchema<typeof responseSchema>['candidates'][number]['groundingMetadata']\n>;\n\ntype GroundingChunkSchema = NonNullable<\n  GroundingMetadataSchema['groundingChunks']\n>[number];\n\nexport type UrlContextMetadataSchema = NonNullable<\n  InferSchema<typeof responseSchema>['candidates'][number]['urlContextMetadata']\n>;\n\nexport type SafetyRatingSchema = NonNullable<\n  InferSchema<typeof responseSchema>['candidates'][number]['safetyRatings']\n>[number];\n\nexport type PromptFeedbackSchema = NonNullable<\n  InferSchema<typeof responseSchema>['promptFeedback']\n>;\n\nexport type UsageMetadataSchema = NonNullable<\n  InferSchema<typeof responseSchema>['usageMetadata']\n>;\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst chunkSchema = lazySchema(() =>\n  zodSchema(\n    z.object({\n      candidates: z\n        .array(\n          z.object({\n            content: getContentSchema().nullish(),\n            finishReason: z.string().nullish(),\n            finishMessage: z.string().nullish(),\n            safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n            groundingMetadata: getGroundingMetadataSchema().nullish(),\n            urlContextMetadata: getUrlContextMetadataSchema().nullish(),\n          }),\n        )\n        .nullish(),\n      usageMetadata: usageSchema.nullish(),\n      promptFeedback: z\n        .object({\n          blockReason: z.string().nullish(),\n          safetyRatings: z.array(getSafetyRatingSchema()).nullish(),\n        })\n        .nullish(),\n      serviceTier: z.string().nullish(),\n    }),\n  ),\n);\n\ntype ChunkSchema = InferSchema<typeof chunkSchema>;\n","import { LanguageModelV3Usage } from '@ai-sdk/provider';\n\nexport type GoogleGenerativeAITokenDetail = {\n  modality: string;\n  tokenCount: number;\n};\n\nexport type GoogleGenerativeAIUsageMetadata = {\n  promptTokenCount?: number | null;\n  candidatesTokenCount?: number | null;\n  totalTokenCount?: number | null;\n  cachedContentTokenCount?: number | null;\n  thoughtsTokenCount?: number | null;\n  trafficType?: string | null;\n  promptTokensDetails?: GoogleGenerativeAITokenDetail[] | null;\n  candidatesTokensDetails?: GoogleGenerativeAITokenDetail[] | null;\n};\n\nexport function convertGoogleGenerativeAIUsage(\n  usage: GoogleGenerativeAIUsageMetadata | undefined | null,\n): LanguageModelV3Usage {\n  if (usage == null) {\n    return {\n      inputTokens: {\n        total: undefined,\n        noCache: undefined,\n        cacheRead: undefined,\n        cacheWrite: undefined,\n      },\n      outputTokens: {\n        total: undefined,\n        text: undefined,\n        reasoning: undefined,\n      },\n      raw: undefined,\n    };\n  }\n\n  const promptTokens = usage.promptTokenCount ?? 0;\n  const candidatesTokens = usage.candidatesTokenCount ?? 0;\n  const cachedContentTokens = usage.cachedContentTokenCount ?? 0;\n  const thoughtsTokens = usage.thoughtsTokenCount ?? 0;\n\n  return {\n    inputTokens: {\n      total: promptTokens,\n      noCache: promptTokens - cachedContentTokens,\n      cacheRead: cachedContentTokens,\n      cacheWrite: undefined,\n    },\n    outputTokens: {\n      total: candidatesTokens + thoughtsTokens,\n      text: candidatesTokens,\n      reasoning: thoughtsTokens,\n    },\n    raw: usage,\n  };\n}\n","import { 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  LanguageModelV3Prompt,\n  UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport { convertToBase64 } from '@ai-sdk/provider-utils';\nimport {\n  GoogleGenerativeAIContent,\n  GoogleGenerativeAIContentPart,\n  GoogleGenerativeAIFunctionResponsePart,\n  GoogleGenerativeAIPrompt,\n} from './google-generative-ai-prompt';\n\nconst dataUrlRegex = /^data:([^;,]+);base64,(.+)$/s;\n\nfunction parseBase64DataUrl(\n  value: string,\n): { mediaType: string; data: string } | undefined {\n  const match = dataUrlRegex.exec(value);\n  if (match == null) {\n    return undefined;\n  }\n\n  return {\n    mediaType: match[1],\n    data: match[2],\n  };\n}\n\nfunction convertUrlToolResultPart(\n  url: string,\n): GoogleGenerativeAIFunctionResponsePart | undefined {\n  // Per https://ai.google.dev/api/caching#FunctionResponsePart, only inline data is supported.\n  // https://docs.cloud.google.com/vertex-ai/generative-ai/docs/model-reference/function-calling#functionresponsepart suggests that this\n  // may be different for Vertex, but this needs to be confirmed and further tested for both APIs.\n  const parsedDataUrl = parseBase64DataUrl(url);\n  if (parsedDataUrl == null) {\n    return undefined;\n  }\n\n  return {\n    inlineData: {\n      mimeType: parsedDataUrl.mediaType,\n      data: parsedDataUrl.data,\n    },\n  };\n}\n\n/*\n * Appends tool result content parts to the message using the functionResponse\n * format with support for multimodal parts (e.g. inline images/files alongside\n * text). This format is supported by Gemini 3+ models.\n */\nfunction appendToolResultParts(\n  parts: GoogleGenerativeAIContentPart[],\n  toolName: string,\n  outputValue: Array<{\n    type: string;\n    [key: string]: unknown;\n  }>,\n): void {\n  const functionResponseParts: GoogleGenerativeAIFunctionResponsePart[] = [];\n  const responseTextParts: string[] = [];\n\n  for (const contentPart of outputValue) {\n    switch (contentPart.type) {\n      case 'text': {\n        responseTextParts.push(contentPart.text as string);\n        break;\n      }\n      case 'image-data':\n      case 'file-data': {\n        functionResponseParts.push({\n          inlineData: {\n            mimeType: contentPart.mediaType as string,\n            data: contentPart.data as string,\n          },\n        });\n        break;\n      }\n      case 'image-url':\n      case 'file-url': {\n        const functionResponsePart = convertUrlToolResultPart(\n          contentPart.url as string,\n        );\n\n        if (functionResponsePart != null) {\n          functionResponseParts.push(functionResponsePart);\n        } else {\n          responseTextParts.push(JSON.stringify(contentPart));\n        }\n        break;\n      }\n      default: {\n        responseTextParts.push(JSON.stringify(contentPart));\n        break;\n      }\n    }\n  }\n\n  parts.push({\n    functionResponse: {\n      name: toolName,\n      response: {\n        name: toolName,\n        content:\n          responseTextParts.length > 0\n            ? responseTextParts.join('\\n')\n            : 'Tool executed successfully.',\n      },\n      ...(functionResponseParts.length > 0\n        ? { parts: functionResponseParts }\n        : {}),\n    },\n  });\n}\n\n/*\n * Appends tool result content parts using a legacy format for pre-Gemini 3\n * models that do not support multimodal parts within functionResponse. Instead,\n * non-text content like images is sent as separate top-level inlineData parts.\n */\nfunction appendLegacyToolResultParts(\n  parts: GoogleGenerativeAIContentPart[],\n  toolName: string,\n  outputValue: Array<{\n    type: string;\n    [key: string]: unknown;\n  }>,\n): void {\n  for (const contentPart of outputValue) {\n    switch (contentPart.type) {\n      case 'text':\n        parts.push({\n          functionResponse: {\n            name: toolName,\n            response: {\n              name: toolName,\n              content: contentPart.text,\n            },\n          },\n        });\n        break;\n      case 'image-data':\n        parts.push(\n          {\n            inlineData: {\n              mimeType: String(contentPart.mediaType),\n              data: String(contentPart.data),\n            },\n          },\n          {\n            text: 'Tool executed successfully and returned this image as a response',\n          },\n        );\n        break;\n      default:\n        parts.push({ text: JSON.stringify(contentPart) });\n        break;\n    }\n  }\n}\n\nexport function convertToGoogleGenerativeAIMessages(\n  prompt: LanguageModelV3Prompt,\n  options?: {\n    isGemmaModel?: boolean;\n    providerOptionsName?: string;\n    supportsFunctionResponseParts?: boolean;\n  },\n): GoogleGenerativeAIPrompt {\n  const systemInstructionParts: Array<{ text: string }> = [];\n  const contents: Array<GoogleGenerativeAIContent> = [];\n  let systemMessagesAllowed = true;\n  const isGemmaModel = options?.isGemmaModel ?? false;\n  const providerOptionsName = options?.providerOptionsName ?? 'google';\n  const supportsFunctionResponseParts =\n    options?.supportsFunctionResponseParts ?? true;\n\n  for (const { role, content } of prompt) {\n    switch (role) {\n      case 'system': {\n        if (!systemMessagesAllowed) {\n          throw new UnsupportedFunctionalityError({\n            functionality:\n              'system messages are only supported at the beginning of the conversation',\n          });\n        }\n\n        systemInstructionParts.push({ text: content });\n        break;\n      }\n\n      case 'user': {\n        systemMessagesAllowed = false;\n\n        const parts: GoogleGenerativeAIContentPart[] = [];\n\n        for (const part of content) {\n          switch (part.type) {\n            case 'text': {\n              parts.push({ text: part.text });\n              break;\n            }\n\n            case 'file': {\n              // default to image/jpeg for unknown image/* types\n              const mediaType =\n                part.mediaType === 'image/*' ? 'image/jpeg' : part.mediaType;\n\n              parts.push(\n                part.data instanceof URL\n                  ? {\n                      fileData: {\n                        mimeType: mediaType,\n                        fileUri: part.data.toString(),\n                      },\n                    }\n                  : {\n                      inlineData: {\n                        mimeType: mediaType,\n                        data: convertToBase64(part.data),\n                      },\n                    },\n              );\n\n              break;\n            }\n          }\n        }\n\n        contents.push({ role: 'user', parts });\n        break;\n      }\n\n      case 'assistant': {\n        systemMessagesAllowed = false;\n\n        contents.push({\n          role: 'model',\n          parts: content\n            .map(part => {\n              const providerOpts =\n                part.providerOptions?.[providerOptionsName] ??\n                (providerOptionsName !== 'google'\n                  ? part.providerOptions?.google\n                  : part.providerOptions?.vertex);\n              const thoughtSignature =\n                providerOpts?.thoughtSignature != null\n                  ? String(providerOpts.thoughtSignature)\n                  : undefined;\n\n              switch (part.type) {\n                case 'text': {\n                  return part.text.length === 0\n                    ? undefined\n                    : {\n                        text: part.text,\n                        thoughtSignature,\n                      };\n                }\n\n                case 'reasoning': {\n                  return part.text.length === 0\n                    ? undefined\n                    : {\n                        text: part.text,\n                        thought: true,\n                        thoughtSignature,\n                      };\n                }\n\n                case 'file': {\n                  if (part.data instanceof URL) {\n                    throw new UnsupportedFunctionalityError({\n                      functionality:\n                        'File data URLs in assistant messages are not supported',\n                    });\n                  }\n\n                  return {\n                    inlineData: {\n                      mimeType: part.mediaType,\n                      data: convertToBase64(part.data),\n                    },\n                    ...(providerOpts?.thought === true\n                      ? { thought: true }\n                      : {}),\n                    thoughtSignature,\n                  };\n                }\n\n                case 'tool-call': {\n                  const serverToolCallId =\n                    providerOpts?.serverToolCallId != null\n                      ? String(providerOpts.serverToolCallId)\n                      : undefined;\n                  const serverToolType =\n                    providerOpts?.serverToolType != null\n                      ? String(providerOpts.serverToolType)\n                      : undefined;\n\n                  if (serverToolCallId && serverToolType) {\n                    return {\n                      toolCall: {\n                        toolType: serverToolType,\n                        args:\n                          typeof part.input === 'string'\n                            ? JSON.parse(part.input)\n                            : part.input,\n                        id: serverToolCallId,\n                      },\n                      thoughtSignature,\n                    };\n                  }\n\n                  return {\n                    functionCall: {\n                      name: part.toolName,\n                      args: part.input,\n                    },\n                    thoughtSignature,\n                  };\n                }\n\n                case 'tool-result': {\n                  const serverToolCallId =\n                    providerOpts?.serverToolCallId != null\n                      ? String(providerOpts.serverToolCallId)\n                      : undefined;\n                  const serverToolType =\n                    providerOpts?.serverToolType != null\n                      ? String(providerOpts.serverToolType)\n                      : undefined;\n\n                  if (serverToolCallId && serverToolType) {\n                    return {\n                      toolResponse: {\n                        toolType: serverToolType,\n                        response:\n                          part.output.type === 'json' ? part.output.value : {},\n                        id: serverToolCallId,\n                      },\n                      thoughtSignature,\n                    };\n                  }\n\n                  return undefined;\n                }\n              }\n            })\n            .filter(part => part !== undefined),\n        });\n\n        break;\n      }\n\n      case 'tool': {\n        systemMessagesAllowed = false;\n\n        const parts: GoogleGenerativeAIContentPart[] = [];\n\n        for (const part of content) {\n          if (part.type === 'tool-approval-response') {\n            continue;\n          }\n\n          const partProviderOpts =\n            part.providerOptions?.[providerOptionsName] ??\n            (providerOptionsName !== 'google'\n              ? part.providerOptions?.google\n              : part.providerOptions?.vertex);\n          const serverToolCallId =\n            partProviderOpts?.serverToolCallId != null\n              ? String(partProviderOpts.serverToolCallId)\n              : undefined;\n          const serverToolType =\n            partProviderOpts?.serverToolType != null\n              ? String(partProviderOpts.serverToolType)\n              : undefined;\n\n          if (serverToolCallId && serverToolType) {\n            const serverThoughtSignature =\n              partProviderOpts?.thoughtSignature != null\n                ? String(partProviderOpts.thoughtSignature)\n                : undefined;\n\n            if (contents.length > 0) {\n              const lastContent = contents[contents.length - 1];\n              if (lastContent.role === 'model') {\n                lastContent.parts.push({\n                  toolResponse: {\n                    toolType: serverToolType,\n                    response:\n                      part.output.type === 'json' ? part.output.value : {},\n                    id: serverToolCallId,\n                  },\n                  thoughtSignature: serverThoughtSignature,\n                });\n                continue;\n              }\n            }\n          }\n\n          const output = part.output;\n\n          if (output.type === 'content') {\n            if (supportsFunctionResponseParts) {\n              appendToolResultParts(parts, part.toolName, output.value);\n            } else {\n              appendLegacyToolResultParts(parts, part.toolName, output.value);\n            }\n          } else {\n            parts.push({\n              functionResponse: {\n                name: part.toolName,\n                response: {\n                  name: part.toolName,\n                  content:\n                    output.type === 'execution-denied'\n                      ? (output.reason ?? 'Tool execution denied.')\n                      : output.value,\n                },\n              },\n            });\n          }\n        }\n\n        contents.push({\n          role: 'user',\n          parts,\n        });\n        break;\n      }\n    }\n  }\n\n  if (\n    isGemmaModel &&\n    systemInstructionParts.length > 0 &&\n    contents.length > 0 &&\n    contents[0].role === 'user'\n  ) {\n    const systemText = systemInstructionParts\n      .map(part => part.text)\n      .join('\\n\\n');\n\n    contents[0].parts.unshift({ text: systemText + '\\n\\n' });\n  }\n\n  return {\n    systemInstruction:\n      systemInstructionParts.length > 0 && !isGemmaModel\n        ? { parts: systemInstructionParts }\n        : undefined,\n    contents,\n  };\n}\n","export function getModelPath(modelId: string): string {\n  return modelId.includes('/') ? modelId : `models/${modelId}`;\n}\n","import {\n  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 { InferSchema, lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type GoogleGenerativeAIModelId =\n  // Stable models\n  // https://ai.google.dev/gemini-api/docs/models/gemini\n  | 'gemini-2.0-flash'\n  | 'gemini-2.0-flash-001'\n  | 'gemini-2.0-flash-lite'\n  | 'gemini-2.0-flash-lite-001'\n  | 'gemini-2.5-pro'\n  | 'gemini-2.5-flash'\n  | 'gemini-2.5-flash-image'\n  | 'gemini-2.5-flash-lite'\n  | 'gemini-2.5-flash-preview-tts'\n  | 'gemini-2.5-pro-preview-tts'\n  | 'gemini-2.5-flash-native-audio-latest'\n  | 'gemini-2.5-flash-native-audio-preview-09-2025'\n  | 'gemini-2.5-flash-native-audio-preview-12-2025'\n  | 'gemini-2.5-computer-use-preview-10-2025'\n  | 'gemini-3-pro-preview'\n  | 'gemini-3-pro-image-preview'\n  | 'gemini-3-flash-preview'\n  | 'gemini-3.1-pro-preview'\n  | 'gemini-3.1-pro-preview-customtools'\n  | 'gemini-3.1-flash-image-preview'\n  | 'gemini-3.1-flash-lite-preview'\n  | 'gemini-3.1-flash-tts-preview'\n  // latest version\n  // https://ai.google.dev/gemini-api/docs/models#latest\n  | 'gemini-pro-latest'\n  | 'gemini-flash-latest'\n  | 'gemini-flash-lite-latest'\n  | 'deep-research-pro-preview-12-2025'\n  | 'nano-banana-pro-preview'\n  | 'aqa'\n  // Experimental models\n  // https://ai.google.dev/gemini-api/docs/models/experimental-models\n  | 'gemini-robotics-er-1.5-preview'\n  | 'gemma-3-1b-it'\n  | 'gemma-3-4b-it'\n  | 'gemma-3n-e4b-it'\n  | 'gemma-3n-e2b-it'\n  | 'gemma-3-12b-it'\n  | 'gemma-3-27b-it'\n  | (string & {});\n\nexport const googleLanguageModelOptions = lazySchema(() =>\n  zodSchema(\n    z.object({\n      responseModalities: z.array(z.enum(['TEXT', 'IMAGE'])).optional(),\n\n      thinkingConfig: z\n        .object({\n          thinkingBudget: z.number().optional(),\n          includeThoughts: z.boolean().optional(),\n          // https://ai.google.dev/gemini-api/docs/gemini-3?thinking=high#thinking_level\n          thinkingLevel: z\n            .enum(['minimal', 'low', 'medium', 'high'])\n            .optional(),\n        })\n        .optional(),\n\n      /**\n       * Optional.\n       * The name of the cached content used as context to serve the prediction.\n       * Format: cachedContents/{cachedContent}\n       */\n      cachedContent: z.string().optional(),\n\n      /**\n       * Optional. Enable structured output. Default is true.\n       *\n       * This is useful when the JSON Schema contains elements that are\n       * not supported by the OpenAPI schema version that\n       * Google Generative AI uses. You can use this to disable\n       * structured outputs if you need to.\n       */\n      structuredOutputs: z.boolean().optional(),\n\n      /**\n       * Optional. A list of unique safety settings for blocking unsafe content.\n       */\n      safetySettings: z\n        .array(\n          z.object({\n            category: z.enum([\n              'HARM_CATEGORY_UNSPECIFIED',\n              'HARM_CATEGORY_HATE_SPEECH',\n              'HARM_CATEGORY_DANGEROUS_CONTENT',\n              'HARM_CATEGORY_HARASSMENT',\n              'HARM_CATEGORY_SEXUALLY_EXPLICIT',\n              'HARM_CATEGORY_CIVIC_INTEGRITY',\n            ]),\n            threshold: z.enum([\n              'HARM_BLOCK_THRESHOLD_UNSPECIFIED',\n              'BLOCK_LOW_AND_ABOVE',\n              'BLOCK_MEDIUM_AND_ABOVE',\n              'BLOCK_ONLY_HIGH',\n              'BLOCK_NONE',\n              'OFF',\n            ]),\n          }),\n        )\n        .optional(),\n\n      threshold: z\n        .enum([\n          'HARM_BLOCK_THRESHOLD_UNSPECIFIED',\n          'BLOCK_LOW_AND_ABOVE',\n          'BLOCK_MEDIUM_AND_ABOVE',\n          'BLOCK_ONLY_HIGH',\n          'BLOCK_NONE',\n          'OFF',\n        ])\n        .optional(),\n\n      /**\n       * Optional. Enables timestamp understanding for audio-only files.\n       *\n       * https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/audio-understanding\n       */\n      audioTimestamp: z.boolean().optional(),\n\n      /**\n       * Optional. Defines labels used in billing reports. Available on Vertex AI only.\n       *\n       * https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/add-labels-to-api-calls\n       */\n      labels: z.record(z.string(), z.string()).optional(),\n\n      /**\n       * Optional. If specified, the media resolution specified will be used.\n       *\n       * https://ai.google.dev/api/generate-content#MediaResolution\n       */\n      mediaResolution: z\n        .enum([\n          'MEDIA_RESOLUTION_UNSPECIFIED',\n          'MEDIA_RESOLUTION_LOW',\n          'MEDIA_RESOLUTION_MEDIUM',\n          'MEDIA_RESOLUTION_HIGH',\n        ])\n        .optional(),\n\n      /**\n       * Optional. Configures the image generation aspect ratio for Gemini models.\n       *\n       * https://ai.google.dev/gemini-api/docs/image-generation#aspect_ratios\n       */\n      imageConfig: z\n        .object({\n          aspectRatio: z\n            .enum([\n              '1:1',\n              '2:3',\n              '3:2',\n              '3:4',\n              '4:3',\n              '4:5',\n              '5:4',\n              '9:16',\n              '16:9',\n              '21:9',\n              '1:8',\n              '8:1',\n              '1:4',\n              '4:1',\n            ])\n            .optional(),\n          imageSize: z.enum(['1K', '2K', '4K', '512']).optional(),\n        })\n        .optional(),\n\n      /**\n       * Optional. Configuration for grounding retrieval.\n       * Used to provide location context for Google Maps and Google Search grounding.\n       *\n       * https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-maps\n       */\n      retrievalConfig: z\n        .object({\n          latLng: z\n            .object({\n              latitude: z.number(),\n              longitude: z.number(),\n            })\n            .optional(),\n        })\n        .optional(),\n\n      /**\n       * Optional. When set to true, function call arguments will be streamed\n       * incrementally via partialArgs in streaming responses. Only supported\n       * on the Vertex AI API (not the Gemini API) and only for Gemini 3+\n       * models.\n       *\n       * @default false\n       *\n       * https://docs.cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling#streaming-fc\n       */\n      streamFunctionCallArguments: z.boolean().optional(),\n\n      /**\n       * Optional. The service tier to use for the request.\n       */\n      serviceTier: z.enum(['standard', 'flex', 'priority']).optional(),\n    }),\n  ),\n);\n\nexport type GoogleLanguageModelOptions = InferSchema<\n  typeof googleLanguageModelOptions\n>;\n\n// Vertex API requires another service tier format.\nexport const VertexServiceTierMap = {\n  standard: 'SERVICE_TIER_STANDARD',\n  flex: 'SERVICE_TIER_FLEX',\n  priority: 'SERVICE_TIER_PRIORITY',\n} as const;\n","import {\n  LanguageModelV3CallOptions,\n  SharedV3Warning,\n  UnsupportedFunctionalityError,\n} from '@ai-sdk/provider';\nimport { convertJSONSchemaToOpenAPISchema } from './convert-json-schema-to-openapi-schema';\nimport { GoogleGenerativeAIModelId } from './google-generative-ai-options';\n\nexport function prepareTools({\n  tools,\n  toolChoice,\n  modelId,\n}: {\n  tools: LanguageModelV3CallOptions['tools'];\n  toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n  modelId: GoogleGenerativeAIModelId;\n}): {\n  tools:\n    | Array<\n        | {\n            functionDeclarations: Array<{\n              name: string;\n              description: string;\n              parameters: unknown;\n            }>;\n          }\n        | Record<string, any>\n      >\n    | undefined;\n  toolConfig:\n    | undefined\n    | {\n        functionCallingConfig?: {\n          mode: 'AUTO' | 'NONE' | 'ANY' | 'VALIDATED';\n          allowedFunctionNames?: string[];\n          streamFunctionCallArguments?: boolean;\n        };\n        includeServerSideToolInvocations?: boolean;\n      };\n  toolWarnings: SharedV3Warning[];\n} {\n  // when the tools array is empty, change it to undefined to prevent errors:\n  tools = tools?.length ? tools : undefined;\n\n  const toolWarnings: SharedV3Warning[] = [];\n\n  const isLatest = (\n    [\n      'gemini-flash-latest',\n      'gemini-flash-lite-latest',\n      'gemini-pro-latest',\n    ] as const satisfies GoogleGenerativeAIModelId[]\n  ).some(id => id === modelId);\n  const isGemini2orNewer =\n    modelId.includes('gemini-2') ||\n    modelId.includes('gemini-3') ||\n    modelId.includes('nano-banana') ||\n    isLatest;\n  const isGemini3orNewer = modelId.includes('gemini-3');\n  const supportsFileSearch =\n    modelId.includes('gemini-2.5') || modelId.includes('gemini-3');\n\n  if (tools == null) {\n    return { tools: undefined, toolConfig: undefined, toolWarnings };\n  }\n\n  // Check for mixed tool types and add warnings\n  const hasFunctionTools = tools.some(tool => tool.type === 'function');\n  const hasProviderTools = tools.some(tool => tool.type === 'provider');\n\n  if (hasFunctionTools && hasProviderTools && !isGemini3orNewer) {\n    toolWarnings.push({\n      type: 'unsupported',\n      feature: `combination of function and provider-defined tools`,\n    });\n  }\n\n  if (hasProviderTools) {\n    const googleTools: any[] = [];\n\n    const ProviderTools = tools.filter(tool => tool.type === 'provider');\n    ProviderTools.forEach(tool => {\n      switch (tool.id) {\n        case 'google.google_search':\n          if (isGemini2orNewer) {\n            googleTools.push({ googleSearch: { ...tool.args } });\n          } else {\n            toolWarnings.push({\n              type: 'unsupported',\n              feature: `provider-defined tool ${tool.id}`,\n              details: 'Google Search requires Gemini 2.0 or newer.',\n            });\n          }\n          break;\n        case 'google.enterprise_web_search':\n          if (isGemini2orNewer) {\n            googleTools.push({ enterpriseWebSearch: {} });\n          } else {\n            toolWarnings.push({\n              type: 'unsupported',\n              feature: `provider-defined tool ${tool.id}`,\n              details: 'Enterprise Web Search requires Gemini 2.0 or newer.',\n            });\n          }\n          break;\n        case 'google.url_context':\n          if (isGemini2orNewer) {\n            googleTools.push({ urlContext: {} });\n          } else {\n            toolWarnings.push({\n              type: 'unsupported',\n              feature: `provider-defined tool ${tool.id}`,\n              details:\n                'The URL context tool is not supported with other Gemini models than Gemini 2.',\n            });\n          }\n          break;\n        case 'google.code_execution':\n          if (isGemini2orNewer) {\n            googleTools.push({ codeExecution: {} });\n          } else {\n            toolWarnings.push({\n              type: 'unsupported',\n              feature: `provider-defined tool ${tool.id}`,\n              details:\n                'The code execution tool is not supported with other Gemini models than Gemini 2.',\n            });\n          }\n          break;\n        case 'google.file_search':\n          if (supportsFileSearch) {\n            googleTools.push({ fileSearch: { ...tool.args } });\n          } else {\n            toolWarnings.push({\n              type: 'unsupported',\n              feature: `provider-defined tool ${tool.id}`,\n              details:\n                'The file search tool is only supported with Gemini 2.5 models and Gemini 3 models.',\n            });\n          }\n          break;\n        case 'google.vertex_rag_store':\n          if (isGemini2orNewer) {\n            googleTools.push({\n              retrieval: {\n                vertex_rag_store: {\n                  rag_resources: {\n                    rag_corpus: tool.args.ragCorpus,\n                  },\n                  similarity_top_k: tool.args.topK as number | undefined,\n                },\n              },\n            });\n          } else {\n            toolWarnings.push({\n              type: 'unsupported',\n              feature: `provider-defined tool ${tool.id}`,\n              details:\n                'The RAG store tool is not supported with other Gemini models than Gemini 2.',\n            });\n          }\n          break;\n        case 'google.google_maps':\n          if (isGemini2orNewer) {\n            googleTools.push({ googleMaps: {} });\n          } else {\n            toolWarnings.push({\n              type: 'unsupported',\n              feature: `provider-defined tool ${tool.id}`,\n              details:\n                'The Google Maps grounding tool is not supported with Gemini models other than Gemini 2 or newer.',\n            });\n          }\n          break;\n        default:\n          toolWarnings.push({\n            type: 'unsupported',\n            feature: `provider-defined tool ${tool.id}`,\n          });\n          break;\n      }\n    });\n\n    if (hasFunctionTools && isGemini3orNewer && googleTools.length > 0) {\n      const functionDeclarations: Array<{\n        name: string;\n        description: string;\n        parameters: unknown;\n      }> = [];\n      for (const tool of tools) {\n        if (tool.type === 'function') {\n          functionDeclarations.push({\n            name: tool.name,\n            description: tool.description ?? '',\n            parameters: convertJSONSchemaToOpenAPISchema(tool.inputSchema),\n          });\n        }\n      }\n\n      const combinedToolConfig: {\n        functionCallingConfig: {\n          mode: 'VALIDATED' | 'ANY' | 'NONE';\n          allowedFunctionNames?: string[];\n        };\n        includeServerSideToolInvocations: true;\n      } = {\n        functionCallingConfig: { mode: 'VALIDATED' },\n        includeServerSideToolInvocations: true,\n      };\n\n      if (toolChoice != null) {\n        switch (toolChoice.type) {\n          case 'auto':\n            break;\n          case 'none':\n            combinedToolConfig.functionCallingConfig = { mode: 'NONE' };\n            break;\n          case 'required':\n            combinedToolConfig.functionCallingConfig = { mode: 'ANY' };\n            break;\n          case 'tool':\n            combinedToolConfig.functionCallingConfig = {\n              mode: 'ANY',\n              allowedFunctionNames: [toolChoice.toolName],\n            };\n            break;\n        }\n      }\n\n      return {\n        tools: [...googleTools, { functionDeclarations }],\n        toolConfig: combinedToolConfig,\n        toolWarnings,\n      };\n    }\n\n    return {\n      tools: googleTools.length > 0 ? googleTools : undefined,\n      toolConfig: undefined,\n      toolWarnings,\n    };\n  }\n\n  const functionDeclarations = [];\n  let hasStrictTools = false;\n  for (const tool of tools) {\n    switch (tool.type) {\n      case 'function':\n        functionDeclarations.push({\n          name: tool.name,\n          description: tool.description ?? '',\n          parameters: convertJSONSchemaToOpenAPISchema(tool.inputSchema),\n        });\n        if (tool.strict === true) {\n          hasStrictTools = true;\n        }\n        break;\n      default:\n        toolWarnings.push({\n          type: 'unsupported',\n          feature: `function tool ${tool.name}`,\n        });\n        break;\n    }\n  }\n\n  if (toolChoice == null) {\n    return {\n      tools: [{ functionDeclarations }],\n      toolConfig: hasStrictTools\n        ? { functionCallingConfig: { mode: 'VALIDATED' } }\n        : undefined,\n      toolWarnings,\n    };\n  }\n\n  const type = toolChoice.type;\n\n  switch (type) {\n    case 'auto':\n      return {\n        tools: [{ functionDeclarations }],\n        toolConfig: {\n          functionCallingConfig: {\n            mode: hasStrictTools ? 'VALIDATED' : 'AUTO',\n          },\n        },\n        toolWarnings,\n      };\n    case 'none':\n      return {\n        tools: [{ functionDeclarations }],\n        toolConfig: { functionCallingConfig: { mode: 'NONE' } },\n        toolWarnings,\n      };\n    case 'required':\n      return {\n        tools: [{ functionDeclarations }],\n        toolConfig: {\n          functionCallingConfig: {\n            mode: hasStrictTools ? 'VALIDATED' : 'ANY',\n          },\n        },\n        toolWarnings,\n      };\n    case 'tool':\n      return {\n        tools: [{ functionDeclarations }],\n        toolConfig: {\n          functionCallingConfig: {\n            mode: hasStrictTools ? 'VALIDATED' : 'ANY',\n            allowedFunctionNames: [toolChoice.toolName],\n          },\n        },\n        toolWarnings,\n      };\n    default: {\n      const _exhaustiveCheck: never = type;\n      throw new UnsupportedFunctionalityError({\n        functionality: `tool choice type: ${_exhaustiveCheck}`,\n      });\n    }\n  }\n}\n","export type PartialArg = {\n  jsonPath: string;\n  stringValue?: string | null;\n  numberValue?: number | null;\n  boolValue?: boolean | null;\n  nullValue?: unknown;\n  willContinue?: boolean | null;\n};\n\ntype PathSegment = string | number;\n\ntype StackEntry = {\n  segment: PathSegment;\n  isArray: boolean;\n  childCount: number;\n};\n\n/**\n * Incrementally builds a JSON object from Google's streaming `partialArgs`\n * chunks emitted during tool-call function calling. Tracks both the structured\n * object and a running JSON text representation so callers can emit text deltas\n * that, when concatenated, form valid nested JSON matching JSON.stringify output.\n *\n * Input: [{jsonPath:\"$.location\",stringValue:\"Boston\"}]\n * Output: '{\"location\":\"Boston\"', then finalize() → closingDelta='}'\n */\nexport class GoogleJSONAccumulator {\n  private accumulatedArgs: Record<string, unknown> = {};\n  private jsonText = '';\n\n  /**\n   * Stack representing the currently \"open\" containers in the JSON output.\n   * Entry 0 is always the root `{` object once the first value is written.\n   */\n  private pathStack: StackEntry[] = [];\n\n  /**\n   * Whether a string value is currently \"open\" (willContinue was true),\n   * meaning the closing quote has not yet been emitted.\n   */\n  private stringOpen = false;\n\n  /**\n   * Input: [{jsonPath:\"$.brightness\",numberValue:50}]\n   * Output: { currentJSON:{brightness:50}, textDelta:'{\"brightness\":50' }\n   */\n  processPartialArgs(partialArgs: PartialArg[]): {\n    currentJSON: Record<string, unknown>;\n    textDelta: string;\n  } {\n    let delta = '';\n\n    for (const arg of partialArgs) {\n      const rawPath = arg.jsonPath.replace(/^\\$\\./, '');\n      if (!rawPath) continue;\n\n      const segments = parsePath(rawPath);\n\n      const existingValue = getNestedValue(this.accumulatedArgs, segments);\n      const isStringContinuation =\n        arg.stringValue != null && existingValue !== undefined;\n\n      if (isStringContinuation) {\n        const escaped = JSON.stringify(arg.stringValue).slice(1, -1);\n        setNestedValue(\n          this.accumulatedArgs,\n          segments,\n          (existingValue as string) + arg.stringValue,\n        );\n        delta += escaped;\n        continue;\n      }\n\n      const resolved = resolvePartialArgValue(arg);\n      if (resolved == null) continue;\n\n      setNestedValue(this.accumulatedArgs, segments, resolved.value);\n      delta += this.emitNavigationTo(segments, arg, resolved.json);\n    }\n\n    this.jsonText += delta;\n\n    return {\n      currentJSON: this.accumulatedArgs,\n      textDelta: delta,\n    };\n  }\n\n  /**\n   * Input: jsonText='{\"brightness\":50', accumulatedArgs={brightness:50}\n   * Output: { finalJSON:'{\"brightness\":50}', closingDelta:'}' }\n   */\n  finalize(): { finalJSON: string; closingDelta: string } {\n    const finalArgs = JSON.stringify(this.accumulatedArgs);\n    const closingDelta = finalArgs.slice(this.jsonText.length);\n    return { finalJSON: finalArgs, closingDelta };\n  }\n\n  /**\n   * Input: pathStack=[] (first call) or pathStack=[root,...] (subsequent calls)\n   * Output: '{' (first call) or '' (subsequent calls)\n   */\n  private ensureRoot(): string {\n    if (this.pathStack.length === 0) {\n      this.pathStack.push({ segment: '', isArray: false, childCount: 0 });\n      return '{';\n    }\n    return '';\n  }\n\n  /**\n   * Emits the JSON text fragment needed to navigate from the current open\n   * path to the new leaf at `targetSegments`, then writes the value.\n   *\n   * Input: targetSegments=[\"recipe\",\"name\"], arg={jsonPath:\"$.recipe.name\",stringValue:\"Lasagna\"}, valueJson='\"Lasagna\"'\n   * Output: '{\"recipe\":{\"name\":\"Lasagna\"'\n   */\n  private emitNavigationTo(\n    targetSegments: PathSegment[],\n    arg: PartialArg,\n    valueJson: string,\n  ): string {\n    let fragment = '';\n\n    if (this.stringOpen) {\n      fragment += '\"';\n      this.stringOpen = false;\n    }\n\n    fragment += this.ensureRoot();\n\n    const targetContainerSegments = targetSegments.slice(0, -1);\n    const leafSegment = targetSegments[targetSegments.length - 1];\n\n    const commonDepth = this.findCommonStackDepth(targetContainerSegments);\n\n    fragment += this.closeDownTo(commonDepth);\n    fragment += this.openDownTo(targetContainerSegments, leafSegment);\n    fragment += this.emitLeaf(leafSegment, arg, valueJson);\n\n    return fragment;\n  }\n\n  /**\n   * Returns the stack depth to preserve when navigating to a new target\n   * container path. Always >= 1 (the root is never popped).\n   *\n   * Input: stack=[root,\"recipe\",\"ingredients\",0], target=[\"recipe\",\"ingredients\",1]\n   * Output: 3 (keep root+\"recipe\"+\"ingredients\")\n   */\n  private findCommonStackDepth(targetContainer: PathSegment[]): number {\n    const maxDepth = Math.min(\n      this.pathStack.length - 1,\n      targetContainer.length,\n    );\n    let common = 0;\n    for (let i = 0; i < maxDepth; i++) {\n      if (this.pathStack[i + 1].segment === targetContainer[i]) {\n        common++;\n      } else {\n        break;\n      }\n    }\n    return common + 1;\n  }\n\n  /**\n   * Closes containers from the current stack depth back down to `targetDepth`.\n   *\n   * Input: this.pathStack=[root,\"recipe\",\"ingredients\",0], targetDepth=3\n   * Output: '}'\n   */\n  private closeDownTo(targetDepth: number): string {\n    let fragment = '';\n    while (this.pathStack.length > targetDepth) {\n      const entry = this.pathStack.pop()!;\n      fragment += entry.isArray ? ']' : '}';\n    }\n    return fragment;\n  }\n\n  /**\n   * Opens containers from the current stack depth down to the full target\n   * container path, emitting opening `{`, `[`, keys, and commas as needed.\n   * `leafSegment` is used to determine if the innermost container is an array.\n   *\n   * Input: this.pathStack=[root], targetContainer=[\"recipe\",\"ingredients\"], leafSegment=0\n   * Output: '\"recipe\":{\"ingredients\":['\n   */\n  private openDownTo(\n    targetContainer: PathSegment[],\n    leafSegment: PathSegment,\n  ): string {\n    let fragment = '';\n\n    const startIdx = this.pathStack.length - 1;\n\n    for (let i = startIdx; i < targetContainer.length; i++) {\n      const seg = targetContainer[i];\n      const parentEntry = this.pathStack[this.pathStack.length - 1];\n\n      if (parentEntry.childCount > 0) {\n        fragment += ',';\n      }\n      parentEntry.childCount++;\n\n      if (typeof seg === 'string') {\n        fragment += `${JSON.stringify(seg)}:`;\n      }\n\n      const childSeg =\n        i + 1 < targetContainer.length ? targetContainer[i + 1] : leafSegment;\n      const isArray = typeof childSeg === 'number';\n\n      fragment += isArray ? '[' : '{';\n\n      this.pathStack.push({ segment: seg, isArray, childCount: 0 });\n    }\n\n    return fragment;\n  }\n\n  /**\n   * Emits the comma, key, and value for a leaf entry in the current container.\n   *\n   * Input: leafSegment=\"name\", arg={stringValue:\"Lasagna\"}, valueJson='\"Lasagna\"'\n   * Output: '\"name\":\"Lasagna\"' (or ',\"name\":\"Lasagna\"' if container.childCount > 0)\n   */\n  private emitLeaf(\n    leafSegment: PathSegment,\n    arg: PartialArg,\n    valueJson: string,\n  ): string {\n    let fragment = '';\n    const container = this.pathStack[this.pathStack.length - 1];\n\n    if (container.childCount > 0) {\n      fragment += ',';\n    }\n    container.childCount++;\n\n    if (typeof leafSegment === 'string') {\n      fragment += `${JSON.stringify(leafSegment)}:`;\n    }\n\n    if (arg.stringValue != null && arg.willContinue) {\n      fragment += valueJson.slice(0, -1);\n      this.stringOpen = true;\n    } else {\n      fragment += valueJson;\n    }\n\n    return fragment;\n  }\n}\n\n/**\n * Splits a dotted/bracketed JSON path like `recipe.ingredients[0].name` into segments.\n *\n * Input: \"recipe.ingredients[0].name\"\n * Output: [\"recipe\", \"ingredients\", 0, \"name\"]\n */\nfunction parsePath(rawPath: string): Array<string | number> {\n  const segments: Array<string | number> = [];\n  for (const part of rawPath.split('.')) {\n    const bracketIdx = part.indexOf('[');\n    if (bracketIdx === -1) {\n      segments.push(part);\n    } else {\n      if (bracketIdx > 0) segments.push(part.slice(0, bracketIdx));\n      for (const m of part.matchAll(/\\[(\\d+)\\]/g)) {\n        segments.push(parseInt(m[1], 10));\n      }\n    }\n  }\n  return segments;\n}\n\n/**\n * Traverses a nested object along the given path segments and returns the leaf value.\n *\n * Input: ({recipe:{name:\"Lasagna\"}}, [\"recipe\",\"name\"])\n * Output: \"Lasagna\"\n */\nfunction getNestedValue(\n  obj: Record<string, unknown>,\n  segments: Array<string | number>,\n): unknown {\n  let current: unknown = obj;\n  for (const seg of segments) {\n    if (current == null || typeof current !== 'object') return undefined;\n    current = (current as Record<string | number, unknown>)[seg];\n  }\n  return current;\n}\n\n/**\n * Sets a value at a nested path, creating intermediate objects or arrays as needed.\n *\n * Input: obj={}, segments=[\"recipe\",\"ingredients\",0,\"name\"], value=\"Noodles\"\n * Output: {recipe:{ingredients:[{name:\"Noodles\"}]}}\n */\nfunction setNestedValue(\n  obj: Record<string, unknown>,\n  segments: Array<string | number>,\n  value: unknown,\n): void {\n  let current: Record<string | number, unknown> = obj;\n  for (let i = 0; i < segments.length - 1; i++) {\n    const seg = segments[i];\n    const nextSeg = segments[i + 1];\n    if (current[seg] == null) {\n      current[seg] = typeof nextSeg === 'number' ? [] : {};\n    }\n    current = current[seg] as Record<string | number, unknown>;\n  }\n  current[segments[segments.length - 1]] = value;\n}\n\n/**\n * Extracts the first non-null typed value from a partial arg and returns it with its JSON representation.\n *\n * Input: arg={stringValue:\"Boston\"} or arg={numberValue:50}\n * Output: {value:\"Boston\", json:'\"Boston\"'} or {value:50, json:'50'}\n */\nfunction resolvePartialArgValue(arg: {\n  stringValue?: string | null;\n  numberValue?: number | null;\n  boolValue?: boolean | null;\n  nullValue?: unknown;\n}): { value: unknown; json: string } | undefined {\n  const value = arg.stringValue ?? arg.numberValue ?? arg.boolValue;\n  if (value != null) return { value, json: JSON.stringify(value) };\n  if ('nullValue' in arg) return { value: null, json: 'null' };\n  return undefined;\n}\n","import { LanguageModelV3FinishReason } from '@ai-sdk/provider';\n\nexport function mapGoogleGenerativeAIFinishReason({\n  finishReason,\n  hasToolCalls,\n}: {\n  finishReason: string | null | undefined;\n  hasToolCalls: boolean;\n}): LanguageModelV3FinishReason['unified'] {\n  switch (finishReason) {\n    case 'STOP':\n      return hasToolCalls ? 'tool-calls' : 'stop';\n    case 'MAX_TOKENS':\n      return 'length';\n    case 'IMAGE_SAFETY':\n    case 'RECITATION':\n    case 'SAFETY':\n    case 'BLOCKLIST':\n    case 'PROHIBITED_CONTENT':\n    case 'SPII':\n      return 'content-filter';\n    case 'MALFORMED_FUNCTION_CALL':\n      return 'error';\n    case 'FINISH_REASON_UNSPECIFIED':\n    case 'OTHER':\n    default:\n      return 'other';\n  }\n}\n","import { createProviderToolFactoryWithOutputSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * A tool that enables the model to generate and run Python code.\n *\n * @note Ensure the selected model supports Code Execution.\n * Multi-tool usage with the code execution tool is typically compatible with Gemini >=2 models.\n *\n * @see https://ai.google.dev/gemini-api/docs/code-execution (Google AI)\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/code-execution-api (Vertex AI)\n */\nexport const codeExecution = createProviderToolFactoryWithOutputSchema<\n  {\n    language: string;\n    code: string;\n  },\n  {\n    outcome: string;\n    output: string;\n  },\n  {}\n>({\n  id: 'google.code_execution',\n  inputSchema: z.object({\n    language: z.string().describe('The programming language of the code.'),\n    code: z.string().describe('The code to be executed.'),\n  }),\n  outputSchema: z.object({\n    outcome: z\n      .string()\n      .describe('The outcome of the execution (e.g., \"OUTCOME_OK\").'),\n    output: z.string().describe('The output from the code execution.'),\n  }),\n});\n","import {\n  createProviderToolFactory,\n  lazySchema,\n  zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/web-grounding-enterprise\n\nexport const enterpriseWebSearch = createProviderToolFactory<\n  {\n    // Enterprise Web Search does not have any input schema\n  },\n  {}\n>({\n  id: 'google.enterprise_web_search',\n  inputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n  createProviderToolFactory,\n  lazySchema,\n  zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/** Tool to retrieve knowledge from the File Search Stores. */\nconst fileSearchArgsBaseSchema = z\n  .object({\n    /** The names of the file_search_stores to retrieve from.\n     *  Example: `fileSearchStores/my-file-search-store-123`\n     */\n    fileSearchStoreNames: z\n      .array(z.string())\n      .describe(\n        'The names of the file_search_stores to retrieve from. Example: `fileSearchStores/my-file-search-store-123`',\n      ),\n    /** The number of file search retrieval chunks to retrieve. */\n    topK: z\n      .number()\n      .int()\n      .positive()\n      .describe('The number of file search retrieval chunks to retrieve.')\n      .optional(),\n\n    /** Metadata filter to apply to the file search retrieval documents.\n     *  See https://google.aip.dev/160 for the syntax of the filter expression.\n     */\n    metadataFilter: z\n      .string()\n      .describe(\n        'Metadata filter to apply to the file search retrieval documents. See https://google.aip.dev/160 for the syntax of the filter expression.',\n      )\n      .optional(),\n  })\n  .passthrough();\n\nexport type GoogleFileSearchToolArgs = z.infer<typeof fileSearchArgsBaseSchema>;\n\nconst fileSearchArgsSchema = lazySchema(() =>\n  zodSchema(fileSearchArgsBaseSchema),\n);\n\nexport const fileSearch = createProviderToolFactory<\n  {},\n  GoogleFileSearchToolArgs\n>({\n  id: 'google.file_search',\n  inputSchema: fileSearchArgsSchema,\n});\n","import {\n  createProviderToolFactory,\n  lazySchema,\n  zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://ai.google.dev/gemini-api/docs/maps-grounding\n// https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-maps\n\nexport const googleMaps = createProviderToolFactory<{}, {}>({\n  id: 'google.google_maps',\n  inputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import {\n  createProviderToolFactory,\n  lazySchema,\n  zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://ai.google.dev/gemini-api/docs/google-search\n// https://ai.google.dev/api/generate-content#GroundingSupport\n// https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-search\n\nconst googleSearchToolArgsBaseSchema = z\n  .object({\n    searchTypes: z\n      .object({\n        webSearch: z.object({}).optional(),\n        imageSearch: z.object({}).optional(),\n      })\n      .optional(),\n\n    timeRangeFilter: z\n      .object({\n        startTime: z.string(),\n        endTime: z.string(),\n      })\n      .optional(),\n  })\n  .passthrough();\n\nexport type GoogleSearchToolArgs = z.infer<\n  typeof googleSearchToolArgsBaseSchema\n>;\n\nconst googleSearchToolArgsSchema = lazySchema(() =>\n  zodSchema(googleSearchToolArgsBaseSchema),\n);\n\nexport const googleSearch = createProviderToolFactory<{}, GoogleSearchToolArgs>(\n  {\n    id: 'google.google_search',\n    inputSchema: googleSearchToolArgsSchema,\n  },\n);\n","import {\n  createProviderToolFactory,\n  lazySchema,\n  zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const urlContext = createProviderToolFactory<\n  {\n    // Url context does not have any input schema, it will directly use the url from the prompt\n  },\n  {}\n>({\n  id: 'google.url_context',\n  inputSchema: lazySchema(() => zodSchema(z.object({}))),\n});\n","import { createProviderToolFactory } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/rag-engine/use-vertexai-search#generate-content-using-gemini-api\n// https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/rag-output-explained\n\n/**\n * A tool that enables the model to perform RAG searches against a Vertex RAG Store.\n *\n * @note Only works with Vertex Gemini models.\n */\nexport const vertexRagStore = createProviderToolFactory<\n  {},\n  {\n    /**\n     * RagCorpus resource names, eg: projects/{project}/locations/{location}/ragCorpora/{rag_corpus}\n     */\n    ragCorpus: string;\n\n    /**\n     * The number of top contexts to retrieve.\n     */\n    topK?: number;\n  }\n>({\n  id: 'google.vertex_rag_store',\n  inputSchema: z.object({\n    ragCorpus: z.string(),\n    topK: z.number().optional(),\n  }),\n});\n","import { codeExecution } from './tool/code-execution';\nimport { enterpriseWebSearch } from './tool/enterprise-web-search';\nimport { fileSearch } from './tool/file-search';\nimport { googleMaps } from './tool/google-maps';\nimport { googleSearch } from './tool/google-search';\nimport { urlContext } from './tool/url-context';\nimport { vertexRagStore } from './tool/vertex-rag-store';\n\nexport const googleTools = {\n  /**\n   * Creates a Google search tool that gives Google direct access to real-time web content.\n   * Must have name \"google_search\".\n   */\n  googleSearch,\n\n  /**\n   * Creates an Enterprise Web Search tool for grounding responses using a compliance-focused web index.\n   * Designed for highly-regulated industries (finance, healthcare, public sector).\n   * Does not log customer data and supports VPC service controls.\n   * Must have name \"enterprise_web_search\".\n   *\n   * @note Only available on Vertex AI. Requires Gemini 2.0 or newer.\n   *\n   * @see https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/web-grounding-enterprise\n   */\n  enterpriseWebSearch,\n\n  /**\n   * Creates a Google Maps grounding tool that gives the model access to Google Maps data.\n   * Must have name \"google_maps\".\n   *\n   * @see https://ai.google.dev/gemini-api/docs/maps-grounding\n   * @see https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-maps\n   */\n  googleMaps,\n\n  /**\n   * Creates a URL context tool that gives Google direct access to real-time web content.\n   * Must have name \"url_context\".\n   */\n  urlContext,\n\n  /**\n   * Enables Retrieval Augmented Generation (RAG) via the Gemini File Search tool.\n   * Must have name \"file_search\".\n   *\n   * @param fileSearchStoreNames - Fully-qualified File Search store resource names.\n   * @param metadataFilter - Optional filter expression to restrict the files that can be retrieved.\n   * @param topK - Optional result limit for the number of chunks returned from File Search.\n   *\n   * @see https://ai.google.dev/gemini-api/docs/file-search\n   */\n  fileSearch,\n  /**\n   * A tool that enables the model to generate and run Python code.\n   * Must have name \"code_execution\".\n   *\n   * @note Ensure the selected model supports Code Execution.\n   * Multi-tool usage with the code execution tool is typically compatible with Gemini >=2 models.\n   *\n   * @see https://ai.google.dev/gemini-api/docs/code-execution (Google AI)\n   * @see https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/code-execution-api (Vertex AI)\n   */\n  codeExecution,\n\n  /**\n   * Creates a Vertex RAG Store tool that enables the model to perform RAG searches against a Vertex RAG Store.\n   * Must have name \"vertex_rag_store\".\n   */\n  vertexRagStore,\n};\n"],"mappings":"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","names":["lazySchema","zodSchema","z","_a","_b","_c","_d","lazySchema","zodSchema","z","UnsupportedFunctionalityError","googleTools","functionDeclarations","UnsupportedFunctionalityError","googleTools","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"]}