@langchain/google 0.2.10 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/chat_models/base.cjs +16 -2
- package/dist/chat_models/base.cjs.map +1 -1
- package/dist/chat_models/base.js +16 -2
- package/dist/chat_models/base.js.map +1 -1
- package/dist/chat_models/profiles.cjs +14 -0
- package/dist/chat_models/profiles.cjs.map +1 -1
- package/dist/chat_models/profiles.js +14 -0
- package/dist/chat_models/profiles.js.map +1 -1
- package/dist/converters/params.cjs +9 -1
- package/dist/converters/params.cjs.map +1 -1
- package/dist/converters/params.js +9 -2
- package/dist/converters/params.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @langchain/google
|
|
2
2
|
|
|
3
|
+
## 0.2.11
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#11940](https://github.com/langchain-ai/langchainjs/pull/11940) [`57d0e02`](https://github.com/langchain-ai/langchainjs/commit/57d0e02b2256da85dec6e5062d3e1bde2271c5de) Thanks [@hntrl](https://github.com/hntrl)! - Support Gemini 4 Argon model capabilities and Gemini 3+ compatibility; preserve usage-only streaming chunks.
|
|
8
|
+
|
|
3
9
|
## 0.2.10
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -92,7 +92,7 @@ var BaseChatGoogle = class extends _langchain_core_language_models_chat_models.B
|
|
|
92
92
|
constructor(params) {
|
|
93
93
|
super(params);
|
|
94
94
|
this.params = params;
|
|
95
|
-
this._addVersion("@langchain/google", "0.2.
|
|
95
|
+
this._addVersion("@langchain/google", "0.2.11");
|
|
96
96
|
if (!params.apiClient) throw new require_errors.ConfigurationError("BaseChatGoogle requires an apiClient. This should be provided automatically by ChatGoogle constructors. If you're extending BaseChatGoogle directly, please provide an apiClient instance.");
|
|
97
97
|
this.apiClient = params.apiClient;
|
|
98
98
|
this.model = params.model;
|
|
@@ -424,7 +424,21 @@ var BaseChatGoogle = class extends _langchain_core_language_models_chat_models.B
|
|
|
424
424
|
return;
|
|
425
425
|
}
|
|
426
426
|
const candidate = chunk.candidates?.[0];
|
|
427
|
-
if (!candidate)
|
|
427
|
+
if (!candidate) {
|
|
428
|
+
if (chunk.usageMetadata && streamUsage) {
|
|
429
|
+
const cumulative = require_messages.convertGeminiGenerateContentResponseToUsageMetadata(chunk);
|
|
430
|
+
controller.enqueue(new _langchain_core_outputs.ChatGenerationChunk({
|
|
431
|
+
text: "",
|
|
432
|
+
message: new _langchain_core_messages.AIMessageChunk({
|
|
433
|
+
content: "",
|
|
434
|
+
response_metadata: { model_provider: "google" },
|
|
435
|
+
usage_metadata: require_metadata.subtractUsageMetadata(cumulative, previousUsage)
|
|
436
|
+
})
|
|
437
|
+
}));
|
|
438
|
+
previousUsage = cumulative;
|
|
439
|
+
}
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
428
442
|
const message = require_messages.convertGeminiCandidateToAIMessage(candidate);
|
|
429
443
|
const text = require_messages.convertAIMessageToText(message);
|
|
430
444
|
const parts = candidate.content?.parts ?? [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.cjs","names":["getEnvironmentVariable","convertParamsToPlatformType","resolveLangSmithGatewayConfig","BaseChatModel","ConfigurationError","PROFILES","convertToolsToGeminiTools","convertToolChoiceToGeminiConfig","mixesBuiltinAndFunctionTools","isInteropZodSchema","isSerializableSchema","toJsonSchema","convertFieldsToThinkingConfig","convertFieldsToSpeechConfig","convertFieldsToServiceTier","settableServiceTier","concat","convertMessagesToGeminiSystemInstruction","convertMessagesToGeminiContents","RequestError","PromptBlockedError","NoCandidatesError","convertGeminiCandidateToAIMessage","convertAIMessageToText","convertGeminiGenerateContentResponseToUsageMetadata","iife","EventSourceParserStream","SafeJsonEventParserStream","convertGoogleGeminiStream","ChatGenerationChunk","AIMessageChunk","convertGeminiPartsToToolCalls","subtractUsageMetadata","RunnableLambda","AIMessage","MalformedOutputError","createContentParser","schemaToGeminiParameters","createFunctionCallingParser","assembleStructuredOutputPipeline"],"sources":["../../src/chat_models/base.ts"],"sourcesContent":["import {\n BaseChatModel,\n type BaseChatModelCallOptions,\n type LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n AIMessage,\n AIMessageChunk,\n AIMessageChunkFields,\n BaseMessage,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { convertGoogleGeminiStream } from \"../utils/stream_events.js\";\nimport { concat } from \"@langchain/core/utils/stream\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { EventSourceParserStream } from \"eventsource-parser/stream\";\nimport type { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport PROFILES from \"./profiles.js\";\nimport type {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { Runnable, RunnableLambda } from \"@langchain/core/runnables\";\nimport {\n toJsonSchema,\n type JsonSchema7Type,\n} from \"@langchain/core/utils/json_schema\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\n\nimport { ApiClient } from \"../clients/index.js\";\nimport { ChatGoogleFields, settableServiceTier } from \"./types.js\";\nimport { SafeJsonEventParserStream } from \"../utils/stream.js\";\nimport {\n convertAIMessageToText,\n convertGeminiCandidateToAIMessage,\n convertGeminiGenerateContentResponseToUsageMetadata,\n convertGeminiPartsToToolCalls,\n convertMessagesToGeminiContents,\n convertMessagesToGeminiSystemInstruction,\n} from \"../converters/messages.js\";\nimport {\n ConfigurationError,\n MalformedOutputError,\n NoCandidatesError,\n PromptBlockedError,\n RequestError,\n} from \"../utils/errors.js\";\nimport {\n convertToolsToGeminiTools,\n convertToolChoiceToGeminiConfig,\n mixesBuiltinAndFunctionTools,\n schemaToGeminiParameters,\n} from \"../converters/tools.js\";\nimport {\n convertParamsToPlatformType,\n convertFieldsToSpeechConfig,\n convertFieldsToThinkingConfig,\n convertFieldsToServiceTier,\n} from \"../converters/params.js\";\nimport { Gemini } from \"./api-types.js\";\nimport { subtractUsageMetadata } from \"../utils/metadata.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\nimport { iife } from \"../utils/misc\";\nimport { resolveLangSmithGatewayConfig } from \"@langchain/core/utils/gateway\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport ServiceTier = Gemini.ServiceTier;\n\nexport type GooglePlatformType = \"gai\" | \"gcp\";\n\nfunction hasVertexCredentials(params: {\n credentials?: unknown;\n googleAuthOptions?: unknown;\n}): boolean {\n return (\n typeof params.credentials !== \"undefined\" ||\n typeof params.googleAuthOptions !== \"undefined\" ||\n typeof getEnvironmentVariable(\"GOOGLE_CLOUD_CREDENTIALS\") !== \"undefined\"\n );\n}\n\n/**\n * Resolves LangSmith gateway routing for Google chat model params.\n *\n * The LangSmith gateway exposes direct paths for the Gemini Developer API and\n * Vertex AI. An explicit `endpoint` suppresses gateway routing.\n *\n * When `LANGSMITH_GATEWAY` is set, this rewrites `endpoint` to the gateway\n * host and lets the gateway key take precedence over the provider key (which\n * then rides as the `x-goog-api-key` header via the ApiClient). The default\n * `https` gateway host is written scheme-less (the URL builders prepend\n * `https://`); a non-`https` custom gateway keeps its scheme so it is not\n * forced to TLS.\n *\n * This function is pure: it never mutates `params`. It returns a new object\n * with the gateway overrides applied when routing is active, or an unchanged\n * shallow copy otherwise.\n *\n * @returns a new params object with gateway routing applied when applicable.\n */\nexport function applyGeminiGatewayParams<\n TParams extends {\n apiKey?: string;\n endpoint?: string;\n platformType?: GooglePlatformType;\n vertexai?: boolean;\n credentials?: unknown;\n googleAuthOptions?: unknown;\n },\n>(params: TParams): TParams & { apiKey?: string; endpoint?: string } {\n if (typeof params.endpoint !== \"undefined\") {\n return { ...params };\n }\n const platform =\n convertParamsToPlatformType(params) ??\n (hasVertexCredentials(params) ? \"gcp\" : \"gai\");\n const gatewayConfig = resolveLangSmithGatewayConfig({\n providerPath: platform === \"gcp\" ? \"vertex\" : \"gemini\",\n });\n if (typeof gatewayConfig.baseURL === \"undefined\") {\n return { ...params };\n }\n\n // A provider key still wins over the gateway key.\n const gatewayUrl = new URL(gatewayConfig.baseURL);\n const path = gatewayUrl.pathname.replace(/\\/+$/, \"\");\n // The URL builders compose `https://${endpoint}/${apiVersion}/...`. For the\n // default `https` gateway, keep the endpoint scheme-less (host + path) so the\n // builder's `https://` prefix produces the right URL. For a non-`https`\n // custom gateway (e.g. `http://localhost:8080`), keep the full scheme so the\n // builder does not force TLS; `buildUrlGemini` skips its prefix when the\n // endpoint already includes a scheme.\n const endpoint =\n gatewayUrl.protocol === \"https:\"\n ? `${gatewayUrl.host}${path}`\n : `${gatewayUrl.protocol}//${gatewayUrl.host}${path}`;\n return {\n ...params,\n apiKey: params.apiKey ?? gatewayConfig.apiKey,\n endpoint,\n platformType: platform,\n };\n}\n\nexport function getPlatformType(\n platform: GooglePlatformType | undefined,\n hasApiKey: boolean\n): GooglePlatformType {\n if (typeof platform !== \"undefined\") {\n return platform;\n } else if (hasApiKey) {\n return \"gai\";\n } else {\n return \"gcp\";\n }\n}\n\nfunction usageMetadataToTokenUsage(usageMetadata: UsageMetadata) {\n return {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n };\n}\n\nfunction mapDetailToMediaResolution(\n detail?: ChatGoogleFields[\"detail\"]\n): Gemini.GenerationConfig[\"mediaResolution\"] | undefined {\n switch (detail) {\n case \"low\":\n return \"MEDIA_RESOLUTION_LOW\";\n case \"high\":\n return \"MEDIA_RESOLUTION_HIGH\";\n default:\n return undefined;\n }\n}\n\nexport interface BaseChatGoogleParams\n extends BaseChatModelParams, ChatGoogleFields {\n /**\n * The name of the Gemini model to use.\n *\n * Example: \"gemini-3-pro-preview\"\n */\n model: string;\n\n /**\n * Optional. The API client implementation for making HTTP requests to the Gemini API.\n * If not set, a default client will be used based on the runtime environment.\n */\n apiClient?: ApiClient;\n\n /**\n * Hostname for the API call (if this is running on GCP)\n * Usually this is computed based on location and platformType.\n **/\n endpoint?: string;\n\n /**\n * Region where the LLM is stored (if this is running on GCP)\n * Defaults to \"global\"\n **/\n location?: string;\n\n /**\n * The version of the API functions. Part of the path.\n * Usually this is computed based on platformType.\n **/\n apiVersion?: string;\n\n /**\n * What platform to run the service on.\n * If not specified, the class should determine this from other\n * means. Either way, the platform actually used will be in\n * the \"platform\" getter.\n */\n platformType?: GooglePlatformType;\n\n /**\n * For compatibility with Google's libraries, should this use Vertex?\n * The \"platformType\" parmeter takes precedence.\n */\n vertexai?: boolean;\n\n /**\n * Backwards compatibility.\n * @deprecated in favor of using `disableStreaming` or `.stream()`\n */\n streaming?: boolean;\n\n streamUsage?: boolean;\n}\n\nexport interface BaseChatGoogleCallOptions\n extends BaseChatModelCallOptions, ChatGoogleFields {}\n\nexport abstract class BaseChatGoogle<\n CallOptions extends BaseChatGoogleCallOptions = BaseChatGoogleCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n model: string;\n\n streaming: boolean;\n\n disableStreaming: boolean;\n\n streamUsage: boolean = true;\n\n protected _platform?: GooglePlatformType;\n\n protected _endpoint?: string;\n\n protected _customHeaders?: Record<string, string>;\n\n protected _location?: string;\n\n protected _apiVersion?: string;\n\n protected apiClient: ApiClient;\n\n constructor(\n protected params: BaseChatGoogleParams & {\n credentials?: unknown;\n googleAuthOptions?: unknown;\n }\n ) {\n super(params);\n this._addVersion(\"@langchain/google\", __PKG_VERSION__);\n\n if (!params.apiClient) {\n throw new ConfigurationError(\n \"BaseChatGoogle requires an apiClient. This should be provided automatically by ChatGoogle constructors. If you're extending BaseChatGoogle directly, please provide an apiClient instance.\"\n );\n }\n this.apiClient = params.apiClient;\n\n this.model = params.model;\n this._platform = convertParamsToPlatformType(params);\n this._endpoint = params.endpoint;\n this._customHeaders = params.customHeaders;\n this._location = params.location;\n this._apiVersion = params.apiVersion;\n\n this.disableStreaming = params?.disableStreaming === true;\n this.streaming = params?.streaming === true;\n if (this.disableStreaming) this.streaming = false;\n // disable streaming in BaseChatModel if explicitly disabled\n if (params?.streaming === false) this.disableStreaming = true;\n\n this.streamUsage = params?.streamUsage ?? this.streamUsage;\n if (this.disableStreaming) this.streamUsage = false;\n }\n\n _llmType(): string {\n return \"google\";\n }\n\n protected get platformType(): GooglePlatformType | undefined {\n return this._platform;\n }\n\n protected get platform(): GooglePlatformType {\n return getPlatformType(this._platform, this.apiClient.hasApiKey());\n }\n\n protected get isVertexExpress(): boolean {\n return (\n this.platform === \"gcp\" &&\n this.apiClient.hasApiKey() &&\n !hasVertexCredentials(this.params)\n );\n }\n\n protected get apiVersion(): string {\n if (typeof this._apiVersion !== \"undefined\") {\n return this._apiVersion;\n } else if (this.platform === \"gai\") {\n return \"v1beta\";\n } else {\n return \"v1\";\n }\n }\n\n protected get location(): string {\n return this._location || \"global\";\n }\n\n protected get endpoint(): string {\n if (typeof this._endpoint !== \"undefined\") {\n return this._endpoint;\n } else if (this.platform === \"gai\") {\n return \"generativelanguage.googleapis.com\";\n } else if (this.isVertexExpress) {\n return \"aiplatform.googleapis.com\";\n } else if (this.location === \"global\") {\n // See https://docs.cloud.google.com/vertex-ai/generative-ai/docs/learn/locations#use_the_global_endpoint\n return \"aiplatform.googleapis.com\";\n } else if (!this.location.includes(\"-\")) {\n return `aiplatform.${this.location}.rep.googleapis.com`;\n } else {\n return `${this.location}-aiplatform.googleapis.com`;\n }\n }\n\n protected get publisher(): string {\n return \"google\";\n }\n\n protected get urlMethod(): string {\n return this.streaming ? \"streamGenerateContent?alt=sse\" : \"generateContent\";\n }\n\n /**\n * Returns the model profile for this instance's model, describing its\n * capabilities and constraints (e.g. max tokens, input/output modalities,\n * tool calling support).\n *\n * @example\n * ```typescript\n * const model = new ChatGoogle({ model: \"gemini-2.5-pro\" });\n * const profile = model.profile;\n * console.log(profile.maxInputTokens); // 1048576\n * console.log(profile.imageInputs); // true\n * ```\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n protected async buildUrlGemini(urlMethod?: string): Promise<string> {\n // `endpoint` is normally scheme-less (e.g. `generativelanguage.googleapis.com`)\n // and defaults to `https`, but a gateway endpoint may already carry a scheme\n // and a base path (e.g. a custom `http://` LangSmith gateway). Let `URL`\n // resolve the scheme so a custom `http://` gateway is not forced to TLS.\n const url = this.endpoint.includes(\"://\")\n ? new URL(this.endpoint)\n : new URL(`https://${this.endpoint}`);\n // `urlMethod` may include a query string (e.g. `streamGenerateContent?alt=sse`);\n // split it out so `URL` keeps it as a query rather than encoding the `?`.\n const [method, search] = (urlMethod ?? this.urlMethod).split(\"?\", 2);\n const basePath = url.pathname.replace(/\\/+$/, \"\");\n url.pathname = `${basePath}/${this.apiVersion}/models/${this.model}:${method}`;\n if (search) {\n url.search = search;\n }\n return url.toString();\n }\n\n protected get endpointUrl(): string {\n return this.endpoint.includes(\"://\")\n ? this.endpoint\n : `https://${this.endpoint}`;\n }\n\n protected async buildUrlVertexExpress(urlMethod?: string): Promise<string> {\n return `${this.endpointUrl}/${this.apiVersion}/publishers/${\n this.publisher\n }/models/${this.model}:${urlMethod ?? this.urlMethod}`;\n }\n\n protected async buildUrlVertexLocation(urlMethod?: string): Promise<string> {\n const projectId = await this.apiClient.getProjectId();\n return `${this.endpointUrl}/${\n this.apiVersion\n }/projects/${projectId}/locations/${this.location}/publishers/${\n this.publisher\n }/models/${this.model}:${urlMethod ?? this.urlMethod}`;\n }\n\n protected async buildUrlVertex(urlMethod?: string): Promise<string> {\n if (this.isVertexExpress) {\n return this.buildUrlVertexExpress(urlMethod);\n } else {\n return this.buildUrlVertexLocation(urlMethod);\n }\n }\n\n protected async buildUrl(urlMethod?: string): Promise<string> {\n switch (this.platform) {\n case \"gai\":\n return this.buildUrlGemini(urlMethod);\n default:\n return this.buildUrlVertex(urlMethod);\n }\n }\n\n override invocationParams(options: this[\"ParsedCallOptions\"]) {\n const fields = combineGoogleChatModelFields(this.params, options);\n const mediaResolution =\n fields.mediaResolution ?? mapDetailToMediaResolution(fields.detail);\n\n // Convert tools to Gemini format\n const tools = fields.tools\n ? convertToolsToGeminiTools(fields.tools)\n : undefined;\n\n // Convert tool choice to Gemini function calling config\n let toolConfig = convertToolChoiceToGeminiConfig(\n options.tool_choice,\n !!(tools && tools.length > 0)\n );\n\n // Gemini rejects a mix of built-in and function-declaration tools unless\n // this is set. See mixesBuiltinAndFunctionTools's docstring.\n if (tools && mixesBuiltinAndFunctionTools(tools)) {\n toolConfig = {\n ...toolConfig,\n includeServerSideToolInvocations: true,\n };\n }\n\n let responseJsonSchema:\n | JsonSchema7Type\n | Record<string, unknown>\n | undefined;\n let responseMimeType: string | undefined;\n\n if (fields.responseSchema) {\n // Convert Zod schema to JSON Schema if needed\n if (\n isInteropZodSchema(fields.responseSchema) ||\n isSerializableSchema(fields.responseSchema)\n ) {\n responseJsonSchema = toJsonSchema(fields.responseSchema);\n } else {\n responseJsonSchema = fields.responseSchema as Record<string, unknown>;\n }\n // Automatically set responseMimeType to \"application/json\" when schema is provided\n responseMimeType = \"application/json\";\n }\n\n return {\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(toolConfig ? { toolConfig } : {}),\n safetySettings: fields.safetySettings,\n generationConfig: {\n temperature: fields.temperature,\n topP: fields.topP,\n topK: fields.topK,\n maxOutputTokens: fields.maxOutputTokens,\n presencePenalty: fields.presencePenalty,\n frequencyPenalty: fields.frequencyPenalty,\n stopSequences: fields.stopSequences,\n ...(responseMimeType ? { responseMimeType } : {}),\n ...(responseJsonSchema ? { responseJsonSchema } : {}),\n ...(fields.responseModalities && fields.responseModalities.length > 0\n ? { responseModalities: fields.responseModalities }\n : {}),\n candidateCount: 1,\n seed: fields.seed,\n responseLogprobs: fields.responseLogprobs,\n logprobs: fields.logprobs,\n ...(fields.enableEnhancedCivicAnswers !== undefined\n ? { enableEnhancedCivicAnswers: fields.enableEnhancedCivicAnswers }\n : {}),\n thinkingConfig: convertFieldsToThinkingConfig(this.model, fields),\n speechConfig: convertFieldsToSpeechConfig(fields),\n ...(fields.imageConfig ? { imageConfig: fields.imageConfig } : {}),\n ...(mediaResolution ? { mediaResolution } : {}),\n },\n ...convertFieldsToServiceTier(this.platform, fields),\n };\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: this.platform === \"gcp\" ? \"google_vertexai\" : \"google_genai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.generationConfig?.temperature ?? undefined,\n ls_max_tokens: params.generationConfig?.maxOutputTokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n getHeaders(options: this[\"ParsedCallOptions\"]): HeadersInit {\n const fields = combineGoogleChatModelFields(this.params, options);\n\n // The priority type is set via header only for Vertex\n const priorityHeaders: Record<string, string> =\n this.platform === \"gcp\" &&\n typeof fields.serviceTier !== \"undefined\" &&\n settableServiceTier.includes(fields.serviceTier)\n ? { \"X-Vertex-AI-LLM-Shared-Request-Type\": fields.serviceTier }\n : {};\n\n return {\n \"Content-Type\": \"application/json\",\n ...priorityHeaders,\n ...this._customHeaders,\n ...options.customHeaders,\n };\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.streaming) {\n const stream = await this._streamResponseChunks(\n messages,\n options,\n runManager\n );\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (\n typeof finalChunk?.message?.content === \"string\" &&\n typeof (\n finalChunk?.message?.additional_kwargs\n ?.originalTextContentBlock as Record<string, unknown>\n )?.text === \"string\"\n ) {\n (\n finalChunk.message.additional_kwargs\n .originalTextContentBlock as Record<string, unknown>\n ).text = finalChunk.message.content;\n }\n const usageMetadata = finalChunk?.message?.usage_metadata;\n return {\n generations: finalChunk ? [finalChunk] : [],\n ...(usageMetadata\n ? {\n llmOutput: {\n tokenUsage: usageMetadataToTokenUsage(usageMetadata),\n usageMetadata,\n },\n }\n : {}),\n };\n }\n\n const url = await this.buildUrl();\n const headers = this.getHeaders(options);\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const moduleName = this.constructor.name;\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n url,\n headers,\n body,\n });\n\n let response: Response;\n try {\n response = await this.caller.callWithOptions(\n { signal: options.signal, maxRetries: options.maxRetries },\n async () => {\n const nextResponse = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!nextResponse.ok) {\n throw await RequestError.fromResponse(nextResponse);\n }\n\n return nextResponse;\n }\n );\n } catch (error) {\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n error,\n });\n throw error;\n }\n\n const data: Gemini.GenerateContentResponse = await response.json();\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n data,\n url: response.url,\n headers: Array.from(response.headers.entries()),\n status: response.status,\n statusText: response.statusText,\n });\n\n // Check for prompt feedback errors\n if (data.promptFeedback?.blockReason) {\n throw PromptBlockedError.fromPromptFeedback(data.promptFeedback);\n }\n\n // Check if we have candidates\n if (!data.candidates || data.candidates.length === 0) {\n throw new NoCandidatesError();\n }\n\n // Use the first candidate\n const candidate = data.candidates[0];\n const message = convertGeminiCandidateToAIMessage(candidate);\n\n // Extract text content from the message\n const text = convertAIMessageToText(message);\n\n const usageMetadata =\n convertGeminiGenerateContentResponseToUsageMetadata(data);\n message.usage_metadata = usageMetadata;\n\n const serviceTier: ServiceTier = iife((): ServiceTier => {\n // @ts-expect-error - trafficType is defined on Vertex, so isn't in the OpenAPI spec\n const trafficType: string | undefined = data.usageMetadata?.trafficType;\n\n // AI Studio replies with actual service type in the header\n const serviceTierHeader: string | null = response.headers.get(\n \"x-gemini-service-tier\"\n );\n\n if (trafficType?.startsWith(\"ON_DEMAND_\")) {\n return trafficType?.substring(\"ON_DEMAND_\".length).toLowerCase();\n }\n return serviceTierHeader || \"standard\";\n });\n\n return {\n generations: [\n {\n text,\n message,\n generationInfo: {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n safetyRatings: candidate.safetyRatings,\n citationMetadata: candidate.citationMetadata,\n tokenCount: candidate.tokenCount,\n },\n },\n ],\n llmOutput: {\n tokenUsage: usageMetadataToTokenUsage(usageMetadata),\n model: data.modelVersion,\n responseId: data.responseId,\n usageMetadata,\n serviceTier,\n },\n };\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const url = await this.buildUrl(\"streamGenerateContent?alt=sse\");\n const headers = this.getHeaders(options);\n\n const response = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!response.ok) {\n throw await RequestError.fromResponse(response);\n }\n\n if (!response.body) {\n return;\n }\n\n const eventStream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new SafeJsonEventParserStream<Gemini.GenerateContentResponse>()\n );\n\n const shouldStreamUsage =\n this.streamUsage !== false && options.streamUsage !== false;\n\n async function* geminiChunks(\n stream: ReadableStream<Gemini.GenerateContentResponse | null>,\n signal?: AbortSignal\n ) {\n const reader = stream.getReader();\n try {\n while (true) {\n if (signal?.aborted) {\n return;\n }\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (value !== null) {\n yield value;\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n yield* convertGoogleGeminiStream(\n geminiChunks(eventStream, options.signal),\n {\n streamUsage: shouldStreamUsage,\n }\n );\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamUsage: boolean = this.streamUsage ?? true;\n\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const url = await this.buildUrl(\"streamGenerateContent?alt=sse\");\n const headers = this.getHeaders(options);\n const moduleName = this.constructor.name;\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n url,\n headers,\n body,\n });\n\n let response: Response;\n try {\n response = await this.caller.callWithOptions(\n { signal: options.signal, maxRetries: options.maxRetries },\n async () => {\n const nextResponse = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!nextResponse.ok) {\n throw await RequestError.fromResponse(nextResponse);\n }\n\n return nextResponse;\n }\n );\n } catch (error) {\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n error,\n });\n throw error;\n }\n\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n url: response.url,\n headers: response.headers,\n status: response.status,\n statusText: response.statusText,\n });\n\n if (response.body) {\n let previousUsage: UsageMetadata | undefined;\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new SafeJsonEventParserStream<Gemini.GenerateContentResponse>()\n )\n .pipeThrough(\n new TransformStream<\n Gemini.GenerateContentResponse,\n ChatGenerationChunk\n >({\n transform(chunk, controller) {\n // oxlint-disable-next-line no-void\n void runManager?.handleCustomEvent(`google-chunk-${moduleName}`, {\n chunk,\n });\n if (chunk === null) {\n controller.enqueue(\n new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({ content: \"\" }),\n generationInfo: { finishReason: \"stop\" },\n })\n );\n return;\n }\n\n // Extract text delta from the chunk\n const candidate = chunk.candidates?.[0];\n if (!candidate) {\n return;\n }\n\n const message = convertGeminiCandidateToAIMessage(candidate);\n const text = convertAIMessageToText(message);\n\n const parts = candidate.content?.parts ?? [];\n const toolCalls = convertGeminiPartsToToolCalls(parts);\n\n // Only emit if we have content\n if (parts.length > 0 || candidate.finishReason) {\n const messageChunkParams: AIMessageChunkFields = {\n content: message.content,\n tool_calls: toolCalls,\n response_metadata: {\n model_provider: \"google\",\n },\n additional_kwargs: {\n ...(message.additional_kwargs.originalTextContentBlock\n ? {\n originalTextContentBlock:\n message.additional_kwargs.originalTextContentBlock,\n }\n : {}),\n ...(candidate.finishReason\n ? {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n }\n : {}),\n },\n };\n\n if (chunk?.usageMetadata && streamUsage) {\n const cumulative =\n convertGeminiGenerateContentResponseToUsageMetadata(chunk);\n messageChunkParams.usage_metadata = subtractUsageMetadata(\n cumulative,\n previousUsage\n );\n previousUsage = cumulative;\n }\n const messageChunk = new AIMessageChunk(messageChunkParams);\n\n controller.enqueue(\n new ChatGenerationChunk({\n text: text,\n message: messageChunk,\n generationInfo: {\n ...(candidate.finishReason && {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n }),\n ...(candidate.safetyRatings && {\n safetyRatings: candidate.safetyRatings,\n }),\n ...(candidate.citationMetadata && {\n citationMetadata: candidate.citationMetadata,\n }),\n ...(candidate.groundingMetadata && {\n groundingMetadata: candidate.groundingMetadata,\n // Support entries for the first content part only (matches messages.ts).\n groundingSupport:\n candidate.groundingMetadata.groundingSupports?.filter(\n (s) => (s?.segment?.partIndex ?? 0) === 0\n ),\n }),\n },\n })\n );\n }\n },\n })\n );\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n await runManager?.handleLLMNewToken(\n value.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: value }\n );\n }\n } finally {\n reader.releaseLock();\n }\n }\n }\n\n /**\n * Bind tool-like objects to this chat model.\n *\n * @param tools A list of tool definitions to bind to this chat model.\n * Can be a structured tool, an OpenAI formatted tool, or a Gemini function declaration.\n * @param kwargs Any additional parameters to bind.\n */\n bindTools(\n tools: BindToolsInput[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseMessage[], AIMessageChunk, CallOptions> {\n return this.withConfig({\n ...kwargs,\n tools,\n } as Partial<CallOptions>);\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n /**\n * Get structured output from the model based on a schema.\n *\n * This method supports two modes:\n * - `jsonMode`: Uses `responseSchema` to get JSON responses directly (preferred for structured outputs)\n * - `functionCalling`: Uses function calling with tools (default, for compatibility)\n *\n * @param outputSchema - The schema to use for structured output (Zod schema or JSON Schema)\n * @param config - Configuration options including method and whether to include raw response\n * @returns A Runnable that returns the parsed structured output\n */\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n let llm: Runnable<BaseMessage[], AIMessageChunk, CallOptions>;\n let outputParser: Runnable<BaseMessage, RunOutput>;\n\n const { schema, name, includeRaw } = {\n ...config,\n schema: outputSchema,\n };\n let method = config?.method ?? \"functionCalling\";\n\n if (method === \"jsonMode\") {\n console.warn(\n `\"jsonMode\" is not supported for Google models. Falling back to \"jsonSchema\".`\n );\n method = \"jsonSchema\";\n }\n\n if (method === \"jsonSchema\") {\n // Use JSON mode with responseSchema\n llm = this.withConfig({\n responseSchema: schema,\n } as Partial<CallOptions>);\n\n outputParser = RunnableLambda.from<BaseMessage, RunOutput>(\n async (input: BaseMessage): Promise<RunOutput> => {\n if (\n !AIMessage.isInstance(input) &&\n !AIMessageChunk.isInstance(input)\n ) {\n throw new MalformedOutputError({\n message: \"Input is not an AIMessage or AIMessageChunk.\",\n });\n }\n\n if (!input.text) {\n throw new MalformedOutputError({\n message:\n \"No content found in response. Cannot parse structured output.\",\n });\n }\n\n // Parse JSON and validate with schema\n const parser = createContentParser(schema);\n return await parser.parse(input.text);\n }\n );\n } else if (method === \"functionCalling\") {\n // Use function calling mode\n let functionName = name ?? \"extract\";\n let geminiFunctionDeclaration: Gemini.Tools.FunctionDeclaration;\n\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n const description =\n typeof jsonSchema.description === \"string\"\n ? jsonSchema.description\n : \"A function available to call.\";\n geminiFunctionDeclaration = {\n name: functionName,\n description,\n parameters: jsonSchema as Gemini.Tools.Schema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDeclaration = schema as Gemini.Tools.FunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters\n const parameters = schemaToGeminiParameters(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description: (schema as { description?: string }).description ?? \"\",\n parameters,\n };\n }\n\n const tools: Gemini.Tool[] = [\n {\n functionDeclarations: [geminiFunctionDeclaration],\n },\n ];\n llm = this.bindTools(tools).withConfig({\n tool_choice: functionName,\n } as Partial<CallOptions>);\n\n outputParser = createFunctionCallingParser(schema, functionName);\n } else {\n throw new ConfigurationError(\n `Unrecognized structured output method '${method}'. Expected 'functionCalling' or 'jsonSchema'`\n );\n }\n\n return assembleStructuredOutputPipeline(\n llm,\n outputParser,\n includeRaw,\n includeRaw\n ? \"ChatGoogleStructuredOutputRunnable\"\n : \"ChatGoogleStructuredOutput\"\n );\n }\n}\n\ntype CombinableFields = Omit<BaseChatGoogleParams, \"model\">;\n\nexport function combineGoogleChatModelFields(\n a: CombinableFields,\n b: CombinableFields,\n ...rest: CombinableFields[]\n): CombinableFields {\n const combined: CombinableFields = {\n temperature: b.temperature ?? a.temperature,\n topP: b.topP ?? a.topP,\n topK: b.topK ?? a.topK,\n maxOutputTokens: b.maxOutputTokens ?? a.maxOutputTokens,\n presencePenalty: b.presencePenalty ?? a.presencePenalty,\n frequencyPenalty: b.frequencyPenalty ?? a.frequencyPenalty,\n stopSequences: b.stopSequences ?? a.stopSequences,\n seed: b.seed ?? a.seed,\n responseLogprobs: b.responseLogprobs ?? a.responseLogprobs,\n logprobs: b.logprobs ?? a.logprobs,\n safetySettings: b.safetySettings ?? a.safetySettings,\n responseSchema: b.responseSchema ?? a.responseSchema,\n tools: b.tools ?? a.tools,\n responseModalities: b.responseModalities ?? a.responseModalities,\n enableEnhancedCivicAnswers:\n b.enableEnhancedCivicAnswers ?? a.enableEnhancedCivicAnswers,\n speechConfig: b.speechConfig ?? a.speechConfig,\n imageConfig: b.imageConfig ?? a.imageConfig,\n mediaResolution: b.mediaResolution ?? a.mediaResolution,\n detail: b.detail ?? a.detail,\n maxReasoningTokens: b.maxReasoningTokens ?? a.maxReasoningTokens,\n thinkingBudget: b.thinkingBudget ?? a.thinkingBudget,\n reasoningEffort: b.reasoningEffort ?? a.reasoningEffort,\n thinkingLevel: b.thinkingLevel ?? a.thinkingLevel,\n serviceTier: b.serviceTier ?? a.serviceTier,\n };\n if (rest.length > 0) {\n return combineGoogleChatModelFields(combined, rest[0], ...rest.slice(1));\n }\n return combined;\n}\n\nexport function getGoogleChatModelParams<TParams extends BaseChatGoogleParams>(\n modelOrParams: string | TParams,\n paramsArg?: Omit<TParams, \"model\">\n): TParams {\n const model =\n typeof modelOrParams === \"string\" ? modelOrParams : modelOrParams.model;\n const params = typeof modelOrParams === \"string\" ? paramsArg : modelOrParams;\n return { model, ...params } as TParams;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base.cjs","names":["getEnvironmentVariable","convertParamsToPlatformType","resolveLangSmithGatewayConfig","BaseChatModel","ConfigurationError","PROFILES","convertToolsToGeminiTools","convertToolChoiceToGeminiConfig","mixesBuiltinAndFunctionTools","isInteropZodSchema","isSerializableSchema","toJsonSchema","convertFieldsToThinkingConfig","convertFieldsToSpeechConfig","convertFieldsToServiceTier","settableServiceTier","concat","convertMessagesToGeminiSystemInstruction","convertMessagesToGeminiContents","RequestError","PromptBlockedError","NoCandidatesError","convertGeminiCandidateToAIMessage","convertAIMessageToText","convertGeminiGenerateContentResponseToUsageMetadata","iife","EventSourceParserStream","SafeJsonEventParserStream","convertGoogleGeminiStream","ChatGenerationChunk","AIMessageChunk","subtractUsageMetadata","convertGeminiPartsToToolCalls","RunnableLambda","AIMessage","MalformedOutputError","createContentParser","schemaToGeminiParameters","createFunctionCallingParser","assembleStructuredOutputPipeline"],"sources":["../../src/chat_models/base.ts"],"sourcesContent":["import {\n BaseChatModel,\n type BaseChatModelCallOptions,\n type LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n AIMessage,\n AIMessageChunk,\n AIMessageChunkFields,\n BaseMessage,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { convertGoogleGeminiStream } from \"../utils/stream_events.js\";\nimport { concat } from \"@langchain/core/utils/stream\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { EventSourceParserStream } from \"eventsource-parser/stream\";\nimport type { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport PROFILES from \"./profiles.js\";\nimport type {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { Runnable, RunnableLambda } from \"@langchain/core/runnables\";\nimport {\n toJsonSchema,\n type JsonSchema7Type,\n} from \"@langchain/core/utils/json_schema\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\n\nimport { ApiClient } from \"../clients/index.js\";\nimport { ChatGoogleFields, settableServiceTier } from \"./types.js\";\nimport { SafeJsonEventParserStream } from \"../utils/stream.js\";\nimport {\n convertAIMessageToText,\n convertGeminiCandidateToAIMessage,\n convertGeminiGenerateContentResponseToUsageMetadata,\n convertGeminiPartsToToolCalls,\n convertMessagesToGeminiContents,\n convertMessagesToGeminiSystemInstruction,\n} from \"../converters/messages.js\";\nimport {\n ConfigurationError,\n MalformedOutputError,\n NoCandidatesError,\n PromptBlockedError,\n RequestError,\n} from \"../utils/errors.js\";\nimport {\n convertToolsToGeminiTools,\n convertToolChoiceToGeminiConfig,\n mixesBuiltinAndFunctionTools,\n schemaToGeminiParameters,\n} from \"../converters/tools.js\";\nimport {\n convertParamsToPlatformType,\n convertFieldsToSpeechConfig,\n convertFieldsToThinkingConfig,\n convertFieldsToServiceTier,\n} from \"../converters/params.js\";\nimport { Gemini } from \"./api-types.js\";\nimport { subtractUsageMetadata } from \"../utils/metadata.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\nimport { iife } from \"../utils/misc\";\nimport { resolveLangSmithGatewayConfig } from \"@langchain/core/utils/gateway\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport ServiceTier = Gemini.ServiceTier;\n\nexport type GooglePlatformType = \"gai\" | \"gcp\";\n\nfunction hasVertexCredentials(params: {\n credentials?: unknown;\n googleAuthOptions?: unknown;\n}): boolean {\n return (\n typeof params.credentials !== \"undefined\" ||\n typeof params.googleAuthOptions !== \"undefined\" ||\n typeof getEnvironmentVariable(\"GOOGLE_CLOUD_CREDENTIALS\") !== \"undefined\"\n );\n}\n\n/**\n * Resolves LangSmith gateway routing for Google chat model params.\n *\n * The LangSmith gateway exposes direct paths for the Gemini Developer API and\n * Vertex AI. An explicit `endpoint` suppresses gateway routing.\n *\n * When `LANGSMITH_GATEWAY` is set, this rewrites `endpoint` to the gateway\n * host and lets the gateway key take precedence over the provider key (which\n * then rides as the `x-goog-api-key` header via the ApiClient). The default\n * `https` gateway host is written scheme-less (the URL builders prepend\n * `https://`); a non-`https` custom gateway keeps its scheme so it is not\n * forced to TLS.\n *\n * This function is pure: it never mutates `params`. It returns a new object\n * with the gateway overrides applied when routing is active, or an unchanged\n * shallow copy otherwise.\n *\n * @returns a new params object with gateway routing applied when applicable.\n */\nexport function applyGeminiGatewayParams<\n TParams extends {\n apiKey?: string;\n endpoint?: string;\n platformType?: GooglePlatformType;\n vertexai?: boolean;\n credentials?: unknown;\n googleAuthOptions?: unknown;\n },\n>(params: TParams): TParams & { apiKey?: string; endpoint?: string } {\n if (typeof params.endpoint !== \"undefined\") {\n return { ...params };\n }\n const platform =\n convertParamsToPlatformType(params) ??\n (hasVertexCredentials(params) ? \"gcp\" : \"gai\");\n const gatewayConfig = resolveLangSmithGatewayConfig({\n providerPath: platform === \"gcp\" ? \"vertex\" : \"gemini\",\n });\n if (typeof gatewayConfig.baseURL === \"undefined\") {\n return { ...params };\n }\n\n // A provider key still wins over the gateway key.\n const gatewayUrl = new URL(gatewayConfig.baseURL);\n const path = gatewayUrl.pathname.replace(/\\/+$/, \"\");\n // The URL builders compose `https://${endpoint}/${apiVersion}/...`. For the\n // default `https` gateway, keep the endpoint scheme-less (host + path) so the\n // builder's `https://` prefix produces the right URL. For a non-`https`\n // custom gateway (e.g. `http://localhost:8080`), keep the full scheme so the\n // builder does not force TLS; `buildUrlGemini` skips its prefix when the\n // endpoint already includes a scheme.\n const endpoint =\n gatewayUrl.protocol === \"https:\"\n ? `${gatewayUrl.host}${path}`\n : `${gatewayUrl.protocol}//${gatewayUrl.host}${path}`;\n return {\n ...params,\n apiKey: params.apiKey ?? gatewayConfig.apiKey,\n endpoint,\n platformType: platform,\n };\n}\n\nexport function getPlatformType(\n platform: GooglePlatformType | undefined,\n hasApiKey: boolean\n): GooglePlatformType {\n if (typeof platform !== \"undefined\") {\n return platform;\n } else if (hasApiKey) {\n return \"gai\";\n } else {\n return \"gcp\";\n }\n}\n\nfunction usageMetadataToTokenUsage(usageMetadata: UsageMetadata) {\n return {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n };\n}\n\nfunction mapDetailToMediaResolution(\n detail?: ChatGoogleFields[\"detail\"]\n): Gemini.GenerationConfig[\"mediaResolution\"] | undefined {\n switch (detail) {\n case \"low\":\n return \"MEDIA_RESOLUTION_LOW\";\n case \"high\":\n return \"MEDIA_RESOLUTION_HIGH\";\n default:\n return undefined;\n }\n}\n\nexport interface BaseChatGoogleParams\n extends BaseChatModelParams, ChatGoogleFields {\n /**\n * The name of the Gemini model to use.\n *\n * Example: \"gemini-3-pro-preview\"\n */\n model: string;\n\n /**\n * Optional. The API client implementation for making HTTP requests to the Gemini API.\n * If not set, a default client will be used based on the runtime environment.\n */\n apiClient?: ApiClient;\n\n /**\n * Hostname for the API call (if this is running on GCP)\n * Usually this is computed based on location and platformType.\n **/\n endpoint?: string;\n\n /**\n * Region where the LLM is stored (if this is running on GCP)\n * Defaults to \"global\"\n **/\n location?: string;\n\n /**\n * The version of the API functions. Part of the path.\n * Usually this is computed based on platformType.\n **/\n apiVersion?: string;\n\n /**\n * What platform to run the service on.\n * If not specified, the class should determine this from other\n * means. Either way, the platform actually used will be in\n * the \"platform\" getter.\n */\n platformType?: GooglePlatformType;\n\n /**\n * For compatibility with Google's libraries, should this use Vertex?\n * The \"platformType\" parmeter takes precedence.\n */\n vertexai?: boolean;\n\n /**\n * Backwards compatibility.\n * @deprecated in favor of using `disableStreaming` or `.stream()`\n */\n streaming?: boolean;\n\n streamUsage?: boolean;\n}\n\nexport interface BaseChatGoogleCallOptions\n extends BaseChatModelCallOptions, ChatGoogleFields {}\n\nexport abstract class BaseChatGoogle<\n CallOptions extends BaseChatGoogleCallOptions = BaseChatGoogleCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n model: string;\n\n streaming: boolean;\n\n disableStreaming: boolean;\n\n streamUsage: boolean = true;\n\n protected _platform?: GooglePlatformType;\n\n protected _endpoint?: string;\n\n protected _customHeaders?: Record<string, string>;\n\n protected _location?: string;\n\n protected _apiVersion?: string;\n\n protected apiClient: ApiClient;\n\n constructor(\n protected params: BaseChatGoogleParams & {\n credentials?: unknown;\n googleAuthOptions?: unknown;\n }\n ) {\n super(params);\n this._addVersion(\"@langchain/google\", __PKG_VERSION__);\n\n if (!params.apiClient) {\n throw new ConfigurationError(\n \"BaseChatGoogle requires an apiClient. This should be provided automatically by ChatGoogle constructors. If you're extending BaseChatGoogle directly, please provide an apiClient instance.\"\n );\n }\n this.apiClient = params.apiClient;\n\n this.model = params.model;\n this._platform = convertParamsToPlatformType(params);\n this._endpoint = params.endpoint;\n this._customHeaders = params.customHeaders;\n this._location = params.location;\n this._apiVersion = params.apiVersion;\n\n this.disableStreaming = params?.disableStreaming === true;\n this.streaming = params?.streaming === true;\n if (this.disableStreaming) this.streaming = false;\n // disable streaming in BaseChatModel if explicitly disabled\n if (params?.streaming === false) this.disableStreaming = true;\n\n this.streamUsage = params?.streamUsage ?? this.streamUsage;\n if (this.disableStreaming) this.streamUsage = false;\n }\n\n _llmType(): string {\n return \"google\";\n }\n\n protected get platformType(): GooglePlatformType | undefined {\n return this._platform;\n }\n\n protected get platform(): GooglePlatformType {\n return getPlatformType(this._platform, this.apiClient.hasApiKey());\n }\n\n protected get isVertexExpress(): boolean {\n return (\n this.platform === \"gcp\" &&\n this.apiClient.hasApiKey() &&\n !hasVertexCredentials(this.params)\n );\n }\n\n protected get apiVersion(): string {\n if (typeof this._apiVersion !== \"undefined\") {\n return this._apiVersion;\n } else if (this.platform === \"gai\") {\n return \"v1beta\";\n } else {\n return \"v1\";\n }\n }\n\n protected get location(): string {\n return this._location || \"global\";\n }\n\n protected get endpoint(): string {\n if (typeof this._endpoint !== \"undefined\") {\n return this._endpoint;\n } else if (this.platform === \"gai\") {\n return \"generativelanguage.googleapis.com\";\n } else if (this.isVertexExpress) {\n return \"aiplatform.googleapis.com\";\n } else if (this.location === \"global\") {\n // See https://docs.cloud.google.com/vertex-ai/generative-ai/docs/learn/locations#use_the_global_endpoint\n return \"aiplatform.googleapis.com\";\n } else if (!this.location.includes(\"-\")) {\n return `aiplatform.${this.location}.rep.googleapis.com`;\n } else {\n return `${this.location}-aiplatform.googleapis.com`;\n }\n }\n\n protected get publisher(): string {\n return \"google\";\n }\n\n protected get urlMethod(): string {\n return this.streaming ? \"streamGenerateContent?alt=sse\" : \"generateContent\";\n }\n\n /**\n * Returns the model profile for this instance's model, describing its\n * capabilities and constraints (e.g. max tokens, input/output modalities,\n * tool calling support).\n *\n * @example\n * ```typescript\n * const model = new ChatGoogle({ model: \"gemini-2.5-pro\" });\n * const profile = model.profile;\n * console.log(profile.maxInputTokens); // 1048576\n * console.log(profile.imageInputs); // true\n * ```\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n protected async buildUrlGemini(urlMethod?: string): Promise<string> {\n // `endpoint` is normally scheme-less (e.g. `generativelanguage.googleapis.com`)\n // and defaults to `https`, but a gateway endpoint may already carry a scheme\n // and a base path (e.g. a custom `http://` LangSmith gateway). Let `URL`\n // resolve the scheme so a custom `http://` gateway is not forced to TLS.\n const url = this.endpoint.includes(\"://\")\n ? new URL(this.endpoint)\n : new URL(`https://${this.endpoint}`);\n // `urlMethod` may include a query string (e.g. `streamGenerateContent?alt=sse`);\n // split it out so `URL` keeps it as a query rather than encoding the `?`.\n const [method, search] = (urlMethod ?? this.urlMethod).split(\"?\", 2);\n const basePath = url.pathname.replace(/\\/+$/, \"\");\n url.pathname = `${basePath}/${this.apiVersion}/models/${this.model}:${method}`;\n if (search) {\n url.search = search;\n }\n return url.toString();\n }\n\n protected get endpointUrl(): string {\n return this.endpoint.includes(\"://\")\n ? this.endpoint\n : `https://${this.endpoint}`;\n }\n\n protected async buildUrlVertexExpress(urlMethod?: string): Promise<string> {\n return `${this.endpointUrl}/${this.apiVersion}/publishers/${\n this.publisher\n }/models/${this.model}:${urlMethod ?? this.urlMethod}`;\n }\n\n protected async buildUrlVertexLocation(urlMethod?: string): Promise<string> {\n const projectId = await this.apiClient.getProjectId();\n return `${this.endpointUrl}/${\n this.apiVersion\n }/projects/${projectId}/locations/${this.location}/publishers/${\n this.publisher\n }/models/${this.model}:${urlMethod ?? this.urlMethod}`;\n }\n\n protected async buildUrlVertex(urlMethod?: string): Promise<string> {\n if (this.isVertexExpress) {\n return this.buildUrlVertexExpress(urlMethod);\n } else {\n return this.buildUrlVertexLocation(urlMethod);\n }\n }\n\n protected async buildUrl(urlMethod?: string): Promise<string> {\n switch (this.platform) {\n case \"gai\":\n return this.buildUrlGemini(urlMethod);\n default:\n return this.buildUrlVertex(urlMethod);\n }\n }\n\n override invocationParams(options: this[\"ParsedCallOptions\"]) {\n const fields = combineGoogleChatModelFields(this.params, options);\n const mediaResolution =\n fields.mediaResolution ?? mapDetailToMediaResolution(fields.detail);\n\n // Convert tools to Gemini format\n const tools = fields.tools\n ? convertToolsToGeminiTools(fields.tools)\n : undefined;\n\n // Convert tool choice to Gemini function calling config\n let toolConfig = convertToolChoiceToGeminiConfig(\n options.tool_choice,\n !!(tools && tools.length > 0)\n );\n\n // Gemini rejects a mix of built-in and function-declaration tools unless\n // this is set. See mixesBuiltinAndFunctionTools's docstring.\n if (tools && mixesBuiltinAndFunctionTools(tools)) {\n toolConfig = {\n ...toolConfig,\n includeServerSideToolInvocations: true,\n };\n }\n\n let responseJsonSchema:\n | JsonSchema7Type\n | Record<string, unknown>\n | undefined;\n let responseMimeType: string | undefined;\n\n if (fields.responseSchema) {\n // Convert Zod schema to JSON Schema if needed\n if (\n isInteropZodSchema(fields.responseSchema) ||\n isSerializableSchema(fields.responseSchema)\n ) {\n responseJsonSchema = toJsonSchema(fields.responseSchema);\n } else {\n responseJsonSchema = fields.responseSchema as Record<string, unknown>;\n }\n // Automatically set responseMimeType to \"application/json\" when schema is provided\n responseMimeType = \"application/json\";\n }\n\n return {\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(toolConfig ? { toolConfig } : {}),\n safetySettings: fields.safetySettings,\n generationConfig: {\n temperature: fields.temperature,\n topP: fields.topP,\n topK: fields.topK,\n maxOutputTokens: fields.maxOutputTokens,\n presencePenalty: fields.presencePenalty,\n frequencyPenalty: fields.frequencyPenalty,\n stopSequences: fields.stopSequences,\n ...(responseMimeType ? { responseMimeType } : {}),\n ...(responseJsonSchema ? { responseJsonSchema } : {}),\n ...(fields.responseModalities && fields.responseModalities.length > 0\n ? { responseModalities: fields.responseModalities }\n : {}),\n candidateCount: 1,\n seed: fields.seed,\n responseLogprobs: fields.responseLogprobs,\n logprobs: fields.logprobs,\n ...(fields.enableEnhancedCivicAnswers !== undefined\n ? { enableEnhancedCivicAnswers: fields.enableEnhancedCivicAnswers }\n : {}),\n thinkingConfig: convertFieldsToThinkingConfig(this.model, fields),\n speechConfig: convertFieldsToSpeechConfig(fields),\n ...(fields.imageConfig ? { imageConfig: fields.imageConfig } : {}),\n ...(mediaResolution ? { mediaResolution } : {}),\n },\n ...convertFieldsToServiceTier(this.platform, fields),\n };\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: this.platform === \"gcp\" ? \"google_vertexai\" : \"google_genai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.generationConfig?.temperature ?? undefined,\n ls_max_tokens: params.generationConfig?.maxOutputTokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n getHeaders(options: this[\"ParsedCallOptions\"]): HeadersInit {\n const fields = combineGoogleChatModelFields(this.params, options);\n\n // The priority type is set via header only for Vertex\n const priorityHeaders: Record<string, string> =\n this.platform === \"gcp\" &&\n typeof fields.serviceTier !== \"undefined\" &&\n settableServiceTier.includes(fields.serviceTier)\n ? { \"X-Vertex-AI-LLM-Shared-Request-Type\": fields.serviceTier }\n : {};\n\n return {\n \"Content-Type\": \"application/json\",\n ...priorityHeaders,\n ...this._customHeaders,\n ...options.customHeaders,\n };\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.streaming) {\n const stream = await this._streamResponseChunks(\n messages,\n options,\n runManager\n );\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (\n typeof finalChunk?.message?.content === \"string\" &&\n typeof (\n finalChunk?.message?.additional_kwargs\n ?.originalTextContentBlock as Record<string, unknown>\n )?.text === \"string\"\n ) {\n (\n finalChunk.message.additional_kwargs\n .originalTextContentBlock as Record<string, unknown>\n ).text = finalChunk.message.content;\n }\n const usageMetadata = finalChunk?.message?.usage_metadata;\n return {\n generations: finalChunk ? [finalChunk] : [],\n ...(usageMetadata\n ? {\n llmOutput: {\n tokenUsage: usageMetadataToTokenUsage(usageMetadata),\n usageMetadata,\n },\n }\n : {}),\n };\n }\n\n const url = await this.buildUrl();\n const headers = this.getHeaders(options);\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const moduleName = this.constructor.name;\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n url,\n headers,\n body,\n });\n\n let response: Response;\n try {\n response = await this.caller.callWithOptions(\n { signal: options.signal, maxRetries: options.maxRetries },\n async () => {\n const nextResponse = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!nextResponse.ok) {\n throw await RequestError.fromResponse(nextResponse);\n }\n\n return nextResponse;\n }\n );\n } catch (error) {\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n error,\n });\n throw error;\n }\n\n const data: Gemini.GenerateContentResponse = await response.json();\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n data,\n url: response.url,\n headers: Array.from(response.headers.entries()),\n status: response.status,\n statusText: response.statusText,\n });\n\n // Check for prompt feedback errors\n if (data.promptFeedback?.blockReason) {\n throw PromptBlockedError.fromPromptFeedback(data.promptFeedback);\n }\n\n // Check if we have candidates\n if (!data.candidates || data.candidates.length === 0) {\n throw new NoCandidatesError();\n }\n\n // Use the first candidate\n const candidate = data.candidates[0];\n const message = convertGeminiCandidateToAIMessage(candidate);\n\n // Extract text content from the message\n const text = convertAIMessageToText(message);\n\n const usageMetadata =\n convertGeminiGenerateContentResponseToUsageMetadata(data);\n message.usage_metadata = usageMetadata;\n\n const serviceTier: ServiceTier = iife((): ServiceTier => {\n // @ts-expect-error - trafficType is defined on Vertex, so isn't in the OpenAPI spec\n const trafficType: string | undefined = data.usageMetadata?.trafficType;\n\n // AI Studio replies with actual service type in the header\n const serviceTierHeader: string | null = response.headers.get(\n \"x-gemini-service-tier\"\n );\n\n if (trafficType?.startsWith(\"ON_DEMAND_\")) {\n return trafficType?.substring(\"ON_DEMAND_\".length).toLowerCase();\n }\n return serviceTierHeader || \"standard\";\n });\n\n return {\n generations: [\n {\n text,\n message,\n generationInfo: {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n safetyRatings: candidate.safetyRatings,\n citationMetadata: candidate.citationMetadata,\n tokenCount: candidate.tokenCount,\n },\n },\n ],\n llmOutput: {\n tokenUsage: usageMetadataToTokenUsage(usageMetadata),\n model: data.modelVersion,\n responseId: data.responseId,\n usageMetadata,\n serviceTier,\n },\n };\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const url = await this.buildUrl(\"streamGenerateContent?alt=sse\");\n const headers = this.getHeaders(options);\n\n const response = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!response.ok) {\n throw await RequestError.fromResponse(response);\n }\n\n if (!response.body) {\n return;\n }\n\n const eventStream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new SafeJsonEventParserStream<Gemini.GenerateContentResponse>()\n );\n\n const shouldStreamUsage =\n this.streamUsage !== false && options.streamUsage !== false;\n\n async function* geminiChunks(\n stream: ReadableStream<Gemini.GenerateContentResponse | null>,\n signal?: AbortSignal\n ) {\n const reader = stream.getReader();\n try {\n while (true) {\n if (signal?.aborted) {\n return;\n }\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (value !== null) {\n yield value;\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n yield* convertGoogleGeminiStream(\n geminiChunks(eventStream, options.signal),\n {\n streamUsage: shouldStreamUsage,\n }\n );\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamUsage: boolean = this.streamUsage ?? true;\n\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const url = await this.buildUrl(\"streamGenerateContent?alt=sse\");\n const headers = this.getHeaders(options);\n const moduleName = this.constructor.name;\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n url,\n headers,\n body,\n });\n\n let response: Response;\n try {\n response = await this.caller.callWithOptions(\n { signal: options.signal, maxRetries: options.maxRetries },\n async () => {\n const nextResponse = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!nextResponse.ok) {\n throw await RequestError.fromResponse(nextResponse);\n }\n\n return nextResponse;\n }\n );\n } catch (error) {\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n error,\n });\n throw error;\n }\n\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n url: response.url,\n headers: response.headers,\n status: response.status,\n statusText: response.statusText,\n });\n\n if (response.body) {\n let previousUsage: UsageMetadata | undefined;\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new SafeJsonEventParserStream<Gemini.GenerateContentResponse>()\n )\n .pipeThrough(\n new TransformStream<\n Gemini.GenerateContentResponse,\n ChatGenerationChunk\n >({\n transform(chunk, controller) {\n // oxlint-disable-next-line no-void\n void runManager?.handleCustomEvent(`google-chunk-${moduleName}`, {\n chunk,\n });\n if (chunk === null) {\n controller.enqueue(\n new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({ content: \"\" }),\n generationInfo: { finishReason: \"stop\" },\n })\n );\n return;\n }\n\n // Extract text delta from the chunk\n const candidate = chunk.candidates?.[0];\n if (!candidate) {\n if (chunk.usageMetadata && streamUsage) {\n const cumulative =\n convertGeminiGenerateContentResponseToUsageMetadata(chunk);\n controller.enqueue(\n new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: { model_provider: \"google\" },\n usage_metadata: subtractUsageMetadata(\n cumulative,\n previousUsage\n ),\n }),\n })\n );\n previousUsage = cumulative;\n }\n return;\n }\n\n const message = convertGeminiCandidateToAIMessage(candidate);\n const text = convertAIMessageToText(message);\n\n const parts = candidate.content?.parts ?? [];\n const toolCalls = convertGeminiPartsToToolCalls(parts);\n\n // Only emit if we have content\n if (parts.length > 0 || candidate.finishReason) {\n const messageChunkParams: AIMessageChunkFields = {\n content: message.content,\n tool_calls: toolCalls,\n response_metadata: {\n model_provider: \"google\",\n },\n additional_kwargs: {\n ...(message.additional_kwargs.originalTextContentBlock\n ? {\n originalTextContentBlock:\n message.additional_kwargs.originalTextContentBlock,\n }\n : {}),\n ...(candidate.finishReason\n ? {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n }\n : {}),\n },\n };\n\n if (chunk?.usageMetadata && streamUsage) {\n const cumulative =\n convertGeminiGenerateContentResponseToUsageMetadata(chunk);\n messageChunkParams.usage_metadata = subtractUsageMetadata(\n cumulative,\n previousUsage\n );\n previousUsage = cumulative;\n }\n const messageChunk = new AIMessageChunk(messageChunkParams);\n\n controller.enqueue(\n new ChatGenerationChunk({\n text: text,\n message: messageChunk,\n generationInfo: {\n ...(candidate.finishReason && {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n }),\n ...(candidate.safetyRatings && {\n safetyRatings: candidate.safetyRatings,\n }),\n ...(candidate.citationMetadata && {\n citationMetadata: candidate.citationMetadata,\n }),\n ...(candidate.groundingMetadata && {\n groundingMetadata: candidate.groundingMetadata,\n // Support entries for the first content part only (matches messages.ts).\n groundingSupport:\n candidate.groundingMetadata.groundingSupports?.filter(\n (s) => (s?.segment?.partIndex ?? 0) === 0\n ),\n }),\n },\n })\n );\n }\n },\n })\n );\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n await runManager?.handleLLMNewToken(\n value.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: value }\n );\n }\n } finally {\n reader.releaseLock();\n }\n }\n }\n\n /**\n * Bind tool-like objects to this chat model.\n *\n * @param tools A list of tool definitions to bind to this chat model.\n * Can be a structured tool, an OpenAI formatted tool, or a Gemini function declaration.\n * @param kwargs Any additional parameters to bind.\n */\n bindTools(\n tools: BindToolsInput[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseMessage[], AIMessageChunk, CallOptions> {\n return this.withConfig({\n ...kwargs,\n tools,\n } as Partial<CallOptions>);\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n /**\n * Get structured output from the model based on a schema.\n *\n * This method supports two modes:\n * - `jsonMode`: Uses `responseSchema` to get JSON responses directly (preferred for structured outputs)\n * - `functionCalling`: Uses function calling with tools (default, for compatibility)\n *\n * @param outputSchema - The schema to use for structured output (Zod schema or JSON Schema)\n * @param config - Configuration options including method and whether to include raw response\n * @returns A Runnable that returns the parsed structured output\n */\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n let llm: Runnable<BaseMessage[], AIMessageChunk, CallOptions>;\n let outputParser: Runnable<BaseMessage, RunOutput>;\n\n const { schema, name, includeRaw } = {\n ...config,\n schema: outputSchema,\n };\n let method = config?.method ?? \"functionCalling\";\n\n if (method === \"jsonMode\") {\n console.warn(\n `\"jsonMode\" is not supported for Google models. Falling back to \"jsonSchema\".`\n );\n method = \"jsonSchema\";\n }\n\n if (method === \"jsonSchema\") {\n // Use JSON mode with responseSchema\n llm = this.withConfig({\n responseSchema: schema,\n } as Partial<CallOptions>);\n\n outputParser = RunnableLambda.from<BaseMessage, RunOutput>(\n async (input: BaseMessage): Promise<RunOutput> => {\n if (\n !AIMessage.isInstance(input) &&\n !AIMessageChunk.isInstance(input)\n ) {\n throw new MalformedOutputError({\n message: \"Input is not an AIMessage or AIMessageChunk.\",\n });\n }\n\n if (!input.text) {\n throw new MalformedOutputError({\n message:\n \"No content found in response. Cannot parse structured output.\",\n });\n }\n\n // Parse JSON and validate with schema\n const parser = createContentParser(schema);\n return await parser.parse(input.text);\n }\n );\n } else if (method === \"functionCalling\") {\n // Use function calling mode\n let functionName = name ?? \"extract\";\n let geminiFunctionDeclaration: Gemini.Tools.FunctionDeclaration;\n\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n const description =\n typeof jsonSchema.description === \"string\"\n ? jsonSchema.description\n : \"A function available to call.\";\n geminiFunctionDeclaration = {\n name: functionName,\n description,\n parameters: jsonSchema as Gemini.Tools.Schema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDeclaration = schema as Gemini.Tools.FunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters\n const parameters = schemaToGeminiParameters(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description: (schema as { description?: string }).description ?? \"\",\n parameters,\n };\n }\n\n const tools: Gemini.Tool[] = [\n {\n functionDeclarations: [geminiFunctionDeclaration],\n },\n ];\n llm = this.bindTools(tools).withConfig({\n tool_choice: functionName,\n } as Partial<CallOptions>);\n\n outputParser = createFunctionCallingParser(schema, functionName);\n } else {\n throw new ConfigurationError(\n `Unrecognized structured output method '${method}'. Expected 'functionCalling' or 'jsonSchema'`\n );\n }\n\n return assembleStructuredOutputPipeline(\n llm,\n outputParser,\n includeRaw,\n includeRaw\n ? \"ChatGoogleStructuredOutputRunnable\"\n : \"ChatGoogleStructuredOutput\"\n );\n }\n}\n\ntype CombinableFields = Omit<BaseChatGoogleParams, \"model\">;\n\nexport function combineGoogleChatModelFields(\n a: CombinableFields,\n b: CombinableFields,\n ...rest: CombinableFields[]\n): CombinableFields {\n const combined: CombinableFields = {\n temperature: b.temperature ?? a.temperature,\n topP: b.topP ?? a.topP,\n topK: b.topK ?? a.topK,\n maxOutputTokens: b.maxOutputTokens ?? a.maxOutputTokens,\n presencePenalty: b.presencePenalty ?? a.presencePenalty,\n frequencyPenalty: b.frequencyPenalty ?? a.frequencyPenalty,\n stopSequences: b.stopSequences ?? a.stopSequences,\n seed: b.seed ?? a.seed,\n responseLogprobs: b.responseLogprobs ?? a.responseLogprobs,\n logprobs: b.logprobs ?? a.logprobs,\n safetySettings: b.safetySettings ?? a.safetySettings,\n responseSchema: b.responseSchema ?? a.responseSchema,\n tools: b.tools ?? a.tools,\n responseModalities: b.responseModalities ?? a.responseModalities,\n enableEnhancedCivicAnswers:\n b.enableEnhancedCivicAnswers ?? a.enableEnhancedCivicAnswers,\n speechConfig: b.speechConfig ?? a.speechConfig,\n imageConfig: b.imageConfig ?? a.imageConfig,\n mediaResolution: b.mediaResolution ?? a.mediaResolution,\n detail: b.detail ?? a.detail,\n maxReasoningTokens: b.maxReasoningTokens ?? a.maxReasoningTokens,\n thinkingBudget: b.thinkingBudget ?? a.thinkingBudget,\n reasoningEffort: b.reasoningEffort ?? a.reasoningEffort,\n thinkingLevel: b.thinkingLevel ?? a.thinkingLevel,\n serviceTier: b.serviceTier ?? a.serviceTier,\n };\n if (rest.length > 0) {\n return combineGoogleChatModelFields(combined, rest[0], ...rest.slice(1));\n }\n return combined;\n}\n\nexport function getGoogleChatModelParams<TParams extends BaseChatGoogleParams>(\n modelOrParams: string | TParams,\n paramsArg?: Omit<TParams, \"model\">\n): TParams {\n const model =\n typeof modelOrParams === \"string\" ? modelOrParams : modelOrParams.model;\n const params = typeof modelOrParams === \"string\" ? paramsArg : modelOrParams;\n return { model, ...params } as TParams;\n}\n"],"mappings":"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"}
|
package/dist/chat_models/base.js
CHANGED
|
@@ -92,7 +92,7 @@ var BaseChatGoogle = class extends BaseChatModel {
|
|
|
92
92
|
constructor(params) {
|
|
93
93
|
super(params);
|
|
94
94
|
this.params = params;
|
|
95
|
-
this._addVersion("@langchain/google", "0.2.
|
|
95
|
+
this._addVersion("@langchain/google", "0.2.11");
|
|
96
96
|
if (!params.apiClient) throw new ConfigurationError("BaseChatGoogle requires an apiClient. This should be provided automatically by ChatGoogle constructors. If you're extending BaseChatGoogle directly, please provide an apiClient instance.");
|
|
97
97
|
this.apiClient = params.apiClient;
|
|
98
98
|
this.model = params.model;
|
|
@@ -424,7 +424,21 @@ var BaseChatGoogle = class extends BaseChatModel {
|
|
|
424
424
|
return;
|
|
425
425
|
}
|
|
426
426
|
const candidate = chunk.candidates?.[0];
|
|
427
|
-
if (!candidate)
|
|
427
|
+
if (!candidate) {
|
|
428
|
+
if (chunk.usageMetadata && streamUsage) {
|
|
429
|
+
const cumulative = convertGeminiGenerateContentResponseToUsageMetadata(chunk);
|
|
430
|
+
controller.enqueue(new ChatGenerationChunk({
|
|
431
|
+
text: "",
|
|
432
|
+
message: new AIMessageChunk({
|
|
433
|
+
content: "",
|
|
434
|
+
response_metadata: { model_provider: "google" },
|
|
435
|
+
usage_metadata: subtractUsageMetadata(cumulative, previousUsage)
|
|
436
|
+
})
|
|
437
|
+
}));
|
|
438
|
+
previousUsage = cumulative;
|
|
439
|
+
}
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
428
442
|
const message = convertGeminiCandidateToAIMessage(candidate);
|
|
429
443
|
const text = convertAIMessageToText(message);
|
|
430
444
|
const parts = candidate.content?.parts ?? [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","names":[],"sources":["../../src/chat_models/base.ts"],"sourcesContent":["import {\n BaseChatModel,\n type BaseChatModelCallOptions,\n type LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n AIMessage,\n AIMessageChunk,\n AIMessageChunkFields,\n BaseMessage,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { convertGoogleGeminiStream } from \"../utils/stream_events.js\";\nimport { concat } from \"@langchain/core/utils/stream\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { EventSourceParserStream } from \"eventsource-parser/stream\";\nimport type { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport PROFILES from \"./profiles.js\";\nimport type {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { Runnable, RunnableLambda } from \"@langchain/core/runnables\";\nimport {\n toJsonSchema,\n type JsonSchema7Type,\n} from \"@langchain/core/utils/json_schema\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\n\nimport { ApiClient } from \"../clients/index.js\";\nimport { ChatGoogleFields, settableServiceTier } from \"./types.js\";\nimport { SafeJsonEventParserStream } from \"../utils/stream.js\";\nimport {\n convertAIMessageToText,\n convertGeminiCandidateToAIMessage,\n convertGeminiGenerateContentResponseToUsageMetadata,\n convertGeminiPartsToToolCalls,\n convertMessagesToGeminiContents,\n convertMessagesToGeminiSystemInstruction,\n} from \"../converters/messages.js\";\nimport {\n ConfigurationError,\n MalformedOutputError,\n NoCandidatesError,\n PromptBlockedError,\n RequestError,\n} from \"../utils/errors.js\";\nimport {\n convertToolsToGeminiTools,\n convertToolChoiceToGeminiConfig,\n mixesBuiltinAndFunctionTools,\n schemaToGeminiParameters,\n} from \"../converters/tools.js\";\nimport {\n convertParamsToPlatformType,\n convertFieldsToSpeechConfig,\n convertFieldsToThinkingConfig,\n convertFieldsToServiceTier,\n} from \"../converters/params.js\";\nimport { Gemini } from \"./api-types.js\";\nimport { subtractUsageMetadata } from \"../utils/metadata.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\nimport { iife } from \"../utils/misc\";\nimport { resolveLangSmithGatewayConfig } from \"@langchain/core/utils/gateway\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport ServiceTier = Gemini.ServiceTier;\n\nexport type GooglePlatformType = \"gai\" | \"gcp\";\n\nfunction hasVertexCredentials(params: {\n credentials?: unknown;\n googleAuthOptions?: unknown;\n}): boolean {\n return (\n typeof params.credentials !== \"undefined\" ||\n typeof params.googleAuthOptions !== \"undefined\" ||\n typeof getEnvironmentVariable(\"GOOGLE_CLOUD_CREDENTIALS\") !== \"undefined\"\n );\n}\n\n/**\n * Resolves LangSmith gateway routing for Google chat model params.\n *\n * The LangSmith gateway exposes direct paths for the Gemini Developer API and\n * Vertex AI. An explicit `endpoint` suppresses gateway routing.\n *\n * When `LANGSMITH_GATEWAY` is set, this rewrites `endpoint` to the gateway\n * host and lets the gateway key take precedence over the provider key (which\n * then rides as the `x-goog-api-key` header via the ApiClient). The default\n * `https` gateway host is written scheme-less (the URL builders prepend\n * `https://`); a non-`https` custom gateway keeps its scheme so it is not\n * forced to TLS.\n *\n * This function is pure: it never mutates `params`. It returns a new object\n * with the gateway overrides applied when routing is active, or an unchanged\n * shallow copy otherwise.\n *\n * @returns a new params object with gateway routing applied when applicable.\n */\nexport function applyGeminiGatewayParams<\n TParams extends {\n apiKey?: string;\n endpoint?: string;\n platformType?: GooglePlatformType;\n vertexai?: boolean;\n credentials?: unknown;\n googleAuthOptions?: unknown;\n },\n>(params: TParams): TParams & { apiKey?: string; endpoint?: string } {\n if (typeof params.endpoint !== \"undefined\") {\n return { ...params };\n }\n const platform =\n convertParamsToPlatformType(params) ??\n (hasVertexCredentials(params) ? \"gcp\" : \"gai\");\n const gatewayConfig = resolveLangSmithGatewayConfig({\n providerPath: platform === \"gcp\" ? \"vertex\" : \"gemini\",\n });\n if (typeof gatewayConfig.baseURL === \"undefined\") {\n return { ...params };\n }\n\n // A provider key still wins over the gateway key.\n const gatewayUrl = new URL(gatewayConfig.baseURL);\n const path = gatewayUrl.pathname.replace(/\\/+$/, \"\");\n // The URL builders compose `https://${endpoint}/${apiVersion}/...`. For the\n // default `https` gateway, keep the endpoint scheme-less (host + path) so the\n // builder's `https://` prefix produces the right URL. For a non-`https`\n // custom gateway (e.g. `http://localhost:8080`), keep the full scheme so the\n // builder does not force TLS; `buildUrlGemini` skips its prefix when the\n // endpoint already includes a scheme.\n const endpoint =\n gatewayUrl.protocol === \"https:\"\n ? `${gatewayUrl.host}${path}`\n : `${gatewayUrl.protocol}//${gatewayUrl.host}${path}`;\n return {\n ...params,\n apiKey: params.apiKey ?? gatewayConfig.apiKey,\n endpoint,\n platformType: platform,\n };\n}\n\nexport function getPlatformType(\n platform: GooglePlatformType | undefined,\n hasApiKey: boolean\n): GooglePlatformType {\n if (typeof platform !== \"undefined\") {\n return platform;\n } else if (hasApiKey) {\n return \"gai\";\n } else {\n return \"gcp\";\n }\n}\n\nfunction usageMetadataToTokenUsage(usageMetadata: UsageMetadata) {\n return {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n };\n}\n\nfunction mapDetailToMediaResolution(\n detail?: ChatGoogleFields[\"detail\"]\n): Gemini.GenerationConfig[\"mediaResolution\"] | undefined {\n switch (detail) {\n case \"low\":\n return \"MEDIA_RESOLUTION_LOW\";\n case \"high\":\n return \"MEDIA_RESOLUTION_HIGH\";\n default:\n return undefined;\n }\n}\n\nexport interface BaseChatGoogleParams\n extends BaseChatModelParams, ChatGoogleFields {\n /**\n * The name of the Gemini model to use.\n *\n * Example: \"gemini-3-pro-preview\"\n */\n model: string;\n\n /**\n * Optional. The API client implementation for making HTTP requests to the Gemini API.\n * If not set, a default client will be used based on the runtime environment.\n */\n apiClient?: ApiClient;\n\n /**\n * Hostname for the API call (if this is running on GCP)\n * Usually this is computed based on location and platformType.\n **/\n endpoint?: string;\n\n /**\n * Region where the LLM is stored (if this is running on GCP)\n * Defaults to \"global\"\n **/\n location?: string;\n\n /**\n * The version of the API functions. Part of the path.\n * Usually this is computed based on platformType.\n **/\n apiVersion?: string;\n\n /**\n * What platform to run the service on.\n * If not specified, the class should determine this from other\n * means. Either way, the platform actually used will be in\n * the \"platform\" getter.\n */\n platformType?: GooglePlatformType;\n\n /**\n * For compatibility with Google's libraries, should this use Vertex?\n * The \"platformType\" parmeter takes precedence.\n */\n vertexai?: boolean;\n\n /**\n * Backwards compatibility.\n * @deprecated in favor of using `disableStreaming` or `.stream()`\n */\n streaming?: boolean;\n\n streamUsage?: boolean;\n}\n\nexport interface BaseChatGoogleCallOptions\n extends BaseChatModelCallOptions, ChatGoogleFields {}\n\nexport abstract class BaseChatGoogle<\n CallOptions extends BaseChatGoogleCallOptions = BaseChatGoogleCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n model: string;\n\n streaming: boolean;\n\n disableStreaming: boolean;\n\n streamUsage: boolean = true;\n\n protected _platform?: GooglePlatformType;\n\n protected _endpoint?: string;\n\n protected _customHeaders?: Record<string, string>;\n\n protected _location?: string;\n\n protected _apiVersion?: string;\n\n protected apiClient: ApiClient;\n\n constructor(\n protected params: BaseChatGoogleParams & {\n credentials?: unknown;\n googleAuthOptions?: unknown;\n }\n ) {\n super(params);\n this._addVersion(\"@langchain/google\", __PKG_VERSION__);\n\n if (!params.apiClient) {\n throw new ConfigurationError(\n \"BaseChatGoogle requires an apiClient. This should be provided automatically by ChatGoogle constructors. If you're extending BaseChatGoogle directly, please provide an apiClient instance.\"\n );\n }\n this.apiClient = params.apiClient;\n\n this.model = params.model;\n this._platform = convertParamsToPlatformType(params);\n this._endpoint = params.endpoint;\n this._customHeaders = params.customHeaders;\n this._location = params.location;\n this._apiVersion = params.apiVersion;\n\n this.disableStreaming = params?.disableStreaming === true;\n this.streaming = params?.streaming === true;\n if (this.disableStreaming) this.streaming = false;\n // disable streaming in BaseChatModel if explicitly disabled\n if (params?.streaming === false) this.disableStreaming = true;\n\n this.streamUsage = params?.streamUsage ?? this.streamUsage;\n if (this.disableStreaming) this.streamUsage = false;\n }\n\n _llmType(): string {\n return \"google\";\n }\n\n protected get platformType(): GooglePlatformType | undefined {\n return this._platform;\n }\n\n protected get platform(): GooglePlatformType {\n return getPlatformType(this._platform, this.apiClient.hasApiKey());\n }\n\n protected get isVertexExpress(): boolean {\n return (\n this.platform === \"gcp\" &&\n this.apiClient.hasApiKey() &&\n !hasVertexCredentials(this.params)\n );\n }\n\n protected get apiVersion(): string {\n if (typeof this._apiVersion !== \"undefined\") {\n return this._apiVersion;\n } else if (this.platform === \"gai\") {\n return \"v1beta\";\n } else {\n return \"v1\";\n }\n }\n\n protected get location(): string {\n return this._location || \"global\";\n }\n\n protected get endpoint(): string {\n if (typeof this._endpoint !== \"undefined\") {\n return this._endpoint;\n } else if (this.platform === \"gai\") {\n return \"generativelanguage.googleapis.com\";\n } else if (this.isVertexExpress) {\n return \"aiplatform.googleapis.com\";\n } else if (this.location === \"global\") {\n // See https://docs.cloud.google.com/vertex-ai/generative-ai/docs/learn/locations#use_the_global_endpoint\n return \"aiplatform.googleapis.com\";\n } else if (!this.location.includes(\"-\")) {\n return `aiplatform.${this.location}.rep.googleapis.com`;\n } else {\n return `${this.location}-aiplatform.googleapis.com`;\n }\n }\n\n protected get publisher(): string {\n return \"google\";\n }\n\n protected get urlMethod(): string {\n return this.streaming ? \"streamGenerateContent?alt=sse\" : \"generateContent\";\n }\n\n /**\n * Returns the model profile for this instance's model, describing its\n * capabilities and constraints (e.g. max tokens, input/output modalities,\n * tool calling support).\n *\n * @example\n * ```typescript\n * const model = new ChatGoogle({ model: \"gemini-2.5-pro\" });\n * const profile = model.profile;\n * console.log(profile.maxInputTokens); // 1048576\n * console.log(profile.imageInputs); // true\n * ```\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n protected async buildUrlGemini(urlMethod?: string): Promise<string> {\n // `endpoint` is normally scheme-less (e.g. `generativelanguage.googleapis.com`)\n // and defaults to `https`, but a gateway endpoint may already carry a scheme\n // and a base path (e.g. a custom `http://` LangSmith gateway). Let `URL`\n // resolve the scheme so a custom `http://` gateway is not forced to TLS.\n const url = this.endpoint.includes(\"://\")\n ? new URL(this.endpoint)\n : new URL(`https://${this.endpoint}`);\n // `urlMethod` may include a query string (e.g. `streamGenerateContent?alt=sse`);\n // split it out so `URL` keeps it as a query rather than encoding the `?`.\n const [method, search] = (urlMethod ?? this.urlMethod).split(\"?\", 2);\n const basePath = url.pathname.replace(/\\/+$/, \"\");\n url.pathname = `${basePath}/${this.apiVersion}/models/${this.model}:${method}`;\n if (search) {\n url.search = search;\n }\n return url.toString();\n }\n\n protected get endpointUrl(): string {\n return this.endpoint.includes(\"://\")\n ? this.endpoint\n : `https://${this.endpoint}`;\n }\n\n protected async buildUrlVertexExpress(urlMethod?: string): Promise<string> {\n return `${this.endpointUrl}/${this.apiVersion}/publishers/${\n this.publisher\n }/models/${this.model}:${urlMethod ?? this.urlMethod}`;\n }\n\n protected async buildUrlVertexLocation(urlMethod?: string): Promise<string> {\n const projectId = await this.apiClient.getProjectId();\n return `${this.endpointUrl}/${\n this.apiVersion\n }/projects/${projectId}/locations/${this.location}/publishers/${\n this.publisher\n }/models/${this.model}:${urlMethod ?? this.urlMethod}`;\n }\n\n protected async buildUrlVertex(urlMethod?: string): Promise<string> {\n if (this.isVertexExpress) {\n return this.buildUrlVertexExpress(urlMethod);\n } else {\n return this.buildUrlVertexLocation(urlMethod);\n }\n }\n\n protected async buildUrl(urlMethod?: string): Promise<string> {\n switch (this.platform) {\n case \"gai\":\n return this.buildUrlGemini(urlMethod);\n default:\n return this.buildUrlVertex(urlMethod);\n }\n }\n\n override invocationParams(options: this[\"ParsedCallOptions\"]) {\n const fields = combineGoogleChatModelFields(this.params, options);\n const mediaResolution =\n fields.mediaResolution ?? mapDetailToMediaResolution(fields.detail);\n\n // Convert tools to Gemini format\n const tools = fields.tools\n ? convertToolsToGeminiTools(fields.tools)\n : undefined;\n\n // Convert tool choice to Gemini function calling config\n let toolConfig = convertToolChoiceToGeminiConfig(\n options.tool_choice,\n !!(tools && tools.length > 0)\n );\n\n // Gemini rejects a mix of built-in and function-declaration tools unless\n // this is set. See mixesBuiltinAndFunctionTools's docstring.\n if (tools && mixesBuiltinAndFunctionTools(tools)) {\n toolConfig = {\n ...toolConfig,\n includeServerSideToolInvocations: true,\n };\n }\n\n let responseJsonSchema:\n | JsonSchema7Type\n | Record<string, unknown>\n | undefined;\n let responseMimeType: string | undefined;\n\n if (fields.responseSchema) {\n // Convert Zod schema to JSON Schema if needed\n if (\n isInteropZodSchema(fields.responseSchema) ||\n isSerializableSchema(fields.responseSchema)\n ) {\n responseJsonSchema = toJsonSchema(fields.responseSchema);\n } else {\n responseJsonSchema = fields.responseSchema as Record<string, unknown>;\n }\n // Automatically set responseMimeType to \"application/json\" when schema is provided\n responseMimeType = \"application/json\";\n }\n\n return {\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(toolConfig ? { toolConfig } : {}),\n safetySettings: fields.safetySettings,\n generationConfig: {\n temperature: fields.temperature,\n topP: fields.topP,\n topK: fields.topK,\n maxOutputTokens: fields.maxOutputTokens,\n presencePenalty: fields.presencePenalty,\n frequencyPenalty: fields.frequencyPenalty,\n stopSequences: fields.stopSequences,\n ...(responseMimeType ? { responseMimeType } : {}),\n ...(responseJsonSchema ? { responseJsonSchema } : {}),\n ...(fields.responseModalities && fields.responseModalities.length > 0\n ? { responseModalities: fields.responseModalities }\n : {}),\n candidateCount: 1,\n seed: fields.seed,\n responseLogprobs: fields.responseLogprobs,\n logprobs: fields.logprobs,\n ...(fields.enableEnhancedCivicAnswers !== undefined\n ? { enableEnhancedCivicAnswers: fields.enableEnhancedCivicAnswers }\n : {}),\n thinkingConfig: convertFieldsToThinkingConfig(this.model, fields),\n speechConfig: convertFieldsToSpeechConfig(fields),\n ...(fields.imageConfig ? { imageConfig: fields.imageConfig } : {}),\n ...(mediaResolution ? { mediaResolution } : {}),\n },\n ...convertFieldsToServiceTier(this.platform, fields),\n };\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: this.platform === \"gcp\" ? \"google_vertexai\" : \"google_genai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.generationConfig?.temperature ?? undefined,\n ls_max_tokens: params.generationConfig?.maxOutputTokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n getHeaders(options: this[\"ParsedCallOptions\"]): HeadersInit {\n const fields = combineGoogleChatModelFields(this.params, options);\n\n // The priority type is set via header only for Vertex\n const priorityHeaders: Record<string, string> =\n this.platform === \"gcp\" &&\n typeof fields.serviceTier !== \"undefined\" &&\n settableServiceTier.includes(fields.serviceTier)\n ? { \"X-Vertex-AI-LLM-Shared-Request-Type\": fields.serviceTier }\n : {};\n\n return {\n \"Content-Type\": \"application/json\",\n ...priorityHeaders,\n ...this._customHeaders,\n ...options.customHeaders,\n };\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.streaming) {\n const stream = await this._streamResponseChunks(\n messages,\n options,\n runManager\n );\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (\n typeof finalChunk?.message?.content === \"string\" &&\n typeof (\n finalChunk?.message?.additional_kwargs\n ?.originalTextContentBlock as Record<string, unknown>\n )?.text === \"string\"\n ) {\n (\n finalChunk.message.additional_kwargs\n .originalTextContentBlock as Record<string, unknown>\n ).text = finalChunk.message.content;\n }\n const usageMetadata = finalChunk?.message?.usage_metadata;\n return {\n generations: finalChunk ? [finalChunk] : [],\n ...(usageMetadata\n ? {\n llmOutput: {\n tokenUsage: usageMetadataToTokenUsage(usageMetadata),\n usageMetadata,\n },\n }\n : {}),\n };\n }\n\n const url = await this.buildUrl();\n const headers = this.getHeaders(options);\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const moduleName = this.constructor.name;\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n url,\n headers,\n body,\n });\n\n let response: Response;\n try {\n response = await this.caller.callWithOptions(\n { signal: options.signal, maxRetries: options.maxRetries },\n async () => {\n const nextResponse = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!nextResponse.ok) {\n throw await RequestError.fromResponse(nextResponse);\n }\n\n return nextResponse;\n }\n );\n } catch (error) {\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n error,\n });\n throw error;\n }\n\n const data: Gemini.GenerateContentResponse = await response.json();\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n data,\n url: response.url,\n headers: Array.from(response.headers.entries()),\n status: response.status,\n statusText: response.statusText,\n });\n\n // Check for prompt feedback errors\n if (data.promptFeedback?.blockReason) {\n throw PromptBlockedError.fromPromptFeedback(data.promptFeedback);\n }\n\n // Check if we have candidates\n if (!data.candidates || data.candidates.length === 0) {\n throw new NoCandidatesError();\n }\n\n // Use the first candidate\n const candidate = data.candidates[0];\n const message = convertGeminiCandidateToAIMessage(candidate);\n\n // Extract text content from the message\n const text = convertAIMessageToText(message);\n\n const usageMetadata =\n convertGeminiGenerateContentResponseToUsageMetadata(data);\n message.usage_metadata = usageMetadata;\n\n const serviceTier: ServiceTier = iife((): ServiceTier => {\n // @ts-expect-error - trafficType is defined on Vertex, so isn't in the OpenAPI spec\n const trafficType: string | undefined = data.usageMetadata?.trafficType;\n\n // AI Studio replies with actual service type in the header\n const serviceTierHeader: string | null = response.headers.get(\n \"x-gemini-service-tier\"\n );\n\n if (trafficType?.startsWith(\"ON_DEMAND_\")) {\n return trafficType?.substring(\"ON_DEMAND_\".length).toLowerCase();\n }\n return serviceTierHeader || \"standard\";\n });\n\n return {\n generations: [\n {\n text,\n message,\n generationInfo: {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n safetyRatings: candidate.safetyRatings,\n citationMetadata: candidate.citationMetadata,\n tokenCount: candidate.tokenCount,\n },\n },\n ],\n llmOutput: {\n tokenUsage: usageMetadataToTokenUsage(usageMetadata),\n model: data.modelVersion,\n responseId: data.responseId,\n usageMetadata,\n serviceTier,\n },\n };\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const url = await this.buildUrl(\"streamGenerateContent?alt=sse\");\n const headers = this.getHeaders(options);\n\n const response = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!response.ok) {\n throw await RequestError.fromResponse(response);\n }\n\n if (!response.body) {\n return;\n }\n\n const eventStream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new SafeJsonEventParserStream<Gemini.GenerateContentResponse>()\n );\n\n const shouldStreamUsage =\n this.streamUsage !== false && options.streamUsage !== false;\n\n async function* geminiChunks(\n stream: ReadableStream<Gemini.GenerateContentResponse | null>,\n signal?: AbortSignal\n ) {\n const reader = stream.getReader();\n try {\n while (true) {\n if (signal?.aborted) {\n return;\n }\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (value !== null) {\n yield value;\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n yield* convertGoogleGeminiStream(\n geminiChunks(eventStream, options.signal),\n {\n streamUsage: shouldStreamUsage,\n }\n );\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamUsage: boolean = this.streamUsage ?? true;\n\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const url = await this.buildUrl(\"streamGenerateContent?alt=sse\");\n const headers = this.getHeaders(options);\n const moduleName = this.constructor.name;\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n url,\n headers,\n body,\n });\n\n let response: Response;\n try {\n response = await this.caller.callWithOptions(\n { signal: options.signal, maxRetries: options.maxRetries },\n async () => {\n const nextResponse = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!nextResponse.ok) {\n throw await RequestError.fromResponse(nextResponse);\n }\n\n return nextResponse;\n }\n );\n } catch (error) {\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n error,\n });\n throw error;\n }\n\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n url: response.url,\n headers: response.headers,\n status: response.status,\n statusText: response.statusText,\n });\n\n if (response.body) {\n let previousUsage: UsageMetadata | undefined;\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new SafeJsonEventParserStream<Gemini.GenerateContentResponse>()\n )\n .pipeThrough(\n new TransformStream<\n Gemini.GenerateContentResponse,\n ChatGenerationChunk\n >({\n transform(chunk, controller) {\n // oxlint-disable-next-line no-void\n void runManager?.handleCustomEvent(`google-chunk-${moduleName}`, {\n chunk,\n });\n if (chunk === null) {\n controller.enqueue(\n new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({ content: \"\" }),\n generationInfo: { finishReason: \"stop\" },\n })\n );\n return;\n }\n\n // Extract text delta from the chunk\n const candidate = chunk.candidates?.[0];\n if (!candidate) {\n return;\n }\n\n const message = convertGeminiCandidateToAIMessage(candidate);\n const text = convertAIMessageToText(message);\n\n const parts = candidate.content?.parts ?? [];\n const toolCalls = convertGeminiPartsToToolCalls(parts);\n\n // Only emit if we have content\n if (parts.length > 0 || candidate.finishReason) {\n const messageChunkParams: AIMessageChunkFields = {\n content: message.content,\n tool_calls: toolCalls,\n response_metadata: {\n model_provider: \"google\",\n },\n additional_kwargs: {\n ...(message.additional_kwargs.originalTextContentBlock\n ? {\n originalTextContentBlock:\n message.additional_kwargs.originalTextContentBlock,\n }\n : {}),\n ...(candidate.finishReason\n ? {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n }\n : {}),\n },\n };\n\n if (chunk?.usageMetadata && streamUsage) {\n const cumulative =\n convertGeminiGenerateContentResponseToUsageMetadata(chunk);\n messageChunkParams.usage_metadata = subtractUsageMetadata(\n cumulative,\n previousUsage\n );\n previousUsage = cumulative;\n }\n const messageChunk = new AIMessageChunk(messageChunkParams);\n\n controller.enqueue(\n new ChatGenerationChunk({\n text: text,\n message: messageChunk,\n generationInfo: {\n ...(candidate.finishReason && {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n }),\n ...(candidate.safetyRatings && {\n safetyRatings: candidate.safetyRatings,\n }),\n ...(candidate.citationMetadata && {\n citationMetadata: candidate.citationMetadata,\n }),\n ...(candidate.groundingMetadata && {\n groundingMetadata: candidate.groundingMetadata,\n // Support entries for the first content part only (matches messages.ts).\n groundingSupport:\n candidate.groundingMetadata.groundingSupports?.filter(\n (s) => (s?.segment?.partIndex ?? 0) === 0\n ),\n }),\n },\n })\n );\n }\n },\n })\n );\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n await runManager?.handleLLMNewToken(\n value.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: value }\n );\n }\n } finally {\n reader.releaseLock();\n }\n }\n }\n\n /**\n * Bind tool-like objects to this chat model.\n *\n * @param tools A list of tool definitions to bind to this chat model.\n * Can be a structured tool, an OpenAI formatted tool, or a Gemini function declaration.\n * @param kwargs Any additional parameters to bind.\n */\n bindTools(\n tools: BindToolsInput[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseMessage[], AIMessageChunk, CallOptions> {\n return this.withConfig({\n ...kwargs,\n tools,\n } as Partial<CallOptions>);\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n /**\n * Get structured output from the model based on a schema.\n *\n * This method supports two modes:\n * - `jsonMode`: Uses `responseSchema` to get JSON responses directly (preferred for structured outputs)\n * - `functionCalling`: Uses function calling with tools (default, for compatibility)\n *\n * @param outputSchema - The schema to use for structured output (Zod schema or JSON Schema)\n * @param config - Configuration options including method and whether to include raw response\n * @returns A Runnable that returns the parsed structured output\n */\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n let llm: Runnable<BaseMessage[], AIMessageChunk, CallOptions>;\n let outputParser: Runnable<BaseMessage, RunOutput>;\n\n const { schema, name, includeRaw } = {\n ...config,\n schema: outputSchema,\n };\n let method = config?.method ?? \"functionCalling\";\n\n if (method === \"jsonMode\") {\n console.warn(\n `\"jsonMode\" is not supported for Google models. Falling back to \"jsonSchema\".`\n );\n method = \"jsonSchema\";\n }\n\n if (method === \"jsonSchema\") {\n // Use JSON mode with responseSchema\n llm = this.withConfig({\n responseSchema: schema,\n } as Partial<CallOptions>);\n\n outputParser = RunnableLambda.from<BaseMessage, RunOutput>(\n async (input: BaseMessage): Promise<RunOutput> => {\n if (\n !AIMessage.isInstance(input) &&\n !AIMessageChunk.isInstance(input)\n ) {\n throw new MalformedOutputError({\n message: \"Input is not an AIMessage or AIMessageChunk.\",\n });\n }\n\n if (!input.text) {\n throw new MalformedOutputError({\n message:\n \"No content found in response. Cannot parse structured output.\",\n });\n }\n\n // Parse JSON and validate with schema\n const parser = createContentParser(schema);\n return await parser.parse(input.text);\n }\n );\n } else if (method === \"functionCalling\") {\n // Use function calling mode\n let functionName = name ?? \"extract\";\n let geminiFunctionDeclaration: Gemini.Tools.FunctionDeclaration;\n\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n const description =\n typeof jsonSchema.description === \"string\"\n ? jsonSchema.description\n : \"A function available to call.\";\n geminiFunctionDeclaration = {\n name: functionName,\n description,\n parameters: jsonSchema as Gemini.Tools.Schema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDeclaration = schema as Gemini.Tools.FunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters\n const parameters = schemaToGeminiParameters(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description: (schema as { description?: string }).description ?? \"\",\n parameters,\n };\n }\n\n const tools: Gemini.Tool[] = [\n {\n functionDeclarations: [geminiFunctionDeclaration],\n },\n ];\n llm = this.bindTools(tools).withConfig({\n tool_choice: functionName,\n } as Partial<CallOptions>);\n\n outputParser = createFunctionCallingParser(schema, functionName);\n } else {\n throw new ConfigurationError(\n `Unrecognized structured output method '${method}'. Expected 'functionCalling' or 'jsonSchema'`\n );\n }\n\n return assembleStructuredOutputPipeline(\n llm,\n outputParser,\n includeRaw,\n includeRaw\n ? \"ChatGoogleStructuredOutputRunnable\"\n : \"ChatGoogleStructuredOutput\"\n );\n }\n}\n\ntype CombinableFields = Omit<BaseChatGoogleParams, \"model\">;\n\nexport function combineGoogleChatModelFields(\n a: CombinableFields,\n b: CombinableFields,\n ...rest: CombinableFields[]\n): CombinableFields {\n const combined: CombinableFields = {\n temperature: b.temperature ?? a.temperature,\n topP: b.topP ?? a.topP,\n topK: b.topK ?? a.topK,\n maxOutputTokens: b.maxOutputTokens ?? a.maxOutputTokens,\n presencePenalty: b.presencePenalty ?? a.presencePenalty,\n frequencyPenalty: b.frequencyPenalty ?? a.frequencyPenalty,\n stopSequences: b.stopSequences ?? a.stopSequences,\n seed: b.seed ?? a.seed,\n responseLogprobs: b.responseLogprobs ?? a.responseLogprobs,\n logprobs: b.logprobs ?? a.logprobs,\n safetySettings: b.safetySettings ?? a.safetySettings,\n responseSchema: b.responseSchema ?? a.responseSchema,\n tools: b.tools ?? a.tools,\n responseModalities: b.responseModalities ?? a.responseModalities,\n enableEnhancedCivicAnswers:\n b.enableEnhancedCivicAnswers ?? a.enableEnhancedCivicAnswers,\n speechConfig: b.speechConfig ?? a.speechConfig,\n imageConfig: b.imageConfig ?? a.imageConfig,\n mediaResolution: b.mediaResolution ?? a.mediaResolution,\n detail: b.detail ?? a.detail,\n maxReasoningTokens: b.maxReasoningTokens ?? a.maxReasoningTokens,\n thinkingBudget: b.thinkingBudget ?? a.thinkingBudget,\n reasoningEffort: b.reasoningEffort ?? a.reasoningEffort,\n thinkingLevel: b.thinkingLevel ?? a.thinkingLevel,\n serviceTier: b.serviceTier ?? a.serviceTier,\n };\n if (rest.length > 0) {\n return combineGoogleChatModelFields(combined, rest[0], ...rest.slice(1));\n }\n return combined;\n}\n\nexport function getGoogleChatModelParams<TParams extends BaseChatGoogleParams>(\n modelOrParams: string | TParams,\n paramsArg?: Omit<TParams, \"model\">\n): TParams {\n const model =\n typeof modelOrParams === \"string\" ? modelOrParams : modelOrParams.model;\n const params = typeof modelOrParams === \"string\" ? paramsArg : modelOrParams;\n return { model, ...params } as TParams;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base.js","names":[],"sources":["../../src/chat_models/base.ts"],"sourcesContent":["import {\n BaseChatModel,\n type BaseChatModelCallOptions,\n type LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n AIMessage,\n AIMessageChunk,\n AIMessageChunkFields,\n BaseMessage,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { convertGoogleGeminiStream } from \"../utils/stream_events.js\";\nimport { concat } from \"@langchain/core/utils/stream\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { EventSourceParserStream } from \"eventsource-parser/stream\";\nimport type { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nimport PROFILES from \"./profiles.js\";\nimport type {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { Runnable, RunnableLambda } from \"@langchain/core/runnables\";\nimport {\n toJsonSchema,\n type JsonSchema7Type,\n} from \"@langchain/core/utils/json_schema\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\n\nimport { ApiClient } from \"../clients/index.js\";\nimport { ChatGoogleFields, settableServiceTier } from \"./types.js\";\nimport { SafeJsonEventParserStream } from \"../utils/stream.js\";\nimport {\n convertAIMessageToText,\n convertGeminiCandidateToAIMessage,\n convertGeminiGenerateContentResponseToUsageMetadata,\n convertGeminiPartsToToolCalls,\n convertMessagesToGeminiContents,\n convertMessagesToGeminiSystemInstruction,\n} from \"../converters/messages.js\";\nimport {\n ConfigurationError,\n MalformedOutputError,\n NoCandidatesError,\n PromptBlockedError,\n RequestError,\n} from \"../utils/errors.js\";\nimport {\n convertToolsToGeminiTools,\n convertToolChoiceToGeminiConfig,\n mixesBuiltinAndFunctionTools,\n schemaToGeminiParameters,\n} from \"../converters/tools.js\";\nimport {\n convertParamsToPlatformType,\n convertFieldsToSpeechConfig,\n convertFieldsToThinkingConfig,\n convertFieldsToServiceTier,\n} from \"../converters/params.js\";\nimport { Gemini } from \"./api-types.js\";\nimport { subtractUsageMetadata } from \"../utils/metadata.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\nimport { iife } from \"../utils/misc\";\nimport { resolveLangSmithGatewayConfig } from \"@langchain/core/utils/gateway\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport ServiceTier = Gemini.ServiceTier;\n\nexport type GooglePlatformType = \"gai\" | \"gcp\";\n\nfunction hasVertexCredentials(params: {\n credentials?: unknown;\n googleAuthOptions?: unknown;\n}): boolean {\n return (\n typeof params.credentials !== \"undefined\" ||\n typeof params.googleAuthOptions !== \"undefined\" ||\n typeof getEnvironmentVariable(\"GOOGLE_CLOUD_CREDENTIALS\") !== \"undefined\"\n );\n}\n\n/**\n * Resolves LangSmith gateway routing for Google chat model params.\n *\n * The LangSmith gateway exposes direct paths for the Gemini Developer API and\n * Vertex AI. An explicit `endpoint` suppresses gateway routing.\n *\n * When `LANGSMITH_GATEWAY` is set, this rewrites `endpoint` to the gateway\n * host and lets the gateway key take precedence over the provider key (which\n * then rides as the `x-goog-api-key` header via the ApiClient). The default\n * `https` gateway host is written scheme-less (the URL builders prepend\n * `https://`); a non-`https` custom gateway keeps its scheme so it is not\n * forced to TLS.\n *\n * This function is pure: it never mutates `params`. It returns a new object\n * with the gateway overrides applied when routing is active, or an unchanged\n * shallow copy otherwise.\n *\n * @returns a new params object with gateway routing applied when applicable.\n */\nexport function applyGeminiGatewayParams<\n TParams extends {\n apiKey?: string;\n endpoint?: string;\n platformType?: GooglePlatformType;\n vertexai?: boolean;\n credentials?: unknown;\n googleAuthOptions?: unknown;\n },\n>(params: TParams): TParams & { apiKey?: string; endpoint?: string } {\n if (typeof params.endpoint !== \"undefined\") {\n return { ...params };\n }\n const platform =\n convertParamsToPlatformType(params) ??\n (hasVertexCredentials(params) ? \"gcp\" : \"gai\");\n const gatewayConfig = resolveLangSmithGatewayConfig({\n providerPath: platform === \"gcp\" ? \"vertex\" : \"gemini\",\n });\n if (typeof gatewayConfig.baseURL === \"undefined\") {\n return { ...params };\n }\n\n // A provider key still wins over the gateway key.\n const gatewayUrl = new URL(gatewayConfig.baseURL);\n const path = gatewayUrl.pathname.replace(/\\/+$/, \"\");\n // The URL builders compose `https://${endpoint}/${apiVersion}/...`. For the\n // default `https` gateway, keep the endpoint scheme-less (host + path) so the\n // builder's `https://` prefix produces the right URL. For a non-`https`\n // custom gateway (e.g. `http://localhost:8080`), keep the full scheme so the\n // builder does not force TLS; `buildUrlGemini` skips its prefix when the\n // endpoint already includes a scheme.\n const endpoint =\n gatewayUrl.protocol === \"https:\"\n ? `${gatewayUrl.host}${path}`\n : `${gatewayUrl.protocol}//${gatewayUrl.host}${path}`;\n return {\n ...params,\n apiKey: params.apiKey ?? gatewayConfig.apiKey,\n endpoint,\n platformType: platform,\n };\n}\n\nexport function getPlatformType(\n platform: GooglePlatformType | undefined,\n hasApiKey: boolean\n): GooglePlatformType {\n if (typeof platform !== \"undefined\") {\n return platform;\n } else if (hasApiKey) {\n return \"gai\";\n } else {\n return \"gcp\";\n }\n}\n\nfunction usageMetadataToTokenUsage(usageMetadata: UsageMetadata) {\n return {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n };\n}\n\nfunction mapDetailToMediaResolution(\n detail?: ChatGoogleFields[\"detail\"]\n): Gemini.GenerationConfig[\"mediaResolution\"] | undefined {\n switch (detail) {\n case \"low\":\n return \"MEDIA_RESOLUTION_LOW\";\n case \"high\":\n return \"MEDIA_RESOLUTION_HIGH\";\n default:\n return undefined;\n }\n}\n\nexport interface BaseChatGoogleParams\n extends BaseChatModelParams, ChatGoogleFields {\n /**\n * The name of the Gemini model to use.\n *\n * Example: \"gemini-3-pro-preview\"\n */\n model: string;\n\n /**\n * Optional. The API client implementation for making HTTP requests to the Gemini API.\n * If not set, a default client will be used based on the runtime environment.\n */\n apiClient?: ApiClient;\n\n /**\n * Hostname for the API call (if this is running on GCP)\n * Usually this is computed based on location and platformType.\n **/\n endpoint?: string;\n\n /**\n * Region where the LLM is stored (if this is running on GCP)\n * Defaults to \"global\"\n **/\n location?: string;\n\n /**\n * The version of the API functions. Part of the path.\n * Usually this is computed based on platformType.\n **/\n apiVersion?: string;\n\n /**\n * What platform to run the service on.\n * If not specified, the class should determine this from other\n * means. Either way, the platform actually used will be in\n * the \"platform\" getter.\n */\n platformType?: GooglePlatformType;\n\n /**\n * For compatibility with Google's libraries, should this use Vertex?\n * The \"platformType\" parmeter takes precedence.\n */\n vertexai?: boolean;\n\n /**\n * Backwards compatibility.\n * @deprecated in favor of using `disableStreaming` or `.stream()`\n */\n streaming?: boolean;\n\n streamUsage?: boolean;\n}\n\nexport interface BaseChatGoogleCallOptions\n extends BaseChatModelCallOptions, ChatGoogleFields {}\n\nexport abstract class BaseChatGoogle<\n CallOptions extends BaseChatGoogleCallOptions = BaseChatGoogleCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n model: string;\n\n streaming: boolean;\n\n disableStreaming: boolean;\n\n streamUsage: boolean = true;\n\n protected _platform?: GooglePlatformType;\n\n protected _endpoint?: string;\n\n protected _customHeaders?: Record<string, string>;\n\n protected _location?: string;\n\n protected _apiVersion?: string;\n\n protected apiClient: ApiClient;\n\n constructor(\n protected params: BaseChatGoogleParams & {\n credentials?: unknown;\n googleAuthOptions?: unknown;\n }\n ) {\n super(params);\n this._addVersion(\"@langchain/google\", __PKG_VERSION__);\n\n if (!params.apiClient) {\n throw new ConfigurationError(\n \"BaseChatGoogle requires an apiClient. This should be provided automatically by ChatGoogle constructors. If you're extending BaseChatGoogle directly, please provide an apiClient instance.\"\n );\n }\n this.apiClient = params.apiClient;\n\n this.model = params.model;\n this._platform = convertParamsToPlatformType(params);\n this._endpoint = params.endpoint;\n this._customHeaders = params.customHeaders;\n this._location = params.location;\n this._apiVersion = params.apiVersion;\n\n this.disableStreaming = params?.disableStreaming === true;\n this.streaming = params?.streaming === true;\n if (this.disableStreaming) this.streaming = false;\n // disable streaming in BaseChatModel if explicitly disabled\n if (params?.streaming === false) this.disableStreaming = true;\n\n this.streamUsage = params?.streamUsage ?? this.streamUsage;\n if (this.disableStreaming) this.streamUsage = false;\n }\n\n _llmType(): string {\n return \"google\";\n }\n\n protected get platformType(): GooglePlatformType | undefined {\n return this._platform;\n }\n\n protected get platform(): GooglePlatformType {\n return getPlatformType(this._platform, this.apiClient.hasApiKey());\n }\n\n protected get isVertexExpress(): boolean {\n return (\n this.platform === \"gcp\" &&\n this.apiClient.hasApiKey() &&\n !hasVertexCredentials(this.params)\n );\n }\n\n protected get apiVersion(): string {\n if (typeof this._apiVersion !== \"undefined\") {\n return this._apiVersion;\n } else if (this.platform === \"gai\") {\n return \"v1beta\";\n } else {\n return \"v1\";\n }\n }\n\n protected get location(): string {\n return this._location || \"global\";\n }\n\n protected get endpoint(): string {\n if (typeof this._endpoint !== \"undefined\") {\n return this._endpoint;\n } else if (this.platform === \"gai\") {\n return \"generativelanguage.googleapis.com\";\n } else if (this.isVertexExpress) {\n return \"aiplatform.googleapis.com\";\n } else if (this.location === \"global\") {\n // See https://docs.cloud.google.com/vertex-ai/generative-ai/docs/learn/locations#use_the_global_endpoint\n return \"aiplatform.googleapis.com\";\n } else if (!this.location.includes(\"-\")) {\n return `aiplatform.${this.location}.rep.googleapis.com`;\n } else {\n return `${this.location}-aiplatform.googleapis.com`;\n }\n }\n\n protected get publisher(): string {\n return \"google\";\n }\n\n protected get urlMethod(): string {\n return this.streaming ? \"streamGenerateContent?alt=sse\" : \"generateContent\";\n }\n\n /**\n * Returns the model profile for this instance's model, describing its\n * capabilities and constraints (e.g. max tokens, input/output modalities,\n * tool calling support).\n *\n * @example\n * ```typescript\n * const model = new ChatGoogle({ model: \"gemini-2.5-pro\" });\n * const profile = model.profile;\n * console.log(profile.maxInputTokens); // 1048576\n * console.log(profile.imageInputs); // true\n * ```\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n protected async buildUrlGemini(urlMethod?: string): Promise<string> {\n // `endpoint` is normally scheme-less (e.g. `generativelanguage.googleapis.com`)\n // and defaults to `https`, but a gateway endpoint may already carry a scheme\n // and a base path (e.g. a custom `http://` LangSmith gateway). Let `URL`\n // resolve the scheme so a custom `http://` gateway is not forced to TLS.\n const url = this.endpoint.includes(\"://\")\n ? new URL(this.endpoint)\n : new URL(`https://${this.endpoint}`);\n // `urlMethod` may include a query string (e.g. `streamGenerateContent?alt=sse`);\n // split it out so `URL` keeps it as a query rather than encoding the `?`.\n const [method, search] = (urlMethod ?? this.urlMethod).split(\"?\", 2);\n const basePath = url.pathname.replace(/\\/+$/, \"\");\n url.pathname = `${basePath}/${this.apiVersion}/models/${this.model}:${method}`;\n if (search) {\n url.search = search;\n }\n return url.toString();\n }\n\n protected get endpointUrl(): string {\n return this.endpoint.includes(\"://\")\n ? this.endpoint\n : `https://${this.endpoint}`;\n }\n\n protected async buildUrlVertexExpress(urlMethod?: string): Promise<string> {\n return `${this.endpointUrl}/${this.apiVersion}/publishers/${\n this.publisher\n }/models/${this.model}:${urlMethod ?? this.urlMethod}`;\n }\n\n protected async buildUrlVertexLocation(urlMethod?: string): Promise<string> {\n const projectId = await this.apiClient.getProjectId();\n return `${this.endpointUrl}/${\n this.apiVersion\n }/projects/${projectId}/locations/${this.location}/publishers/${\n this.publisher\n }/models/${this.model}:${urlMethod ?? this.urlMethod}`;\n }\n\n protected async buildUrlVertex(urlMethod?: string): Promise<string> {\n if (this.isVertexExpress) {\n return this.buildUrlVertexExpress(urlMethod);\n } else {\n return this.buildUrlVertexLocation(urlMethod);\n }\n }\n\n protected async buildUrl(urlMethod?: string): Promise<string> {\n switch (this.platform) {\n case \"gai\":\n return this.buildUrlGemini(urlMethod);\n default:\n return this.buildUrlVertex(urlMethod);\n }\n }\n\n override invocationParams(options: this[\"ParsedCallOptions\"]) {\n const fields = combineGoogleChatModelFields(this.params, options);\n const mediaResolution =\n fields.mediaResolution ?? mapDetailToMediaResolution(fields.detail);\n\n // Convert tools to Gemini format\n const tools = fields.tools\n ? convertToolsToGeminiTools(fields.tools)\n : undefined;\n\n // Convert tool choice to Gemini function calling config\n let toolConfig = convertToolChoiceToGeminiConfig(\n options.tool_choice,\n !!(tools && tools.length > 0)\n );\n\n // Gemini rejects a mix of built-in and function-declaration tools unless\n // this is set. See mixesBuiltinAndFunctionTools's docstring.\n if (tools && mixesBuiltinAndFunctionTools(tools)) {\n toolConfig = {\n ...toolConfig,\n includeServerSideToolInvocations: true,\n };\n }\n\n let responseJsonSchema:\n | JsonSchema7Type\n | Record<string, unknown>\n | undefined;\n let responseMimeType: string | undefined;\n\n if (fields.responseSchema) {\n // Convert Zod schema to JSON Schema if needed\n if (\n isInteropZodSchema(fields.responseSchema) ||\n isSerializableSchema(fields.responseSchema)\n ) {\n responseJsonSchema = toJsonSchema(fields.responseSchema);\n } else {\n responseJsonSchema = fields.responseSchema as Record<string, unknown>;\n }\n // Automatically set responseMimeType to \"application/json\" when schema is provided\n responseMimeType = \"application/json\";\n }\n\n return {\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(toolConfig ? { toolConfig } : {}),\n safetySettings: fields.safetySettings,\n generationConfig: {\n temperature: fields.temperature,\n topP: fields.topP,\n topK: fields.topK,\n maxOutputTokens: fields.maxOutputTokens,\n presencePenalty: fields.presencePenalty,\n frequencyPenalty: fields.frequencyPenalty,\n stopSequences: fields.stopSequences,\n ...(responseMimeType ? { responseMimeType } : {}),\n ...(responseJsonSchema ? { responseJsonSchema } : {}),\n ...(fields.responseModalities && fields.responseModalities.length > 0\n ? { responseModalities: fields.responseModalities }\n : {}),\n candidateCount: 1,\n seed: fields.seed,\n responseLogprobs: fields.responseLogprobs,\n logprobs: fields.logprobs,\n ...(fields.enableEnhancedCivicAnswers !== undefined\n ? { enableEnhancedCivicAnswers: fields.enableEnhancedCivicAnswers }\n : {}),\n thinkingConfig: convertFieldsToThinkingConfig(this.model, fields),\n speechConfig: convertFieldsToSpeechConfig(fields),\n ...(fields.imageConfig ? { imageConfig: fields.imageConfig } : {}),\n ...(mediaResolution ? { mediaResolution } : {}),\n },\n ...convertFieldsToServiceTier(this.platform, fields),\n };\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: this.platform === \"gcp\" ? \"google_vertexai\" : \"google_genai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.generationConfig?.temperature ?? undefined,\n ls_max_tokens: params.generationConfig?.maxOutputTokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n getHeaders(options: this[\"ParsedCallOptions\"]): HeadersInit {\n const fields = combineGoogleChatModelFields(this.params, options);\n\n // The priority type is set via header only for Vertex\n const priorityHeaders: Record<string, string> =\n this.platform === \"gcp\" &&\n typeof fields.serviceTier !== \"undefined\" &&\n settableServiceTier.includes(fields.serviceTier)\n ? { \"X-Vertex-AI-LLM-Shared-Request-Type\": fields.serviceTier }\n : {};\n\n return {\n \"Content-Type\": \"application/json\",\n ...priorityHeaders,\n ...this._customHeaders,\n ...options.customHeaders,\n };\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.streaming) {\n const stream = await this._streamResponseChunks(\n messages,\n options,\n runManager\n );\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (\n typeof finalChunk?.message?.content === \"string\" &&\n typeof (\n finalChunk?.message?.additional_kwargs\n ?.originalTextContentBlock as Record<string, unknown>\n )?.text === \"string\"\n ) {\n (\n finalChunk.message.additional_kwargs\n .originalTextContentBlock as Record<string, unknown>\n ).text = finalChunk.message.content;\n }\n const usageMetadata = finalChunk?.message?.usage_metadata;\n return {\n generations: finalChunk ? [finalChunk] : [],\n ...(usageMetadata\n ? {\n llmOutput: {\n tokenUsage: usageMetadataToTokenUsage(usageMetadata),\n usageMetadata,\n },\n }\n : {}),\n };\n }\n\n const url = await this.buildUrl();\n const headers = this.getHeaders(options);\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const moduleName = this.constructor.name;\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n url,\n headers,\n body,\n });\n\n let response: Response;\n try {\n response = await this.caller.callWithOptions(\n { signal: options.signal, maxRetries: options.maxRetries },\n async () => {\n const nextResponse = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!nextResponse.ok) {\n throw await RequestError.fromResponse(nextResponse);\n }\n\n return nextResponse;\n }\n );\n } catch (error) {\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n error,\n });\n throw error;\n }\n\n const data: Gemini.GenerateContentResponse = await response.json();\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n data,\n url: response.url,\n headers: Array.from(response.headers.entries()),\n status: response.status,\n statusText: response.statusText,\n });\n\n // Check for prompt feedback errors\n if (data.promptFeedback?.blockReason) {\n throw PromptBlockedError.fromPromptFeedback(data.promptFeedback);\n }\n\n // Check if we have candidates\n if (!data.candidates || data.candidates.length === 0) {\n throw new NoCandidatesError();\n }\n\n // Use the first candidate\n const candidate = data.candidates[0];\n const message = convertGeminiCandidateToAIMessage(candidate);\n\n // Extract text content from the message\n const text = convertAIMessageToText(message);\n\n const usageMetadata =\n convertGeminiGenerateContentResponseToUsageMetadata(data);\n message.usage_metadata = usageMetadata;\n\n const serviceTier: ServiceTier = iife((): ServiceTier => {\n // @ts-expect-error - trafficType is defined on Vertex, so isn't in the OpenAPI spec\n const trafficType: string | undefined = data.usageMetadata?.trafficType;\n\n // AI Studio replies with actual service type in the header\n const serviceTierHeader: string | null = response.headers.get(\n \"x-gemini-service-tier\"\n );\n\n if (trafficType?.startsWith(\"ON_DEMAND_\")) {\n return trafficType?.substring(\"ON_DEMAND_\".length).toLowerCase();\n }\n return serviceTierHeader || \"standard\";\n });\n\n return {\n generations: [\n {\n text,\n message,\n generationInfo: {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n safetyRatings: candidate.safetyRatings,\n citationMetadata: candidate.citationMetadata,\n tokenCount: candidate.tokenCount,\n },\n },\n ],\n llmOutput: {\n tokenUsage: usageMetadataToTokenUsage(usageMetadata),\n model: data.modelVersion,\n responseId: data.responseId,\n usageMetadata,\n serviceTier,\n },\n };\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const url = await this.buildUrl(\"streamGenerateContent?alt=sse\");\n const headers = this.getHeaders(options);\n\n const response = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!response.ok) {\n throw await RequestError.fromResponse(response);\n }\n\n if (!response.body) {\n return;\n }\n\n const eventStream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new SafeJsonEventParserStream<Gemini.GenerateContentResponse>()\n );\n\n const shouldStreamUsage =\n this.streamUsage !== false && options.streamUsage !== false;\n\n async function* geminiChunks(\n stream: ReadableStream<Gemini.GenerateContentResponse | null>,\n signal?: AbortSignal\n ) {\n const reader = stream.getReader();\n try {\n while (true) {\n if (signal?.aborted) {\n return;\n }\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (value !== null) {\n yield value;\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n yield* convertGoogleGeminiStream(\n geminiChunks(eventStream, options.signal),\n {\n streamUsage: shouldStreamUsage,\n }\n );\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamUsage: boolean = this.streamUsage ?? true;\n\n const body = {\n ...this.invocationParams(options),\n systemInstruction: convertMessagesToGeminiSystemInstruction(messages),\n contents: convertMessagesToGeminiContents(messages),\n };\n\n const url = await this.buildUrl(\"streamGenerateContent?alt=sse\");\n const headers = this.getHeaders(options);\n const moduleName = this.constructor.name;\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n url,\n headers,\n body,\n });\n\n let response: Response;\n try {\n response = await this.caller.callWithOptions(\n { signal: options.signal, maxRetries: options.maxRetries },\n async () => {\n const nextResponse = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n })\n );\n\n if (!nextResponse.ok) {\n throw await RequestError.fromResponse(nextResponse);\n }\n\n return nextResponse;\n }\n );\n } catch (error) {\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n error,\n });\n throw error;\n }\n\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n url: response.url,\n headers: response.headers,\n status: response.status,\n statusText: response.statusText,\n });\n\n if (response.body) {\n let previousUsage: UsageMetadata | undefined;\n const stream = response.body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new SafeJsonEventParserStream<Gemini.GenerateContentResponse>()\n )\n .pipeThrough(\n new TransformStream<\n Gemini.GenerateContentResponse,\n ChatGenerationChunk\n >({\n transform(chunk, controller) {\n // oxlint-disable-next-line no-void\n void runManager?.handleCustomEvent(`google-chunk-${moduleName}`, {\n chunk,\n });\n if (chunk === null) {\n controller.enqueue(\n new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({ content: \"\" }),\n generationInfo: { finishReason: \"stop\" },\n })\n );\n return;\n }\n\n // Extract text delta from the chunk\n const candidate = chunk.candidates?.[0];\n if (!candidate) {\n if (chunk.usageMetadata && streamUsage) {\n const cumulative =\n convertGeminiGenerateContentResponseToUsageMetadata(chunk);\n controller.enqueue(\n new ChatGenerationChunk({\n text: \"\",\n message: new AIMessageChunk({\n content: \"\",\n response_metadata: { model_provider: \"google\" },\n usage_metadata: subtractUsageMetadata(\n cumulative,\n previousUsage\n ),\n }),\n })\n );\n previousUsage = cumulative;\n }\n return;\n }\n\n const message = convertGeminiCandidateToAIMessage(candidate);\n const text = convertAIMessageToText(message);\n\n const parts = candidate.content?.parts ?? [];\n const toolCalls = convertGeminiPartsToToolCalls(parts);\n\n // Only emit if we have content\n if (parts.length > 0 || candidate.finishReason) {\n const messageChunkParams: AIMessageChunkFields = {\n content: message.content,\n tool_calls: toolCalls,\n response_metadata: {\n model_provider: \"google\",\n },\n additional_kwargs: {\n ...(message.additional_kwargs.originalTextContentBlock\n ? {\n originalTextContentBlock:\n message.additional_kwargs.originalTextContentBlock,\n }\n : {}),\n ...(candidate.finishReason\n ? {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n }\n : {}),\n },\n };\n\n if (chunk?.usageMetadata && streamUsage) {\n const cumulative =\n convertGeminiGenerateContentResponseToUsageMetadata(chunk);\n messageChunkParams.usage_metadata = subtractUsageMetadata(\n cumulative,\n previousUsage\n );\n previousUsage = cumulative;\n }\n const messageChunk = new AIMessageChunk(messageChunkParams);\n\n controller.enqueue(\n new ChatGenerationChunk({\n text: text,\n message: messageChunk,\n generationInfo: {\n ...(candidate.finishReason && {\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n }),\n ...(candidate.safetyRatings && {\n safetyRatings: candidate.safetyRatings,\n }),\n ...(candidate.citationMetadata && {\n citationMetadata: candidate.citationMetadata,\n }),\n ...(candidate.groundingMetadata && {\n groundingMetadata: candidate.groundingMetadata,\n // Support entries for the first content part only (matches messages.ts).\n groundingSupport:\n candidate.groundingMetadata.groundingSupports?.filter(\n (s) => (s?.segment?.partIndex ?? 0) === 0\n ),\n }),\n },\n })\n );\n }\n },\n })\n );\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n await runManager?.handleLLMNewToken(\n value.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: value }\n );\n }\n } finally {\n reader.releaseLock();\n }\n }\n }\n\n /**\n * Bind tool-like objects to this chat model.\n *\n * @param tools A list of tool definitions to bind to this chat model.\n * Can be a structured tool, an OpenAI formatted tool, or a Gemini function declaration.\n * @param kwargs Any additional parameters to bind.\n */\n bindTools(\n tools: BindToolsInput[],\n kwargs?: Partial<CallOptions>\n ): Runnable<BaseMessage[], AIMessageChunk, CallOptions> {\n return this.withConfig({\n ...kwargs,\n tools,\n } as Partial<CallOptions>);\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n /**\n * Get structured output from the model based on a schema.\n *\n * This method supports two modes:\n * - `jsonMode`: Uses `responseSchema` to get JSON responses directly (preferred for structured outputs)\n * - `functionCalling`: Uses function calling with tools (default, for compatibility)\n *\n * @param outputSchema - The schema to use for structured output (Zod schema or JSON Schema)\n * @param config - Configuration options including method and whether to include raw response\n * @returns A Runnable that returns the parsed structured output\n */\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n let llm: Runnable<BaseMessage[], AIMessageChunk, CallOptions>;\n let outputParser: Runnable<BaseMessage, RunOutput>;\n\n const { schema, name, includeRaw } = {\n ...config,\n schema: outputSchema,\n };\n let method = config?.method ?? \"functionCalling\";\n\n if (method === \"jsonMode\") {\n console.warn(\n `\"jsonMode\" is not supported for Google models. Falling back to \"jsonSchema\".`\n );\n method = \"jsonSchema\";\n }\n\n if (method === \"jsonSchema\") {\n // Use JSON mode with responseSchema\n llm = this.withConfig({\n responseSchema: schema,\n } as Partial<CallOptions>);\n\n outputParser = RunnableLambda.from<BaseMessage, RunOutput>(\n async (input: BaseMessage): Promise<RunOutput> => {\n if (\n !AIMessage.isInstance(input) &&\n !AIMessageChunk.isInstance(input)\n ) {\n throw new MalformedOutputError({\n message: \"Input is not an AIMessage or AIMessageChunk.\",\n });\n }\n\n if (!input.text) {\n throw new MalformedOutputError({\n message:\n \"No content found in response. Cannot parse structured output.\",\n });\n }\n\n // Parse JSON and validate with schema\n const parser = createContentParser(schema);\n return await parser.parse(input.text);\n }\n );\n } else if (method === \"functionCalling\") {\n // Use function calling mode\n let functionName = name ?? \"extract\";\n let geminiFunctionDeclaration: Gemini.Tools.FunctionDeclaration;\n\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n const description =\n typeof jsonSchema.description === \"string\"\n ? jsonSchema.description\n : \"A function available to call.\";\n geminiFunctionDeclaration = {\n name: functionName,\n description,\n parameters: jsonSchema as Gemini.Tools.Schema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDeclaration = schema as Gemini.Tools.FunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters\n const parameters = schemaToGeminiParameters(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description: (schema as { description?: string }).description ?? \"\",\n parameters,\n };\n }\n\n const tools: Gemini.Tool[] = [\n {\n functionDeclarations: [geminiFunctionDeclaration],\n },\n ];\n llm = this.bindTools(tools).withConfig({\n tool_choice: functionName,\n } as Partial<CallOptions>);\n\n outputParser = createFunctionCallingParser(schema, functionName);\n } else {\n throw new ConfigurationError(\n `Unrecognized structured output method '${method}'. Expected 'functionCalling' or 'jsonSchema'`\n );\n }\n\n return assembleStructuredOutputPipeline(\n llm,\n outputParser,\n includeRaw,\n includeRaw\n ? \"ChatGoogleStructuredOutputRunnable\"\n : \"ChatGoogleStructuredOutput\"\n );\n }\n}\n\ntype CombinableFields = Omit<BaseChatGoogleParams, \"model\">;\n\nexport function combineGoogleChatModelFields(\n a: CombinableFields,\n b: CombinableFields,\n ...rest: CombinableFields[]\n): CombinableFields {\n const combined: CombinableFields = {\n temperature: b.temperature ?? a.temperature,\n topP: b.topP ?? a.topP,\n topK: b.topK ?? a.topK,\n maxOutputTokens: b.maxOutputTokens ?? a.maxOutputTokens,\n presencePenalty: b.presencePenalty ?? a.presencePenalty,\n frequencyPenalty: b.frequencyPenalty ?? a.frequencyPenalty,\n stopSequences: b.stopSequences ?? a.stopSequences,\n seed: b.seed ?? a.seed,\n responseLogprobs: b.responseLogprobs ?? a.responseLogprobs,\n logprobs: b.logprobs ?? a.logprobs,\n safetySettings: b.safetySettings ?? a.safetySettings,\n responseSchema: b.responseSchema ?? a.responseSchema,\n tools: b.tools ?? a.tools,\n responseModalities: b.responseModalities ?? a.responseModalities,\n enableEnhancedCivicAnswers:\n b.enableEnhancedCivicAnswers ?? a.enableEnhancedCivicAnswers,\n speechConfig: b.speechConfig ?? a.speechConfig,\n imageConfig: b.imageConfig ?? a.imageConfig,\n mediaResolution: b.mediaResolution ?? a.mediaResolution,\n detail: b.detail ?? a.detail,\n maxReasoningTokens: b.maxReasoningTokens ?? a.maxReasoningTokens,\n thinkingBudget: b.thinkingBudget ?? a.thinkingBudget,\n reasoningEffort: b.reasoningEffort ?? a.reasoningEffort,\n thinkingLevel: b.thinkingLevel ?? a.thinkingLevel,\n serviceTier: b.serviceTier ?? a.serviceTier,\n };\n if (rest.length > 0) {\n return combineGoogleChatModelFields(combined, rest[0], ...rest.slice(1));\n }\n return combined;\n}\n\nexport function getGoogleChatModelParams<TParams extends BaseChatGoogleParams>(\n modelOrParams: string | TParams,\n paramsArg?: Omit<TParams, \"model\">\n): TParams {\n const model =\n typeof modelOrParams === \"string\" ? modelOrParams : modelOrParams.model;\n const params = typeof modelOrParams === \"string\" ? paramsArg : modelOrParams;\n return { model, ...params } as TParams;\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
//#region src/chat_models/profiles.ts
|
|
2
2
|
const PROFILES = {
|
|
3
|
+
"gemini-4-argon": {
|
|
4
|
+
maxInputTokens: 1048576,
|
|
5
|
+
imageInputs: true,
|
|
6
|
+
audioInputs: true,
|
|
7
|
+
pdfInputs: true,
|
|
8
|
+
videoInputs: true,
|
|
9
|
+
maxOutputTokens: 65536,
|
|
10
|
+
reasoningOutput: true,
|
|
11
|
+
imageOutputs: false,
|
|
12
|
+
audioOutputs: false,
|
|
13
|
+
videoOutputs: false,
|
|
14
|
+
toolCalling: true,
|
|
15
|
+
structuredOutput: true
|
|
16
|
+
},
|
|
3
17
|
"gemini-embedding-001": {
|
|
4
18
|
maxInputTokens: 2048,
|
|
5
19
|
imageInputs: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.cjs","names":[],"sources":["../../src/chat_models/profiles.ts"],"sourcesContent":["/**\n * This file was automatically generated by an automated script. Do not edit manually.\n */\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nconst PROFILES: Record<string, ModelProfile> = {\n \"gemini-embedding-001\": {\n maxInputTokens: 2048,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 3072,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-lite-preview-09-2025\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro-preview-06-05\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-04-17\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-preview-09-2025\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro-preview-05-06\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-05-20\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-live-2.5-flash\": {\n maxInputTokens: 128000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-3-flash-preview\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-live-2.5-flash-preview-native-audio\": {\n maxInputTokens: 131072,\n imageInputs: false,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-lite\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-tts\": {\n maxInputTokens: 8000,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 16000,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-flash-latest\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-lite-preview-06-17\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-image\": {\n maxInputTokens: 32768,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 32768,\n reasoningOutput: true,\n imageOutputs: true,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-pro-preview-tts\": {\n maxInputTokens: 8000,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 16000,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-image-preview\": {\n maxInputTokens: 32768,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 32768,\n reasoningOutput: true,\n imageOutputs: true,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-1.5-flash-8b\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-3-pro-preview\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.0-flash-lite\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-1.5-flash\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-flash-lite-latest\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.0-flash\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-1.5-pro\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n};\nexport default PROFILES;\n"],"mappings":";AAIA,MAAM,WAAyC;CAC7C,wBAAwB;EACtB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yCAAyC;EACvC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oCAAoC;EAClC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,0BAA0B;EACxB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,8CAA8C;EAC5C,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uBAAuB;EACrB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uCAAuC;EACrC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,0BAA0B;EACxB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,8BAA8B;EAC5B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uBAAuB;EACrB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,wBAAwB;EACtB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,4BAA4B;EAC1B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kBAAkB;EAChB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kBAAkB;EAChB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;AACF"}
|
|
1
|
+
{"version":3,"file":"profiles.cjs","names":[],"sources":["../../src/chat_models/profiles.ts"],"sourcesContent":["/**\n * This file was automatically generated by an automated script. Do not edit manually.\n */\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nconst PROFILES: Record<string, ModelProfile> = {\n \"gemini-4-argon\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-embedding-001\": {\n maxInputTokens: 2048,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 3072,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-lite-preview-09-2025\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro-preview-06-05\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-04-17\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-preview-09-2025\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro-preview-05-06\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-05-20\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-live-2.5-flash\": {\n maxInputTokens: 128000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-3-flash-preview\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-live-2.5-flash-preview-native-audio\": {\n maxInputTokens: 131072,\n imageInputs: false,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-lite\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-tts\": {\n maxInputTokens: 8000,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 16000,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-flash-latest\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-lite-preview-06-17\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-image\": {\n maxInputTokens: 32768,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 32768,\n reasoningOutput: true,\n imageOutputs: true,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-pro-preview-tts\": {\n maxInputTokens: 8000,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 16000,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-image-preview\": {\n maxInputTokens: 32768,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 32768,\n reasoningOutput: true,\n imageOutputs: true,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-1.5-flash-8b\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-3-pro-preview\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.0-flash-lite\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-1.5-flash\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-flash-lite-latest\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.0-flash\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-1.5-pro\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n};\nexport default PROFILES;\n"],"mappings":";AAIA,MAAM,WAAyC;CAC7C,kBAAkB;EAChB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,wBAAwB;EACtB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yCAAyC;EACvC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oCAAoC;EAClC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,0BAA0B;EACxB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,8CAA8C;EAC5C,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uBAAuB;EACrB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uCAAuC;EACrC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,0BAA0B;EACxB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,8BAA8B;EAC5B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uBAAuB;EACrB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,wBAAwB;EACtB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,4BAA4B;EAC1B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kBAAkB;EAChB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kBAAkB;EAChB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;AACF"}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
//#region src/chat_models/profiles.ts
|
|
2
2
|
const PROFILES = {
|
|
3
|
+
"gemini-4-argon": {
|
|
4
|
+
maxInputTokens: 1048576,
|
|
5
|
+
imageInputs: true,
|
|
6
|
+
audioInputs: true,
|
|
7
|
+
pdfInputs: true,
|
|
8
|
+
videoInputs: true,
|
|
9
|
+
maxOutputTokens: 65536,
|
|
10
|
+
reasoningOutput: true,
|
|
11
|
+
imageOutputs: false,
|
|
12
|
+
audioOutputs: false,
|
|
13
|
+
videoOutputs: false,
|
|
14
|
+
toolCalling: true,
|
|
15
|
+
structuredOutput: true
|
|
16
|
+
},
|
|
3
17
|
"gemini-embedding-001": {
|
|
4
18
|
maxInputTokens: 2048,
|
|
5
19
|
imageInputs: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.js","names":[],"sources":["../../src/chat_models/profiles.ts"],"sourcesContent":["/**\n * This file was automatically generated by an automated script. Do not edit manually.\n */\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nconst PROFILES: Record<string, ModelProfile> = {\n \"gemini-embedding-001\": {\n maxInputTokens: 2048,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 3072,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-lite-preview-09-2025\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro-preview-06-05\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-04-17\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-preview-09-2025\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro-preview-05-06\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-05-20\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-live-2.5-flash\": {\n maxInputTokens: 128000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-3-flash-preview\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-live-2.5-flash-preview-native-audio\": {\n maxInputTokens: 131072,\n imageInputs: false,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-lite\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-tts\": {\n maxInputTokens: 8000,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 16000,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-flash-latest\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-lite-preview-06-17\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-image\": {\n maxInputTokens: 32768,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 32768,\n reasoningOutput: true,\n imageOutputs: true,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-pro-preview-tts\": {\n maxInputTokens: 8000,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 16000,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-image-preview\": {\n maxInputTokens: 32768,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 32768,\n reasoningOutput: true,\n imageOutputs: true,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-1.5-flash-8b\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-3-pro-preview\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.0-flash-lite\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-1.5-flash\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-flash-lite-latest\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.0-flash\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-1.5-pro\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n};\nexport default PROFILES;\n"],"mappings":";AAIA,MAAM,WAAyC;CAC7C,wBAAwB;EACtB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yCAAyC;EACvC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oCAAoC;EAClC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,0BAA0B;EACxB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,8CAA8C;EAC5C,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uBAAuB;EACrB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uCAAuC;EACrC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,0BAA0B;EACxB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,8BAA8B;EAC5B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uBAAuB;EACrB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,wBAAwB;EACtB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,4BAA4B;EAC1B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kBAAkB;EAChB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kBAAkB;EAChB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;AACF"}
|
|
1
|
+
{"version":3,"file":"profiles.js","names":[],"sources":["../../src/chat_models/profiles.ts"],"sourcesContent":["/**\n * This file was automatically generated by an automated script. Do not edit manually.\n */\nimport type { ModelProfile } from \"@langchain/core/language_models/profile\";\nconst PROFILES: Record<string, ModelProfile> = {\n \"gemini-4-argon\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-embedding-001\": {\n maxInputTokens: 2048,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 3072,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-lite-preview-09-2025\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro-preview-06-05\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-04-17\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-preview-09-2025\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro-preview-05-06\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-05-20\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-live-2.5-flash\": {\n maxInputTokens: 128000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-3-flash-preview\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-live-2.5-flash-preview-native-audio\": {\n maxInputTokens: 131072,\n imageInputs: false,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-lite\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-preview-tts\": {\n maxInputTokens: 8000,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 16000,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-flash-latest\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-flash-lite-preview-06-17\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-image\": {\n maxInputTokens: 32768,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 32768,\n reasoningOutput: true,\n imageOutputs: true,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-pro-preview-tts\": {\n maxInputTokens: 8000,\n imageInputs: false,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 16000,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: true,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-2.5-flash-image-preview\": {\n maxInputTokens: 32768,\n imageInputs: true,\n audioInputs: false,\n pdfInputs: false,\n videoInputs: false,\n maxOutputTokens: 32768,\n reasoningOutput: true,\n imageOutputs: true,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: false,\n structuredOutput: false,\n },\n \"gemini-1.5-flash-8b\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-3-pro-preview\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 64000,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.0-flash-lite\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-1.5-flash\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n \"gemini-flash-lite-latest\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.5-pro\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 65536,\n reasoningOutput: true,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-2.0-flash\": {\n maxInputTokens: 1048576,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: true,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: true,\n },\n \"gemini-1.5-pro\": {\n maxInputTokens: 1000000,\n imageInputs: true,\n audioInputs: true,\n pdfInputs: false,\n videoInputs: true,\n maxOutputTokens: 8192,\n reasoningOutput: false,\n imageOutputs: false,\n audioOutputs: false,\n videoOutputs: false,\n toolCalling: true,\n structuredOutput: false,\n },\n};\nexport default PROFILES;\n"],"mappings":";AAIA,MAAM,WAAyC;CAC7C,kBAAkB;EAChB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,wBAAwB;EACtB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yCAAyC;EACvC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oCAAoC;EAClC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,0BAA0B;EACxB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,8CAA8C;EAC5C,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,gCAAgC;EAC9B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uBAAuB;EACrB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uCAAuC;EACrC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,0BAA0B;EACxB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,8BAA8B;EAC5B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kCAAkC;EAChC,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,uBAAuB;EACrB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,wBAAwB;EACtB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,yBAAyB;EACvB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,4BAA4B;EAC1B,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kBAAkB;EAChB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,oBAAoB;EAClB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;CACA,kBAAkB;EAChB,gBAAgB;EAChB,aAAa;EACb,aAAa;EACb,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,cAAc;EACd,aAAa;EACb,kBAAkB;CACpB;AACF"}
|
|
@@ -109,6 +109,13 @@ function convertParamsToPlatformType(params) {
|
|
|
109
109
|
if (params.vertexai === true) return "gcp";
|
|
110
110
|
}
|
|
111
111
|
/**
|
|
112
|
+
* Returns the model family from a Gemini model name.
|
|
113
|
+
* e.g. "gemini-2.5-flash" → "gemini"
|
|
114
|
+
*/
|
|
115
|
+
function getModelFamily(model) {
|
|
116
|
+
return model.split("-")[0];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
112
119
|
* Returns the model version from a Gemini model name.
|
|
113
120
|
* e.g. "gemini-2.5-flash" → "2.5"
|
|
114
121
|
*/
|
|
@@ -163,7 +170,7 @@ function convertFieldsToThinkingConfig(model, fields) {
|
|
|
163
170
|
}
|
|
164
171
|
let thinkingLevel = (fields?.reasoningEffort ?? fields?.thinkingLevel ?? convertReasoningTokensToReasoningEffort(model, fields?.maxReasoningTokens ?? fields?.thinkingBudget))?.toUpperCase();
|
|
165
172
|
if (thinkingLevel === "MINIMAL") includeThoughts = false;
|
|
166
|
-
if (thinkingLevel === "MINIMAL" && model
|
|
173
|
+
if (thinkingLevel === "MINIMAL" && getModelFamily(model) === "gemini" && Number(getModelVersion(model)) >= 3 && !supportsMinimalThinkingLevel(model)) thinkingLevel = "LOW";
|
|
167
174
|
if (model.startsWith("gemini-3-pro") && thinkingLevel === "MEDIUM") thinkingLevel = "HIGH";
|
|
168
175
|
const modelVersion = getModelVersion(model);
|
|
169
176
|
const modelSpecialty = getModelSpecialty(model);
|
|
@@ -231,6 +238,7 @@ exports.convertFieldsToThinkingConfig = convertFieldsToThinkingConfig;
|
|
|
231
238
|
exports.convertParamsToPlatformType = convertParamsToPlatformType;
|
|
232
239
|
exports.convertReasoningEffortToReasoningTokens = convertReasoningEffortToReasoningTokens;
|
|
233
240
|
exports.convertReasoningTokensToReasoningEffort = convertReasoningTokensToReasoningEffort;
|
|
241
|
+
exports.getModelFamily = getModelFamily;
|
|
234
242
|
exports.getModelLevel = getModelLevel;
|
|
235
243
|
exports.getModelSpecialty = getModelSpecialty;
|
|
236
244
|
exports.getModelVersion = getModelVersion;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.cjs","names":["settableServiceTier"],"sources":["../../src/converters/params.ts"],"sourcesContent":["import {\n ChatGoogleFields,\n GooglePlatformType,\n settableServiceTier,\n SimplifiedSpeechConfig,\n SimplifiedSpeechLanguageConfig,\n SpeechSpeakerName,\n SpeechVoice,\n SpeechVoiceLanguage,\n} from \"../chat_models/types.js\";\nimport type { Gemini } from \"../chat_models/api-types.js\";\n\n/**\n * Converts a reasoning \"effort\" level value (e.g., \"minimal\", \"low\", \"medium\", \"high\")\n * to a corresponding reasoning token budget, depending on the target Gemini model.\n *\n * This mapping is essential when configuring Google Gemini API calls with reasoning\n * effort/level fields (as in the Gemini OpenAI-compatible API) or when translating\n * user-friendly configuration to explicit token budgets.\n *\n * - The mapping is refined to reflect the constraints documented by Google:\n * - For \"gemini-2.5-flash\" models, token budgets may be set as low as 0 and up to 24k.\n * - For other Gemini models, minimum is 128, maximum is 32k.\n * - Standard effort levels and their token mappings:\n * - \"none\" / \"minimal\": lowest allowed (minTokens)\n * - \"low\": 1k tokens\n * - \"medium\": 8k tokens\n * - \"high\": maximum allowed for the model (maxTokens)\n * - See reference:\n * https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n * https://ai.google.dev/gemini-api/docs/openai#thinking\n *\n * @param {string | undefined} modelName\n * The Gemini model name (e.g., \"gemini-2.5-flash\"). Used to determine token range constraints.\n * @param {string | undefined} effort\n * The reasoning effort level: one of \"none\", \"minimal\", \"low\", \"medium\", \"high\"\n * (case-insensitive). If undefined, the function returns undefined.\n * @returns {number | undefined}\n * The corresponding token count for the given effort and model. Returns undefined if\n * the effort is not recognized or not provided.\n *\n * @example\n * convertReasoningEffortToReasoningTokens(\"gemini-2.5-flash\", \"medium\") // 8192\n * convertReasoningEffortToReasoningTokens(\"gemini-1.5-pro\", \"high\") // 32768\n * convertReasoningEffortToReasoningTokens(\"gemini-2.5-flash\", \"none\") // 0\n * convertReasoningEffortToReasoningTokens(undefined, \"low\") // 1024\n */\nexport function convertReasoningEffortToReasoningTokens(\n modelName?: string,\n effort?: string\n): number | undefined {\n if (effort === undefined) {\n return undefined;\n }\n\n // gemini-2.5-flash and -flash-lite can be disabled. Others can't.\n // https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n const minTokens: number = modelName?.startsWith(\"gemini-2.5-flash\") ? 0 : 128;\n const maxTokens: number = modelName?.startsWith(\"gemini-2.5-flash\")\n ? 24 * 1024\n : 32 * 1024;\n\n const normalizedEffort = effort.toLowerCase();\n switch (normalizedEffort) {\n case \"none\":\n case \"minimal\":\n return minTokens;\n case \"low\":\n // Defined as 1k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 1024;\n case \"medium\":\n // Defined as 8k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 8 * 1024;\n case \"high\":\n // Defined as 24k or 32k (model-dependent) by https://ai.google.dev/gemini-api/docs/openai#thinking\n return maxTokens;\n default:\n return undefined;\n }\n}\n\n/**\n * Converts a reasoning token budget (e.g., 0, 1024, 8192, 32768) to its corresponding\n * reasoning \"effort\" level, as used in the Google Gemini API (\"minimal\", \"low\", \"medium\", \"high\").\n *\n * This is the inverse of {@link convertReasoningEffortToReasoningTokens}. It is useful for\n * translating explicit numeric settings (often surfaced in raw API responses or configs)\n * into user-facing friendly reasoning levels/labels. The mapping relies on Google's\n * documented reasoning levels for different models:\n *\n * - -1 means default effort (per API documentation: this is \"minimal\" for flash-lite models\n * and \"high\" (dynamic) for others).\n * - 0 means \"minimal\" unless the model is \"gemini-3-pro\", for which it maps to \"low\".\n * - <= 1024 tokens: \"low\"\n * - <= 8192 tokens: \"medium\" (unless model is \"gemini-3-pro\", for which it reverts to \"low\")\n * - > 8192: \"high\"\n *\n * Reference:\n * https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n * https://ai.google.dev/gemini-api/docs/openai#thinking\n *\n * @param {string | undefined} model\n * The Gemini model name (e.g., \"gemini-3-pro\"). Used for model-specific special cases.\n * @param {number | undefined} reasoningTokens\n * The token budget to convert. If undefined, the function returns undefined.\n * @returns {Lowercase<Gemini.ThinkingLevel> | undefined}\n * The reasoning \"effort\" level (\"minimal\", \"low\", \"medium\", \"high\") or undefined if input is not valid.\n *\n * @example\n * convertReasoningTokensToReasoningEffort(\"gemini-3-pro\", 0) // \"low\"\n * convertReasoningTokensToReasoningEffort(\"gemini-1.5-pro\", 0) // \"minimal\"\n * convertReasoningTokensToReasoningEffort(undefined, 1024) // \"low\"\n * convertReasoningTokensToReasoningEffort(undefined, -1) // \"high\"\n * convertReasoningTokensToReasoningEffort(undefined, 9000) // \"high\"\n */\nexport function convertReasoningTokensToReasoningEffort(\n model?: string,\n reasoningTokens?: number\n): Gemini.ThinkingLevel | undefined {\n if (typeof reasoningTokens === \"undefined\") {\n return undefined;\n } else if (reasoningTokens === -1) {\n // -1 means \"minimal\" for flash-lite models and \"high\"/dynamic for others\n // (\"default\" per https://ai.google.dev/gemini-api/docs/thinking#thinking-levels)\n if (model && getModelLevel(model) === \"flash-lite\") {\n return \"minimal\";\n }\n return \"high\";\n } else if (reasoningTokens === 0) {\n if (model?.startsWith(\"gemini-3-pro\")) {\n return \"low\";\n } else {\n return \"minimal\";\n }\n } else if (reasoningTokens <= 1024) {\n return \"low\";\n } else if (reasoningTokens <= 8192) {\n if (model?.startsWith(\"gemini-3-pro\")) {\n return \"low\";\n } else {\n return \"medium\";\n }\n } else {\n return \"high\";\n }\n}\n\n/**\n * Infers and returns the Google platform type from the provided chat model parameters.\n *\n * This function helps determine which Google platform (e.g., Vertex AI on GCP or the public API)\n * should be used for calling Gemini/PaLM endpoints, based on the options provided in\n * {@link BaseChatGoogleParams} (such as model constructors or call options).\n */\nexport function convertParamsToPlatformType(params: {\n platformType?: GooglePlatformType;\n vertexai?: boolean;\n}): GooglePlatformType | undefined {\n if (typeof params === \"undefined\") {\n return undefined;\n }\n if (typeof params.platformType !== \"undefined\") {\n return params.platformType;\n }\n if (params.vertexai === true) {\n return \"gcp\";\n }\n return undefined;\n}\n\n/**\n * Returns the model family from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"gemini\"\n */\nexport function getModelFamily(model: string): string {\n return model.split(\"-\")[0];\n}\n\n/**\n * Returns the model version from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"2.5\"\n */\nexport function getModelVersion(model: string): string {\n return model.split(\"-\")[1];\n}\n\n/**\n * Returns the model level from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"flash\", \"gemini-2.5-flash-lite\" → \"flash-lite\"\n */\nexport function getModelLevel(model: string): string {\n const parts = model.split(\"-\");\n let ret = parts[2];\n if (ret === \"flash\" && parts[3] === \"lite\") {\n ret = \"flash-lite\";\n }\n return ret;\n}\n\n/**\n * Returns the model specialty from a Gemini model name.\n * e.g. \"gemini-2.5-flash-preview-image\" → \"image\",\n * \"gemini-2.5-flash-preview-tts\" → \"tts\",\n * \"gemini-2.5-flash\" → \"\"\n */\nexport function getModelSpecialty(model: string): string {\n if (model.includes(\"image\")) {\n return \"image\";\n } else if (model.includes(\"tts\")) {\n return \"tts\";\n } else {\n return \"\";\n }\n}\n\n// Gemini 3 models that accept thinkingLevel \"MINIMAL\"; the others reject it with a 400, so they get \"LOW\".\n// TODO: Move this to model profile.\nconst MINIMAL_THINKING_LEVEL_MODELS = [\n \"gemini-3-flash\",\n \"gemini-3.1-flash-lite\",\n \"gemini-3.5-flash\",\n \"gemini-3.6-flash\",\n];\n\nfunction supportsMinimalThinkingLevel(model: string): boolean {\n return MINIMAL_THINKING_LEVEL_MODELS.some((prefix) =>\n model.startsWith(prefix)\n );\n}\n\n/**\n * Builds the `thinkingConfig` object for the Gemini `generationConfig`,\n * translating user-facing reasoning fields into the wire format.\n *\n * @param model The full Gemini model name (e.g. \"gemini-2.5-flash\").\n * @param fields The combined user/call-option fields.\n * @returns A populated {@link Gemini.ThinkingConfig}, or `{}`\n * when thinking should not be explicitly configured.\n */\nexport function convertFieldsToThinkingConfig(\n model: string,\n fields: ChatGoogleFields\n): Gemini.ThinkingConfig | undefined {\n // Thinking / reasoning\n let includeThoughts = true;\n\n let thinkingBudget =\n fields?.maxReasoningTokens ??\n fields?.thinkingBudget ??\n convertReasoningEffortToReasoningTokens(\n model,\n fields?.reasoningEffort ?? fields?.thinkingLevel\n );\n if (\n thinkingBudget === 0 ||\n (model.includes(\"pro\") && thinkingBudget === 128)\n ) {\n includeThoughts = false;\n }\n if (\n model.startsWith(\"gemini-2.5-pro\") &&\n typeof thinkingBudget !== \"undefined\"\n ) {\n // Can't turn off Gemini 2.5 Pro thinking completely\n if (thinkingBudget >= 0 && thinkingBudget < 128) {\n thinkingBudget = 128;\n }\n }\n\n const thinkingLevelRaw =\n fields?.reasoningEffort ??\n fields?.thinkingLevel ??\n convertReasoningTokensToReasoningEffort(\n model,\n fields?.maxReasoningTokens ?? fields?.thinkingBudget\n );\n let thinkingLevel = thinkingLevelRaw?.toUpperCase();\n if (thinkingLevel === \"MINIMAL\") {\n includeThoughts = false;\n }\n if (\n thinkingLevel === \"MINIMAL\" &&\n model.startsWith(\"gemini-3\") &&\n !supportsMinimalThinkingLevel(model)\n ) {\n thinkingLevel = \"LOW\";\n }\n if (model.startsWith(\"gemini-3-pro\") && thinkingLevel === \"MEDIUM\") {\n // Gemini 3 Pro has only low and high.\n thinkingLevel = \"HIGH\";\n }\n\n // If we are using a model that doesn't support thinking at all (gemini 2.5 imaging)\n // or we haven't explicitly tried to set a thinking budget/level, then bail out.\n const modelVersion = getModelVersion(model);\n const modelSpecialty = getModelSpecialty(model);\n const thoughtsNotSupported =\n modelVersion === \"2.5\" && modelSpecialty === \"image\";\n if (\n thoughtsNotSupported ||\n typeof thinkingBudget === \"undefined\" ||\n typeof thinkingLevel === \"undefined\"\n ) {\n return undefined;\n }\n\n // If we have gotten this far, then we want to explicitly set if we include thoughts or not.\n const thinkingConfig: Gemini.ThinkingConfig = {\n includeThoughts,\n };\n\n // Explicitly setting the budget/level is only valid (currently) for text models.\n if (modelSpecialty === \"\") {\n if (model.startsWith(\"gemini-2.5\")) {\n thinkingConfig.thinkingBudget = thinkingBudget;\n } else {\n thinkingConfig.thinkingLevel = thinkingLevel as Gemini.ThinkingLevel;\n }\n }\n\n return thinkingConfig;\n}\n\n/**\n * Builds the `speechConfig` object for the Gemini `generationConfig`,\n * normalising the user-friendly simplified forms into the wire format.\n *\n * @param fields The combined user/call-option fields.\n * @returns A populated {@link Gemini.SpeechConfig}, or `{}`\n * when no speech config was provided.\n */\nexport function convertFieldsToSpeechConfig(\n fields: ChatGoogleFields\n): Gemini.SpeechConfig | undefined {\n const config: Gemini.SpeechConfig | SimplifiedSpeechConfig | undefined =\n fields.speechConfig;\n if (typeof config === \"undefined\") {\n return undefined;\n }\n\n function isSpeechConfig(\n config: Gemini.SpeechConfig | SimplifiedSpeechConfig\n ): config is Gemini.SpeechConfig {\n return (\n typeof config === \"object\" &&\n (Object.hasOwn(config, \"voiceConfig\") ||\n Object.hasOwn(config, \"multiSpeakerVoiceConfig\"))\n );\n }\n\n function hasLanguage(\n config: SimplifiedSpeechConfig\n ): config is SimplifiedSpeechLanguageConfig {\n return typeof config === \"object\" && Object.hasOwn(config, \"languageCode\");\n }\n\n function hasVoice(\n config: SimplifiedSpeechLanguageConfig\n ): config is SpeechVoiceLanguage {\n return Object.hasOwn(config, \"voice\");\n }\n\n // If this is already a SpeechConfig, just return it\n if (isSpeechConfig(config)) {\n return config;\n }\n\n let languageCode: string | undefined;\n let voice: SpeechVoice;\n if (hasLanguage(config)) {\n languageCode = config.languageCode;\n voice = hasVoice(config) ? config.voice : config.voices;\n } else {\n languageCode = undefined;\n voice = config;\n }\n\n let ret: Gemini.SpeechConfig;\n\n if (typeof voice === \"string\") {\n // They just provided the prebuilt voice configuration name. Use it.\n ret = {\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: voice,\n },\n },\n };\n } else {\n // This is multi-speaker, so we have speaker/name pairs\n // If we have just one (why?), turn it into an array for the moment\n const voices: SpeechSpeakerName[] = Array.isArray(voice) ? voice : [voice];\n // Go through all the speaker/name pairs and turn this into the voice config array\n const speakerVoiceConfigs: Gemini.SpeakerVoiceConfig[] = voices.map(\n (v: SpeechSpeakerName): Gemini.SpeakerVoiceConfig => ({\n speaker: v.speaker,\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: v.name,\n },\n },\n })\n );\n // Create the multi-speaker voice configuration\n ret = {\n multiSpeakerVoiceConfig: {\n speakerVoiceConfigs,\n },\n };\n }\n\n if (languageCode) {\n ret.languageCode = languageCode;\n }\n\n return ret;\n}\n\ntype ServiceTierResponse = {} | { serviceTier: Gemini.ServiceTier };\n\n/**\n * Builds an object that can be included as part of the request\n * which will add a `speechConfig` attribute if appropriate.\n */\nexport function convertFieldsToServiceTier(\n platform: GooglePlatformType,\n fields: ChatGoogleFields\n): ServiceTierResponse {\n // Service tier is handled in a different way on GCP\n if (platform === \"gcp\") {\n return {};\n }\n\n const serviceTier = fields.serviceTier;\n if (!serviceTier || !settableServiceTier.includes(serviceTier)) {\n return {};\n }\n\n return {\n serviceTier: serviceTier,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"params.cjs","names":["settableServiceTier"],"sources":["../../src/converters/params.ts"],"sourcesContent":["import {\n ChatGoogleFields,\n GooglePlatformType,\n settableServiceTier,\n SimplifiedSpeechConfig,\n SimplifiedSpeechLanguageConfig,\n SpeechSpeakerName,\n SpeechVoice,\n SpeechVoiceLanguage,\n} from \"../chat_models/types.js\";\nimport type { Gemini } from \"../chat_models/api-types.js\";\n\n/**\n * Converts a reasoning \"effort\" level value (e.g., \"minimal\", \"low\", \"medium\", \"high\")\n * to a corresponding reasoning token budget, depending on the target Gemini model.\n *\n * This mapping is essential when configuring Google Gemini API calls with reasoning\n * effort/level fields (as in the Gemini OpenAI-compatible API) or when translating\n * user-friendly configuration to explicit token budgets.\n *\n * - The mapping is refined to reflect the constraints documented by Google:\n * - For \"gemini-2.5-flash\" models, token budgets may be set as low as 0 and up to 24k.\n * - For other Gemini models, minimum is 128, maximum is 32k.\n * - Standard effort levels and their token mappings:\n * - \"none\" / \"minimal\": lowest allowed (minTokens)\n * - \"low\": 1k tokens\n * - \"medium\": 8k tokens\n * - \"high\": maximum allowed for the model (maxTokens)\n * - See reference:\n * https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n * https://ai.google.dev/gemini-api/docs/openai#thinking\n *\n * @param {string | undefined} modelName\n * The Gemini model name (e.g., \"gemini-2.5-flash\"). Used to determine token range constraints.\n * @param {string | undefined} effort\n * The reasoning effort level: one of \"none\", \"minimal\", \"low\", \"medium\", \"high\"\n * (case-insensitive). If undefined, the function returns undefined.\n * @returns {number | undefined}\n * The corresponding token count for the given effort and model. Returns undefined if\n * the effort is not recognized or not provided.\n *\n * @example\n * convertReasoningEffortToReasoningTokens(\"gemini-2.5-flash\", \"medium\") // 8192\n * convertReasoningEffortToReasoningTokens(\"gemini-1.5-pro\", \"high\") // 32768\n * convertReasoningEffortToReasoningTokens(\"gemini-2.5-flash\", \"none\") // 0\n * convertReasoningEffortToReasoningTokens(undefined, \"low\") // 1024\n */\nexport function convertReasoningEffortToReasoningTokens(\n modelName?: string,\n effort?: string\n): number | undefined {\n if (effort === undefined) {\n return undefined;\n }\n\n // gemini-2.5-flash and -flash-lite can be disabled. Others can't.\n // https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n const minTokens: number = modelName?.startsWith(\"gemini-2.5-flash\") ? 0 : 128;\n const maxTokens: number = modelName?.startsWith(\"gemini-2.5-flash\")\n ? 24 * 1024\n : 32 * 1024;\n\n const normalizedEffort = effort.toLowerCase();\n switch (normalizedEffort) {\n case \"none\":\n case \"minimal\":\n return minTokens;\n case \"low\":\n // Defined as 1k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 1024;\n case \"medium\":\n // Defined as 8k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 8 * 1024;\n case \"high\":\n // Defined as 24k or 32k (model-dependent) by https://ai.google.dev/gemini-api/docs/openai#thinking\n return maxTokens;\n default:\n return undefined;\n }\n}\n\n/**\n * Converts a reasoning token budget (e.g., 0, 1024, 8192, 32768) to its corresponding\n * reasoning \"effort\" level, as used in the Google Gemini API (\"minimal\", \"low\", \"medium\", \"high\").\n *\n * This is the inverse of {@link convertReasoningEffortToReasoningTokens}. It is useful for\n * translating explicit numeric settings (often surfaced in raw API responses or configs)\n * into user-facing friendly reasoning levels/labels. The mapping relies on Google's\n * documented reasoning levels for different models:\n *\n * - -1 means default effort (per API documentation: this is \"minimal\" for flash-lite models\n * and \"high\" (dynamic) for others).\n * - 0 means \"minimal\" unless the model is \"gemini-3-pro\", for which it maps to \"low\".\n * - <= 1024 tokens: \"low\"\n * - <= 8192 tokens: \"medium\" (unless model is \"gemini-3-pro\", for which it reverts to \"low\")\n * - > 8192: \"high\"\n *\n * Reference:\n * https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n * https://ai.google.dev/gemini-api/docs/openai#thinking\n *\n * @param {string | undefined} model\n * The Gemini model name (e.g., \"gemini-3-pro\"). Used for model-specific special cases.\n * @param {number | undefined} reasoningTokens\n * The token budget to convert. If undefined, the function returns undefined.\n * @returns {Lowercase<Gemini.ThinkingLevel> | undefined}\n * The reasoning \"effort\" level (\"minimal\", \"low\", \"medium\", \"high\") or undefined if input is not valid.\n *\n * @example\n * convertReasoningTokensToReasoningEffort(\"gemini-3-pro\", 0) // \"low\"\n * convertReasoningTokensToReasoningEffort(\"gemini-1.5-pro\", 0) // \"minimal\"\n * convertReasoningTokensToReasoningEffort(undefined, 1024) // \"low\"\n * convertReasoningTokensToReasoningEffort(undefined, -1) // \"high\"\n * convertReasoningTokensToReasoningEffort(undefined, 9000) // \"high\"\n */\nexport function convertReasoningTokensToReasoningEffort(\n model?: string,\n reasoningTokens?: number\n): Gemini.ThinkingLevel | undefined {\n if (typeof reasoningTokens === \"undefined\") {\n return undefined;\n } else if (reasoningTokens === -1) {\n // -1 means \"minimal\" for flash-lite models and \"high\"/dynamic for others\n // (\"default\" per https://ai.google.dev/gemini-api/docs/thinking#thinking-levels)\n if (model && getModelLevel(model) === \"flash-lite\") {\n return \"minimal\";\n }\n return \"high\";\n } else if (reasoningTokens === 0) {\n if (model?.startsWith(\"gemini-3-pro\")) {\n return \"low\";\n } else {\n return \"minimal\";\n }\n } else if (reasoningTokens <= 1024) {\n return \"low\";\n } else if (reasoningTokens <= 8192) {\n if (model?.startsWith(\"gemini-3-pro\")) {\n return \"low\";\n } else {\n return \"medium\";\n }\n } else {\n return \"high\";\n }\n}\n\n/**\n * Infers and returns the Google platform type from the provided chat model parameters.\n *\n * This function helps determine which Google platform (e.g., Vertex AI on GCP or the public API)\n * should be used for calling Gemini/PaLM endpoints, based on the options provided in\n * {@link BaseChatGoogleParams} (such as model constructors or call options).\n */\nexport function convertParamsToPlatformType(params: {\n platformType?: GooglePlatformType;\n vertexai?: boolean;\n}): GooglePlatformType | undefined {\n if (typeof params === \"undefined\") {\n return undefined;\n }\n if (typeof params.platformType !== \"undefined\") {\n return params.platformType;\n }\n if (params.vertexai === true) {\n return \"gcp\";\n }\n return undefined;\n}\n\n/**\n * Returns the model family from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"gemini\"\n */\nexport function getModelFamily(model: string): string {\n return model.split(\"-\")[0];\n}\n\n/**\n * Returns the model version from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"2.5\"\n */\nexport function getModelVersion(model: string): string {\n return model.split(\"-\")[1];\n}\n\n/**\n * Returns the model level from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"flash\", \"gemini-2.5-flash-lite\" → \"flash-lite\"\n */\nexport function getModelLevel(model: string): string {\n const parts = model.split(\"-\");\n let ret = parts[2];\n if (ret === \"flash\" && parts[3] === \"lite\") {\n ret = \"flash-lite\";\n }\n return ret;\n}\n\n/**\n * Returns the model specialty from a Gemini model name.\n * e.g. \"gemini-2.5-flash-preview-image\" → \"image\",\n * \"gemini-2.5-flash-preview-tts\" → \"tts\",\n * \"gemini-2.5-flash\" → \"\"\n */\nexport function getModelSpecialty(model: string): string {\n if (model.includes(\"image\")) {\n return \"image\";\n } else if (model.includes(\"tts\")) {\n return \"tts\";\n } else {\n return \"\";\n }\n}\n\n// Gemini 3 models that accept thinkingLevel \"MINIMAL\"; the others reject it with a 400, so they get \"LOW\".\n// TODO: Move this to model profile.\nconst MINIMAL_THINKING_LEVEL_MODELS = [\n \"gemini-3-flash\",\n \"gemini-3.1-flash-lite\",\n \"gemini-3.5-flash\",\n \"gemini-3.6-flash\",\n];\n\nfunction supportsMinimalThinkingLevel(model: string): boolean {\n return MINIMAL_THINKING_LEVEL_MODELS.some((prefix) =>\n model.startsWith(prefix)\n );\n}\n\n/**\n * Builds the `thinkingConfig` object for the Gemini `generationConfig`,\n * translating user-facing reasoning fields into the wire format.\n *\n * @param model The full Gemini model name (e.g. \"gemini-2.5-flash\").\n * @param fields The combined user/call-option fields.\n * @returns A populated {@link Gemini.ThinkingConfig}, or `{}`\n * when thinking should not be explicitly configured.\n */\nexport function convertFieldsToThinkingConfig(\n model: string,\n fields: ChatGoogleFields\n): Gemini.ThinkingConfig | undefined {\n // Thinking / reasoning\n let includeThoughts = true;\n\n let thinkingBudget =\n fields?.maxReasoningTokens ??\n fields?.thinkingBudget ??\n convertReasoningEffortToReasoningTokens(\n model,\n fields?.reasoningEffort ?? fields?.thinkingLevel\n );\n if (\n thinkingBudget === 0 ||\n (model.includes(\"pro\") && thinkingBudget === 128)\n ) {\n includeThoughts = false;\n }\n if (\n model.startsWith(\"gemini-2.5-pro\") &&\n typeof thinkingBudget !== \"undefined\"\n ) {\n // Can't turn off Gemini 2.5 Pro thinking completely\n if (thinkingBudget >= 0 && thinkingBudget < 128) {\n thinkingBudget = 128;\n }\n }\n\n const thinkingLevelRaw =\n fields?.reasoningEffort ??\n fields?.thinkingLevel ??\n convertReasoningTokensToReasoningEffort(\n model,\n fields?.maxReasoningTokens ?? fields?.thinkingBudget\n );\n let thinkingLevel = thinkingLevelRaw?.toUpperCase();\n if (thinkingLevel === \"MINIMAL\") {\n includeThoughts = false;\n }\n if (\n thinkingLevel === \"MINIMAL\" &&\n getModelFamily(model) === \"gemini\" &&\n Number(getModelVersion(model)) >= 3 &&\n !supportsMinimalThinkingLevel(model)\n ) {\n thinkingLevel = \"LOW\";\n }\n if (model.startsWith(\"gemini-3-pro\") && thinkingLevel === \"MEDIUM\") {\n // Gemini 3 Pro has only low and high.\n thinkingLevel = \"HIGH\";\n }\n\n // If we are using a model that doesn't support thinking at all (gemini 2.5 imaging)\n // or we haven't explicitly tried to set a thinking budget/level, then bail out.\n const modelVersion = getModelVersion(model);\n const modelSpecialty = getModelSpecialty(model);\n const thoughtsNotSupported =\n modelVersion === \"2.5\" && modelSpecialty === \"image\";\n if (\n thoughtsNotSupported ||\n typeof thinkingBudget === \"undefined\" ||\n typeof thinkingLevel === \"undefined\"\n ) {\n return undefined;\n }\n\n // If we have gotten this far, then we want to explicitly set if we include thoughts or not.\n const thinkingConfig: Gemini.ThinkingConfig = {\n includeThoughts,\n };\n\n // Explicitly setting the budget/level is only valid (currently) for text models.\n if (modelSpecialty === \"\") {\n if (model.startsWith(\"gemini-2.5\")) {\n thinkingConfig.thinkingBudget = thinkingBudget;\n } else {\n thinkingConfig.thinkingLevel = thinkingLevel as Gemini.ThinkingLevel;\n }\n }\n\n return thinkingConfig;\n}\n\n/**\n * Builds the `speechConfig` object for the Gemini `generationConfig`,\n * normalising the user-friendly simplified forms into the wire format.\n *\n * @param fields The combined user/call-option fields.\n * @returns A populated {@link Gemini.SpeechConfig}, or `{}`\n * when no speech config was provided.\n */\nexport function convertFieldsToSpeechConfig(\n fields: ChatGoogleFields\n): Gemini.SpeechConfig | undefined {\n const config: Gemini.SpeechConfig | SimplifiedSpeechConfig | undefined =\n fields.speechConfig;\n if (typeof config === \"undefined\") {\n return undefined;\n }\n\n function isSpeechConfig(\n config: Gemini.SpeechConfig | SimplifiedSpeechConfig\n ): config is Gemini.SpeechConfig {\n return (\n typeof config === \"object\" &&\n (Object.hasOwn(config, \"voiceConfig\") ||\n Object.hasOwn(config, \"multiSpeakerVoiceConfig\"))\n );\n }\n\n function hasLanguage(\n config: SimplifiedSpeechConfig\n ): config is SimplifiedSpeechLanguageConfig {\n return typeof config === \"object\" && Object.hasOwn(config, \"languageCode\");\n }\n\n function hasVoice(\n config: SimplifiedSpeechLanguageConfig\n ): config is SpeechVoiceLanguage {\n return Object.hasOwn(config, \"voice\");\n }\n\n // If this is already a SpeechConfig, just return it\n if (isSpeechConfig(config)) {\n return config;\n }\n\n let languageCode: string | undefined;\n let voice: SpeechVoice;\n if (hasLanguage(config)) {\n languageCode = config.languageCode;\n voice = hasVoice(config) ? config.voice : config.voices;\n } else {\n languageCode = undefined;\n voice = config;\n }\n\n let ret: Gemini.SpeechConfig;\n\n if (typeof voice === \"string\") {\n // They just provided the prebuilt voice configuration name. Use it.\n ret = {\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: voice,\n },\n },\n };\n } else {\n // This is multi-speaker, so we have speaker/name pairs\n // If we have just one (why?), turn it into an array for the moment\n const voices: SpeechSpeakerName[] = Array.isArray(voice) ? voice : [voice];\n // Go through all the speaker/name pairs and turn this into the voice config array\n const speakerVoiceConfigs: Gemini.SpeakerVoiceConfig[] = voices.map(\n (v: SpeechSpeakerName): Gemini.SpeakerVoiceConfig => ({\n speaker: v.speaker,\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: v.name,\n },\n },\n })\n );\n // Create the multi-speaker voice configuration\n ret = {\n multiSpeakerVoiceConfig: {\n speakerVoiceConfigs,\n },\n };\n }\n\n if (languageCode) {\n ret.languageCode = languageCode;\n }\n\n return ret;\n}\n\ntype ServiceTierResponse = {} | { serviceTier: Gemini.ServiceTier };\n\n/**\n * Builds an object that can be included as part of the request\n * which will add a `speechConfig` attribute if appropriate.\n */\nexport function convertFieldsToServiceTier(\n platform: GooglePlatformType,\n fields: ChatGoogleFields\n): ServiceTierResponse {\n // Service tier is handled in a different way on GCP\n if (platform === \"gcp\") {\n return {};\n }\n\n const serviceTier = fields.serviceTier;\n if (!serviceTier || !settableServiceTier.includes(serviceTier)) {\n return {};\n }\n\n return {\n serviceTier: serviceTier,\n };\n}\n"],"mappings":"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"}
|
|
@@ -109,6 +109,13 @@ function convertParamsToPlatformType(params) {
|
|
|
109
109
|
if (params.vertexai === true) return "gcp";
|
|
110
110
|
}
|
|
111
111
|
/**
|
|
112
|
+
* Returns the model family from a Gemini model name.
|
|
113
|
+
* e.g. "gemini-2.5-flash" → "gemini"
|
|
114
|
+
*/
|
|
115
|
+
function getModelFamily(model) {
|
|
116
|
+
return model.split("-")[0];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
112
119
|
* Returns the model version from a Gemini model name.
|
|
113
120
|
* e.g. "gemini-2.5-flash" → "2.5"
|
|
114
121
|
*/
|
|
@@ -163,7 +170,7 @@ function convertFieldsToThinkingConfig(model, fields) {
|
|
|
163
170
|
}
|
|
164
171
|
let thinkingLevel = (fields?.reasoningEffort ?? fields?.thinkingLevel ?? convertReasoningTokensToReasoningEffort(model, fields?.maxReasoningTokens ?? fields?.thinkingBudget))?.toUpperCase();
|
|
165
172
|
if (thinkingLevel === "MINIMAL") includeThoughts = false;
|
|
166
|
-
if (thinkingLevel === "MINIMAL" && model
|
|
173
|
+
if (thinkingLevel === "MINIMAL" && getModelFamily(model) === "gemini" && Number(getModelVersion(model)) >= 3 && !supportsMinimalThinkingLevel(model)) thinkingLevel = "LOW";
|
|
167
174
|
if (model.startsWith("gemini-3-pro") && thinkingLevel === "MEDIUM") thinkingLevel = "HIGH";
|
|
168
175
|
const modelVersion = getModelVersion(model);
|
|
169
176
|
const modelSpecialty = getModelSpecialty(model);
|
|
@@ -225,6 +232,6 @@ function convertFieldsToServiceTier(platform, fields) {
|
|
|
225
232
|
return { serviceTier };
|
|
226
233
|
}
|
|
227
234
|
//#endregion
|
|
228
|
-
export { convertFieldsToServiceTier, convertFieldsToSpeechConfig, convertFieldsToThinkingConfig, convertParamsToPlatformType, convertReasoningEffortToReasoningTokens, convertReasoningTokensToReasoningEffort, getModelLevel, getModelSpecialty, getModelVersion };
|
|
235
|
+
export { convertFieldsToServiceTier, convertFieldsToSpeechConfig, convertFieldsToThinkingConfig, convertParamsToPlatformType, convertReasoningEffortToReasoningTokens, convertReasoningTokensToReasoningEffort, getModelFamily, getModelLevel, getModelSpecialty, getModelVersion };
|
|
229
236
|
|
|
230
237
|
//# sourceMappingURL=params.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.js","names":[],"sources":["../../src/converters/params.ts"],"sourcesContent":["import {\n ChatGoogleFields,\n GooglePlatformType,\n settableServiceTier,\n SimplifiedSpeechConfig,\n SimplifiedSpeechLanguageConfig,\n SpeechSpeakerName,\n SpeechVoice,\n SpeechVoiceLanguage,\n} from \"../chat_models/types.js\";\nimport type { Gemini } from \"../chat_models/api-types.js\";\n\n/**\n * Converts a reasoning \"effort\" level value (e.g., \"minimal\", \"low\", \"medium\", \"high\")\n * to a corresponding reasoning token budget, depending on the target Gemini model.\n *\n * This mapping is essential when configuring Google Gemini API calls with reasoning\n * effort/level fields (as in the Gemini OpenAI-compatible API) or when translating\n * user-friendly configuration to explicit token budgets.\n *\n * - The mapping is refined to reflect the constraints documented by Google:\n * - For \"gemini-2.5-flash\" models, token budgets may be set as low as 0 and up to 24k.\n * - For other Gemini models, minimum is 128, maximum is 32k.\n * - Standard effort levels and their token mappings:\n * - \"none\" / \"minimal\": lowest allowed (minTokens)\n * - \"low\": 1k tokens\n * - \"medium\": 8k tokens\n * - \"high\": maximum allowed for the model (maxTokens)\n * - See reference:\n * https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n * https://ai.google.dev/gemini-api/docs/openai#thinking\n *\n * @param {string | undefined} modelName\n * The Gemini model name (e.g., \"gemini-2.5-flash\"). Used to determine token range constraints.\n * @param {string | undefined} effort\n * The reasoning effort level: one of \"none\", \"minimal\", \"low\", \"medium\", \"high\"\n * (case-insensitive). If undefined, the function returns undefined.\n * @returns {number | undefined}\n * The corresponding token count for the given effort and model. Returns undefined if\n * the effort is not recognized or not provided.\n *\n * @example\n * convertReasoningEffortToReasoningTokens(\"gemini-2.5-flash\", \"medium\") // 8192\n * convertReasoningEffortToReasoningTokens(\"gemini-1.5-pro\", \"high\") // 32768\n * convertReasoningEffortToReasoningTokens(\"gemini-2.5-flash\", \"none\") // 0\n * convertReasoningEffortToReasoningTokens(undefined, \"low\") // 1024\n */\nexport function convertReasoningEffortToReasoningTokens(\n modelName?: string,\n effort?: string\n): number | undefined {\n if (effort === undefined) {\n return undefined;\n }\n\n // gemini-2.5-flash and -flash-lite can be disabled. Others can't.\n // https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n const minTokens: number = modelName?.startsWith(\"gemini-2.5-flash\") ? 0 : 128;\n const maxTokens: number = modelName?.startsWith(\"gemini-2.5-flash\")\n ? 24 * 1024\n : 32 * 1024;\n\n const normalizedEffort = effort.toLowerCase();\n switch (normalizedEffort) {\n case \"none\":\n case \"minimal\":\n return minTokens;\n case \"low\":\n // Defined as 1k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 1024;\n case \"medium\":\n // Defined as 8k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 8 * 1024;\n case \"high\":\n // Defined as 24k or 32k (model-dependent) by https://ai.google.dev/gemini-api/docs/openai#thinking\n return maxTokens;\n default:\n return undefined;\n }\n}\n\n/**\n * Converts a reasoning token budget (e.g., 0, 1024, 8192, 32768) to its corresponding\n * reasoning \"effort\" level, as used in the Google Gemini API (\"minimal\", \"low\", \"medium\", \"high\").\n *\n * This is the inverse of {@link convertReasoningEffortToReasoningTokens}. It is useful for\n * translating explicit numeric settings (often surfaced in raw API responses or configs)\n * into user-facing friendly reasoning levels/labels. The mapping relies on Google's\n * documented reasoning levels for different models:\n *\n * - -1 means default effort (per API documentation: this is \"minimal\" for flash-lite models\n * and \"high\" (dynamic) for others).\n * - 0 means \"minimal\" unless the model is \"gemini-3-pro\", for which it maps to \"low\".\n * - <= 1024 tokens: \"low\"\n * - <= 8192 tokens: \"medium\" (unless model is \"gemini-3-pro\", for which it reverts to \"low\")\n * - > 8192: \"high\"\n *\n * Reference:\n * https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n * https://ai.google.dev/gemini-api/docs/openai#thinking\n *\n * @param {string | undefined} model\n * The Gemini model name (e.g., \"gemini-3-pro\"). Used for model-specific special cases.\n * @param {number | undefined} reasoningTokens\n * The token budget to convert. If undefined, the function returns undefined.\n * @returns {Lowercase<Gemini.ThinkingLevel> | undefined}\n * The reasoning \"effort\" level (\"minimal\", \"low\", \"medium\", \"high\") or undefined if input is not valid.\n *\n * @example\n * convertReasoningTokensToReasoningEffort(\"gemini-3-pro\", 0) // \"low\"\n * convertReasoningTokensToReasoningEffort(\"gemini-1.5-pro\", 0) // \"minimal\"\n * convertReasoningTokensToReasoningEffort(undefined, 1024) // \"low\"\n * convertReasoningTokensToReasoningEffort(undefined, -1) // \"high\"\n * convertReasoningTokensToReasoningEffort(undefined, 9000) // \"high\"\n */\nexport function convertReasoningTokensToReasoningEffort(\n model?: string,\n reasoningTokens?: number\n): Gemini.ThinkingLevel | undefined {\n if (typeof reasoningTokens === \"undefined\") {\n return undefined;\n } else if (reasoningTokens === -1) {\n // -1 means \"minimal\" for flash-lite models and \"high\"/dynamic for others\n // (\"default\" per https://ai.google.dev/gemini-api/docs/thinking#thinking-levels)\n if (model && getModelLevel(model) === \"flash-lite\") {\n return \"minimal\";\n }\n return \"high\";\n } else if (reasoningTokens === 0) {\n if (model?.startsWith(\"gemini-3-pro\")) {\n return \"low\";\n } else {\n return \"minimal\";\n }\n } else if (reasoningTokens <= 1024) {\n return \"low\";\n } else if (reasoningTokens <= 8192) {\n if (model?.startsWith(\"gemini-3-pro\")) {\n return \"low\";\n } else {\n return \"medium\";\n }\n } else {\n return \"high\";\n }\n}\n\n/**\n * Infers and returns the Google platform type from the provided chat model parameters.\n *\n * This function helps determine which Google platform (e.g., Vertex AI on GCP or the public API)\n * should be used for calling Gemini/PaLM endpoints, based on the options provided in\n * {@link BaseChatGoogleParams} (such as model constructors or call options).\n */\nexport function convertParamsToPlatformType(params: {\n platformType?: GooglePlatformType;\n vertexai?: boolean;\n}): GooglePlatformType | undefined {\n if (typeof params === \"undefined\") {\n return undefined;\n }\n if (typeof params.platformType !== \"undefined\") {\n return params.platformType;\n }\n if (params.vertexai === true) {\n return \"gcp\";\n }\n return undefined;\n}\n\n/**\n * Returns the model family from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"gemini\"\n */\nexport function getModelFamily(model: string): string {\n return model.split(\"-\")[0];\n}\n\n/**\n * Returns the model version from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"2.5\"\n */\nexport function getModelVersion(model: string): string {\n return model.split(\"-\")[1];\n}\n\n/**\n * Returns the model level from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"flash\", \"gemini-2.5-flash-lite\" → \"flash-lite\"\n */\nexport function getModelLevel(model: string): string {\n const parts = model.split(\"-\");\n let ret = parts[2];\n if (ret === \"flash\" && parts[3] === \"lite\") {\n ret = \"flash-lite\";\n }\n return ret;\n}\n\n/**\n * Returns the model specialty from a Gemini model name.\n * e.g. \"gemini-2.5-flash-preview-image\" → \"image\",\n * \"gemini-2.5-flash-preview-tts\" → \"tts\",\n * \"gemini-2.5-flash\" → \"\"\n */\nexport function getModelSpecialty(model: string): string {\n if (model.includes(\"image\")) {\n return \"image\";\n } else if (model.includes(\"tts\")) {\n return \"tts\";\n } else {\n return \"\";\n }\n}\n\n// Gemini 3 models that accept thinkingLevel \"MINIMAL\"; the others reject it with a 400, so they get \"LOW\".\n// TODO: Move this to model profile.\nconst MINIMAL_THINKING_LEVEL_MODELS = [\n \"gemini-3-flash\",\n \"gemini-3.1-flash-lite\",\n \"gemini-3.5-flash\",\n \"gemini-3.6-flash\",\n];\n\nfunction supportsMinimalThinkingLevel(model: string): boolean {\n return MINIMAL_THINKING_LEVEL_MODELS.some((prefix) =>\n model.startsWith(prefix)\n );\n}\n\n/**\n * Builds the `thinkingConfig` object for the Gemini `generationConfig`,\n * translating user-facing reasoning fields into the wire format.\n *\n * @param model The full Gemini model name (e.g. \"gemini-2.5-flash\").\n * @param fields The combined user/call-option fields.\n * @returns A populated {@link Gemini.ThinkingConfig}, or `{}`\n * when thinking should not be explicitly configured.\n */\nexport function convertFieldsToThinkingConfig(\n model: string,\n fields: ChatGoogleFields\n): Gemini.ThinkingConfig | undefined {\n // Thinking / reasoning\n let includeThoughts = true;\n\n let thinkingBudget =\n fields?.maxReasoningTokens ??\n fields?.thinkingBudget ??\n convertReasoningEffortToReasoningTokens(\n model,\n fields?.reasoningEffort ?? fields?.thinkingLevel\n );\n if (\n thinkingBudget === 0 ||\n (model.includes(\"pro\") && thinkingBudget === 128)\n ) {\n includeThoughts = false;\n }\n if (\n model.startsWith(\"gemini-2.5-pro\") &&\n typeof thinkingBudget !== \"undefined\"\n ) {\n // Can't turn off Gemini 2.5 Pro thinking completely\n if (thinkingBudget >= 0 && thinkingBudget < 128) {\n thinkingBudget = 128;\n }\n }\n\n const thinkingLevelRaw =\n fields?.reasoningEffort ??\n fields?.thinkingLevel ??\n convertReasoningTokensToReasoningEffort(\n model,\n fields?.maxReasoningTokens ?? fields?.thinkingBudget\n );\n let thinkingLevel = thinkingLevelRaw?.toUpperCase();\n if (thinkingLevel === \"MINIMAL\") {\n includeThoughts = false;\n }\n if (\n thinkingLevel === \"MINIMAL\" &&\n model.startsWith(\"gemini-3\") &&\n !supportsMinimalThinkingLevel(model)\n ) {\n thinkingLevel = \"LOW\";\n }\n if (model.startsWith(\"gemini-3-pro\") && thinkingLevel === \"MEDIUM\") {\n // Gemini 3 Pro has only low and high.\n thinkingLevel = \"HIGH\";\n }\n\n // If we are using a model that doesn't support thinking at all (gemini 2.5 imaging)\n // or we haven't explicitly tried to set a thinking budget/level, then bail out.\n const modelVersion = getModelVersion(model);\n const modelSpecialty = getModelSpecialty(model);\n const thoughtsNotSupported =\n modelVersion === \"2.5\" && modelSpecialty === \"image\";\n if (\n thoughtsNotSupported ||\n typeof thinkingBudget === \"undefined\" ||\n typeof thinkingLevel === \"undefined\"\n ) {\n return undefined;\n }\n\n // If we have gotten this far, then we want to explicitly set if we include thoughts or not.\n const thinkingConfig: Gemini.ThinkingConfig = {\n includeThoughts,\n };\n\n // Explicitly setting the budget/level is only valid (currently) for text models.\n if (modelSpecialty === \"\") {\n if (model.startsWith(\"gemini-2.5\")) {\n thinkingConfig.thinkingBudget = thinkingBudget;\n } else {\n thinkingConfig.thinkingLevel = thinkingLevel as Gemini.ThinkingLevel;\n }\n }\n\n return thinkingConfig;\n}\n\n/**\n * Builds the `speechConfig` object for the Gemini `generationConfig`,\n * normalising the user-friendly simplified forms into the wire format.\n *\n * @param fields The combined user/call-option fields.\n * @returns A populated {@link Gemini.SpeechConfig}, or `{}`\n * when no speech config was provided.\n */\nexport function convertFieldsToSpeechConfig(\n fields: ChatGoogleFields\n): Gemini.SpeechConfig | undefined {\n const config: Gemini.SpeechConfig | SimplifiedSpeechConfig | undefined =\n fields.speechConfig;\n if (typeof config === \"undefined\") {\n return undefined;\n }\n\n function isSpeechConfig(\n config: Gemini.SpeechConfig | SimplifiedSpeechConfig\n ): config is Gemini.SpeechConfig {\n return (\n typeof config === \"object\" &&\n (Object.hasOwn(config, \"voiceConfig\") ||\n Object.hasOwn(config, \"multiSpeakerVoiceConfig\"))\n );\n }\n\n function hasLanguage(\n config: SimplifiedSpeechConfig\n ): config is SimplifiedSpeechLanguageConfig {\n return typeof config === \"object\" && Object.hasOwn(config, \"languageCode\");\n }\n\n function hasVoice(\n config: SimplifiedSpeechLanguageConfig\n ): config is SpeechVoiceLanguage {\n return Object.hasOwn(config, \"voice\");\n }\n\n // If this is already a SpeechConfig, just return it\n if (isSpeechConfig(config)) {\n return config;\n }\n\n let languageCode: string | undefined;\n let voice: SpeechVoice;\n if (hasLanguage(config)) {\n languageCode = config.languageCode;\n voice = hasVoice(config) ? config.voice : config.voices;\n } else {\n languageCode = undefined;\n voice = config;\n }\n\n let ret: Gemini.SpeechConfig;\n\n if (typeof voice === \"string\") {\n // They just provided the prebuilt voice configuration name. Use it.\n ret = {\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: voice,\n },\n },\n };\n } else {\n // This is multi-speaker, so we have speaker/name pairs\n // If we have just one (why?), turn it into an array for the moment\n const voices: SpeechSpeakerName[] = Array.isArray(voice) ? voice : [voice];\n // Go through all the speaker/name pairs and turn this into the voice config array\n const speakerVoiceConfigs: Gemini.SpeakerVoiceConfig[] = voices.map(\n (v: SpeechSpeakerName): Gemini.SpeakerVoiceConfig => ({\n speaker: v.speaker,\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: v.name,\n },\n },\n })\n );\n // Create the multi-speaker voice configuration\n ret = {\n multiSpeakerVoiceConfig: {\n speakerVoiceConfigs,\n },\n };\n }\n\n if (languageCode) {\n ret.languageCode = languageCode;\n }\n\n return ret;\n}\n\ntype ServiceTierResponse = {} | { serviceTier: Gemini.ServiceTier };\n\n/**\n * Builds an object that can be included as part of the request\n * which will add a `speechConfig` attribute if appropriate.\n */\nexport function convertFieldsToServiceTier(\n platform: GooglePlatformType,\n fields: ChatGoogleFields\n): ServiceTierResponse {\n // Service tier is handled in a different way on GCP\n if (platform === \"gcp\") {\n return {};\n }\n\n const serviceTier = fields.serviceTier;\n if (!serviceTier || !settableServiceTier.includes(serviceTier)) {\n return {};\n }\n\n return {\n serviceTier: serviceTier,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"params.js","names":[],"sources":["../../src/converters/params.ts"],"sourcesContent":["import {\n ChatGoogleFields,\n GooglePlatformType,\n settableServiceTier,\n SimplifiedSpeechConfig,\n SimplifiedSpeechLanguageConfig,\n SpeechSpeakerName,\n SpeechVoice,\n SpeechVoiceLanguage,\n} from \"../chat_models/types.js\";\nimport type { Gemini } from \"../chat_models/api-types.js\";\n\n/**\n * Converts a reasoning \"effort\" level value (e.g., \"minimal\", \"low\", \"medium\", \"high\")\n * to a corresponding reasoning token budget, depending on the target Gemini model.\n *\n * This mapping is essential when configuring Google Gemini API calls with reasoning\n * effort/level fields (as in the Gemini OpenAI-compatible API) or when translating\n * user-friendly configuration to explicit token budgets.\n *\n * - The mapping is refined to reflect the constraints documented by Google:\n * - For \"gemini-2.5-flash\" models, token budgets may be set as low as 0 and up to 24k.\n * - For other Gemini models, minimum is 128, maximum is 32k.\n * - Standard effort levels and their token mappings:\n * - \"none\" / \"minimal\": lowest allowed (minTokens)\n * - \"low\": 1k tokens\n * - \"medium\": 8k tokens\n * - \"high\": maximum allowed for the model (maxTokens)\n * - See reference:\n * https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n * https://ai.google.dev/gemini-api/docs/openai#thinking\n *\n * @param {string | undefined} modelName\n * The Gemini model name (e.g., \"gemini-2.5-flash\"). Used to determine token range constraints.\n * @param {string | undefined} effort\n * The reasoning effort level: one of \"none\", \"minimal\", \"low\", \"medium\", \"high\"\n * (case-insensitive). If undefined, the function returns undefined.\n * @returns {number | undefined}\n * The corresponding token count for the given effort and model. Returns undefined if\n * the effort is not recognized or not provided.\n *\n * @example\n * convertReasoningEffortToReasoningTokens(\"gemini-2.5-flash\", \"medium\") // 8192\n * convertReasoningEffortToReasoningTokens(\"gemini-1.5-pro\", \"high\") // 32768\n * convertReasoningEffortToReasoningTokens(\"gemini-2.5-flash\", \"none\") // 0\n * convertReasoningEffortToReasoningTokens(undefined, \"low\") // 1024\n */\nexport function convertReasoningEffortToReasoningTokens(\n modelName?: string,\n effort?: string\n): number | undefined {\n if (effort === undefined) {\n return undefined;\n }\n\n // gemini-2.5-flash and -flash-lite can be disabled. Others can't.\n // https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n const minTokens: number = modelName?.startsWith(\"gemini-2.5-flash\") ? 0 : 128;\n const maxTokens: number = modelName?.startsWith(\"gemini-2.5-flash\")\n ? 24 * 1024\n : 32 * 1024;\n\n const normalizedEffort = effort.toLowerCase();\n switch (normalizedEffort) {\n case \"none\":\n case \"minimal\":\n return minTokens;\n case \"low\":\n // Defined as 1k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 1024;\n case \"medium\":\n // Defined as 8k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 8 * 1024;\n case \"high\":\n // Defined as 24k or 32k (model-dependent) by https://ai.google.dev/gemini-api/docs/openai#thinking\n return maxTokens;\n default:\n return undefined;\n }\n}\n\n/**\n * Converts a reasoning token budget (e.g., 0, 1024, 8192, 32768) to its corresponding\n * reasoning \"effort\" level, as used in the Google Gemini API (\"minimal\", \"low\", \"medium\", \"high\").\n *\n * This is the inverse of {@link convertReasoningEffortToReasoningTokens}. It is useful for\n * translating explicit numeric settings (often surfaced in raw API responses or configs)\n * into user-facing friendly reasoning levels/labels. The mapping relies on Google's\n * documented reasoning levels for different models:\n *\n * - -1 means default effort (per API documentation: this is \"minimal\" for flash-lite models\n * and \"high\" (dynamic) for others).\n * - 0 means \"minimal\" unless the model is \"gemini-3-pro\", for which it maps to \"low\".\n * - <= 1024 tokens: \"low\"\n * - <= 8192 tokens: \"medium\" (unless model is \"gemini-3-pro\", for which it reverts to \"low\")\n * - > 8192: \"high\"\n *\n * Reference:\n * https://ai.google.dev/gemini-api/docs/thinking#thinking-levels\n * https://ai.google.dev/gemini-api/docs/openai#thinking\n *\n * @param {string | undefined} model\n * The Gemini model name (e.g., \"gemini-3-pro\"). Used for model-specific special cases.\n * @param {number | undefined} reasoningTokens\n * The token budget to convert. If undefined, the function returns undefined.\n * @returns {Lowercase<Gemini.ThinkingLevel> | undefined}\n * The reasoning \"effort\" level (\"minimal\", \"low\", \"medium\", \"high\") or undefined if input is not valid.\n *\n * @example\n * convertReasoningTokensToReasoningEffort(\"gemini-3-pro\", 0) // \"low\"\n * convertReasoningTokensToReasoningEffort(\"gemini-1.5-pro\", 0) // \"minimal\"\n * convertReasoningTokensToReasoningEffort(undefined, 1024) // \"low\"\n * convertReasoningTokensToReasoningEffort(undefined, -1) // \"high\"\n * convertReasoningTokensToReasoningEffort(undefined, 9000) // \"high\"\n */\nexport function convertReasoningTokensToReasoningEffort(\n model?: string,\n reasoningTokens?: number\n): Gemini.ThinkingLevel | undefined {\n if (typeof reasoningTokens === \"undefined\") {\n return undefined;\n } else if (reasoningTokens === -1) {\n // -1 means \"minimal\" for flash-lite models and \"high\"/dynamic for others\n // (\"default\" per https://ai.google.dev/gemini-api/docs/thinking#thinking-levels)\n if (model && getModelLevel(model) === \"flash-lite\") {\n return \"minimal\";\n }\n return \"high\";\n } else if (reasoningTokens === 0) {\n if (model?.startsWith(\"gemini-3-pro\")) {\n return \"low\";\n } else {\n return \"minimal\";\n }\n } else if (reasoningTokens <= 1024) {\n return \"low\";\n } else if (reasoningTokens <= 8192) {\n if (model?.startsWith(\"gemini-3-pro\")) {\n return \"low\";\n } else {\n return \"medium\";\n }\n } else {\n return \"high\";\n }\n}\n\n/**\n * Infers and returns the Google platform type from the provided chat model parameters.\n *\n * This function helps determine which Google platform (e.g., Vertex AI on GCP or the public API)\n * should be used for calling Gemini/PaLM endpoints, based on the options provided in\n * {@link BaseChatGoogleParams} (such as model constructors or call options).\n */\nexport function convertParamsToPlatformType(params: {\n platformType?: GooglePlatformType;\n vertexai?: boolean;\n}): GooglePlatformType | undefined {\n if (typeof params === \"undefined\") {\n return undefined;\n }\n if (typeof params.platformType !== \"undefined\") {\n return params.platformType;\n }\n if (params.vertexai === true) {\n return \"gcp\";\n }\n return undefined;\n}\n\n/**\n * Returns the model family from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"gemini\"\n */\nexport function getModelFamily(model: string): string {\n return model.split(\"-\")[0];\n}\n\n/**\n * Returns the model version from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"2.5\"\n */\nexport function getModelVersion(model: string): string {\n return model.split(\"-\")[1];\n}\n\n/**\n * Returns the model level from a Gemini model name.\n * e.g. \"gemini-2.5-flash\" → \"flash\", \"gemini-2.5-flash-lite\" → \"flash-lite\"\n */\nexport function getModelLevel(model: string): string {\n const parts = model.split(\"-\");\n let ret = parts[2];\n if (ret === \"flash\" && parts[3] === \"lite\") {\n ret = \"flash-lite\";\n }\n return ret;\n}\n\n/**\n * Returns the model specialty from a Gemini model name.\n * e.g. \"gemini-2.5-flash-preview-image\" → \"image\",\n * \"gemini-2.5-flash-preview-tts\" → \"tts\",\n * \"gemini-2.5-flash\" → \"\"\n */\nexport function getModelSpecialty(model: string): string {\n if (model.includes(\"image\")) {\n return \"image\";\n } else if (model.includes(\"tts\")) {\n return \"tts\";\n } else {\n return \"\";\n }\n}\n\n// Gemini 3 models that accept thinkingLevel \"MINIMAL\"; the others reject it with a 400, so they get \"LOW\".\n// TODO: Move this to model profile.\nconst MINIMAL_THINKING_LEVEL_MODELS = [\n \"gemini-3-flash\",\n \"gemini-3.1-flash-lite\",\n \"gemini-3.5-flash\",\n \"gemini-3.6-flash\",\n];\n\nfunction supportsMinimalThinkingLevel(model: string): boolean {\n return MINIMAL_THINKING_LEVEL_MODELS.some((prefix) =>\n model.startsWith(prefix)\n );\n}\n\n/**\n * Builds the `thinkingConfig` object for the Gemini `generationConfig`,\n * translating user-facing reasoning fields into the wire format.\n *\n * @param model The full Gemini model name (e.g. \"gemini-2.5-flash\").\n * @param fields The combined user/call-option fields.\n * @returns A populated {@link Gemini.ThinkingConfig}, or `{}`\n * when thinking should not be explicitly configured.\n */\nexport function convertFieldsToThinkingConfig(\n model: string,\n fields: ChatGoogleFields\n): Gemini.ThinkingConfig | undefined {\n // Thinking / reasoning\n let includeThoughts = true;\n\n let thinkingBudget =\n fields?.maxReasoningTokens ??\n fields?.thinkingBudget ??\n convertReasoningEffortToReasoningTokens(\n model,\n fields?.reasoningEffort ?? fields?.thinkingLevel\n );\n if (\n thinkingBudget === 0 ||\n (model.includes(\"pro\") && thinkingBudget === 128)\n ) {\n includeThoughts = false;\n }\n if (\n model.startsWith(\"gemini-2.5-pro\") &&\n typeof thinkingBudget !== \"undefined\"\n ) {\n // Can't turn off Gemini 2.5 Pro thinking completely\n if (thinkingBudget >= 0 && thinkingBudget < 128) {\n thinkingBudget = 128;\n }\n }\n\n const thinkingLevelRaw =\n fields?.reasoningEffort ??\n fields?.thinkingLevel ??\n convertReasoningTokensToReasoningEffort(\n model,\n fields?.maxReasoningTokens ?? fields?.thinkingBudget\n );\n let thinkingLevel = thinkingLevelRaw?.toUpperCase();\n if (thinkingLevel === \"MINIMAL\") {\n includeThoughts = false;\n }\n if (\n thinkingLevel === \"MINIMAL\" &&\n getModelFamily(model) === \"gemini\" &&\n Number(getModelVersion(model)) >= 3 &&\n !supportsMinimalThinkingLevel(model)\n ) {\n thinkingLevel = \"LOW\";\n }\n if (model.startsWith(\"gemini-3-pro\") && thinkingLevel === \"MEDIUM\") {\n // Gemini 3 Pro has only low and high.\n thinkingLevel = \"HIGH\";\n }\n\n // If we are using a model that doesn't support thinking at all (gemini 2.5 imaging)\n // or we haven't explicitly tried to set a thinking budget/level, then bail out.\n const modelVersion = getModelVersion(model);\n const modelSpecialty = getModelSpecialty(model);\n const thoughtsNotSupported =\n modelVersion === \"2.5\" && modelSpecialty === \"image\";\n if (\n thoughtsNotSupported ||\n typeof thinkingBudget === \"undefined\" ||\n typeof thinkingLevel === \"undefined\"\n ) {\n return undefined;\n }\n\n // If we have gotten this far, then we want to explicitly set if we include thoughts or not.\n const thinkingConfig: Gemini.ThinkingConfig = {\n includeThoughts,\n };\n\n // Explicitly setting the budget/level is only valid (currently) for text models.\n if (modelSpecialty === \"\") {\n if (model.startsWith(\"gemini-2.5\")) {\n thinkingConfig.thinkingBudget = thinkingBudget;\n } else {\n thinkingConfig.thinkingLevel = thinkingLevel as Gemini.ThinkingLevel;\n }\n }\n\n return thinkingConfig;\n}\n\n/**\n * Builds the `speechConfig` object for the Gemini `generationConfig`,\n * normalising the user-friendly simplified forms into the wire format.\n *\n * @param fields The combined user/call-option fields.\n * @returns A populated {@link Gemini.SpeechConfig}, or `{}`\n * when no speech config was provided.\n */\nexport function convertFieldsToSpeechConfig(\n fields: ChatGoogleFields\n): Gemini.SpeechConfig | undefined {\n const config: Gemini.SpeechConfig | SimplifiedSpeechConfig | undefined =\n fields.speechConfig;\n if (typeof config === \"undefined\") {\n return undefined;\n }\n\n function isSpeechConfig(\n config: Gemini.SpeechConfig | SimplifiedSpeechConfig\n ): config is Gemini.SpeechConfig {\n return (\n typeof config === \"object\" &&\n (Object.hasOwn(config, \"voiceConfig\") ||\n Object.hasOwn(config, \"multiSpeakerVoiceConfig\"))\n );\n }\n\n function hasLanguage(\n config: SimplifiedSpeechConfig\n ): config is SimplifiedSpeechLanguageConfig {\n return typeof config === \"object\" && Object.hasOwn(config, \"languageCode\");\n }\n\n function hasVoice(\n config: SimplifiedSpeechLanguageConfig\n ): config is SpeechVoiceLanguage {\n return Object.hasOwn(config, \"voice\");\n }\n\n // If this is already a SpeechConfig, just return it\n if (isSpeechConfig(config)) {\n return config;\n }\n\n let languageCode: string | undefined;\n let voice: SpeechVoice;\n if (hasLanguage(config)) {\n languageCode = config.languageCode;\n voice = hasVoice(config) ? config.voice : config.voices;\n } else {\n languageCode = undefined;\n voice = config;\n }\n\n let ret: Gemini.SpeechConfig;\n\n if (typeof voice === \"string\") {\n // They just provided the prebuilt voice configuration name. Use it.\n ret = {\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: voice,\n },\n },\n };\n } else {\n // This is multi-speaker, so we have speaker/name pairs\n // If we have just one (why?), turn it into an array for the moment\n const voices: SpeechSpeakerName[] = Array.isArray(voice) ? voice : [voice];\n // Go through all the speaker/name pairs and turn this into the voice config array\n const speakerVoiceConfigs: Gemini.SpeakerVoiceConfig[] = voices.map(\n (v: SpeechSpeakerName): Gemini.SpeakerVoiceConfig => ({\n speaker: v.speaker,\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: v.name,\n },\n },\n })\n );\n // Create the multi-speaker voice configuration\n ret = {\n multiSpeakerVoiceConfig: {\n speakerVoiceConfigs,\n },\n };\n }\n\n if (languageCode) {\n ret.languageCode = languageCode;\n }\n\n return ret;\n}\n\ntype ServiceTierResponse = {} | { serviceTier: Gemini.ServiceTier };\n\n/**\n * Builds an object that can be included as part of the request\n * which will add a `speechConfig` attribute if appropriate.\n */\nexport function convertFieldsToServiceTier(\n platform: GooglePlatformType,\n fields: ChatGoogleFields\n): ServiceTierResponse {\n // Service tier is handled in a different way on GCP\n if (platform === \"gcp\") {\n return {};\n }\n\n const serviceTier = fields.serviceTier;\n if (!serviceTier || !settableServiceTier.includes(serviceTier)) {\n return {};\n }\n\n return {\n serviceTier: serviceTier,\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langchain/google",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.11",
|
|
4
4
|
"description": "Google integrations for LangChain.js",
|
|
5
5
|
"author": "LangChain",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"jose": "^6.2.12"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@langchain/core": "^1.2.
|
|
22
|
+
"@langchain/core": "^1.2.18"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@tsconfig/recommended": "^1.0.10",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"vitest": "^5.0.2",
|
|
31
31
|
"zod": "^3.25.76 || ^4",
|
|
32
32
|
"zod-to-json-schema": "^3.25.2",
|
|
33
|
-
"@langchain/
|
|
34
|
-
"@langchain/
|
|
33
|
+
"@langchain/standard-tests": "0.0.23",
|
|
34
|
+
"@langchain/core": "^1.2.18"
|
|
35
35
|
},
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public"
|