@langchain/google 0.1.0 → 0.1.1-dev-1771365493298

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.
Files changed (65) hide show
  1. package/dist/chat_models/base.cjs +31 -40
  2. package/dist/chat_models/base.cjs.map +1 -1
  3. package/dist/chat_models/base.js +9 -17
  4. package/dist/chat_models/base.js.map +1 -1
  5. package/dist/chat_models/index.cjs +2 -3
  6. package/dist/chat_models/index.cjs.map +1 -1
  7. package/dist/chat_models/index.d.cts +0 -1
  8. package/dist/chat_models/index.d.ts +0 -1
  9. package/dist/chat_models/index.js.map +1 -1
  10. package/dist/chat_models/node.cjs +3 -6
  11. package/dist/chat_models/node.cjs.map +1 -1
  12. package/dist/chat_models/node.js +1 -3
  13. package/dist/chat_models/node.js.map +1 -1
  14. package/dist/chat_models/profiles.cjs +1 -2
  15. package/dist/chat_models/profiles.cjs.map +1 -1
  16. package/dist/chat_models/profiles.js +1 -2
  17. package/dist/chat_models/profiles.js.map +1 -1
  18. package/dist/chat_models/types.d.cts +4 -3
  19. package/dist/chat_models/types.d.ts +4 -3
  20. package/dist/clients/index.cjs +3 -5
  21. package/dist/clients/index.cjs.map +1 -1
  22. package/dist/clients/index.js +0 -1
  23. package/dist/clients/index.js.map +1 -1
  24. package/dist/clients/node.cjs +8 -15
  25. package/dist/clients/node.cjs.map +1 -1
  26. package/dist/clients/node.d.cts +0 -1
  27. package/dist/clients/node.d.ts +0 -1
  28. package/dist/clients/node.js +4 -10
  29. package/dist/clients/node.js.map +1 -1
  30. package/dist/const.cjs.map +1 -1
  31. package/dist/const.js.map +1 -1
  32. package/dist/converters/messages.cjs +46 -67
  33. package/dist/converters/messages.cjs.map +1 -1
  34. package/dist/converters/messages.js +22 -42
  35. package/dist/converters/messages.js.map +1 -1
  36. package/dist/converters/params.cjs +20 -27
  37. package/dist/converters/params.cjs.map +1 -1
  38. package/dist/converters/params.js +20 -27
  39. package/dist/converters/params.js.map +1 -1
  40. package/dist/converters/tools.cjs +13 -19
  41. package/dist/converters/tools.cjs.map +1 -1
  42. package/dist/converters/tools.js +7 -12
  43. package/dist/converters/tools.js.map +1 -1
  44. package/dist/index.cjs +1 -0
  45. package/dist/node.cjs +1 -0
  46. package/dist/utils/errors.cjs +2 -4
  47. package/dist/utils/errors.cjs.map +1 -1
  48. package/dist/utils/errors.js +2 -4
  49. package/dist/utils/errors.js.map +1 -1
  50. package/dist/utils/gcp-auth.cjs +10 -6
  51. package/dist/utils/gcp-auth.cjs.map +1 -1
  52. package/dist/utils/gcp-auth.js +9 -4
  53. package/dist/utils/gcp-auth.js.map +1 -1
  54. package/dist/utils/handler.cjs +3 -4
  55. package/dist/utils/handler.cjs.map +1 -1
  56. package/dist/utils/handler.js +1 -1
  57. package/dist/utils/handler.js.map +1 -1
  58. package/dist/utils/misc.cjs.map +1 -1
  59. package/dist/utils/misc.d.cts +6 -2
  60. package/dist/utils/misc.d.ts +6 -2
  61. package/dist/utils/misc.js.map +1 -1
  62. package/dist/utils/stream.cjs.map +1 -1
  63. package/dist/utils/stream.js.map +1 -1
  64. package/package.json +5 -5
  65. package/dist/_virtual/rolldown_runtime.cjs +0 -25
@@ -1,20 +1,19 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
1
  const require_errors = require('../utils/errors.cjs');
3
2
  const require_profiles = require('./profiles.cjs');
4
3
  const require_stream = require('../utils/stream.cjs');
5
4
  const require_messages = require('../converters/messages.cjs');
6
5
  const require_tools = require('../converters/tools.cjs');
7
6
  const require_params = require('../converters/params.cjs');
8
- const __langchain_core_language_models_chat_models = require_rolldown_runtime.__toESM(require("@langchain/core/language_models/chat_models"));
9
- const __langchain_core_messages = require_rolldown_runtime.__toESM(require("@langchain/core/messages"));
10
- const __langchain_core_utils_stream = require_rolldown_runtime.__toESM(require("@langchain/core/utils/stream"));
11
- const __langchain_core_outputs = require_rolldown_runtime.__toESM(require("@langchain/core/outputs"));
12
- const eventsource_parser_stream = require_rolldown_runtime.__toESM(require("eventsource-parser/stream"));
13
- const __langchain_core_runnables = require_rolldown_runtime.__toESM(require("@langchain/core/runnables"));
14
- const __langchain_core_utils_json_schema = require_rolldown_runtime.__toESM(require("@langchain/core/utils/json_schema"));
15
- const __langchain_core_utils_types = require_rolldown_runtime.__toESM(require("@langchain/core/utils/types"));
16
- const __langchain_core_output_parsers = require_rolldown_runtime.__toESM(require("@langchain/core/output_parsers"));
17
- const __langchain_core_output_parsers_openai_tools = require_rolldown_runtime.__toESM(require("@langchain/core/output_parsers/openai_tools"));
7
+ let _langchain_core_language_models_chat_models = require("@langchain/core/language_models/chat_models");
8
+ let _langchain_core_messages = require("@langchain/core/messages");
9
+ let _langchain_core_utils_stream = require("@langchain/core/utils/stream");
10
+ let _langchain_core_outputs = require("@langchain/core/outputs");
11
+ let eventsource_parser_stream = require("eventsource-parser/stream");
12
+ let _langchain_core_runnables = require("@langchain/core/runnables");
13
+ let _langchain_core_utils_json_schema = require("@langchain/core/utils/json_schema");
14
+ let _langchain_core_utils_types = require("@langchain/core/utils/types");
15
+ let _langchain_core_output_parsers = require("@langchain/core/output_parsers");
16
+ let _langchain_core_output_parsers_openai_tools = require("@langchain/core/output_parsers/openai_tools");
18
17
 
19
18
  //#region src/chat_models/base.ts
20
19
  function getPlatformType(platform, hasApiKey) {
@@ -22,7 +21,7 @@ function getPlatformType(platform, hasApiKey) {
22
21
  else if (hasApiKey) return "gai";
23
22
  else return "gcp";
24
23
  }
25
- var BaseChatGoogle = class extends __langchain_core_language_models_chat_models.BaseChatModel {
24
+ var BaseChatGoogle = class extends _langchain_core_language_models_chat_models.BaseChatModel {
26
25
  model;
27
26
  streaming;
28
27
  disableStreaming;
@@ -125,7 +124,7 @@ var BaseChatGoogle = class extends __langchain_core_language_models_chat_models.
125
124
  let responseJsonSchema;
126
125
  let responseMimeType;
127
126
  if (fields.responseSchema) {
128
- if ((0, __langchain_core_utils_types.isInteropZodSchema)(fields.responseSchema)) responseJsonSchema = (0, __langchain_core_utils_json_schema.toJsonSchema)(fields.responseSchema);
127
+ if ((0, _langchain_core_utils_types.isInteropZodSchema)(fields.responseSchema)) responseJsonSchema = (0, _langchain_core_utils_json_schema.toJsonSchema)(fields.responseSchema);
129
128
  else responseJsonSchema = fields.responseSchema;
130
129
  responseMimeType = "application/json";
131
130
  }
@@ -160,7 +159,7 @@ var BaseChatGoogle = class extends __langchain_core_language_models_chat_models.
160
159
  if (this.streaming) {
161
160
  const stream = await this._streamResponseChunks(messages, options, runManager);
162
161
  let finalChunk = null;
163
- for await (const chunk of stream) finalChunk = !finalChunk ? chunk : (0, __langchain_core_utils_stream.concat)(finalChunk, chunk);
162
+ for await (const chunk of stream) finalChunk = !finalChunk ? chunk : (0, _langchain_core_utils_stream.concat)(finalChunk, chunk);
164
163
  if (typeof finalChunk?.message?.content === "string" && typeof (finalChunk?.message?.additional_kwargs?.originalTextContentBlock)?.text === "string") finalChunk.message.additional_kwargs.originalTextContentBlock.text = finalChunk.message.content;
165
164
  return { generations: finalChunk ? [finalChunk] : [] };
166
165
  }
@@ -251,12 +250,12 @@ var BaseChatGoogle = class extends __langchain_core_language_models_chat_models.
251
250
  throw error;
252
251
  }
253
252
  if (response.body) {
254
- const stream = response.body.pipeThrough(new TextDecoderStream()).pipeThrough(new eventsource_parser_stream.EventSourceParserStream()).pipeThrough(new require_stream.SafeJsonEventParserStream()).pipeThrough(new TransformStream({ transform(chunk, controller) {
253
+ const reader = response.body.pipeThrough(new TextDecoderStream()).pipeThrough(new eventsource_parser_stream.EventSourceParserStream()).pipeThrough(new require_stream.SafeJsonEventParserStream()).pipeThrough(new TransformStream({ transform(chunk, controller) {
255
254
  runManager?.handleCustomEvent(`google-chunk-${moduleName}`, { chunk });
256
255
  if (chunk === null) {
257
- controller.enqueue(new __langchain_core_outputs.ChatGenerationChunk({
256
+ controller.enqueue(new _langchain_core_outputs.ChatGenerationChunk({
258
257
  text: "",
259
- message: new __langchain_core_messages.AIMessageChunk({ content: "" }),
258
+ message: new _langchain_core_messages.AIMessageChunk({ content: "" }),
260
259
  generationInfo: { finishReason: "stop" }
261
260
  }));
262
261
  return;
@@ -281,8 +280,8 @@ var BaseChatGoogle = class extends __langchain_core_language_models_chat_models.
281
280
  }
282
281
  };
283
282
  if (chunk?.usageMetadata && streamUsage) messageChunkParams.usage_metadata = require_messages.convertGeminiGenerateContentResponseToUsageMetadata(chunk);
284
- const messageChunk = new __langchain_core_messages.AIMessageChunk(messageChunkParams);
285
- controller.enqueue(new __langchain_core_outputs.ChatGenerationChunk({
283
+ const messageChunk = new _langchain_core_messages.AIMessageChunk(messageChunkParams);
284
+ controller.enqueue(new _langchain_core_outputs.ChatGenerationChunk({
286
285
  text,
287
286
  message: messageChunk,
288
287
  generationInfo: {
@@ -294,8 +293,7 @@ var BaseChatGoogle = class extends __langchain_core_language_models_chat_models.
294
293
  }
295
294
  }));
296
295
  }
297
- } }));
298
- const reader = stream.getReader();
296
+ } })).getReader();
299
297
  try {
300
298
  while (true) {
301
299
  const { done, value } = await reader.read();
@@ -346,21 +344,16 @@ var BaseChatGoogle = class extends __langchain_core_language_models_chat_models.
346
344
  }
347
345
  if (method === "jsonSchema") {
348
346
  llm = this.withConfig({ responseSchema: schema });
349
- outputParser = __langchain_core_runnables.RunnableLambda.from(async (input) => {
350
- if (!__langchain_core_messages.AIMessage.isInstance(input) && !__langchain_core_messages.AIMessageChunk.isInstance(input)) throw new require_errors.MalformedOutputError({ message: "Input is not an AIMessage or AIMessageChunk." });
347
+ outputParser = _langchain_core_runnables.RunnableLambda.from(async (input) => {
348
+ if (!_langchain_core_messages.AIMessage.isInstance(input) && !_langchain_core_messages.AIMessageChunk.isInstance(input)) throw new require_errors.MalformedOutputError({ message: "Input is not an AIMessage or AIMessageChunk." });
351
349
  if (!input.text) throw new require_errors.MalformedOutputError({ message: "No content found in response. Cannot parse structured output." });
352
- if ((0, __langchain_core_utils_types.isInteropZodSchema)(schema)) {
353
- const zodParser = __langchain_core_output_parsers.StructuredOutputParser.fromZodSchema(schema);
354
- return await zodParser.parse(input.text);
355
- } else {
356
- const jsonParser = new __langchain_core_output_parsers.JsonOutputParser();
357
- return await jsonParser.parse(input.text);
358
- }
350
+ if ((0, _langchain_core_utils_types.isInteropZodSchema)(schema)) return await _langchain_core_output_parsers.StructuredOutputParser.fromZodSchema(schema).parse(input.text);
351
+ else return await new _langchain_core_output_parsers.JsonOutputParser().parse(input.text);
359
352
  });
360
353
  } else if (method === "functionCalling") {
361
354
  let functionName = name ?? "extract";
362
355
  let tools;
363
- if ((0, __langchain_core_utils_types.isInteropZodSchema)(schema)) {
356
+ if ((0, _langchain_core_utils_types.isInteropZodSchema)(schema)) {
364
357
  const jsonSchema = require_tools.schemaToGeminiParameters(schema);
365
358
  const description = typeof jsonSchema.description === "string" ? jsonSchema.description : "A function available to call.";
366
359
  tools = [{ functionDeclarations: [{
@@ -368,7 +361,7 @@ var BaseChatGoogle = class extends __langchain_core_language_models_chat_models.
368
361
  description,
369
362
  parameters: jsonSchema
370
363
  }] }];
371
- outputParser = new __langchain_core_output_parsers_openai_tools.JsonOutputKeyToolsParser({
364
+ outputParser = new _langchain_core_output_parsers_openai_tools.JsonOutputKeyToolsParser({
372
365
  returnSingle: true,
373
366
  keyName: functionName,
374
367
  zodSchema: schema
@@ -387,7 +380,7 @@ var BaseChatGoogle = class extends __langchain_core_language_models_chat_models.
387
380
  };
388
381
  }
389
382
  tools = [{ functionDeclarations: [geminiFunctionDefinition] }];
390
- outputParser = new __langchain_core_output_parsers_openai_tools.JsonOutputKeyToolsParser({
383
+ outputParser = new _langchain_core_output_parsers_openai_tools.JsonOutputKeyToolsParser({
391
384
  returnSingle: true,
392
385
  keyName: functionName
393
386
  });
@@ -395,10 +388,10 @@ var BaseChatGoogle = class extends __langchain_core_language_models_chat_models.
395
388
  llm = this.bindTools(tools).withConfig({ tool_choice: functionName });
396
389
  } else throw new require_errors.ConfigurationError(`Unrecognized structured output method '${method}'. Expected 'functionCalling' or 'jsonSchema'`);
397
390
  if (!includeRaw) return llm.pipe(outputParser).withConfig({ runName: "ChatGoogleStructuredOutput" });
398
- const parserAssign = __langchain_core_runnables.RunnablePassthrough.assign({ parsed: (input, config$1) => outputParser.invoke(input.raw, config$1) });
399
- const parserNone = __langchain_core_runnables.RunnablePassthrough.assign({ parsed: () => null });
391
+ const parserAssign = _langchain_core_runnables.RunnablePassthrough.assign({ parsed: (input, config) => outputParser.invoke(input.raw, config) });
392
+ const parserNone = _langchain_core_runnables.RunnablePassthrough.assign({ parsed: () => null });
400
393
  const parsedWithFallback = parserAssign.withFallbacks({ fallbacks: [parserNone] });
401
- return __langchain_core_runnables.RunnableSequence.from([{ raw: llm }, parsedWithFallback]).withConfig({ runName: "ChatGoogleStructuredOutputRunnable" });
394
+ return _langchain_core_runnables.RunnableSequence.from([{ raw: llm }, parsedWithFallback]).withConfig({ runName: "ChatGoogleStructuredOutputRunnable" });
402
395
  }
403
396
  };
404
397
  function combineGoogleChatModelFields(a, b, ...rest) {
@@ -430,11 +423,9 @@ function combineGoogleChatModelFields(a, b, ...rest) {
430
423
  return combined;
431
424
  }
432
425
  function getGoogleChatModelParams(modelOrParams, paramsArg) {
433
- const model = typeof modelOrParams === "string" ? modelOrParams : modelOrParams.model;
434
- const params = typeof modelOrParams === "string" ? paramsArg : modelOrParams;
435
426
  return {
436
- model,
437
- ...params
427
+ model: typeof modelOrParams === "string" ? modelOrParams : modelOrParams.model,
428
+ ...typeof modelOrParams === "string" ? paramsArg : modelOrParams
438
429
  };
439
430
  }
440
431
 
@@ -1 +1 @@
1
- {"version":3,"file":"base.cjs","names":["platform: GooglePlatformType | undefined","hasApiKey: boolean","BaseChatModel","params: BaseChatGoogleParams","ConfigurationError","convertParamsToPlatformType","PROFILES","urlMethod?: string","options: this[\"ParsedCallOptions\"]","convertToolsToGeminiTools","convertToolChoiceToGeminiConfig","responseJsonSchema:\n | JsonSchema7Type\n | Record<string, unknown>\n | undefined","responseMimeType: string | undefined","convertFieldsToThinkingConfig","convertFieldsToSpeechConfig","messages: BaseMessage[]","runManager?: CallbackManagerForLLMRun","finalChunk: ChatGenerationChunk | null","convertMessagesToGeminiSystemInstruction","convertMessagesToGeminiContents","RequestError","data: Gemini.GenerateContentResponse","PromptBlockedError","NoCandidatesError","convertGeminiCandidateToAIMessage","convertAIMessageToText","convertGeminiGenerateContentResponseToUsageMetadata","streamUsage: boolean","EventSourceParserStream","SafeJsonEventParserStream","ChatGenerationChunk","AIMessageChunk","convertGeminiPartsToToolCalls","messageChunkParams: AIMessageChunkFields","tools: BindToolsInput[]","kwargs?: Partial<CallOptions>","outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","config?: StructuredOutputMethodOptions<boolean>","llm: Runnable<BaseMessage[], AIMessageChunk, CallOptions>","outputParser: Runnable<BaseMessage, RunOutput>","RunnableLambda","input: BaseMessage","AIMessage","MalformedOutputError","StructuredOutputParser","JsonOutputParser","tools: Gemini.Tool[]","schemaToGeminiParameters","JsonOutputKeyToolsParser","geminiFunctionDefinition: Gemini.Tools.FunctionDeclaration","RunnablePassthrough","input: any","config","RunnableSequence","a: CombinableFields","b: CombinableFields","combined: CombinableFields","modelOrParams: string | TParams","paramsArg?: Omit<TParams, \"model\">"],"sources":["../../src/chat_models/base.ts"],"sourcesContent":["import {\n BaseChatModel,\n type BaseChatModelCallOptions,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n AIMessage,\n AIMessageChunk,\n AIMessageChunkFields,\n BaseMessage,\n} from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\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 {\n Runnable,\n RunnableLambda,\n RunnablePassthrough,\n RunnableSequence,\n} 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\";\nimport {\n JsonOutputParser,\n StructuredOutputParser,\n} from \"@langchain/core/output_parsers\";\nimport { JsonOutputKeyToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\n\nimport { ApiClient } from \"../clients/index.js\";\nimport type { ChatGoogleFields } 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 schemaToGeminiParameters,\n} from \"../converters/tools.js\";\nimport {\n convertParamsToPlatformType,\n convertFieldsToSpeechConfig,\n convertFieldsToThinkingConfig,\n} from \"../converters/params.js\";\nimport { Gemini } from \"./api-types.js\";\n\nexport type GooglePlatformType = \"gai\" | \"gcp\";\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\nexport interface BaseChatGoogleParams\n extends BaseChatModelParams,\n 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,\n 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 _location?: string;\n\n protected _apiVersion?: string;\n\n protected apiClient: ApiClient;\n\n constructor(protected params: BaseChatGoogleParams) {\n super(params);\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._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 this.platform === \"gcp\" && this.apiClient.hasApiKey();\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 {\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 return `https://${this.endpoint}/${this.apiVersion}/models/${this.model}:${\n urlMethod ?? this.urlMethod\n }`;\n }\n\n protected async buildUrlVertexExpress(urlMethod?: string): Promise<string> {\n return `https://${this.endpoint}/${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 `https://${this.endpoint}/${\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\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 const toolConfig = convertToolChoiceToGeminiConfig(\n options.tool_choice,\n !!(tools && tools.length > 0)\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 (isInteropZodSchema(fields.responseSchema)) {\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 ...(fields.mediaResolution\n ? { mediaResolution: fields.mediaResolution }\n : {}),\n },\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 return {\n generations: finalChunk ? [finalChunk] : [],\n };\n }\n\n const url = await this.buildUrl();\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 body,\n });\n\n const response = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n })\n );\n\n if (!response.ok) {\n const error = await RequestError.fromResponse(response);\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: response.headers,\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 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: usageMetadata,\n model: data.modelVersion,\n responseId: data.responseId,\n usageMetadata,\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 moduleName = this.constructor.name;\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n url,\n body,\n });\n\n const response = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: options.signal,\n })\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.ok) {\n const error = await RequestError.fromResponse(response);\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n error,\n });\n throw error;\n }\n\n if (response.body) {\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 // eslint-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 // Include usageMetadata if there is any and we have\n // enabled it with streamUsage on\n if (chunk?.usageMetadata && streamUsage) {\n messageChunkParams.usage_metadata =\n convertGeminiGenerateContentResponseToUsageMetadata(chunk);\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 },\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 if (value.text) {\n await runManager?.handleLLMNewToken(\n value.text,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: value }\n );\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 /**\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-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 if (isInteropZodSchema(schema)) {\n const zodParser = StructuredOutputParser.fromZodSchema(\n schema as InteropZodType<RunOutput>\n );\n return (await zodParser.parse(input.text)) as RunOutput;\n } else {\n const jsonParser = new JsonOutputParser<RunOutput>();\n return await jsonParser.parse(input.text);\n }\n }\n );\n } else if (method === \"functionCalling\") {\n // Use function calling mode\n let functionName = name ?? \"extract\";\n let tools: Gemini.Tool[];\n\n if (isInteropZodSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n const description =\n typeof jsonSchema.description === \"string\"\n ? jsonSchema.description\n : \"A function available to call.\";\n tools = [\n {\n functionDeclarations: [\n {\n name: functionName,\n description,\n parameters: jsonSchema as Gemini.Tools.Schema,\n },\n ],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser({\n returnSingle: true,\n keyName: functionName,\n zodSchema: schema,\n });\n } else {\n let geminiFunctionDefinition: Gemini.Tools.FunctionDeclaration;\n if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDefinition = 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 geminiFunctionDefinition = {\n name: functionName,\n description: (schema as { description?: string }).description ?? \"\",\n parameters,\n };\n }\n tools = [\n {\n functionDeclarations: [geminiFunctionDefinition],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser<RunOutput>({\n returnSingle: true,\n keyName: functionName,\n });\n }\n\n llm = this.bindTools(tools).withConfig({\n tool_choice: functionName,\n } as Partial<CallOptions>);\n } else {\n throw new ConfigurationError(\n `Unrecognized structured output method '${method}'. Expected 'functionCalling' or 'jsonSchema'`\n );\n }\n\n // Shared logic for handling includeRaw\n if (!includeRaw) {\n return llm.pipe(outputParser).withConfig({\n runName: \"ChatGoogleStructuredOutput\",\n }) as Runnable<BaseLanguageModelInput, RunOutput>;\n }\n\n const parserAssign = RunnablePassthrough.assign({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parsed: (input: any, config) => outputParser.invoke(input.raw, config),\n });\n const parserNone = RunnablePassthrough.assign({\n parsed: () => null,\n });\n const parsedWithFallback = parserAssign.withFallbacks({\n fallbacks: [parserNone],\n });\n return RunnableSequence.from<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n >([\n {\n raw: llm,\n },\n parsedWithFallback,\n ]).withConfig({\n runName: \"ChatGoogleStructuredOutputRunnable\",\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 maxReasoningTokens: b.maxReasoningTokens ?? a.maxReasoningTokens,\n thinkingBudget: b.thinkingBudget ?? a.thinkingBudget,\n reasoningEffort: b.reasoningEffort ?? a.reasoningEffort,\n thinkingLevel: b.thinkingLevel ?? a.thinkingLevel,\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":["BaseChatModel","ConfigurationError","convertParamsToPlatformType","PROFILES","convertToolsToGeminiTools","convertToolChoiceToGeminiConfig","convertFieldsToThinkingConfig","convertFieldsToSpeechConfig","convertMessagesToGeminiSystemInstruction","convertMessagesToGeminiContents","RequestError","PromptBlockedError","NoCandidatesError","convertGeminiCandidateToAIMessage","convertAIMessageToText","convertGeminiGenerateContentResponseToUsageMetadata","EventSourceParserStream","SafeJsonEventParserStream","ChatGenerationChunk","AIMessageChunk","convertGeminiPartsToToolCalls","RunnableLambda","AIMessage","MalformedOutputError","StructuredOutputParser","JsonOutputParser","schemaToGeminiParameters","JsonOutputKeyToolsParser","RunnablePassthrough","RunnableSequence"],"sources":["../../src/chat_models/base.ts"],"sourcesContent":["import {\n BaseChatModel,\n type BaseChatModelCallOptions,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n AIMessage,\n AIMessageChunk,\n AIMessageChunkFields,\n BaseMessage,\n} from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\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 {\n Runnable,\n RunnableLambda,\n RunnablePassthrough,\n RunnableSequence,\n} 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\";\nimport {\n JsonOutputParser,\n StructuredOutputParser,\n} from \"@langchain/core/output_parsers\";\nimport { JsonOutputKeyToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\n\nimport { ApiClient } from \"../clients/index.js\";\nimport type { ChatGoogleFields } 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 schemaToGeminiParameters,\n} from \"../converters/tools.js\";\nimport {\n convertParamsToPlatformType,\n convertFieldsToSpeechConfig,\n convertFieldsToThinkingConfig,\n} from \"../converters/params.js\";\nimport { Gemini } from \"./api-types.js\";\n\nexport type GooglePlatformType = \"gai\" | \"gcp\";\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\nexport interface BaseChatGoogleParams\n extends BaseChatModelParams,\n 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,\n 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 _location?: string;\n\n protected _apiVersion?: string;\n\n protected apiClient: ApiClient;\n\n constructor(protected params: BaseChatGoogleParams) {\n super(params);\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._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 this.platform === \"gcp\" && this.apiClient.hasApiKey();\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 {\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 return `https://${this.endpoint}/${this.apiVersion}/models/${this.model}:${\n urlMethod ?? this.urlMethod\n }`;\n }\n\n protected async buildUrlVertexExpress(urlMethod?: string): Promise<string> {\n return `https://${this.endpoint}/${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 `https://${this.endpoint}/${\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\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 const toolConfig = convertToolChoiceToGeminiConfig(\n options.tool_choice,\n !!(tools && tools.length > 0)\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 (isInteropZodSchema(fields.responseSchema)) {\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 ...(fields.mediaResolution\n ? { mediaResolution: fields.mediaResolution }\n : {}),\n },\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 return {\n generations: finalChunk ? [finalChunk] : [],\n };\n }\n\n const url = await this.buildUrl();\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 body,\n });\n\n const response = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n })\n );\n\n if (!response.ok) {\n const error = await RequestError.fromResponse(response);\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: response.headers,\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 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: usageMetadata,\n model: data.modelVersion,\n responseId: data.responseId,\n usageMetadata,\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 moduleName = this.constructor.name;\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n url,\n body,\n });\n\n const response = await this.apiClient.fetch(\n new Request(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: options.signal,\n })\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.ok) {\n const error = await RequestError.fromResponse(response);\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n error,\n });\n throw error;\n }\n\n if (response.body) {\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 // eslint-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 // Include usageMetadata if there is any and we have\n // enabled it with streamUsage on\n if (chunk?.usageMetadata && streamUsage) {\n messageChunkParams.usage_metadata =\n convertGeminiGenerateContentResponseToUsageMetadata(chunk);\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 },\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 if (value.text) {\n await runManager?.handleLLMNewToken(\n value.text,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: value }\n );\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 /**\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-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 if (isInteropZodSchema(schema)) {\n const zodParser = StructuredOutputParser.fromZodSchema(\n schema as InteropZodType<RunOutput>\n );\n return (await zodParser.parse(input.text)) as RunOutput;\n } else {\n const jsonParser = new JsonOutputParser<RunOutput>();\n return await jsonParser.parse(input.text);\n }\n }\n );\n } else if (method === \"functionCalling\") {\n // Use function calling mode\n let functionName = name ?? \"extract\";\n let tools: Gemini.Tool[];\n\n if (isInteropZodSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n const description =\n typeof jsonSchema.description === \"string\"\n ? jsonSchema.description\n : \"A function available to call.\";\n tools = [\n {\n functionDeclarations: [\n {\n name: functionName,\n description,\n parameters: jsonSchema as Gemini.Tools.Schema,\n },\n ],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser({\n returnSingle: true,\n keyName: functionName,\n zodSchema: schema,\n });\n } else {\n let geminiFunctionDefinition: Gemini.Tools.FunctionDeclaration;\n if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDefinition = 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 geminiFunctionDefinition = {\n name: functionName,\n description: (schema as { description?: string }).description ?? \"\",\n parameters,\n };\n }\n tools = [\n {\n functionDeclarations: [geminiFunctionDefinition],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser<RunOutput>({\n returnSingle: true,\n keyName: functionName,\n });\n }\n\n llm = this.bindTools(tools).withConfig({\n tool_choice: functionName,\n } as Partial<CallOptions>);\n } else {\n throw new ConfigurationError(\n `Unrecognized structured output method '${method}'. Expected 'functionCalling' or 'jsonSchema'`\n );\n }\n\n // Shared logic for handling includeRaw\n if (!includeRaw) {\n return llm.pipe(outputParser).withConfig({\n runName: \"ChatGoogleStructuredOutput\",\n }) as Runnable<BaseLanguageModelInput, RunOutput>;\n }\n\n const parserAssign = RunnablePassthrough.assign({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parsed: (input: any, config) => outputParser.invoke(input.raw, config),\n });\n const parserNone = RunnablePassthrough.assign({\n parsed: () => null,\n });\n const parsedWithFallback = parserAssign.withFallbacks({\n fallbacks: [parserNone],\n });\n return RunnableSequence.from<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n >([\n {\n raw: llm,\n },\n parsedWithFallback,\n ]).withConfig({\n runName: \"ChatGoogleStructuredOutputRunnable\",\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 maxReasoningTokens: b.maxReasoningTokens ?? a.maxReasoningTokens,\n thinkingBudget: b.thinkingBudget ?? a.thinkingBudget,\n reasoningEffort: b.reasoningEffort ?? a.reasoningEffort,\n thinkingLevel: b.thinkingLevel ?? a.thinkingLevel,\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,5 @@
1
1
  import { ConfigurationError, MalformedOutputError, NoCandidatesError, PromptBlockedError, RequestError } from "../utils/errors.js";
2
- import profiles_default from "./profiles.js";
2
+ import PROFILES from "./profiles.js";
3
3
  import { SafeJsonEventParserStream } from "../utils/stream.js";
4
4
  import { convertAIMessageToText, convertGeminiCandidateToAIMessage, convertGeminiGenerateContentResponseToUsageMetadata, convertGeminiPartsToToolCalls, convertMessagesToGeminiContents, convertMessagesToGeminiSystemInstruction } from "../converters/messages.js";
5
5
  import { convertToolChoiceToGeminiConfig, convertToolsToGeminiTools, schemaToGeminiParameters } from "../converters/tools.js";
@@ -95,7 +95,7 @@ var BaseChatGoogle = class extends BaseChatModel {
95
95
  * ```
96
96
  */
97
97
  get profile() {
98
- return profiles_default[this.model] ?? {};
98
+ return PROFILES[this.model] ?? {};
99
99
  }
100
100
  async buildUrlGemini(urlMethod) {
101
101
  return `https://${this.endpoint}/${this.apiVersion}/models/${this.model}:${urlMethod ?? this.urlMethod}`;
@@ -250,7 +250,7 @@ var BaseChatGoogle = class extends BaseChatModel {
250
250
  throw error;
251
251
  }
252
252
  if (response.body) {
253
- const stream = response.body.pipeThrough(new TextDecoderStream()).pipeThrough(new EventSourceParserStream()).pipeThrough(new SafeJsonEventParserStream()).pipeThrough(new TransformStream({ transform(chunk, controller) {
253
+ const reader = response.body.pipeThrough(new TextDecoderStream()).pipeThrough(new EventSourceParserStream()).pipeThrough(new SafeJsonEventParserStream()).pipeThrough(new TransformStream({ transform(chunk, controller) {
254
254
  runManager?.handleCustomEvent(`google-chunk-${moduleName}`, { chunk });
255
255
  if (chunk === null) {
256
256
  controller.enqueue(new ChatGenerationChunk({
@@ -293,8 +293,7 @@ var BaseChatGoogle = class extends BaseChatModel {
293
293
  }
294
294
  }));
295
295
  }
296
- } }));
297
- const reader = stream.getReader();
296
+ } })).getReader();
298
297
  try {
299
298
  while (true) {
300
299
  const { done, value } = await reader.read();
@@ -348,13 +347,8 @@ var BaseChatGoogle = class extends BaseChatModel {
348
347
  outputParser = RunnableLambda.from(async (input) => {
349
348
  if (!AIMessage.isInstance(input) && !AIMessageChunk.isInstance(input)) throw new MalformedOutputError({ message: "Input is not an AIMessage or AIMessageChunk." });
350
349
  if (!input.text) throw new MalformedOutputError({ message: "No content found in response. Cannot parse structured output." });
351
- if (isInteropZodSchema(schema)) {
352
- const zodParser = StructuredOutputParser.fromZodSchema(schema);
353
- return await zodParser.parse(input.text);
354
- } else {
355
- const jsonParser = new JsonOutputParser();
356
- return await jsonParser.parse(input.text);
357
- }
350
+ if (isInteropZodSchema(schema)) return await StructuredOutputParser.fromZodSchema(schema).parse(input.text);
351
+ else return await new JsonOutputParser().parse(input.text);
358
352
  });
359
353
  } else if (method === "functionCalling") {
360
354
  let functionName = name ?? "extract";
@@ -394,7 +388,7 @@ var BaseChatGoogle = class extends BaseChatModel {
394
388
  llm = this.bindTools(tools).withConfig({ tool_choice: functionName });
395
389
  } else throw new ConfigurationError(`Unrecognized structured output method '${method}'. Expected 'functionCalling' or 'jsonSchema'`);
396
390
  if (!includeRaw) return llm.pipe(outputParser).withConfig({ runName: "ChatGoogleStructuredOutput" });
397
- const parserAssign = RunnablePassthrough.assign({ parsed: (input, config$1) => outputParser.invoke(input.raw, config$1) });
391
+ const parserAssign = RunnablePassthrough.assign({ parsed: (input, config) => outputParser.invoke(input.raw, config) });
398
392
  const parserNone = RunnablePassthrough.assign({ parsed: () => null });
399
393
  const parsedWithFallback = parserAssign.withFallbacks({ fallbacks: [parserNone] });
400
394
  return RunnableSequence.from([{ raw: llm }, parsedWithFallback]).withConfig({ runName: "ChatGoogleStructuredOutputRunnable" });
@@ -429,11 +423,9 @@ function combineGoogleChatModelFields(a, b, ...rest) {
429
423
  return combined;
430
424
  }
431
425
  function getGoogleChatModelParams(modelOrParams, paramsArg) {
432
- const model = typeof modelOrParams === "string" ? modelOrParams : modelOrParams.model;
433
- const params = typeof modelOrParams === "string" ? paramsArg : modelOrParams;
434
426
  return {
435
- model,
436
- ...params
427
+ model: typeof modelOrParams === "string" ? modelOrParams : modelOrParams.model,
428
+ ...typeof modelOrParams === "string" ? paramsArg : modelOrParams
437
429
  };
438
430
  }
439
431