UNPKG

@ai-sdk/google

Version:
579 lines (568 loc) 27 kB
import * as _ai_sdk_provider_utils from '@ai-sdk/provider-utils'; import { WORKFLOW_SERIALIZE, WORKFLOW_DESERIALIZE, Resolvable, FetchFunction, InferSchema } from '@ai-sdk/provider-utils'; import * as _ai_sdk_provider from '@ai-sdk/provider'; import { LanguageModelV4, JSONObject, LanguageModelV4CallOptions, SharedV4Warning, LanguageModelV4GenerateResult, LanguageModelV4StreamResult, SpeechModelV4 } from '@ai-sdk/provider'; import { z } from 'zod/v4'; type GoogleSystemInstruction = { parts: Array<{ text: string; }>; }; type GoogleContent = { role: 'user' | 'model'; parts: Array<GoogleContentPart>; }; type GoogleContentPart = { text: string; thought?: boolean; thoughtSignature?: string; } | { inlineData: { mimeType: string; data: string; }; thought?: boolean; thoughtSignature?: string; } | { functionCall: { id?: string; name: string; args: unknown; }; thoughtSignature?: string; } | { functionResponse: { id?: string; name: string; response: unknown; parts?: Array<GoogleFunctionResponsePart>; }; } | { fileData: { mimeType: string; fileUri: string; }; thought?: boolean; thoughtSignature?: string; } | { toolCall: { toolType: string; args?: unknown; id: string; }; thoughtSignature?: string; } | { toolResponse: { toolType: string; response?: unknown; id: string; }; thoughtSignature?: string; }; type GoogleFunctionResponsePart = { inlineData: { mimeType: string; data: string; }; }; type GoogleModelId = 'gemini-2.0-flash' | 'gemini-2.0-flash-001' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-001' | 'gemini-2.5-pro' | 'gemini-2.5-flash' | 'gemini-2.5-flash-image' | 'gemini-2.5-flash-lite' | 'gemini-2.5-flash-preview-tts' | 'gemini-2.5-pro-preview-tts' | 'gemini-2.5-flash-native-audio-latest' | 'gemini-2.5-flash-native-audio-preview-09-2025' | 'gemini-2.5-flash-native-audio-preview-12-2025' | 'gemini-2.5-computer-use-preview-10-2025' | 'gemini-3-pro-preview' | 'gemini-3-pro-image-preview' | 'gemini-3-flash-preview' | 'gemini-3.1-pro-preview' | 'gemini-3.1-pro-preview-customtools' | 'gemini-3.1-flash-image-preview' | 'gemini-3.1-flash-lite-preview' | 'gemini-3.1-flash-tts-preview' | 'gemini-3.5-flash' | 'gemini-3.5-flash-lite' | 'gemini-3.6-flash' | 'gemini-3.7-flash' | 'gemini-pro-latest' | 'gemini-flash-latest' | 'gemini-flash-lite-latest' | 'deep-research-pro-preview-12-2025' | 'deep-research-max-preview-04-2026' | 'deep-research-preview-04-2026' | 'nano-banana-pro-preview' | 'aqa' | 'gemini-robotics-er-1.5-preview' | 'gemma-3-1b-it' | 'gemma-3-4b-it' | 'gemma-3n-e4b-it' | 'gemma-3n-e2b-it' | 'gemma-3-12b-it' | 'gemma-3-27b-it' | (string & {}); type GoogleLanguageModelConfig = { provider: string; baseURL: string; headers?: Resolvable<Record<string, string | undefined>>; fetch?: FetchFunction; generateId: () => string; /** * The supported URLs for the model. */ supportedUrls?: () => LanguageModelV4['supportedUrls']; }; declare class GoogleLanguageModel implements LanguageModelV4 { readonly specificationVersion = "v4"; readonly modelId: GoogleModelId; private readonly config; private readonly generateId; static [WORKFLOW_SERIALIZE](model: GoogleLanguageModel): { modelId: string; config: JSONObject; }; static [WORKFLOW_DESERIALIZE](options: { modelId: string; config: GoogleLanguageModelConfig; }): GoogleLanguageModel; constructor(modelId: GoogleModelId, config: GoogleLanguageModelConfig); get provider(): string; get supportedUrls(): Record<string, RegExp[]> | PromiseLike<Record<string, RegExp[]>>; protected getArgs({ prompt, maxOutputTokens, temperature, topP, topK, frequencyPenalty, presencePenalty, stopSequences, responseFormat, seed, tools, toolChoice, reasoning, providerOptions, }: LanguageModelV4CallOptions, { isStreaming }?: { isStreaming?: boolean; }): Promise<{ args: { generationConfig: { imageConfig?: { aspectRatio?: "1:1" | "2:3" | "3:2" | "3:4" | "4:3" | "4:5" | "5:4" | "9:16" | "16:9" | "21:9" | "1:8" | "8:1" | "1:4" | "4:1" | undefined; imageSize?: "1K" | "2K" | "4K" | "512" | undefined; personGeneration?: "PERSON_GENERATION_UNSPECIFIED" | "ALLOW_ALL" | "ALLOW_ADULT" | "ALLOW_NONE" | undefined; prominentPeople?: "PROMINENT_PEOPLE_UNSPECIFIED" | "ALLOW_PROMINENT_PEOPLE" | "BLOCK_PROMINENT_PEOPLE" | undefined; imageOutputOptions?: { mimeType?: "image/jpeg" | "image/png" | undefined; compressionQuality?: number | undefined; } | undefined; } | undefined; mediaResolution?: "MEDIA_RESOLUTION_UNSPECIFIED" | "MEDIA_RESOLUTION_LOW" | "MEDIA_RESOLUTION_MEDIUM" | "MEDIA_RESOLUTION_HIGH" | undefined; responseModalities: ("TEXT" | "IMAGE")[] | undefined; thinkingConfig: { thinkingBudget?: number | undefined; includeThoughts?: boolean | undefined; thinkingLevel?: "minimal" | "low" | "medium" | "high" | undefined; } | undefined; audioTimestamp?: true | undefined; maxOutputTokens: number | undefined; temperature: number | undefined; topK: number | undefined; topP: number | undefined; frequencyPenalty: number | undefined; presencePenalty: number | undefined; stopSequences: string[] | undefined; seed: number | undefined; responseMimeType: string | undefined; responseSchema: unknown; }; contents: GoogleContent[]; systemInstruction: GoogleSystemInstruction | undefined; safetySettings: { category: "HARM_CATEGORY_UNSPECIFIED" | "HARM_CATEGORY_HATE_SPEECH" | "HARM_CATEGORY_DANGEROUS_CONTENT" | "HARM_CATEGORY_HARASSMENT" | "HARM_CATEGORY_SEXUALLY_EXPLICIT" | "HARM_CATEGORY_CIVIC_INTEGRITY"; threshold: "HARM_BLOCK_THRESHOLD_UNSPECIFIED" | "BLOCK_LOW_AND_ABOVE" | "BLOCK_MEDIUM_AND_ABOVE" | "BLOCK_ONLY_HIGH" | "BLOCK_NONE" | "OFF"; }[] | undefined; tools: ({ functionDeclarations: { name: string; description: string; parameters?: unknown; parametersJsonSchema?: unknown; }[]; } | Record<string, any>)[] | undefined; toolConfig: { retrievalConfig?: { latLng?: { latitude: number; longitude: number; } | undefined; } | undefined; functionCallingConfig?: { mode: "AUTO" | "NONE" | "ANY" | "VALIDATED"; allowedFunctionNames?: string[]; streamFunctionCallArguments?: boolean; } | { streamFunctionCallArguments: true; mode?: "AUTO" | "NONE" | "ANY" | "VALIDATED" | undefined; allowedFunctionNames?: string[]; } | undefined; includeServerSideToolInvocations?: boolean; } | undefined; cachedContent: string | undefined; labels: Record<string, string> | undefined; serviceTier: "standard" | "flex" | "priority" | undefined; }; warnings: SharedV4Warning[]; providerOptionsNames: readonly string[]; extraHeaders: Record<string, string> | undefined; }>; protected convertGenerateContentResponse({ response, warnings, providerOptionsNames, }: { response: InferSchema<typeof responseSchema>; warnings: SharedV4Warning[]; providerOptionsNames: readonly string[]; }): LanguageModelV4GenerateResult; doGenerate(options: LanguageModelV4CallOptions): Promise<LanguageModelV4GenerateResult>; doStream(options: LanguageModelV4CallOptions): Promise<LanguageModelV4StreamResult>; } declare const getGroundingMetadataSchema: () => z.ZodObject<{ webSearchQueries: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>; imageSearchQueries: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>; retrievalQueries: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>; searchEntryPoint: z.ZodOptional<z.ZodNullable<z.ZodObject<{ renderedContent: z.ZodString; }, z.core.$strip>>>; groundingChunks: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{ web: z.ZodOptional<z.ZodNullable<z.ZodObject<{ uri: z.ZodString; title: z.ZodOptional<z.ZodNullable<z.ZodString>>; }, z.core.$strip>>>; image: z.ZodOptional<z.ZodNullable<z.ZodObject<{ sourceUri: z.ZodString; imageUri: z.ZodString; title: z.ZodOptional<z.ZodNullable<z.ZodString>>; domain: z.ZodOptional<z.ZodNullable<z.ZodString>>; }, z.core.$strip>>>; retrievedContext: z.ZodOptional<z.ZodNullable<z.ZodObject<{ uri: z.ZodOptional<z.ZodNullable<z.ZodString>>; title: z.ZodOptional<z.ZodNullable<z.ZodString>>; text: z.ZodOptional<z.ZodNullable<z.ZodString>>; fileSearchStore: z.ZodOptional<z.ZodNullable<z.ZodString>>; }, z.core.$strip>>>; maps: z.ZodOptional<z.ZodNullable<z.ZodObject<{ uri: z.ZodOptional<z.ZodNullable<z.ZodString>>; title: z.ZodOptional<z.ZodNullable<z.ZodString>>; text: z.ZodOptional<z.ZodNullable<z.ZodString>>; placeId: z.ZodOptional<z.ZodNullable<z.ZodString>>; }, z.core.$strip>>>; }, z.core.$strip>>>>; groundingSupports: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{ segment: z.ZodOptional<z.ZodNullable<z.ZodObject<{ startIndex: z.ZodOptional<z.ZodNullable<z.ZodNumber>>; endIndex: z.ZodOptional<z.ZodNullable<z.ZodNumber>>; text: z.ZodOptional<z.ZodNullable<z.ZodString>>; }, z.core.$strip>>>; segment_text: z.ZodOptional<z.ZodNullable<z.ZodString>>; groundingChunkIndices: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodNumber>>>; supportChunkIndices: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodNumber>>>; confidenceScores: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodNumber>>>; confidenceScore: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodNumber>>>; }, z.core.$strip>>>>; retrievalMetadata: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodObject<{ webDynamicRetrievalScore: z.ZodNumber; }, z.core.$strip>, z.ZodObject<{}, z.core.$strip>]>>>; }, z.core.$strip>; declare const getUrlContextMetadataSchema: () => z.ZodObject<{ urlMetadata: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{ retrievedUrl: z.ZodString; urlRetrievalStatus: z.ZodString; }, z.core.$strip>>>>; }, z.core.$strip>; declare const responseSchema: _ai_sdk_provider_utils.LazySchema<{ responseId?: string | null | undefined; candidates?: { content?: Record<string, never> | { parts?: ({ functionCall: { id?: string | null | undefined; name?: string | null | undefined; args?: unknown; partialArgs?: { jsonPath: string; stringValue?: string | null | undefined; numberValue?: number | null | undefined; boolValue?: boolean | null | undefined; nullValue?: unknown; willContinue?: boolean | null | undefined; }[] | null | undefined; willContinue?: boolean | null | undefined; }; thoughtSignature?: string | null | undefined; } | { inlineData: { mimeType: string; data: string; }; thought?: boolean | null | undefined; thoughtSignature?: string | null | undefined; } | { toolCall: { toolType: string; id: string; args?: unknown; }; thoughtSignature?: string | null | undefined; } | { toolResponse: { toolType: string; id: string; response?: unknown; }; thoughtSignature?: string | null | undefined; } | { executableCode?: { language: string; code: string; } | null | undefined; codeExecutionResult?: { outcome: string; output?: string | null | undefined; } | null | undefined; text?: string | null | undefined; thought?: boolean | null | undefined; thoughtSignature?: string | null | undefined; })[] | null | undefined; } | null | undefined; finishReason?: string | null | undefined; finishMessage?: string | null | undefined; safetyRatings?: { category?: string | null | undefined; probability?: string | null | undefined; probabilityScore?: number | null | undefined; severity?: string | null | undefined; severityScore?: number | null | undefined; blocked?: boolean | null | undefined; }[] | null | undefined; groundingMetadata?: { webSearchQueries?: string[] | null | undefined; imageSearchQueries?: string[] | null | undefined; retrievalQueries?: string[] | null | undefined; searchEntryPoint?: { renderedContent: string; } | null | undefined; groundingChunks?: { web?: { uri: string; title?: string | null | undefined; } | null | undefined; image?: { sourceUri: string; imageUri: string; title?: string | null | undefined; domain?: string | null | undefined; } | null | undefined; retrievedContext?: { uri?: string | null | undefined; title?: string | null | undefined; text?: string | null | undefined; fileSearchStore?: string | null | undefined; } | null | undefined; maps?: { uri?: string | null | undefined; title?: string | null | undefined; text?: string | null | undefined; placeId?: string | null | undefined; } | null | undefined; }[] | null | undefined; groundingSupports?: { segment?: { startIndex?: number | null | undefined; endIndex?: number | null | undefined; text?: string | null | undefined; } | null | undefined; segment_text?: string | null | undefined; groundingChunkIndices?: number[] | null | undefined; supportChunkIndices?: number[] | null | undefined; confidenceScores?: number[] | null | undefined; confidenceScore?: number[] | null | undefined; }[] | null | undefined; retrievalMetadata?: Record<string, never> | { webDynamicRetrievalScore: number; } | null | undefined; } | null | undefined; urlContextMetadata?: { urlMetadata?: { retrievedUrl: string; urlRetrievalStatus: string; }[] | null | undefined; } | null | undefined; }[] | null | undefined; usageMetadata?: { [x: string]: unknown; cachedContentTokenCount?: number | null | undefined; thoughtsTokenCount?: number | null | undefined; promptTokenCount?: number | null | undefined; candidatesTokenCount?: number | null | undefined; toolUsePromptTokenCount?: number | null | undefined; totalTokenCount?: number | null | undefined; trafficType?: string | null | undefined; serviceTier?: string | null | undefined; promptTokensDetails?: { [x: string]: unknown; modality: string; tokenCount: number; }[] | null | undefined; cacheTokensDetails?: { [x: string]: unknown; modality: string; tokenCount: number; }[] | null | undefined; candidatesTokensDetails?: { [x: string]: unknown; modality: string; tokenCount: number; }[] | null | undefined; toolUsePromptTokensDetails?: { [x: string]: unknown; modality: string; tokenCount: number; }[] | null | undefined; } | null | undefined; promptFeedback?: { blockReason?: string | null | undefined; safetyRatings?: { category?: string | null | undefined; probability?: string | null | undefined; probabilityScore?: number | null | undefined; severity?: string | null | undefined; severityScore?: number | null | undefined; blocked?: boolean | null | undefined; }[] | null | undefined; } | null | undefined; }>; type CandidateSchema = NonNullable<InferSchema<typeof responseSchema>['candidates']>[number]; type GroundingMetadataSchema = NonNullable<CandidateSchema['groundingMetadata']>; type UrlContextMetadataSchema = NonNullable<CandidateSchema['urlContextMetadata']>; type SafetyRatingSchema = NonNullable<CandidateSchema['safetyRatings']>[number]; type PromptFeedbackSchema = NonNullable<InferSchema<typeof responseSchema>['promptFeedback']>; type UsageMetadataSchema = NonNullable<InferSchema<typeof responseSchema>['usageMetadata']>; type GoogleSpeechModelId = 'gemini-2.5-flash-preview-tts' | 'gemini-2.5-pro-preview-tts' | 'gemini-3.1-flash-tts-preview' | (string & {}); interface GoogleSpeechModelConfig { provider: string; baseURL: string; headers?: Resolvable<Record<string, string | undefined>>; fetch?: FetchFunction; _internal?: { currentDate?: () => Date; }; } declare class GoogleSpeechModel implements SpeechModelV4 { readonly modelId: GoogleSpeechModelId; private readonly config; readonly specificationVersion = "v4"; static [WORKFLOW_SERIALIZE](model: GoogleSpeechModel): { modelId: string; config: _ai_sdk_provider.JSONObject; }; static [WORKFLOW_DESERIALIZE](options: { modelId: GoogleSpeechModelId; config: GoogleSpeechModelConfig; }): GoogleSpeechModel; get provider(): string; constructor(modelId: GoogleSpeechModelId, config: GoogleSpeechModelConfig); private getArgs; doGenerate(options: Parameters<SpeechModelV4['doGenerate']>[0]): Promise<Awaited<ReturnType<SpeechModelV4['doGenerate']>>>; } declare const googleTools: { /** * Creates a Google search tool that gives Google direct access to real-time web content. * Must have name "google_search". */ googleSearch: _ai_sdk_provider_utils.ProviderExecutedToolFactory<{}, {}, { [x: string]: unknown; searchTypes?: { webSearch?: Record<string, never> | undefined; imageSearch?: Record<string, never> | undefined; } | undefined; timeRangeFilter?: { startTime: string; endTime: string; } | undefined; }, {}>; /** * Creates an Enterprise Web Search tool for grounding responses using a compliance-focused web index. * Designed for highly-regulated industries (finance, healthcare, public sector). * Does not log customer data and supports VPC service controls. * Must have name "enterprise_web_search". * * @note Only available on Vertex AI. Requires Gemini 2.0 or newer. * * @see https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/web-grounding-enterprise */ enterpriseWebSearch: _ai_sdk_provider_utils.ProviderExecutedToolFactory<{}, {}, {}, {}>; /** * Creates a Google Maps grounding tool that gives the model access to Google Maps data. * Must have name "google_maps". * * @see https://ai.google.dev/gemini-api/docs/maps-grounding * @see https://cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-google-maps */ googleMaps: _ai_sdk_provider_utils.ProviderExecutedToolFactory<{}, {}, {}, {}>; /** * Creates a URL context tool that gives Google direct access to real-time web content. * Must have name "url_context". */ urlContext: _ai_sdk_provider_utils.ProviderExecutedToolFactory<{}, {}, {}, {}>; /** * Enables Retrieval Augmented Generation (RAG) via the Gemini File Search tool. * Must have name "file_search". * * @param fileSearchStoreNames - Fully-qualified File Search store resource names. * @param metadataFilter - Optional filter expression to restrict the files that can be retrieved. * @param topK - Optional result limit for the number of chunks returned from File Search. * * @see https://ai.google.dev/gemini-api/docs/file-search */ fileSearch: _ai_sdk_provider_utils.ProviderExecutedToolFactory<{}, {}, { [x: string]: unknown; fileSearchStoreNames: string[]; topK?: number | undefined; metadataFilter?: string | undefined; }, {}>; /** * A tool that enables the model to generate and run Python code. * Must have name "code_execution". * * @note Ensure the selected model supports Code Execution. * Multi-tool usage with the code execution tool is typically compatible with Gemini >=2 models. * * @see https://ai.google.dev/gemini-api/docs/code-execution (Google AI) * @see https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/code-execution-api (Vertex AI) */ codeExecution: _ai_sdk_provider_utils.ProviderExecutedToolFactory<{ language: string; code: string; }, { outcome: string; output: string; }, {}, {}>; /** * Creates a Vertex RAG Store tool that enables the model to perform RAG searches against a Vertex RAG Store. * Must have name "vertex_rag_store". */ vertexRagStore: _ai_sdk_provider_utils.ProviderExecutedToolFactory<{}, {}, { ragCorpus: string; topK?: number; }, {}>; }; /** * Type-only union of Gemini model IDs that the Interactions API accepts via * `model:`. Mirrors `Model` from `googleapis/js-genai` * `src/interactions/resources/interactions.ts`. * * Kept as a separate type from `GoogleModelId` even though most IDs overlap; * the two surfaces (`:generateContent` vs `/interactions`) are independent and * may diverge over time. */ type GoogleInteractionsModelId = 'gemini-2.5-computer-use-preview-10-2025' | 'gemini-2.5-flash' | 'gemini-2.5-flash-image' | 'gemini-2.5-flash-lite' | 'gemini-2.5-flash-lite-preview-09-2025' | 'gemini-2.5-flash-native-audio-preview-12-2025' | 'gemini-2.5-flash-preview-09-2025' | 'gemini-2.5-flash-preview-tts' | 'gemini-2.5-pro' | 'gemini-2.5-pro-preview-tts' | 'gemini-3-flash-preview' | 'gemini-3-pro-image-preview' | 'gemini-3-pro-preview' | 'gemini-3.1-pro-preview' | 'gemini-3.1-flash-image-preview' | 'gemini-3.1-flash-lite-preview' | 'gemini-3.1-flash-tts-preview' | 'gemini-3.5-flash' | 'gemini-3.5-flash-lite' | 'gemini-3.6-flash' | 'gemini-3.7-flash' | 'lyria-3-clip-preview' | 'lyria-3-pro-preview' | (string & {}); type GoogleInteractionsConfig = { provider: string; baseURL: string; headers?: Resolvable<Record<string, string | undefined>>; fetch?: FetchFunction; generateId: () => string; supportedUrls?: () => LanguageModelV4['supportedUrls']; }; type GoogleInteractionsModelInput = GoogleInteractionsModelId | { agent: string; } | { managedAgent: string; }; declare class GoogleInteractionsLanguageModel implements LanguageModelV4 { readonly specificationVersion = "v4"; readonly modelId: string; /** * Optional agent name. When provided, the request body sends `agent:` instead * of `model:` and rejects `generation_config` (warned, not thrown). */ readonly agent: string | undefined; private readonly config; static [WORKFLOW_SERIALIZE](model: GoogleInteractionsLanguageModel): { agent: string | undefined; modelId: string; config: _ai_sdk_provider.JSONObject; }; static [WORKFLOW_DESERIALIZE](options: { modelId: string; agent?: string; config: GoogleInteractionsConfig; }): GoogleInteractionsLanguageModel; constructor(modelOrAgent: GoogleInteractionsModelInput, config: GoogleInteractionsConfig); get provider(): string; get supportedUrls(): Record<string, RegExp[]> | PromiseLike<Record<string, RegExp[]>>; private getArgs; doGenerate(options: LanguageModelV4CallOptions): Promise<LanguageModelV4GenerateResult>; doStream(options: LanguageModelV4CallOptions): Promise<LanguageModelV4StreamResult>; private doStreamBackground; } /** * Type-only module: declares the union of supported Gemini Interactions agent * names. Used by the `google.interactions({ agent })` factory branch. * * Strict string-literal union: unknown agent names are a compile-time error. * User-defined agents (created via the `/agents` endpoint) are addressed by * a separate `{ managedAgent: string }` factory shape — see * `GoogleInteractionsModelInput`. */ type GoogleInteractionsAgentName = 'deep-research-pro-preview-12-2025' | 'deep-research-preview-04-2026' | 'deep-research-max-preview-04-2026' | 'antigravity-preview-05-2026'; export { type GoogleInteractionsAgentName, GoogleInteractionsLanguageModel, type GoogleInteractionsModelId, type GoogleInteractionsModelInput, GoogleLanguageModel, type GoogleLanguageModelConfig, type GoogleModelId, GoogleSpeechModel, type GroundingMetadataSchema, type PromptFeedbackSchema, type SafetyRatingSchema, type UrlContextMetadataSchema, type UsageMetadataSchema, getGroundingMetadataSchema, getUrlContextMetadataSchema, googleTools, responseSchema };