@langchain/google 0.2.11 → 0.2.12

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 (80) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/chat_models/{api-types.d.ts → api_types/generate_content.d.cts} +199 -199
  3. package/dist/chat_models/{api-types.d.cts → api_types/generate_content.d.ts} +199 -199
  4. package/dist/chat_models/base.cjs +53 -397
  5. package/dist/chat_models/base.cjs.map +1 -1
  6. package/dist/chat_models/base.d.cts +13 -198
  7. package/dist/chat_models/base.d.ts +15 -200
  8. package/dist/chat_models/base.js +55 -397
  9. package/dist/chat_models/base.js.map +1 -1
  10. package/dist/chat_models/handlers/base.cjs +63 -0
  11. package/dist/chat_models/handlers/base.cjs.map +1 -0
  12. package/dist/chat_models/handlers/base.d.cts +48 -0
  13. package/dist/chat_models/handlers/base.d.ts +48 -0
  14. package/dist/chat_models/handlers/base.js +63 -0
  15. package/dist/chat_models/handlers/base.js.map +1 -0
  16. package/dist/chat_models/handlers/generate_content.cjs +345 -0
  17. package/dist/chat_models/handlers/generate_content.cjs.map +1 -0
  18. package/dist/chat_models/handlers/generate_content.d.cts +34 -0
  19. package/dist/chat_models/handlers/generate_content.d.ts +34 -0
  20. package/dist/chat_models/handlers/generate_content.js +345 -0
  21. package/dist/chat_models/handlers/generate_content.js.map +1 -0
  22. package/dist/chat_models/handlers/index.cjs +4 -0
  23. package/dist/chat_models/handlers/index.d.cts +3 -0
  24. package/dist/chat_models/handlers/index.d.ts +3 -0
  25. package/dist/chat_models/handlers/index.js +3 -0
  26. package/dist/chat_models/index.cjs +11 -4
  27. package/dist/chat_models/index.cjs.map +1 -1
  28. package/dist/chat_models/index.d.cts +6 -1
  29. package/dist/chat_models/index.d.ts +6 -1
  30. package/dist/chat_models/index.js +6 -2
  31. package/dist/chat_models/index.js.map +1 -1
  32. package/dist/chat_models/node.cjs +2 -2
  33. package/dist/chat_models/node.cjs.map +1 -1
  34. package/dist/chat_models/node.js +2 -2
  35. package/dist/chat_models/node.js.map +1 -1
  36. package/dist/chat_models/types.cjs.map +1 -1
  37. package/dist/chat_models/types.d.cts +281 -94
  38. package/dist/chat_models/types.d.ts +281 -94
  39. package/dist/chat_models/types.js.map +1 -1
  40. package/dist/converters/{messages.cjs → generate_content/messages.cjs} +4 -4
  41. package/dist/converters/generate_content/messages.cjs.map +1 -0
  42. package/dist/converters/{messages.js → generate_content/messages.js} +4 -4
  43. package/dist/converters/generate_content/messages.js.map +1 -0
  44. package/dist/converters/generate_content/params.cjs +136 -0
  45. package/dist/converters/generate_content/params.cjs.map +1 -0
  46. package/dist/converters/generate_content/params.js +132 -0
  47. package/dist/converters/generate_content/params.js.map +1 -0
  48. package/dist/{utils → converters/generate_content}/stream_events.cjs +2 -2
  49. package/dist/converters/generate_content/stream_events.cjs.map +1 -0
  50. package/dist/{utils → converters/generate_content}/stream_events.js +2 -2
  51. package/dist/converters/generate_content/stream_events.js.map +1 -0
  52. package/dist/converters/{tools.cjs → generate_content/tools.cjs} +4 -4
  53. package/dist/converters/generate_content/tools.cjs.map +1 -0
  54. package/dist/converters/{tools.js → generate_content/tools.js} +4 -4
  55. package/dist/converters/generate_content/tools.js.map +1 -0
  56. package/dist/converters/{params.cjs → shared/params.cjs} +8 -93
  57. package/dist/converters/shared/params.cjs.map +1 -0
  58. package/dist/converters/{params.js → shared/params.js} +8 -91
  59. package/dist/converters/shared/params.js.map +1 -0
  60. package/dist/index.cjs +6 -0
  61. package/dist/index.d.cts +5 -1
  62. package/dist/index.d.ts +5 -1
  63. package/dist/index.js +4 -1
  64. package/dist/utils/metadata.cjs +8 -0
  65. package/dist/utils/metadata.cjs.map +1 -1
  66. package/dist/utils/metadata.js +8 -1
  67. package/dist/utils/metadata.js.map +1 -1
  68. package/dist/utils/misc.cjs.map +1 -1
  69. package/dist/utils/misc.d.cts +2 -1
  70. package/dist/utils/misc.d.ts +2 -1
  71. package/dist/utils/misc.js.map +1 -1
  72. package/package.json +4 -4
  73. package/dist/converters/messages.cjs.map +0 -1
  74. package/dist/converters/messages.js.map +0 -1
  75. package/dist/converters/params.cjs.map +0 -1
  76. package/dist/converters/params.js.map +0 -1
  77. package/dist/converters/tools.cjs.map +0 -1
  78. package/dist/converters/tools.js.map +0 -1
  79. package/dist/utils/stream_events.cjs.map +0 -1
  80. package/dist/utils/stream_events.js.map +0 -1
@@ -0,0 +1,345 @@
1
+ const require_misc = require("../../utils/misc.cjs");
2
+ const require_errors = require("../../utils/errors.cjs");
3
+ const require_metadata = require("../../utils/metadata.cjs");
4
+ const require_base = require("./base.cjs");
5
+ const require_stream = require("../../utils/stream.cjs");
6
+ const require_messages = require("../../converters/generate_content/messages.cjs");
7
+ const require_tools = require("../../converters/generate_content/tools.cjs");
8
+ const require_types = require("../types.cjs");
9
+ const require_params = require("../../converters/generate_content/params.cjs");
10
+ const require_stream_events = require("../../converters/generate_content/stream_events.cjs");
11
+ let _langchain_core_messages = require("@langchain/core/messages");
12
+ let _langchain_core_outputs = require("@langchain/core/outputs");
13
+ let _langchain_core_utils_types = require("@langchain/core/utils/types");
14
+ let _langchain_core_utils_standard_schema = require("@langchain/core/utils/standard_schema");
15
+ let _langchain_core_utils_json_schema = require("@langchain/core/utils/json_schema");
16
+ let eventsource_parser_stream = require("eventsource-parser/stream");
17
+ //#region src/chat_models/handlers/generate_content.ts
18
+ /**
19
+ * Concrete wire protocol handler for Google's Generate Content API
20
+ * (`/v1beta/models/{model}:generateContent` and `:streamGenerateContent`).
21
+ */
22
+ var GenerateContentApiHandler = class extends require_base.GoogleChatApiHandler {
23
+ constructor(params) {
24
+ super(params);
25
+ }
26
+ get urlMethod() {
27
+ return this.params.streaming ? "streamGenerateContent?alt=sse" : "generateContent";
28
+ }
29
+ getUrlSuffix(urlMethod) {
30
+ const method = urlMethod ?? this.urlMethod;
31
+ return `/models/${this.params.model}:${method}`;
32
+ }
33
+ getHeaders(options) {
34
+ const fields = require_params.combineGoogleChatModelFields(this.params, options ?? {});
35
+ return {
36
+ ...this.params.platform === "gcp" && typeof fields.serviceTier !== "undefined" && require_types.settableServiceTier.includes(fields.serviceTier) ? { "X-Vertex-AI-LLM-Shared-Request-Type": fields.serviceTier } : {},
37
+ ...super.getHeaders(options)
38
+ };
39
+ }
40
+ async generate(messages, options, runManager) {
41
+ const url = await this.buildUrl("generateContent");
42
+ const headers = this.getHeaders(options);
43
+ const body = {
44
+ ...this.invocationParams(options),
45
+ systemInstruction: require_messages.convertMessagesToGeminiSystemInstruction(messages),
46
+ contents: require_messages.convertMessagesToGeminiContents(messages)
47
+ };
48
+ const moduleName = this.constructor.name;
49
+ await runManager?.handleCustomEvent(`google-request-${moduleName}`, {
50
+ url,
51
+ headers,
52
+ body
53
+ });
54
+ let response;
55
+ try {
56
+ response = await this.params.caller.callWithOptions({
57
+ signal: options?.signal,
58
+ maxRetries: options?.maxRetries
59
+ }, async () => {
60
+ const nextResponse = await this.params.apiClient.fetch(new Request(url, {
61
+ method: "POST",
62
+ headers,
63
+ body: JSON.stringify(body),
64
+ signal: options?.signal
65
+ }));
66
+ if (!nextResponse.ok) throw await require_errors.RequestError.fromResponse(nextResponse);
67
+ return nextResponse;
68
+ });
69
+ } catch (error) {
70
+ await runManager?.handleCustomEvent(`google-response-${moduleName}`, { error });
71
+ throw error;
72
+ }
73
+ const data = await response.json();
74
+ await runManager?.handleCustomEvent(`google-response-${moduleName}`, {
75
+ data,
76
+ url: response.url,
77
+ headers: Array.from(response.headers.entries()),
78
+ status: response.status,
79
+ statusText: response.statusText
80
+ });
81
+ if (data.promptFeedback?.blockReason) throw require_errors.PromptBlockedError.fromPromptFeedback(data.promptFeedback);
82
+ if (!data.candidates || data.candidates.length === 0) throw new require_errors.NoCandidatesError();
83
+ const candidate = data.candidates[0];
84
+ const message = require_messages.convertGeminiCandidateToAIMessage(candidate);
85
+ const text = require_messages.convertAIMessageToText(message);
86
+ const usageMetadata = require_messages.convertGeminiGenerateContentResponseToUsageMetadata(data);
87
+ message.usage_metadata = usageMetadata;
88
+ const serviceTier = require_misc.iife(() => {
89
+ const trafficType = data.usageMetadata?.trafficType;
90
+ const serviceTierHeader = response.headers.get("x-gemini-service-tier");
91
+ if (trafficType?.startsWith("ON_DEMAND_")) return trafficType?.substring(10).toLowerCase();
92
+ return serviceTierHeader || "standard";
93
+ });
94
+ return {
95
+ generations: [{
96
+ text,
97
+ message,
98
+ generationInfo: {
99
+ finishReason: candidate.finishReason,
100
+ finishMessage: candidate.finishMessage,
101
+ safetyRatings: candidate.safetyRatings,
102
+ citationMetadata: candidate.citationMetadata,
103
+ tokenCount: candidate.tokenCount
104
+ }
105
+ }],
106
+ llmOutput: {
107
+ tokenUsage: require_metadata.usageMetadataToTokenUsage(usageMetadata),
108
+ model: data.modelVersion,
109
+ responseId: data.responseId,
110
+ usageMetadata,
111
+ serviceTier
112
+ }
113
+ };
114
+ }
115
+ async *streamResponseChunks(messages, options, runManager) {
116
+ const streamUsage = options?.streamUsage ?? this.params.streamUsage ?? false;
117
+ const body = {
118
+ ...this.invocationParams(options),
119
+ systemInstruction: require_messages.convertMessagesToGeminiSystemInstruction(messages),
120
+ contents: require_messages.convertMessagesToGeminiContents(messages)
121
+ };
122
+ const url = await this.buildUrl("streamGenerateContent?alt=sse");
123
+ const headers = this.getHeaders(options);
124
+ const moduleName = this.constructor.name;
125
+ await runManager?.handleCustomEvent(`google-request-${moduleName}`, {
126
+ url,
127
+ headers,
128
+ body
129
+ });
130
+ let response;
131
+ try {
132
+ response = await this.params.caller.callWithOptions({
133
+ signal: options?.signal,
134
+ maxRetries: options?.maxRetries
135
+ }, async () => {
136
+ const nextResponse = await this.params.apiClient.fetch(new Request(url, {
137
+ method: "POST",
138
+ headers,
139
+ body: JSON.stringify(body),
140
+ signal: options?.signal
141
+ }));
142
+ if (!nextResponse.ok) throw await require_errors.RequestError.fromResponse(nextResponse);
143
+ return nextResponse;
144
+ });
145
+ } catch (error) {
146
+ await runManager?.handleCustomEvent(`google-response-${moduleName}`, { error });
147
+ throw error;
148
+ }
149
+ await runManager?.handleCustomEvent(`google-response-${moduleName}`, {
150
+ url: response.url,
151
+ headers: response.headers,
152
+ status: response.status,
153
+ statusText: response.statusText
154
+ });
155
+ if (response.body) {
156
+ let previousUsage;
157
+ const reader = response.body.pipeThrough(new TextDecoderStream()).pipeThrough(new eventsource_parser_stream.EventSourceParserStream()).pipeThrough(new require_stream.SafeJsonEventParserStream()).pipeThrough(new TransformStream({ transform(chunk, controller) {
158
+ runManager?.handleCustomEvent(`google-chunk-${moduleName}`, { chunk });
159
+ if (chunk === null) {
160
+ controller.enqueue(new _langchain_core_outputs.ChatGenerationChunk({
161
+ text: "",
162
+ message: new _langchain_core_messages.AIMessageChunk({ content: "" }),
163
+ generationInfo: { finishReason: "stop" }
164
+ }));
165
+ return;
166
+ }
167
+ const candidate = chunk.candidates?.[0];
168
+ if (!candidate) {
169
+ if (chunk.usageMetadata && streamUsage) {
170
+ const cumulative = require_messages.convertGeminiGenerateContentResponseToUsageMetadata(chunk);
171
+ controller.enqueue(new _langchain_core_outputs.ChatGenerationChunk({
172
+ text: "",
173
+ message: new _langchain_core_messages.AIMessageChunk({
174
+ content: "",
175
+ response_metadata: { model_provider: "google" },
176
+ usage_metadata: require_metadata.subtractUsageMetadata(cumulative, previousUsage)
177
+ })
178
+ }));
179
+ previousUsage = cumulative;
180
+ }
181
+ return;
182
+ }
183
+ const message = require_messages.convertGeminiCandidateToAIMessage(candidate);
184
+ const text = require_messages.convertAIMessageToText(message);
185
+ const parts = candidate.content?.parts ?? [];
186
+ const toolCalls = require_messages.convertGeminiPartsToToolCalls(parts);
187
+ if (parts.length > 0 || candidate.finishReason) {
188
+ const messageChunkParams = {
189
+ content: message.content,
190
+ tool_calls: toolCalls,
191
+ response_metadata: { model_provider: "google" },
192
+ additional_kwargs: {
193
+ ...message.additional_kwargs.originalTextContentBlock ? { originalTextContentBlock: message.additional_kwargs.originalTextContentBlock } : {},
194
+ ...candidate.finishReason ? {
195
+ finishReason: candidate.finishReason,
196
+ finishMessage: candidate.finishMessage
197
+ } : {}
198
+ }
199
+ };
200
+ if (chunk?.usageMetadata && streamUsage) {
201
+ const cumulative = require_messages.convertGeminiGenerateContentResponseToUsageMetadata(chunk);
202
+ messageChunkParams.usage_metadata = require_metadata.subtractUsageMetadata(cumulative, previousUsage);
203
+ previousUsage = cumulative;
204
+ }
205
+ const messageChunk = new _langchain_core_messages.AIMessageChunk(messageChunkParams);
206
+ controller.enqueue(new _langchain_core_outputs.ChatGenerationChunk({
207
+ text,
208
+ message: messageChunk,
209
+ generationInfo: {
210
+ ...candidate.finishReason && {
211
+ finishReason: candidate.finishReason,
212
+ finishMessage: candidate.finishMessage
213
+ },
214
+ ...candidate.safetyRatings && { safetyRatings: candidate.safetyRatings },
215
+ ...candidate.citationMetadata && { citationMetadata: candidate.citationMetadata },
216
+ ...candidate.groundingMetadata && {
217
+ groundingMetadata: candidate.groundingMetadata,
218
+ groundingSupport: candidate.groundingMetadata.groundingSupports?.filter((s) => (s?.segment?.partIndex ?? 0) === 0)
219
+ }
220
+ }
221
+ }));
222
+ }
223
+ } })).getReader();
224
+ try {
225
+ while (true) {
226
+ const { done, value } = await reader.read();
227
+ if (done) break;
228
+ yield value;
229
+ await runManager?.handleLLMNewToken(value.text ?? "", void 0, void 0, void 0, void 0, { chunk: value });
230
+ }
231
+ } finally {
232
+ reader.releaseLock();
233
+ }
234
+ }
235
+ }
236
+ async *streamChatModelEvents(messages, options, _runManager) {
237
+ const body = {
238
+ ...this.invocationParams(options),
239
+ systemInstruction: require_messages.convertMessagesToGeminiSystemInstruction(messages),
240
+ contents: require_messages.convertMessagesToGeminiContents(messages)
241
+ };
242
+ const url = await this.buildUrl("streamGenerateContent?alt=sse");
243
+ const headers = this.getHeaders(options);
244
+ const response = await this.params.apiClient.fetch(new Request(url, {
245
+ method: "POST",
246
+ headers,
247
+ body: JSON.stringify(body),
248
+ signal: options?.signal
249
+ }));
250
+ if (!response.ok) throw await require_errors.RequestError.fromResponse(response);
251
+ if (!response.body) return;
252
+ const eventStream = response.body.pipeThrough(new TextDecoderStream()).pipeThrough(new eventsource_parser_stream.EventSourceParserStream()).pipeThrough(new require_stream.SafeJsonEventParserStream());
253
+ const shouldStreamUsage = this.params.streamUsage !== false && options?.streamUsage !== false;
254
+ async function* geminiChunks(stream, signal) {
255
+ const reader = stream.getReader();
256
+ try {
257
+ while (true) {
258
+ if (signal?.aborted) return;
259
+ const { done, value } = await reader.read();
260
+ if (done) break;
261
+ if (value !== null) yield value;
262
+ }
263
+ } finally {
264
+ reader.releaseLock();
265
+ }
266
+ }
267
+ yield* require_stream_events.convertGoogleGeminiStream(geminiChunks(eventStream, options?.signal), { streamUsage: shouldStreamUsage });
268
+ }
269
+ invocationParams(options) {
270
+ const fields = require_params.combineGoogleChatModelFields(this.params, options ?? {});
271
+ const mediaResolution = fields.mediaResolution ?? require_params.mapDetailToMediaResolution(fields.detail);
272
+ const tools = fields.tools ? require_tools.convertToolsToGeminiTools(fields.tools) : void 0;
273
+ let toolConfig = require_tools.convertToolChoiceToGeminiConfig(options?.tool_choice, !!(tools && tools.length > 0));
274
+ if (tools && require_tools.mixesBuiltinAndFunctionTools(tools)) toolConfig = {
275
+ ...toolConfig,
276
+ includeServerSideToolInvocations: true
277
+ };
278
+ let responseJsonSchema;
279
+ let responseMimeType;
280
+ if (fields.responseSchema) {
281
+ if ((0, _langchain_core_utils_types.isInteropZodSchema)(fields.responseSchema) || (0, _langchain_core_utils_standard_schema.isSerializableSchema)(fields.responseSchema)) responseJsonSchema = (0, _langchain_core_utils_json_schema.toJsonSchema)(fields.responseSchema);
282
+ else responseJsonSchema = fields.responseSchema;
283
+ responseMimeType = "application/json";
284
+ }
285
+ return {
286
+ ...tools && tools.length > 0 ? { tools } : {},
287
+ ...toolConfig ? { toolConfig } : {},
288
+ safetySettings: fields.safetySettings,
289
+ generationConfig: {
290
+ temperature: fields.temperature,
291
+ topP: fields.topP,
292
+ topK: fields.topK,
293
+ maxOutputTokens: fields.maxOutputTokens,
294
+ presencePenalty: fields.presencePenalty,
295
+ frequencyPenalty: fields.frequencyPenalty,
296
+ stopSequences: fields.stopSequences,
297
+ ...responseMimeType ? { responseMimeType } : {},
298
+ ...responseJsonSchema ? { responseJsonSchema } : {},
299
+ ...fields.responseModalities && fields.responseModalities.length > 0 ? { responseModalities: fields.responseModalities } : {},
300
+ candidateCount: 1,
301
+ seed: fields.seed,
302
+ responseLogprobs: fields.responseLogprobs,
303
+ logprobs: fields.logprobs,
304
+ ...fields.enableEnhancedCivicAnswers !== void 0 ? { enableEnhancedCivicAnswers: fields.enableEnhancedCivicAnswers } : {},
305
+ thinkingConfig: require_params.convertFieldsToThinkingConfig(this.params.model, fields),
306
+ speechConfig: require_params.convertFieldsToSpeechConfig(fields),
307
+ ...fields.imageConfig ? { imageConfig: fields.imageConfig } : {},
308
+ ...mediaResolution ? { mediaResolution } : {}
309
+ },
310
+ ...require_params.convertFieldsToServiceTier(this.params.platform, fields)
311
+ };
312
+ }
313
+ formatStructuredOutputTool(schema, options) {
314
+ let functionName = options?.name ?? "extract";
315
+ let geminiFunctionDeclaration;
316
+ if ((0, _langchain_core_utils_types.isInteropZodSchema)(schema) || (0, _langchain_core_utils_standard_schema.isSerializableSchema)(schema)) {
317
+ const jsonSchema = require_tools.schemaToGeminiParameters(schema);
318
+ const description = options?.description ?? (typeof jsonSchema.description === "string" ? jsonSchema.description : "A function available to call.");
319
+ geminiFunctionDeclaration = {
320
+ name: functionName,
321
+ description,
322
+ parameters: jsonSchema
323
+ };
324
+ } else if (typeof schema.name === "string" && typeof schema.parameters === "object" && schema.parameters != null) {
325
+ geminiFunctionDeclaration = schema;
326
+ functionName = schema.name;
327
+ } else {
328
+ const parameters = require_tools.schemaToGeminiParameters(schema);
329
+ geminiFunctionDeclaration = {
330
+ name: functionName,
331
+ description: options?.description ?? schema.description ?? "",
332
+ parameters
333
+ };
334
+ }
335
+ return {
336
+ tools: [{ functionDeclarations: [geminiFunctionDeclaration] }],
337
+ toolChoice: functionName,
338
+ functionName
339
+ };
340
+ }
341
+ };
342
+ //#endregion
343
+ exports.GenerateContentApiHandler = GenerateContentApiHandler;
344
+
345
+ //# sourceMappingURL=generate_content.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate_content.cjs","names":["GoogleChatApiHandler","combineGoogleChatModelFields","settableServiceTier","convertMessagesToGeminiSystemInstruction","convertMessagesToGeminiContents","RequestError","PromptBlockedError","NoCandidatesError","convertGeminiCandidateToAIMessage","convertAIMessageToText","convertGeminiGenerateContentResponseToUsageMetadata","iife","usageMetadataToTokenUsage","EventSourceParserStream","SafeJsonEventParserStream","ChatGenerationChunk","AIMessageChunk","subtractUsageMetadata","convertGeminiPartsToToolCalls","convertGoogleGeminiStream","mapDetailToMediaResolution","convertToolsToGeminiTools","convertToolChoiceToGeminiConfig","mixesBuiltinAndFunctionTools","isInteropZodSchema","isSerializableSchema","toJsonSchema","convertFieldsToThinkingConfig","convertFieldsToSpeechConfig","convertFieldsToServiceTier","schemaToGeminiParameters"],"sources":["../../../src/chat_models/handlers/generate_content.ts"],"sourcesContent":["import {\n AIMessageChunk,\n type AIMessageChunkFields,\n type BaseMessage,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport { ChatGenerationChunk, type ChatResult } from \"@langchain/core/outputs\";\nimport type { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport {\n type InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport {\n type SerializableSchema,\n isSerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n toJsonSchema,\n type JsonSchema7Type,\n} from \"@langchain/core/utils/json_schema\";\nimport { EventSourceParserStream } from \"eventsource-parser/stream\";\nimport { GoogleChatApiHandler } from \"./base.js\";\nimport { SafeJsonEventParserStream } from \"../../utils/stream.js\";\nimport {\n subtractUsageMetadata,\n usageMetadataToTokenUsage,\n} from \"../../utils/metadata.js\";\nimport { iife } from \"../../utils/misc.js\";\nimport {\n PromptBlockedError,\n NoCandidatesError,\n RequestError,\n} from \"../../utils/errors.js\";\nimport {\n convertAIMessageToText,\n convertGeminiCandidateToAIMessage,\n convertGeminiGenerateContentResponseToUsageMetadata,\n convertGeminiPartsToToolCalls,\n convertMessagesToGeminiContents,\n convertMessagesToGeminiSystemInstruction,\n} from \"../../converters/generate_content/messages.js\";\nimport {\n convertToolsToGeminiTools,\n convertToolChoiceToGeminiConfig,\n mixesBuiltinAndFunctionTools,\n schemaToGeminiParameters,\n} from \"../../converters/generate_content/tools.js\";\nimport {\n combineGoogleChatModelFields,\n convertFieldsToSpeechConfig,\n convertFieldsToThinkingConfig,\n convertFieldsToServiceTier,\n mapDetailToMediaResolution,\n} from \"../../converters/generate_content/params.js\";\nimport { convertGoogleGeminiStream } from \"../../converters/generate_content/stream_events.js\";\nimport type {\n BaseChatGoogleCallOptions,\n GenerateContentApiHandlerParams,\n GenerateContentInvocationParams,\n Gemini,\n} from \"../types.js\";\nimport { settableServiceTier } from \"../types.js\";\n\ntype ServiceTier = Gemini.ServiceTier;\n\n/**\n * Concrete wire protocol handler for Google's Generate Content API\n * (`/v1beta/models/{model}:generateContent` and `:streamGenerateContent`).\n */\nexport class GenerateContentApiHandler extends GoogleChatApiHandler<\n GenerateContentInvocationParams,\n GenerateContentApiHandlerParams\n> {\n constructor(params: GenerateContentApiHandlerParams) {\n super(params);\n }\n\n protected get urlMethod(): string {\n return this.params.streaming\n ? \"streamGenerateContent?alt=sse\"\n : \"generateContent\";\n }\n\n protected getUrlSuffix(urlMethod?: string): string {\n const method = urlMethod ?? this.urlMethod;\n return `/models/${this.params.model}:${method}`;\n }\n\n override getHeaders(\n options?: BaseChatGoogleCallOptions\n ): Record<string, string> {\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.params.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 ...priorityHeaders,\n ...super.getHeaders(options),\n };\n }\n\n async generate(\n messages: BaseMessage[],\n options?: BaseChatGoogleCallOptions,\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const url = await this.buildUrl(\"generateContent\");\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.params.caller.callWithOptions(\n { signal: options?.signal, maxRetries: options?.maxRetries },\n async () => {\n const nextResponse = await this.params.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.GenContent.GenerateContentResponse =\n 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 *streamResponseChunks(\n messages: BaseMessage[],\n options?: BaseChatGoogleCallOptions,\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const streamUsage: boolean =\n options?.streamUsage ?? this.params.streamUsage ?? false;\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.params.caller.callWithOptions(\n { signal: options?.signal, maxRetries: options?.maxRetries },\n async () => {\n const nextResponse = await this.params.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.GenContent.GenerateContentResponse>()\n )\n .pipeThrough(\n new TransformStream<\n Gemini.GenContent.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 async *streamChatModelEvents(\n messages: BaseMessage[],\n options?: BaseChatGoogleCallOptions,\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.params.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.GenContent.GenerateContentResponse>()\n );\n\n const shouldStreamUsage =\n this.params.streamUsage !== false && options?.streamUsage !== false;\n\n async function* geminiChunks(\n stream: ReadableStream<Gemini.GenContent.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 invocationParams(\n options?: BaseChatGoogleCallOptions\n ): GenerateContentInvocationParams {\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(\n this.params.model,\n fields\n ),\n speechConfig: convertFieldsToSpeechConfig(fields),\n ...(fields.imageConfig ? { imageConfig: fields.imageConfig } : {}),\n ...(mediaResolution ? { mediaResolution } : {}),\n },\n ...convertFieldsToServiceTier(this.params.platform, fields),\n };\n }\n\n formatStructuredOutputTool(\n schema: InteropZodType | SerializableSchema | Record<string, unknown>,\n options?: { name?: string; description?: string }\n ): { tools: BindToolsInput[]; toolChoice: string; functionName: string } {\n let functionName = options?.name ?? \"extract\";\n let geminiFunctionDeclaration: Gemini.GenContent.Tools.FunctionDeclaration;\n\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n const description =\n options?.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.GenContent.Tools.Schema,\n };\n } else if (\n typeof (schema as { name?: unknown }).name === \"string\" &&\n typeof (schema as { parameters?: unknown }).parameters === \"object\" &&\n (schema as { parameters?: unknown }).parameters != null\n ) {\n geminiFunctionDeclaration =\n schema as unknown as Gemini.GenContent.Tools.FunctionDeclaration;\n functionName = (schema as { name: string }).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:\n options?.description ??\n (schema as { description?: string }).description ??\n \"\",\n parameters,\n };\n }\n\n return {\n tools: [\n {\n functionDeclarations: [geminiFunctionDeclaration],\n },\n ],\n toolChoice: functionName,\n functionName,\n };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { GoogleChatApiHandler } from "./base.cjs";
2
+ import { BaseChatGoogleCallOptions, GenerateContentApiHandlerParams, GenerateContentInvocationParams } from "../types.cjs";
3
+ import { BindToolsInput } from "@langchain/core/language_models/chat_models";
4
+ import { BaseMessage } from "@langchain/core/messages";
5
+ import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
6
+ import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
7
+ import { ChatGenerationChunk, ChatResult } from "@langchain/core/outputs";
8
+ import { InteropZodType } from "@langchain/core/utils/types";
9
+ import { SerializableSchema } from "@langchain/core/utils/standard_schema";
10
+ //#region src/chat_models/handlers/generate_content.d.ts
11
+ /**
12
+ * Concrete wire protocol handler for Google's Generate Content API
13
+ * (`/v1beta/models/{model}:generateContent` and `:streamGenerateContent`).
14
+ */
15
+ export declare class GenerateContentApiHandler extends GoogleChatApiHandler<GenerateContentInvocationParams, GenerateContentApiHandlerParams> {
16
+ constructor(params: GenerateContentApiHandlerParams);
17
+ protected get urlMethod(): string;
18
+ protected getUrlSuffix(urlMethod?: string): string;
19
+ getHeaders(options?: BaseChatGoogleCallOptions): Record<string, string>;
20
+ generate(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, runManager?: CallbackManagerForLLMRun): Promise<ChatResult>;
21
+ streamResponseChunks(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
22
+ streamChatModelEvents(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, _runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatModelStreamEvent>;
23
+ invocationParams(options?: BaseChatGoogleCallOptions): GenerateContentInvocationParams;
24
+ formatStructuredOutputTool(schema: InteropZodType | SerializableSchema | Record<string, unknown>, options?: {
25
+ name?: string;
26
+ description?: string;
27
+ }): {
28
+ tools: BindToolsInput[];
29
+ toolChoice: string;
30
+ functionName: string;
31
+ };
32
+ }
33
+ //#endregion
34
+ //# sourceMappingURL=generate_content.d.cts.map
@@ -0,0 +1,34 @@
1
+ import { GoogleChatApiHandler } from "./base.js";
2
+ import { BaseChatGoogleCallOptions, GenerateContentApiHandlerParams, GenerateContentInvocationParams } from "../types.js";
3
+ import { BindToolsInput } from "@langchain/core/language_models/chat_models";
4
+ import { BaseMessage } from "@langchain/core/messages";
5
+ import { ChatGenerationChunk, ChatResult } from "@langchain/core/outputs";
6
+ import { InteropZodType } from "@langchain/core/utils/types";
7
+ import { SerializableSchema } from "@langchain/core/utils/standard_schema";
8
+ import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
9
+ import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
10
+ //#region src/chat_models/handlers/generate_content.d.ts
11
+ /**
12
+ * Concrete wire protocol handler for Google's Generate Content API
13
+ * (`/v1beta/models/{model}:generateContent` and `:streamGenerateContent`).
14
+ */
15
+ export declare class GenerateContentApiHandler extends GoogleChatApiHandler<GenerateContentInvocationParams, GenerateContentApiHandlerParams> {
16
+ constructor(params: GenerateContentApiHandlerParams);
17
+ protected get urlMethod(): string;
18
+ protected getUrlSuffix(urlMethod?: string): string;
19
+ getHeaders(options?: BaseChatGoogleCallOptions): Record<string, string>;
20
+ generate(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, runManager?: CallbackManagerForLLMRun): Promise<ChatResult>;
21
+ streamResponseChunks(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
22
+ streamChatModelEvents(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, _runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatModelStreamEvent>;
23
+ invocationParams(options?: BaseChatGoogleCallOptions): GenerateContentInvocationParams;
24
+ formatStructuredOutputTool(schema: InteropZodType | SerializableSchema | Record<string, unknown>, options?: {
25
+ name?: string;
26
+ description?: string;
27
+ }): {
28
+ tools: BindToolsInput[];
29
+ toolChoice: string;
30
+ functionName: string;
31
+ };
32
+ }
33
+ //#endregion
34
+ //# sourceMappingURL=generate_content.d.ts.map