@langchain/google 0.2.11 → 0.2.13
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 +29 -0
- package/dist/chat_models/{api-types.d.ts → api_types/generate_content.d.cts} +198 -200
- package/dist/chat_models/{api-types.d.cts → api_types/generate_content.d.ts} +198 -200
- package/dist/chat_models/api_types/interactions.d.cts +1423 -0
- package/dist/chat_models/api_types/interactions.d.ts +1423 -0
- package/dist/chat_models/base.cjs +60 -403
- package/dist/chat_models/base.cjs.map +1 -1
- package/dist/chat_models/base.d.cts +13 -200
- package/dist/chat_models/base.d.ts +15 -202
- package/dist/chat_models/base.js +61 -402
- package/dist/chat_models/base.js.map +1 -1
- package/dist/chat_models/handlers/base.cjs +62 -0
- package/dist/chat_models/handlers/base.cjs.map +1 -0
- package/dist/chat_models/handlers/base.d.cts +46 -0
- package/dist/chat_models/handlers/base.d.ts +46 -0
- package/dist/chat_models/handlers/base.js +62 -0
- package/dist/chat_models/handlers/base.js.map +1 -0
- package/dist/chat_models/handlers/generate_content.cjs +344 -0
- package/dist/chat_models/handlers/generate_content.cjs.map +1 -0
- package/dist/chat_models/handlers/generate_content.d.cts +32 -0
- package/dist/chat_models/handlers/generate_content.d.ts +32 -0
- package/dist/chat_models/handlers/generate_content.js +344 -0
- package/dist/chat_models/handlers/generate_content.js.map +1 -0
- package/dist/chat_models/handlers/index.cjs +6 -0
- package/dist/chat_models/handlers/index.d.cts +4 -0
- package/dist/chat_models/handlers/index.d.ts +4 -0
- package/dist/chat_models/handlers/index.js +4 -0
- package/dist/chat_models/handlers/interactions.cjs +303 -0
- package/dist/chat_models/handlers/interactions.cjs.map +1 -0
- package/dist/chat_models/handlers/interactions.d.cts +33 -0
- package/dist/chat_models/handlers/interactions.d.ts +33 -0
- package/dist/chat_models/handlers/interactions.js +303 -0
- package/dist/chat_models/handlers/interactions.js.map +1 -0
- package/dist/chat_models/index.cjs +14 -6
- package/dist/chat_models/index.cjs.map +1 -1
- package/dist/chat_models/index.d.cts +7 -3
- package/dist/chat_models/index.d.ts +7 -3
- package/dist/chat_models/index.js +8 -4
- package/dist/chat_models/index.js.map +1 -1
- package/dist/chat_models/node.cjs +4 -5
- package/dist/chat_models/node.cjs.map +1 -1
- package/dist/chat_models/node.d.cts +1 -3
- package/dist/chat_models/node.d.ts +1 -3
- package/dist/chat_models/node.js +3 -4
- package/dist/chat_models/node.js.map +1 -1
- package/dist/chat_models/profiles.cjs +1 -2
- package/dist/chat_models/profiles.js +1 -2
- package/dist/chat_models/types.cjs +1 -2
- package/dist/chat_models/types.cjs.map +1 -1
- package/dist/chat_models/types.d.cts +776 -88
- package/dist/chat_models/types.d.ts +776 -88
- package/dist/chat_models/types.js +1 -2
- package/dist/chat_models/types.js.map +1 -1
- package/dist/clients/index.cjs +3 -4
- package/dist/clients/index.d.cts +0 -2
- package/dist/clients/index.d.ts +0 -2
- package/dist/clients/index.js +3 -4
- package/dist/clients/node.cjs +4 -5
- package/dist/clients/node.d.cts +0 -2
- package/dist/clients/node.d.ts +0 -2
- package/dist/clients/node.js +4 -5
- package/dist/const.cjs +1 -2
- package/dist/const.js +1 -2
- package/dist/converters/{messages.cjs → generate_content/messages.cjs} +4 -5
- package/dist/converters/generate_content/messages.cjs.map +1 -0
- package/dist/converters/{messages.js → generate_content/messages.js} +4 -5
- package/dist/converters/generate_content/messages.js.map +1 -0
- package/dist/converters/generate_content/params.cjs +135 -0
- package/dist/converters/generate_content/params.cjs.map +1 -0
- package/dist/converters/generate_content/params.js +131 -0
- package/dist/converters/generate_content/params.js.map +1 -0
- package/dist/{utils → converters/generate_content}/stream_events.cjs +2 -3
- package/dist/converters/generate_content/stream_events.cjs.map +1 -0
- package/dist/{utils → converters/generate_content}/stream_events.js +2 -3
- package/dist/converters/generate_content/stream_events.js.map +1 -0
- package/dist/converters/{tools.cjs → generate_content/tools.cjs} +4 -5
- package/dist/converters/generate_content/tools.cjs.map +1 -0
- package/dist/converters/{tools.js → generate_content/tools.js} +4 -5
- package/dist/converters/generate_content/tools.js.map +1 -0
- package/dist/converters/interactions/messages.cjs +766 -0
- package/dist/converters/interactions/messages.cjs.map +1 -0
- package/dist/converters/interactions/messages.js +759 -0
- package/dist/converters/interactions/messages.js.map +1 -0
- package/dist/converters/interactions/params.cjs +244 -0
- package/dist/converters/interactions/params.cjs.map +1 -0
- package/dist/converters/interactions/params.js +237 -0
- package/dist/converters/interactions/params.js.map +1 -0
- package/dist/converters/interactions/stream_events.cjs +769 -0
- package/dist/converters/interactions/stream_events.cjs.map +1 -0
- package/dist/converters/interactions/stream_events.js +768 -0
- package/dist/converters/interactions/stream_events.js.map +1 -0
- package/dist/converters/interactions/tools.cjs +229 -0
- package/dist/converters/interactions/tools.cjs.map +1 -0
- package/dist/converters/interactions/tools.js +228 -0
- package/dist/converters/interactions/tools.js.map +1 -0
- package/dist/converters/{params.cjs → shared/params.cjs} +8 -94
- package/dist/converters/shared/params.cjs.map +1 -0
- package/dist/converters/{params.js → shared/params.js} +8 -92
- package/dist/converters/shared/params.js.map +1 -0
- package/dist/index.cjs +8 -0
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +5 -1
- package/dist/node.cjs +1 -1
- package/dist/node.d.cts +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +1 -1
- package/dist/utils/errors.cjs +1 -2
- package/dist/utils/errors.js +1 -2
- package/dist/utils/gcp-auth.cjs +3 -4
- package/dist/utils/gcp-auth.d.cts +0 -2
- package/dist/utils/gcp-auth.d.ts +0 -2
- package/dist/utils/gcp-auth.js +3 -4
- package/dist/utils/handler.cjs +1 -2
- package/dist/utils/handler.d.cts +0 -2
- package/dist/utils/handler.d.ts +0 -2
- package/dist/utils/handler.js +1 -2
- package/dist/utils/metadata.cjs +9 -2
- package/dist/utils/metadata.cjs.map +1 -1
- package/dist/utils/metadata.js +9 -3
- package/dist/utils/metadata.js.map +1 -1
- package/dist/utils/misc.cjs +1 -2
- package/dist/utils/misc.cjs.map +1 -1
- package/dist/utils/misc.d.cts +2 -3
- package/dist/utils/misc.d.ts +2 -3
- package/dist/utils/misc.js +1 -2
- package/dist/utils/misc.js.map +1 -1
- package/dist/utils/stream.cjs +1 -2
- package/dist/utils/stream.js +1 -2
- package/package.json +12 -10
- 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,344 @@
|
|
|
1
|
+
const require_base = require("./base.cjs");
|
|
2
|
+
const require_stream = require("../../utils/stream.cjs");
|
|
3
|
+
const require_metadata = require("../../utils/metadata.cjs");
|
|
4
|
+
const require_misc = require("../../utils/misc.cjs");
|
|
5
|
+
const require_errors = require("../../utils/errors.cjs");
|
|
6
|
+
const require_messages = require("../../converters/generate_content/messages.cjs");
|
|
7
|
+
const require_tools = require("../../converters/generate_content/tools.cjs");
|
|
8
|
+
const require_params = require("../../converters/generate_content/params.cjs");
|
|
9
|
+
const require_stream_events = require("../../converters/generate_content/stream_events.cjs");
|
|
10
|
+
const require_types = require("../types.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
|
+
// 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
|
+
exports.GenerateContentApiHandler = GenerateContentApiHandler;
|
|
343
|
+
|
|
344
|
+
//# 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,32 @@
|
|
|
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
|
+
/**
|
|
11
|
+
* Concrete wire protocol handler for Google's Generate Content API
|
|
12
|
+
* (`/v1beta/models/{model}:generateContent` and `:streamGenerateContent`).
|
|
13
|
+
*/
|
|
14
|
+
export declare class GenerateContentApiHandler extends GoogleChatApiHandler<GenerateContentInvocationParams, GenerateContentApiHandlerParams> {
|
|
15
|
+
constructor(params: GenerateContentApiHandlerParams);
|
|
16
|
+
protected get urlMethod(): string;
|
|
17
|
+
protected getUrlSuffix(urlMethod?: string): string;
|
|
18
|
+
getHeaders(options?: BaseChatGoogleCallOptions): Record<string, string>;
|
|
19
|
+
generate(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, runManager?: CallbackManagerForLLMRun): Promise<ChatResult>;
|
|
20
|
+
streamResponseChunks(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
|
|
21
|
+
streamChatModelEvents(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, _runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatModelStreamEvent>;
|
|
22
|
+
invocationParams(options?: BaseChatGoogleCallOptions): GenerateContentInvocationParams;
|
|
23
|
+
formatStructuredOutputTool(schema: InteropZodType | SerializableSchema | Record<string, unknown>, options?: {
|
|
24
|
+
name?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
}): {
|
|
27
|
+
tools: BindToolsInput[];
|
|
28
|
+
toolChoice: string;
|
|
29
|
+
functionName: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=generate_content.d.cts.map
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
/**
|
|
11
|
+
* Concrete wire protocol handler for Google's Generate Content API
|
|
12
|
+
* (`/v1beta/models/{model}:generateContent` and `:streamGenerateContent`).
|
|
13
|
+
*/
|
|
14
|
+
export declare class GenerateContentApiHandler extends GoogleChatApiHandler<GenerateContentInvocationParams, GenerateContentApiHandlerParams> {
|
|
15
|
+
constructor(params: GenerateContentApiHandlerParams);
|
|
16
|
+
protected get urlMethod(): string;
|
|
17
|
+
protected getUrlSuffix(urlMethod?: string): string;
|
|
18
|
+
getHeaders(options?: BaseChatGoogleCallOptions): Record<string, string>;
|
|
19
|
+
generate(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, runManager?: CallbackManagerForLLMRun): Promise<ChatResult>;
|
|
20
|
+
streamResponseChunks(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
|
|
21
|
+
streamChatModelEvents(messages: BaseMessage[], options?: BaseChatGoogleCallOptions, _runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatModelStreamEvent>;
|
|
22
|
+
invocationParams(options?: BaseChatGoogleCallOptions): GenerateContentInvocationParams;
|
|
23
|
+
formatStructuredOutputTool(schema: InteropZodType | SerializableSchema | Record<string, unknown>, options?: {
|
|
24
|
+
name?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
}): {
|
|
27
|
+
tools: BindToolsInput[];
|
|
28
|
+
toolChoice: string;
|
|
29
|
+
functionName: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=generate_content.d.ts.map
|