@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.
- package/CHANGELOG.md +13 -0
- package/dist/chat_models/{api-types.d.ts → api_types/generate_content.d.cts} +199 -199
- package/dist/chat_models/{api-types.d.cts → api_types/generate_content.d.ts} +199 -199
- package/dist/chat_models/base.cjs +53 -397
- package/dist/chat_models/base.cjs.map +1 -1
- package/dist/chat_models/base.d.cts +13 -198
- package/dist/chat_models/base.d.ts +15 -200
- package/dist/chat_models/base.js +55 -397
- package/dist/chat_models/base.js.map +1 -1
- package/dist/chat_models/handlers/base.cjs +63 -0
- package/dist/chat_models/handlers/base.cjs.map +1 -0
- package/dist/chat_models/handlers/base.d.cts +48 -0
- package/dist/chat_models/handlers/base.d.ts +48 -0
- package/dist/chat_models/handlers/base.js +63 -0
- package/dist/chat_models/handlers/base.js.map +1 -0
- package/dist/chat_models/handlers/generate_content.cjs +345 -0
- package/dist/chat_models/handlers/generate_content.cjs.map +1 -0
- package/dist/chat_models/handlers/generate_content.d.cts +34 -0
- package/dist/chat_models/handlers/generate_content.d.ts +34 -0
- package/dist/chat_models/handlers/generate_content.js +345 -0
- package/dist/chat_models/handlers/generate_content.js.map +1 -0
- package/dist/chat_models/handlers/index.cjs +4 -0
- package/dist/chat_models/handlers/index.d.cts +3 -0
- package/dist/chat_models/handlers/index.d.ts +3 -0
- package/dist/chat_models/handlers/index.js +3 -0
- package/dist/chat_models/index.cjs +11 -4
- package/dist/chat_models/index.cjs.map +1 -1
- package/dist/chat_models/index.d.cts +6 -1
- package/dist/chat_models/index.d.ts +6 -1
- package/dist/chat_models/index.js +6 -2
- package/dist/chat_models/index.js.map +1 -1
- package/dist/chat_models/node.cjs +2 -2
- package/dist/chat_models/node.cjs.map +1 -1
- package/dist/chat_models/node.js +2 -2
- package/dist/chat_models/node.js.map +1 -1
- package/dist/chat_models/types.cjs.map +1 -1
- package/dist/chat_models/types.d.cts +281 -94
- package/dist/chat_models/types.d.ts +281 -94
- package/dist/chat_models/types.js.map +1 -1
- package/dist/converters/{messages.cjs → generate_content/messages.cjs} +4 -4
- package/dist/converters/generate_content/messages.cjs.map +1 -0
- package/dist/converters/{messages.js → generate_content/messages.js} +4 -4
- package/dist/converters/generate_content/messages.js.map +1 -0
- package/dist/converters/generate_content/params.cjs +136 -0
- package/dist/converters/generate_content/params.cjs.map +1 -0
- package/dist/converters/generate_content/params.js +132 -0
- package/dist/converters/generate_content/params.js.map +1 -0
- package/dist/{utils → converters/generate_content}/stream_events.cjs +2 -2
- package/dist/converters/generate_content/stream_events.cjs.map +1 -0
- package/dist/{utils → converters/generate_content}/stream_events.js +2 -2
- package/dist/converters/generate_content/stream_events.js.map +1 -0
- package/dist/converters/{tools.cjs → generate_content/tools.cjs} +4 -4
- package/dist/converters/generate_content/tools.cjs.map +1 -0
- package/dist/converters/{tools.js → generate_content/tools.js} +4 -4
- package/dist/converters/generate_content/tools.js.map +1 -0
- package/dist/converters/{params.cjs → shared/params.cjs} +8 -93
- package/dist/converters/shared/params.cjs.map +1 -0
- package/dist/converters/{params.js → shared/params.js} +8 -91
- package/dist/converters/shared/params.js.map +1 -0
- package/dist/index.cjs +6 -0
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +4 -1
- package/dist/utils/metadata.cjs +8 -0
- package/dist/utils/metadata.cjs.map +1 -1
- package/dist/utils/metadata.js +8 -1
- package/dist/utils/metadata.js.map +1 -1
- package/dist/utils/misc.cjs.map +1 -1
- package/dist/utils/misc.d.cts +2 -1
- package/dist/utils/misc.d.ts +2 -1
- package/dist/utils/misc.js.map +1 -1
- package/package.json +4 -4
- package/dist/converters/messages.cjs.map +0 -1
- package/dist/converters/messages.js.map +0 -1
- package/dist/converters/params.cjs.map +0 -1
- package/dist/converters/params.js.map +0 -1
- package/dist/converters/tools.cjs.map +0 -1
- package/dist/converters/tools.js.map +0 -1
- package/dist/utils/stream_events.cjs.map +0 -1
- package/dist/utils/stream_events.js.map +0 -1
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import { iife } from "../../utils/misc.js";
|
|
2
|
+
import { NoCandidatesError, PromptBlockedError, RequestError } from "../../utils/errors.js";
|
|
3
|
+
import { subtractUsageMetadata, usageMetadataToTokenUsage } from "../../utils/metadata.js";
|
|
4
|
+
import { GoogleChatApiHandler } from "./base.js";
|
|
5
|
+
import { SafeJsonEventParserStream } from "../../utils/stream.js";
|
|
6
|
+
import { convertAIMessageToText, convertGeminiCandidateToAIMessage, convertGeminiGenerateContentResponseToUsageMetadata, convertGeminiPartsToToolCalls, convertMessagesToGeminiContents, convertMessagesToGeminiSystemInstruction } from "../../converters/generate_content/messages.js";
|
|
7
|
+
import { convertToolChoiceToGeminiConfig, convertToolsToGeminiTools, mixesBuiltinAndFunctionTools, schemaToGeminiParameters } from "../../converters/generate_content/tools.js";
|
|
8
|
+
import { settableServiceTier } from "../types.js";
|
|
9
|
+
import { combineGoogleChatModelFields, convertFieldsToServiceTier, convertFieldsToSpeechConfig, convertFieldsToThinkingConfig, mapDetailToMediaResolution } from "../../converters/generate_content/params.js";
|
|
10
|
+
import { convertGoogleGeminiStream } from "../../converters/generate_content/stream_events.js";
|
|
11
|
+
import { AIMessageChunk } from "@langchain/core/messages";
|
|
12
|
+
import { ChatGenerationChunk } from "@langchain/core/outputs";
|
|
13
|
+
import { isInteropZodSchema } from "@langchain/core/utils/types";
|
|
14
|
+
import { isSerializableSchema } from "@langchain/core/utils/standard_schema";
|
|
15
|
+
import { toJsonSchema } from "@langchain/core/utils/json_schema";
|
|
16
|
+
import { EventSourceParserStream } from "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 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 = combineGoogleChatModelFields(this.params, options ?? {});
|
|
35
|
+
return {
|
|
36
|
+
...this.params.platform === "gcp" && typeof fields.serviceTier !== "undefined" && 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: convertMessagesToGeminiSystemInstruction(messages),
|
|
46
|
+
contents: 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 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 PromptBlockedError.fromPromptFeedback(data.promptFeedback);
|
|
82
|
+
if (!data.candidates || data.candidates.length === 0) throw new NoCandidatesError();
|
|
83
|
+
const candidate = data.candidates[0];
|
|
84
|
+
const message = convertGeminiCandidateToAIMessage(candidate);
|
|
85
|
+
const text = convertAIMessageToText(message);
|
|
86
|
+
const usageMetadata = convertGeminiGenerateContentResponseToUsageMetadata(data);
|
|
87
|
+
message.usage_metadata = usageMetadata;
|
|
88
|
+
const serviceTier = 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: 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: convertMessagesToGeminiSystemInstruction(messages),
|
|
120
|
+
contents: 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 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 EventSourceParserStream()).pipeThrough(new SafeJsonEventParserStream()).pipeThrough(new TransformStream({ transform(chunk, controller) {
|
|
158
|
+
runManager?.handleCustomEvent(`google-chunk-${moduleName}`, { chunk });
|
|
159
|
+
if (chunk === null) {
|
|
160
|
+
controller.enqueue(new ChatGenerationChunk({
|
|
161
|
+
text: "",
|
|
162
|
+
message: new 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 = convertGeminiGenerateContentResponseToUsageMetadata(chunk);
|
|
171
|
+
controller.enqueue(new ChatGenerationChunk({
|
|
172
|
+
text: "",
|
|
173
|
+
message: new AIMessageChunk({
|
|
174
|
+
content: "",
|
|
175
|
+
response_metadata: { model_provider: "google" },
|
|
176
|
+
usage_metadata: subtractUsageMetadata(cumulative, previousUsage)
|
|
177
|
+
})
|
|
178
|
+
}));
|
|
179
|
+
previousUsage = cumulative;
|
|
180
|
+
}
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const message = convertGeminiCandidateToAIMessage(candidate);
|
|
184
|
+
const text = convertAIMessageToText(message);
|
|
185
|
+
const parts = candidate.content?.parts ?? [];
|
|
186
|
+
const toolCalls = 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 = convertGeminiGenerateContentResponseToUsageMetadata(chunk);
|
|
202
|
+
messageChunkParams.usage_metadata = subtractUsageMetadata(cumulative, previousUsage);
|
|
203
|
+
previousUsage = cumulative;
|
|
204
|
+
}
|
|
205
|
+
const messageChunk = new AIMessageChunk(messageChunkParams);
|
|
206
|
+
controller.enqueue(new 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: convertMessagesToGeminiSystemInstruction(messages),
|
|
240
|
+
contents: 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 RequestError.fromResponse(response);
|
|
251
|
+
if (!response.body) return;
|
|
252
|
+
const eventStream = response.body.pipeThrough(new TextDecoderStream()).pipeThrough(new EventSourceParserStream()).pipeThrough(new 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* convertGoogleGeminiStream(geminiChunks(eventStream, options?.signal), { streamUsage: shouldStreamUsage });
|
|
268
|
+
}
|
|
269
|
+
invocationParams(options) {
|
|
270
|
+
const fields = combineGoogleChatModelFields(this.params, options ?? {});
|
|
271
|
+
const mediaResolution = fields.mediaResolution ?? mapDetailToMediaResolution(fields.detail);
|
|
272
|
+
const tools = fields.tools ? convertToolsToGeminiTools(fields.tools) : void 0;
|
|
273
|
+
let toolConfig = convertToolChoiceToGeminiConfig(options?.tool_choice, !!(tools && tools.length > 0));
|
|
274
|
+
if (tools && mixesBuiltinAndFunctionTools(tools)) toolConfig = {
|
|
275
|
+
...toolConfig,
|
|
276
|
+
includeServerSideToolInvocations: true
|
|
277
|
+
};
|
|
278
|
+
let responseJsonSchema;
|
|
279
|
+
let responseMimeType;
|
|
280
|
+
if (fields.responseSchema) {
|
|
281
|
+
if (isInteropZodSchema(fields.responseSchema) || isSerializableSchema(fields.responseSchema)) responseJsonSchema = 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: convertFieldsToThinkingConfig(this.params.model, fields),
|
|
306
|
+
speechConfig: convertFieldsToSpeechConfig(fields),
|
|
307
|
+
...fields.imageConfig ? { imageConfig: fields.imageConfig } : {},
|
|
308
|
+
...mediaResolution ? { mediaResolution } : {}
|
|
309
|
+
},
|
|
310
|
+
...convertFieldsToServiceTier(this.params.platform, fields)
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
formatStructuredOutputTool(schema, options) {
|
|
314
|
+
let functionName = options?.name ?? "extract";
|
|
315
|
+
let geminiFunctionDeclaration;
|
|
316
|
+
if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {
|
|
317
|
+
const jsonSchema = 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 = 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
|
+
export { GenerateContentApiHandler };
|
|
344
|
+
|
|
345
|
+
//# sourceMappingURL=generate_content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate_content.js","names":[],"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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"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
const require_index = require("../clients/index.cjs");
|
|
2
|
-
const require_base = require("./base.cjs");
|
|
2
|
+
const require_base = require("./handlers/base.cjs");
|
|
3
|
+
const require_params = require("../converters/shared/params.cjs");
|
|
4
|
+
const require_generate_content = require("./handlers/generate_content.cjs");
|
|
5
|
+
require("./handlers/index.cjs");
|
|
6
|
+
const require_base$1 = require("./base.cjs");
|
|
3
7
|
let _langchain_core_utils_env = require("@langchain/core/utils/env");
|
|
4
8
|
//#region src/chat_models/index.ts
|
|
5
|
-
var ChatGoogle = class extends require_base.BaseChatGoogle {
|
|
9
|
+
var ChatGoogle = class extends require_base$1.BaseChatGoogle {
|
|
6
10
|
apiKey;
|
|
7
11
|
constructor(modelOrParams, paramsArg) {
|
|
8
|
-
let params =
|
|
9
|
-
params = require_base.applyGeminiGatewayParams(params);
|
|
12
|
+
let params = require_params.getGoogleChatModelParams(modelOrParams, paramsArg);
|
|
13
|
+
params = require_base$1.applyGeminiGatewayParams(params);
|
|
10
14
|
params.apiKey = params?.apiKey ?? (0, _langchain_core_utils_env.getEnvironmentVariable)("GOOGLE_API_KEY");
|
|
11
15
|
const apiClient = params?.apiClient ?? new require_index.WebApiClient(params);
|
|
12
16
|
super({
|
|
@@ -17,6 +21,9 @@ var ChatGoogle = class extends require_base.BaseChatGoogle {
|
|
|
17
21
|
}
|
|
18
22
|
};
|
|
19
23
|
//#endregion
|
|
24
|
+
exports.BaseChatGoogle = require_base$1.BaseChatGoogle;
|
|
20
25
|
exports.ChatGoogle = ChatGoogle;
|
|
26
|
+
exports.GenerateContentApiHandler = require_generate_content.GenerateContentApiHandler;
|
|
27
|
+
exports.GoogleChatApiHandler = require_base.GoogleChatApiHandler;
|
|
21
28
|
|
|
22
29
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["BaseChatGoogle","getGoogleChatModelParams","applyGeminiGatewayParams","getEnvironmentVariable","WebApiClient"],"sources":["../../src/chat_models/index.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { WebApiClient } from \"../clients/index.js\";\nimport {\n applyGeminiGatewayParams,\n BaseChatGoogle,\n BaseChatGoogleCallOptions,\n BaseChatGoogleParams,\n
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["BaseChatGoogle","getGoogleChatModelParams","applyGeminiGatewayParams","getEnvironmentVariable","WebApiClient"],"sources":["../../src/chat_models/index.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { WebApiClient } from \"../clients/index.js\";\nimport {\n applyGeminiGatewayParams,\n BaseChatGoogle,\n BaseChatGoogleCallOptions,\n BaseChatGoogleParams,\n} from \"./base.js\";\nimport { getGoogleChatModelParams } from \"../converters/shared/params.js\";\n\n/**\n * Configuration parameters for the ChatGoogle model.\n *\n * This interface extends the base Google chat model parameters and adds\n * specific configuration options for the Generative AI API.\n */\nexport interface ChatGoogleParams extends BaseChatGoogleParams {\n /**\n * Google API key for authentication with the Generative AI API.\n *\n * If not provided, the model will attempt to use the `GOOGLE_API_KEY`\n * environment variable. You can obtain an API key from the\n * [Google AI Studio](https://makersuite.google.com/app/apikey).\n */\n apiKey?: string;\n\n /** @deprecated Import from `@langchain/google/node` to configure google auth options */\n authOptions?: never;\n}\n\n/**\n * Call options for the ChatGoogle model.\n *\n * This interface extends the base Google chat model call options and provides\n * configuration for individual model invocations. These options can be passed\n * when calling methods like `invoke()`, `stream()`, or `batch()` to customize\n * the behavior of a specific request.\n */\nexport interface ChatGoogleCallOptions extends BaseChatGoogleCallOptions {}\n\nexport class ChatGoogle extends BaseChatGoogle<ChatGoogleCallOptions> {\n apiKey?: string;\n\n constructor(model: string, params?: Omit<ChatGoogleParams, \"model\">);\n constructor(params: ChatGoogleParams);\n constructor(\n modelOrParams: string | ChatGoogleParams,\n paramsArg?: Omit<ChatGoogleParams, \"model\">\n ) {\n let params = getGoogleChatModelParams(modelOrParams, paramsArg);\n // Route through the LangSmith gateway (Gemini Developer API path) when\n // configured, before falling back to the provider API-key env var so the\n // gateway key can take precedence.\n params = applyGeminiGatewayParams(params);\n params.apiKey = params?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n const apiClient = params?.apiClient ?? new WebApiClient(params);\n super({ ...params, apiClient });\n\n this.apiKey = params.apiKey;\n }\n}\n\nexport {\n BaseChatGoogle,\n type BaseChatGoogleParams,\n type BaseChatGoogleCallOptions,\n} from \"./base.js\";\nexport * from \"./handlers/index.js\";\nexport type {\n GoogleChatApiHandlerParams,\n GenerateContentApiHandlerParams,\n GoogleChatApiHandlerFactory,\n GoogleChatApiHandlerConfig,\n GenerateContentInvocationParams,\n BaseChatGoogleFields,\n GenerateContentSpecificFields,\n GenerateContentFields,\n ChatGoogleFields,\n} from \"./types.js\";\n"],"mappings":";;;;;;;;AAwCA,IAAa,aAAb,cAAgCA,eAAAA,eAAsC;CACpE;CAIA,YACE,eACA,WACA;EACA,IAAI,SAASC,eAAAA,yBAAyB,eAAe,SAAS;EAI9D,SAASC,eAAAA,yBAAyB,MAAM;EACxC,OAAO,SAAS,QAAQ,WAAA,GAAUC,0BAAAA,uBAAAA,CAAuB,gBAAgB;EACzE,MAAM,YAAY,QAAQ,aAAa,IAAIC,cAAAA,aAAa,MAAM;EAC9D,MAAM;GAAE,GAAG;GAAQ;EAAU,CAAC;EAE9B,KAAK,SAAS,OAAO;CACvB;AACF"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GoogleChatApiHandler } from "./handlers/base.cjs";
|
|
2
|
+
import { BaseChatGoogleCallOptions, BaseChatGoogleFields, BaseChatGoogleParams, ChatGoogleFields, GenerateContentApiHandlerParams, GenerateContentFields, GenerateContentInvocationParams, GenerateContentSpecificFields, GoogleChatApiHandlerConfig, GoogleChatApiHandlerFactory, GoogleChatApiHandlerParams } from "./types.cjs";
|
|
3
|
+
import { GenerateContentApiHandler } from "./handlers/generate_content.cjs";
|
|
4
|
+
import "./handlers/index.cjs";
|
|
5
|
+
import { BaseChatGoogle } from "./base.cjs";
|
|
2
6
|
//#region src/chat_models/index.d.ts
|
|
3
7
|
/**
|
|
4
8
|
* Configuration parameters for the ChatGoogle model.
|
|
@@ -33,4 +37,5 @@ export declare class ChatGoogle extends BaseChatGoogle<ChatGoogleCallOptions> {
|
|
|
33
37
|
constructor(params: ChatGoogleParams);
|
|
34
38
|
}
|
|
35
39
|
//#endregion
|
|
40
|
+
export { BaseChatGoogle, type BaseChatGoogleCallOptions, type BaseChatGoogleFields, type BaseChatGoogleParams, type ChatGoogleFields, GenerateContentApiHandler, type GenerateContentApiHandlerParams, type GenerateContentFields, type GenerateContentInvocationParams, type GenerateContentSpecificFields, GoogleChatApiHandler, type GoogleChatApiHandlerConfig, type GoogleChatApiHandlerFactory, type GoogleChatApiHandlerParams };
|
|
36
41
|
//# sourceMappingURL=index.d.cts.map
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GoogleChatApiHandler } from "./handlers/base.js";
|
|
2
|
+
import { BaseChatGoogleCallOptions, BaseChatGoogleFields, BaseChatGoogleParams, ChatGoogleFields, GenerateContentApiHandlerParams, GenerateContentFields, GenerateContentInvocationParams, GenerateContentSpecificFields, GoogleChatApiHandlerConfig, GoogleChatApiHandlerFactory, GoogleChatApiHandlerParams } from "./types.js";
|
|
3
|
+
import { GenerateContentApiHandler } from "./handlers/generate_content.js";
|
|
4
|
+
import "./handlers/index.js";
|
|
5
|
+
import { BaseChatGoogle } from "./base.js";
|
|
2
6
|
//#region src/chat_models/index.d.ts
|
|
3
7
|
/**
|
|
4
8
|
* Configuration parameters for the ChatGoogle model.
|
|
@@ -33,4 +37,5 @@ export declare class ChatGoogle extends BaseChatGoogle<ChatGoogleCallOptions> {
|
|
|
33
37
|
constructor(params: ChatGoogleParams);
|
|
34
38
|
}
|
|
35
39
|
//#endregion
|
|
40
|
+
export { BaseChatGoogle, type BaseChatGoogleCallOptions, type BaseChatGoogleFields, type BaseChatGoogleParams, type ChatGoogleFields, GenerateContentApiHandler, type GenerateContentApiHandlerParams, type GenerateContentFields, type GenerateContentInvocationParams, type GenerateContentSpecificFields, GoogleChatApiHandler, type GoogleChatApiHandlerConfig, type GoogleChatApiHandlerFactory, type GoogleChatApiHandlerParams };
|
|
36
41
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { WebApiClient } from "../clients/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { GoogleChatApiHandler } from "./handlers/base.js";
|
|
3
|
+
import { getGoogleChatModelParams } from "../converters/shared/params.js";
|
|
4
|
+
import { GenerateContentApiHandler } from "./handlers/generate_content.js";
|
|
5
|
+
import "./handlers/index.js";
|
|
6
|
+
import { BaseChatGoogle, applyGeminiGatewayParams } from "./base.js";
|
|
3
7
|
import { getEnvironmentVariable } from "@langchain/core/utils/env";
|
|
4
8
|
//#region src/chat_models/index.ts
|
|
5
9
|
var ChatGoogle = class extends BaseChatGoogle {
|
|
@@ -17,6 +21,6 @@ var ChatGoogle = class extends BaseChatGoogle {
|
|
|
17
21
|
}
|
|
18
22
|
};
|
|
19
23
|
//#endregion
|
|
20
|
-
export { ChatGoogle };
|
|
24
|
+
export { BaseChatGoogle, ChatGoogle, GenerateContentApiHandler, GoogleChatApiHandler };
|
|
21
25
|
|
|
22
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/chat_models/index.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { WebApiClient } from \"../clients/index.js\";\nimport {\n applyGeminiGatewayParams,\n BaseChatGoogle,\n BaseChatGoogleCallOptions,\n BaseChatGoogleParams,\n
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/chat_models/index.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { WebApiClient } from \"../clients/index.js\";\nimport {\n applyGeminiGatewayParams,\n BaseChatGoogle,\n BaseChatGoogleCallOptions,\n BaseChatGoogleParams,\n} from \"./base.js\";\nimport { getGoogleChatModelParams } from \"../converters/shared/params.js\";\n\n/**\n * Configuration parameters for the ChatGoogle model.\n *\n * This interface extends the base Google chat model parameters and adds\n * specific configuration options for the Generative AI API.\n */\nexport interface ChatGoogleParams extends BaseChatGoogleParams {\n /**\n * Google API key for authentication with the Generative AI API.\n *\n * If not provided, the model will attempt to use the `GOOGLE_API_KEY`\n * environment variable. You can obtain an API key from the\n * [Google AI Studio](https://makersuite.google.com/app/apikey).\n */\n apiKey?: string;\n\n /** @deprecated Import from `@langchain/google/node` to configure google auth options */\n authOptions?: never;\n}\n\n/**\n * Call options for the ChatGoogle model.\n *\n * This interface extends the base Google chat model call options and provides\n * configuration for individual model invocations. These options can be passed\n * when calling methods like `invoke()`, `stream()`, or `batch()` to customize\n * the behavior of a specific request.\n */\nexport interface ChatGoogleCallOptions extends BaseChatGoogleCallOptions {}\n\nexport class ChatGoogle extends BaseChatGoogle<ChatGoogleCallOptions> {\n apiKey?: string;\n\n constructor(model: string, params?: Omit<ChatGoogleParams, \"model\">);\n constructor(params: ChatGoogleParams);\n constructor(\n modelOrParams: string | ChatGoogleParams,\n paramsArg?: Omit<ChatGoogleParams, \"model\">\n ) {\n let params = getGoogleChatModelParams(modelOrParams, paramsArg);\n // Route through the LangSmith gateway (Gemini Developer API path) when\n // configured, before falling back to the provider API-key env var so the\n // gateway key can take precedence.\n params = applyGeminiGatewayParams(params);\n params.apiKey = params?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n const apiClient = params?.apiClient ?? new WebApiClient(params);\n super({ ...params, apiClient });\n\n this.apiKey = params.apiKey;\n }\n}\n\nexport {\n BaseChatGoogle,\n type BaseChatGoogleParams,\n type BaseChatGoogleCallOptions,\n} from \"./base.js\";\nexport * from \"./handlers/index.js\";\nexport type {\n GoogleChatApiHandlerParams,\n GenerateContentApiHandlerParams,\n GoogleChatApiHandlerFactory,\n GoogleChatApiHandlerConfig,\n GenerateContentInvocationParams,\n BaseChatGoogleFields,\n GenerateContentSpecificFields,\n GenerateContentFields,\n ChatGoogleFields,\n} from \"./types.js\";\n"],"mappings":";;;;;;;;AAwCA,IAAa,aAAb,cAAgC,eAAsC;CACpE;CAIA,YACE,eACA,WACA;EACA,IAAI,SAAS,yBAAyB,eAAe,SAAS;EAI9D,SAAS,yBAAyB,MAAM;EACxC,OAAO,SAAS,QAAQ,UAAU,uBAAuB,gBAAgB;EACzE,MAAM,YAAY,QAAQ,aAAa,IAAI,aAAa,MAAM;EAC9D,MAAM;GAAE,GAAG;GAAQ;EAAU,CAAC;EAE9B,KAAK,SAAS,OAAO;CACvB;AACF"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
const require_const = require("../const.cjs");
|
|
2
|
-
const require_params = require("../converters/params.cjs");
|
|
2
|
+
const require_params = require("../converters/shared/params.cjs");
|
|
3
3
|
const require_base = require("./base.cjs");
|
|
4
4
|
const require_node = require("../clients/node.cjs");
|
|
5
5
|
let _langchain_core_utils_env = require("@langchain/core/utils/env");
|
|
6
6
|
//#region src/chat_models/node.ts
|
|
7
7
|
var ChatGoogleNode = class extends require_base.BaseChatGoogle {
|
|
8
8
|
constructor(modelOrParams, paramsArg) {
|
|
9
|
-
let params =
|
|
9
|
+
let params = require_params.getGoogleChatModelParams(modelOrParams, paramsArg);
|
|
10
10
|
params = require_base.applyGeminiGatewayParams(params);
|
|
11
11
|
params.apiKey = params.apiKey ?? (0, _langchain_core_utils_env.getEnvironmentVariable)("GOOGLE_API_KEY");
|
|
12
12
|
const requiredScopes = getRequiredAuthScopes(params);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.cjs","names":["BaseChatGoogle","getGoogleChatModelParams","applyGeminiGatewayParams","getEnvironmentVariable","ensureAuthScopes","NodeApiClient","convertParamsToPlatformType","getPlatformType","GENERATIVE_AI_AUTH_SCOPES","VERTEX_AI_AUTH_SCOPES"],"sources":["../../src/chat_models/node.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { ChatGoogleParams } from \"./index.js\";\nimport {\n applyGeminiGatewayParams,\n BaseChatGoogle,\n
|
|
1
|
+
{"version":3,"file":"node.cjs","names":["BaseChatGoogle","getGoogleChatModelParams","applyGeminiGatewayParams","getEnvironmentVariable","ensureAuthScopes","NodeApiClient","convertParamsToPlatformType","getPlatformType","GENERATIVE_AI_AUTH_SCOPES","VERTEX_AI_AUTH_SCOPES"],"sources":["../../src/chat_models/node.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { ChatGoogleParams } from \"./index.js\";\nimport {\n applyGeminiGatewayParams,\n BaseChatGoogle,\n getPlatformType,\n} from \"./base.js\";\nimport {\n convertParamsToPlatformType,\n getGoogleChatModelParams,\n} from \"../converters/shared/params.js\";\nimport { GENERATIVE_AI_AUTH_SCOPES, VERTEX_AI_AUTH_SCOPES } from \"../const.js\";\nimport {\n ensureAuthScopes,\n NodeApiClient,\n NodeApiClientParams,\n} from \"../clients/node.js\";\n\ninterface ChatGoogleNodeParams extends NodeApiClientParams, ChatGoogleParams {}\n\nclass ChatGoogleNode extends BaseChatGoogle {\n constructor(model: string, params?: Omit<ChatGoogleNodeParams, \"model\">);\n constructor(params: ChatGoogleNodeParams);\n constructor(\n modelOrParams: string | ChatGoogleNodeParams,\n paramsArg?: Omit<ChatGoogleNodeParams, \"model\">\n ) {\n let params = getGoogleChatModelParams(modelOrParams, paramsArg);\n params = applyGeminiGatewayParams(params);\n params.apiKey = params.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n const requiredScopes: string[] = getRequiredAuthScopes(params);\n const usesImplicitGoogleAuth =\n !params.apiClient &&\n !params.apiKey &&\n !params.credentials &&\n !getEnvironmentVariable(\"GOOGLE_CLOUD_CREDENTIALS\");\n if (params.googleAuthOptions || usesImplicitGoogleAuth) {\n params.googleAuthOptions = ensureAuthScopes(\n params.googleAuthOptions ?? {},\n requiredScopes\n );\n }\n const apiClient = params?.apiClient ?? new NodeApiClient(params);\n super({ ...params, apiClient });\n }\n}\n\nfunction getRequiredAuthScopes(params: ChatGoogleNodeParams): string[] {\n const hasApiKey = typeof params.apiKey !== \"undefined\";\n const platformType = convertParamsToPlatformType(params);\n const platform = getPlatformType(platformType, hasApiKey);\n switch (platform) {\n case \"gai\":\n return GENERATIVE_AI_AUTH_SCOPES;\n case \"gcp\":\n return VERTEX_AI_AUTH_SCOPES;\n default:\n return VERTEX_AI_AUTH_SCOPES;\n }\n}\n\nexport {\n type ChatGoogleNodeParams as ChatGoogleParams,\n ChatGoogleNode as ChatGoogle,\n};\n"],"mappings":";;;;;;AAoBA,IAAM,iBAAN,cAA6BA,aAAAA,eAAe;CAG1C,YACE,eACA,WACA;EACA,IAAI,SAASC,eAAAA,yBAAyB,eAAe,SAAS;EAC9D,SAASC,aAAAA,yBAAyB,MAAM;EACxC,OAAO,SAAS,OAAO,WAAA,GAAUC,0BAAAA,uBAAAA,CAAuB,gBAAgB;EACxE,MAAM,iBAA2B,sBAAsB,MAAM;EAC7D,MAAM,yBACJ,CAAC,OAAO,aACR,CAAC,OAAO,UACR,CAAC,OAAO,eACR,EAAA,GAACA,0BAAAA,uBAAAA,CAAuB,0BAA0B;EACpD,IAAI,OAAO,qBAAqB,wBAC9B,OAAO,oBAAoBC,aAAAA,iBACzB,OAAO,qBAAqB,CAAC,GAC7B,cACF;EAEF,MAAM,YAAY,QAAQ,aAAa,IAAIC,aAAAA,cAAc,MAAM;EAC/D,MAAM;GAAE,GAAG;GAAQ;EAAU,CAAC;CAChC;AACF;AAEA,SAAS,sBAAsB,QAAwC;CACrE,MAAM,YAAY,OAAO,OAAO,WAAW;CAC3C,MAAM,eAAeC,eAAAA,4BAA4B,MAAM;CAEvD,QADiBC,aAAAA,gBAAgB,cAAc,SAChC,GAAf;EACE,KAAK,OACH,OAAOC,cAAAA;EACT,KAAK,OACH,OAAOC,cAAAA;EACT,SACE,OAAOA,cAAAA;CACX;AACF"}
|
package/dist/chat_models/node.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GENERATIVE_AI_AUTH_SCOPES, VERTEX_AI_AUTH_SCOPES } from "../const.js";
|
|
2
|
-
import { convertParamsToPlatformType } from "../converters/params.js";
|
|
3
|
-
import { BaseChatGoogle, applyGeminiGatewayParams,
|
|
2
|
+
import { convertParamsToPlatformType, getGoogleChatModelParams } from "../converters/shared/params.js";
|
|
3
|
+
import { BaseChatGoogle, applyGeminiGatewayParams, getPlatformType } from "./base.js";
|
|
4
4
|
import { NodeApiClient, ensureAuthScopes } from "../clients/node.js";
|
|
5
5
|
import { getEnvironmentVariable } from "@langchain/core/utils/env";
|
|
6
6
|
//#region src/chat_models/node.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","names":[],"sources":["../../src/chat_models/node.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { ChatGoogleParams } from \"./index.js\";\nimport {\n applyGeminiGatewayParams,\n BaseChatGoogle,\n
|
|
1
|
+
{"version":3,"file":"node.js","names":[],"sources":["../../src/chat_models/node.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { ChatGoogleParams } from \"./index.js\";\nimport {\n applyGeminiGatewayParams,\n BaseChatGoogle,\n getPlatformType,\n} from \"./base.js\";\nimport {\n convertParamsToPlatformType,\n getGoogleChatModelParams,\n} from \"../converters/shared/params.js\";\nimport { GENERATIVE_AI_AUTH_SCOPES, VERTEX_AI_AUTH_SCOPES } from \"../const.js\";\nimport {\n ensureAuthScopes,\n NodeApiClient,\n NodeApiClientParams,\n} from \"../clients/node.js\";\n\ninterface ChatGoogleNodeParams extends NodeApiClientParams, ChatGoogleParams {}\n\nclass ChatGoogleNode extends BaseChatGoogle {\n constructor(model: string, params?: Omit<ChatGoogleNodeParams, \"model\">);\n constructor(params: ChatGoogleNodeParams);\n constructor(\n modelOrParams: string | ChatGoogleNodeParams,\n paramsArg?: Omit<ChatGoogleNodeParams, \"model\">\n ) {\n let params = getGoogleChatModelParams(modelOrParams, paramsArg);\n params = applyGeminiGatewayParams(params);\n params.apiKey = params.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n const requiredScopes: string[] = getRequiredAuthScopes(params);\n const usesImplicitGoogleAuth =\n !params.apiClient &&\n !params.apiKey &&\n !params.credentials &&\n !getEnvironmentVariable(\"GOOGLE_CLOUD_CREDENTIALS\");\n if (params.googleAuthOptions || usesImplicitGoogleAuth) {\n params.googleAuthOptions = ensureAuthScopes(\n params.googleAuthOptions ?? {},\n requiredScopes\n );\n }\n const apiClient = params?.apiClient ?? new NodeApiClient(params);\n super({ ...params, apiClient });\n }\n}\n\nfunction getRequiredAuthScopes(params: ChatGoogleNodeParams): string[] {\n const hasApiKey = typeof params.apiKey !== \"undefined\";\n const platformType = convertParamsToPlatformType(params);\n const platform = getPlatformType(platformType, hasApiKey);\n switch (platform) {\n case \"gai\":\n return GENERATIVE_AI_AUTH_SCOPES;\n case \"gcp\":\n return VERTEX_AI_AUTH_SCOPES;\n default:\n return VERTEX_AI_AUTH_SCOPES;\n }\n}\n\nexport {\n type ChatGoogleNodeParams as ChatGoogleParams,\n ChatGoogleNode as ChatGoogle,\n};\n"],"mappings":";;;;;;AAoBA,IAAM,iBAAN,cAA6B,eAAe;CAG1C,YACE,eACA,WACA;EACA,IAAI,SAAS,yBAAyB,eAAe,SAAS;EAC9D,SAAS,yBAAyB,MAAM;EACxC,OAAO,SAAS,OAAO,UAAU,uBAAuB,gBAAgB;EACxE,MAAM,iBAA2B,sBAAsB,MAAM;EAC7D,MAAM,yBACJ,CAAC,OAAO,aACR,CAAC,OAAO,UACR,CAAC,OAAO,eACR,CAAC,uBAAuB,0BAA0B;EACpD,IAAI,OAAO,qBAAqB,wBAC9B,OAAO,oBAAoB,iBACzB,OAAO,qBAAqB,CAAC,GAC7B,cACF;EAEF,MAAM,YAAY,QAAQ,aAAa,IAAI,cAAc,MAAM;EAC/D,MAAM;GAAE,GAAG;GAAQ;EAAU,CAAC;CAChC;AACF;AAEA,SAAS,sBAAsB,QAAwC;CACrE,MAAM,YAAY,OAAO,OAAO,WAAW;CAC3C,MAAM,eAAe,4BAA4B,MAAM;CAEvD,QADiB,gBAAgB,cAAc,SAChC,GAAf;EACE,KAAK,OACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,SACE,OAAO;CACX;AACF"}
|