@ai-sdk/google 4.0.94 → 4.0.95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/index.d.ts +20 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +173 -15
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +6 -3
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +172 -14
- package/dist/internal/index.js.map +1 -1
- package/docs/15-google.mdx +137 -0
- package/package.json +1 -1
- package/src/continue-google-stream.ts +75 -0
- package/src/convert-google-usage.ts +76 -0
- package/src/google-language-model-options.ts +12 -0
- package/src/google-language-model.ts +146 -24
- package/src/google-prompt.ts +18 -0
- package/src/interactions/google-interactions-language-model-options.ts +1 -0
- package/src/interactions/google-interactions-language-model.ts +6 -6
- package/src/map-google-finish-reason.ts +3 -0
package/dist/internal/index.d.ts
CHANGED
|
@@ -81,7 +81,7 @@ type GoogleFunctionResponsePart = {
|
|
|
81
81
|
};
|
|
82
82
|
//#endregion
|
|
83
83
|
//#region src/google-language-model-options.d.ts
|
|
84
|
-
type GoogleModelId = 'gemini-2.0-flash' | 'gemini-2.0-flash-001' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-001' | 'gemini-2.5-pro' | 'gemini-2.5-flash' | 'gemini-2.5-flash-image' | 'gemini-2.5-flash-lite' | 'gemini-2.5-flash-preview-tts' | 'gemini-2.5-pro-preview-tts' | 'gemini-2.5-flash-native-audio-latest' | 'gemini-2.5-flash-native-audio-preview-09-2025' | 'gemini-2.5-flash-native-audio-preview-12-2025' | 'gemini-2.5-computer-use-preview-10-2025' | 'gemini-3-pro-preview' | 'gemini-3-pro-image-preview' | 'gemini-3-flash-preview' | 'gemini-3.1-pro-preview' | 'gemini-3.1-pro-preview-customtools' | 'gemini-3.1-flash-image-preview' | 'gemini-3.1-flash-lite-preview' | 'gemini-3.1-flash-tts-preview' | 'gemini-3.5-flash' | 'gemini-3.5-flash-lite' | 'gemini-3.6-flash' | 'gemini-3.7-flash' | 'gemini-3.8-flash' | 'gemini-nano-banana-2.1' | 'gemini-pro-latest' | 'gemini-flash-latest' | 'gemini-flash-lite-latest' | 'deep-research-pro-preview-12-2025' | 'deep-research-max-preview-04-2026' | 'deep-research-preview-04-2026' | 'nano-banana-pro-preview' | 'aqa' | 'gemini-robotics-er-1.5-preview' | 'gemma-3-1b-it' | 'gemma-3-4b-it' | 'gemma-3n-e4b-it' | 'gemma-3n-e2b-it' | 'gemma-3-12b-it' | 'gemma-3-27b-it' | (string & {});
|
|
84
|
+
type GoogleModelId = 'gemini-2.0-flash' | 'gemini-2.0-flash-001' | 'gemini-2.0-flash-lite' | 'gemini-2.0-flash-lite-001' | 'gemini-2.5-pro' | 'gemini-2.5-flash' | 'gemini-2.5-flash-image' | 'gemini-2.5-flash-lite' | 'gemini-2.5-flash-preview-tts' | 'gemini-2.5-pro-preview-tts' | 'gemini-2.5-flash-native-audio-latest' | 'gemini-2.5-flash-native-audio-preview-09-2025' | 'gemini-2.5-flash-native-audio-preview-12-2025' | 'gemini-2.5-computer-use-preview-10-2025' | 'gemini-3-pro-preview' | 'gemini-3-pro-image-preview' | 'gemini-3-flash-preview' | 'gemini-3.1-pro-preview' | 'gemini-3.1-pro-preview-customtools' | 'gemini-3.1-flash-image-preview' | 'gemini-3.1-flash-lite-preview' | 'gemini-3.1-flash-tts-preview' | 'gemini-3.5-flash' | 'gemini-3.5-flash-lite' | 'gemini-3.6-flash' | 'gemini-3.7-flash' | 'gemini-3.8-flash' | 'gemini-4-argon' | 'gemini-nano-banana-2.1' | 'gemini-pro-latest' | 'gemini-flash-latest' | 'gemini-flash-lite-latest' | 'deep-research-pro-preview-12-2025' | 'deep-research-max-preview-04-2026' | 'deep-research-preview-04-2026' | 'nano-banana-pro-preview' | 'aqa' | 'gemini-robotics-er-1.5-preview' | 'gemma-3-1b-it' | 'gemma-3-4b-it' | 'gemma-3n-e4b-it' | 'gemma-3n-e2b-it' | 'gemma-3-12b-it' | 'gemma-3-27b-it' | (string & {});
|
|
85
85
|
//#endregion
|
|
86
86
|
//#region src/google-language-model.d.ts
|
|
87
87
|
export type GoogleLanguageModelConfig = {
|
|
@@ -125,6 +125,7 @@ export declare class GoogleLanguageModel implements LanguageModelV4 {
|
|
|
125
125
|
isStreaming?: boolean;
|
|
126
126
|
}): Promise<{
|
|
127
127
|
args: {
|
|
128
|
+
continuationToken?: string | undefined;
|
|
128
129
|
generationConfig: {
|
|
129
130
|
imageConfig?: {
|
|
130
131
|
aspectRatio?: "1:1" | "2:3" | "3:2" | "3:4" | "4:3" | "4:5" | "5:4" | "9:16" | "16:9" | "21:9" | "1:8" | "8:1" | "1:4" | "4:1" | undefined;
|
|
@@ -196,13 +197,14 @@ export declare class GoogleLanguageModel implements LanguageModelV4 {
|
|
|
196
197
|
toolNameMapping: import("@ai-sdk/provider-utils").ToolNameMapping;
|
|
197
198
|
}>;
|
|
198
199
|
private getArgs;
|
|
199
|
-
static convertGenerateContentResponse({ config, response, warnings, providerOptionsNames, toolNameMapping, jsonResponseToolName }: {
|
|
200
|
+
static convertGenerateContentResponse({ config, response, warnings, providerOptionsNames, toolNameMapping, jsonResponseToolName, initialPromptTokenCount }: {
|
|
200
201
|
config: GoogleLanguageModelConfig;
|
|
201
202
|
response: InferSchema<typeof responseSchema>;
|
|
202
203
|
warnings: SharedV4Warning[];
|
|
203
204
|
providerOptionsNames: readonly string[];
|
|
204
205
|
toolNameMapping?: ReturnType<typeof createToolNameMapping>;
|
|
205
206
|
jsonResponseToolName?: string;
|
|
207
|
+
initialPromptTokenCount?: number | null;
|
|
206
208
|
}): LanguageModelV4GenerateResult;
|
|
207
209
|
doGenerate(options: LanguageModelV4CallOptions): Promise<LanguageModelV4GenerateResult>;
|
|
208
210
|
doStream(options: LanguageModelV4CallOptions): Promise<LanguageModelV4StreamResult>;
|
|
@@ -325,6 +327,7 @@ export declare const responseSchema: import("@ai-sdk/provider-utils").LazySchema
|
|
|
325
327
|
} | null | undefined;
|
|
326
328
|
finishReason?: string | null | undefined;
|
|
327
329
|
finishMessage?: string | null | undefined;
|
|
330
|
+
continuationToken?: string | null | undefined;
|
|
328
331
|
safetyRatings?: {
|
|
329
332
|
category?: string | null | undefined;
|
|
330
333
|
probability?: string | null | undefined;
|
|
@@ -585,7 +588,7 @@ export declare const googleTools: {
|
|
|
585
588
|
* the two surfaces (`:generateContent` vs `/interactions`) are independent and
|
|
586
589
|
* may diverge over time.
|
|
587
590
|
*/
|
|
588
|
-
type GoogleInteractionsModelId = 'gemini-2.5-computer-use-preview-10-2025' | 'gemini-2.5-flash' | 'gemini-2.5-flash-image' | 'gemini-2.5-flash-lite' | 'gemini-2.5-flash-lite-preview-09-2025' | 'gemini-2.5-flash-native-audio-preview-12-2025' | 'gemini-2.5-flash-preview-09-2025' | 'gemini-2.5-flash-preview-tts' | 'gemini-2.5-pro' | 'gemini-2.5-pro-preview-tts' | 'gemini-3-flash-preview' | 'gemini-3-pro-image-preview' | 'gemini-3-pro-preview' | 'gemini-3.1-pro-preview' | 'gemini-3.1-flash-image-preview' | 'gemini-3.1-flash-lite-preview' | 'gemini-3.1-flash-tts-preview' | 'gemini-3.5-flash' | 'gemini-3.5-flash-lite' | 'gemini-3.6-flash' | 'gemini-3.7-flash' | 'gemini-3.8-flash' | 'gemini-nano-banana-2.1' | 'lyria-3-clip-preview' | 'lyria-3-pro-preview' | (string & {});
|
|
591
|
+
type GoogleInteractionsModelId = 'gemini-2.5-computer-use-preview-10-2025' | 'gemini-2.5-flash' | 'gemini-2.5-flash-image' | 'gemini-2.5-flash-lite' | 'gemini-2.5-flash-lite-preview-09-2025' | 'gemini-2.5-flash-native-audio-preview-12-2025' | 'gemini-2.5-flash-preview-09-2025' | 'gemini-2.5-flash-preview-tts' | 'gemini-2.5-pro' | 'gemini-2.5-pro-preview-tts' | 'gemini-3-flash-preview' | 'gemini-3-pro-image-preview' | 'gemini-3-pro-preview' | 'gemini-3.1-pro-preview' | 'gemini-3.1-flash-image-preview' | 'gemini-3.1-flash-lite-preview' | 'gemini-3.1-flash-tts-preview' | 'gemini-3.5-flash' | 'gemini-3.5-flash-lite' | 'gemini-3.6-flash' | 'gemini-3.7-flash' | 'gemini-3.8-flash' | 'gemini-4-argon' | 'gemini-nano-banana-2.1' | 'lyria-3-clip-preview' | 'lyria-3-pro-preview' | (string & {});
|
|
589
592
|
//#endregion
|
|
590
593
|
//#region src/interactions/google-interactions-language-model.d.ts
|
|
591
594
|
type GoogleInteractionsConfig = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["_$__google_prompt0.GoogleContent","_$__google_prompt0.GoogleSystemInstruction"],"sources":["../../src/google-prompt.ts","../../src/google-language-model-options.ts","../../src/google-language-model.ts","../../src/google-speech-model-options.ts","../../src/google-speech-model.ts","../../src/google-speech-input.ts","../../src/google-tools.ts","../../src/interactions/google-interactions-language-model-options.ts","../../src/interactions/google-interactions-language-model.ts","../../src/interactions/google-interactions-agent.ts"],"mappings":";;;;KAaY;EACV,OAAO;IAAQ;;;KAGL;EACV;EACA,OAAO,MAAM;;KAGH;EACN;EAAc;EAAmB;;EAEjC;IAAc;IAAkB;;EAChC;EACA;;EAGA;IAAgB;IAAa;IAAc;;EAC3C;;EAGA;IACE;IACA;IACA;IACA,QAAQ,MAAM;;;EAIhB;IAAY;IAAkB;;EAC9B;EACA;;EAGA;IACE;IACA;IACA;;EAEF;;EAGA;IACE;IACA;IACA;;EAEF;;EAGA;IACE;IACA;;;EAIF;IACE;IACA;;;KAII;EAEN;IAAc;IAAkB;;;EAGhC;IAAY;IAAkB;;;;;KCzExB;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["_$__google_prompt0.GoogleContent","_$__google_prompt0.GoogleSystemInstruction"],"sources":["../../src/google-prompt.ts","../../src/google-language-model-options.ts","../../src/google-language-model.ts","../../src/google-speech-model-options.ts","../../src/google-speech-model.ts","../../src/google-speech-input.ts","../../src/google-tools.ts","../../src/interactions/google-interactions-language-model-options.ts","../../src/interactions/google-interactions-language-model.ts","../../src/interactions/google-interactions-agent.ts"],"mappings":"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"}
|
package/dist/internal/index.js
CHANGED
|
@@ -1,6 +1,58 @@
|
|
|
1
1
|
import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, convertBase64ToUint8Array, convertJsonResponseToolStream, convertToBase64, createEventSourceResponseHandler, createJsonErrorResponseHandler, createJsonResponseHandler, createNullLanguageModelUsage, createProviderExecutedToolFactory, createProviderStreamError, createToolNameMapping, delay, detectMediaType, downloadBlob, generateId, getFromApi, getRuntimeEnvironmentUserAgent, getTopLevelMediaType, isAbortError, isCustomReasoning, isFullMediaType, isUrlSupported, lazySchema, mapReasoningToProviderBudget, mapReasoningToProviderEffort, parseProviderOptions, postJsonToApi, resolve, resolveFullMediaType, resolveProviderReference, secureJsonParse, serializeModelOptions, withUserAgentSuffix, zodSchema } from "@ai-sdk/provider-utils";
|
|
2
2
|
import { z } from "zod/v4";
|
|
3
3
|
import { InvalidArgumentError, UnsupportedFunctionalityError } from "@ai-sdk/provider";
|
|
4
|
+
//#region src/continue-google-stream.ts
|
|
5
|
+
/**
|
|
6
|
+
* Concatenates the event streams of a long decode response that spans several
|
|
7
|
+
* requests (Gemini 4 long decode).
|
|
8
|
+
*
|
|
9
|
+
* Events of the current stream are passed through unchanged. When an event
|
|
10
|
+
* signals that the per-request cap was reached while budget remains
|
|
11
|
+
* (`getContinuationToken` returns a token), the next request is sent with that
|
|
12
|
+
* token once the current stream ends, and its events are appended. If the
|
|
13
|
+
* continuation request fails, the error is emitted as a failed parse result
|
|
14
|
+
* and the stream ends.
|
|
15
|
+
*/
|
|
16
|
+
function continueGoogleStream({ stream, getContinuationToken, continueStream }) {
|
|
17
|
+
let reader = stream.getReader();
|
|
18
|
+
let pendingContinuationToken;
|
|
19
|
+
return new ReadableStream({
|
|
20
|
+
async pull(controller) {
|
|
21
|
+
while (true) {
|
|
22
|
+
const { done, value } = await reader.read();
|
|
23
|
+
if (!done) {
|
|
24
|
+
if (value.success) {
|
|
25
|
+
const token = getContinuationToken(value.value);
|
|
26
|
+
if (token != null) pendingContinuationToken = token;
|
|
27
|
+
}
|
|
28
|
+
controller.enqueue(value);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (pendingContinuationToken == null) {
|
|
32
|
+
controller.close();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const continuationToken = pendingContinuationToken;
|
|
36
|
+
pendingContinuationToken = void 0;
|
|
37
|
+
try {
|
|
38
|
+
reader = (await continueStream(continuationToken)).getReader();
|
|
39
|
+
} catch (error) {
|
|
40
|
+
controller.enqueue({
|
|
41
|
+
success: false,
|
|
42
|
+
error,
|
|
43
|
+
rawValue: void 0
|
|
44
|
+
});
|
|
45
|
+
controller.close();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
async cancel(reason) {
|
|
51
|
+
await reader.cancel(reason);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
4
56
|
//#region src/convert-google-usage.ts
|
|
5
57
|
function convertGoogleUsage(usage) {
|
|
6
58
|
if (usage == null) return createNullLanguageModelUsage();
|
|
@@ -25,6 +77,40 @@ function convertGoogleUsage(usage) {
|
|
|
25
77
|
raw: usage
|
|
26
78
|
};
|
|
27
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Sums the usage metadata of two requests, e.g. the hops of a long decode
|
|
82
|
+
* response that was continued automatically. Non-numeric fields are taken
|
|
83
|
+
* from the later request.
|
|
84
|
+
*/
|
|
85
|
+
function addGoogleUsageMetadata(a, b) {
|
|
86
|
+
if (a == null || b == null) return b ?? a;
|
|
87
|
+
return {
|
|
88
|
+
...a,
|
|
89
|
+
...b,
|
|
90
|
+
promptTokenCount: addCounts(a.promptTokenCount, b.promptTokenCount),
|
|
91
|
+
candidatesTokenCount: addCounts(a.candidatesTokenCount, b.candidatesTokenCount),
|
|
92
|
+
toolUsePromptTokenCount: addCounts(a.toolUsePromptTokenCount, b.toolUsePromptTokenCount),
|
|
93
|
+
totalTokenCount: addCounts(a.totalTokenCount, b.totalTokenCount),
|
|
94
|
+
cachedContentTokenCount: addCounts(a.cachedContentTokenCount, b.cachedContentTokenCount),
|
|
95
|
+
thoughtsTokenCount: addCounts(a.thoughtsTokenCount, b.thoughtsTokenCount),
|
|
96
|
+
promptTokensDetails: addTokenDetails(a.promptTokensDetails, b.promptTokensDetails),
|
|
97
|
+
cacheTokensDetails: addTokenDetails(a.cacheTokensDetails, b.cacheTokensDetails),
|
|
98
|
+
candidatesTokensDetails: addTokenDetails(a.candidatesTokensDetails, b.candidatesTokensDetails),
|
|
99
|
+
toolUsePromptTokensDetails: addTokenDetails(a.toolUsePromptTokensDetails, b.toolUsePromptTokensDetails)
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function addCounts(a, b) {
|
|
103
|
+
return a == null && b == null ? b ?? a : (a ?? 0) + (b ?? 0);
|
|
104
|
+
}
|
|
105
|
+
function addTokenDetails(a, b) {
|
|
106
|
+
if (a == null || b == null) return b ?? a;
|
|
107
|
+
const tokenCounts = /* @__PURE__ */ new Map();
|
|
108
|
+
for (const { modality, tokenCount } of [...a, ...b]) tokenCounts.set(modality, (tokenCounts.get(modality) ?? 0) + tokenCount);
|
|
109
|
+
return Array.from(tokenCounts, ([modality, tokenCount]) => ({
|
|
110
|
+
modality,
|
|
111
|
+
tokenCount
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
28
114
|
//#endregion
|
|
29
115
|
//#region src/tool/code-execution.ts
|
|
30
116
|
const codeExecutionInputSchema = z.object({
|
|
@@ -698,6 +784,16 @@ const googleLanguageModelOptions = lazySchema(() => zodSchema(z.object({
|
|
|
698
784
|
"priority"
|
|
699
785
|
]).optional(),
|
|
700
786
|
/**
|
|
787
|
+
* Optional. Resumes a response that stopped with `MAX_TOKENS` because it
|
|
788
|
+
* used up its `maxOutputTokens` budget (Gemini 4 long decode). Pass the
|
|
789
|
+
* `continuationToken` from the previous response's provider metadata
|
|
790
|
+
* together with the original prompt and a higher `maxOutputTokens` (the
|
|
791
|
+
* budget is cumulative across requests). Requests that reach the
|
|
792
|
+
* per-request cap while budget remains (`CONTINUATION`) are continued
|
|
793
|
+
* automatically. Sent as the `continuationToken` body field.
|
|
794
|
+
*/
|
|
795
|
+
continuationToken: z.string().optional(),
|
|
796
|
+
/**
|
|
701
797
|
* Optional. Vertex AI only. Sent as the
|
|
702
798
|
* `X-Vertex-AI-LLM-Shared-Request-Type` request header to select a
|
|
703
799
|
* shared (PayGo) tier. With Provisioned Throughput allocated and
|
|
@@ -1177,7 +1273,8 @@ function resolvePartialArgValue(arg) {
|
|
|
1177
1273
|
function mapGoogleFinishReason({ finishReason, hasToolCalls }) {
|
|
1178
1274
|
switch (finishReason) {
|
|
1179
1275
|
case "STOP": return hasToolCalls ? "tool-calls" : "stop";
|
|
1180
|
-
case "MAX_TOKENS":
|
|
1276
|
+
case "MAX_TOKENS":
|
|
1277
|
+
case "CONTINUATION": return "length";
|
|
1181
1278
|
case "IMAGE_SAFETY":
|
|
1182
1279
|
case "RECITATION":
|
|
1183
1280
|
case "SAFETY":
|
|
@@ -1365,7 +1462,8 @@ var GoogleLanguageModel = class GoogleLanguageModel {
|
|
|
1365
1462
|
toolConfig,
|
|
1366
1463
|
cachedContent: googleOptions?.cachedContent,
|
|
1367
1464
|
labels: googleOptions?.labels,
|
|
1368
|
-
serviceTier: bodyServiceTier
|
|
1465
|
+
serviceTier: bodyServiceTier,
|
|
1466
|
+
...googleOptions?.continuationToken != null && { continuationToken: googleOptions.continuationToken }
|
|
1369
1467
|
},
|
|
1370
1468
|
warnings: [...warnings, ...toolWarnings],
|
|
1371
1469
|
providerOptionsNames,
|
|
@@ -1404,7 +1502,7 @@ var GoogleLanguageModel = class GoogleLanguageModel {
|
|
|
1404
1502
|
jsonResponseToolName: jsonResponseTool?.name
|
|
1405
1503
|
};
|
|
1406
1504
|
}
|
|
1407
|
-
static convertGenerateContentResponse({ config, response, warnings, providerOptionsNames, toolNameMapping, jsonResponseToolName }) {
|
|
1505
|
+
static convertGenerateContentResponse({ config, response, warnings, providerOptionsNames, toolNameMapping, jsonResponseToolName, initialPromptTokenCount }) {
|
|
1408
1506
|
const wrapProviderMetadata = (payload) => Object.fromEntries(providerOptionsNames.map((name) => [name, payload]));
|
|
1409
1507
|
const candidate = response.candidates?.[0];
|
|
1410
1508
|
const promptBlockReason = response.promptFeedback?.blockReason;
|
|
@@ -1536,7 +1634,9 @@ var GoogleLanguageModel = class GoogleLanguageModel {
|
|
|
1536
1634
|
safetyRatings: candidate?.safetyRatings ?? null,
|
|
1537
1635
|
usageMetadata: usageMetadata ?? null,
|
|
1538
1636
|
finishMessage: candidate?.finishMessage ?? null,
|
|
1539
|
-
serviceTier: usageMetadata?.serviceTier ?? null
|
|
1637
|
+
serviceTier: usageMetadata?.serviceTier ?? null,
|
|
1638
|
+
...candidate?.continuationToken != null ? { continuationToken: candidate.continuationToken } : {},
|
|
1639
|
+
...initialPromptTokenCount != null ? { initialPromptTokenCount } : {}
|
|
1540
1640
|
}),
|
|
1541
1641
|
response: { id: response.responseId ?? void 0 }
|
|
1542
1642
|
};
|
|
@@ -1544,23 +1644,55 @@ var GoogleLanguageModel = class GoogleLanguageModel {
|
|
|
1544
1644
|
async doGenerate(options) {
|
|
1545
1645
|
const { args, warnings, providerOptionsNames, extraHeaders, toolNameMapping, jsonResponseToolName } = await this.getArgs(options);
|
|
1546
1646
|
const mergedHeaders = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers, extraHeaders);
|
|
1547
|
-
const
|
|
1647
|
+
const generateContent = (body) => postJsonToApi({
|
|
1548
1648
|
url: `${this.config.baseURL}/${getModelPath(this.modelId)}:generateContent`,
|
|
1549
1649
|
headers: mergedHeaders,
|
|
1550
|
-
body
|
|
1650
|
+
body,
|
|
1551
1651
|
failedResponseHandler: googleFailedResponseHandler,
|
|
1552
1652
|
successfulResponseHandler: createJsonResponseHandler(responseSchema),
|
|
1553
1653
|
abortSignal: options.abortSignal,
|
|
1554
1654
|
fetch: this.config.fetch
|
|
1555
1655
|
});
|
|
1556
|
-
|
|
1656
|
+
let { responseHeaders, value: response, rawValue: rawResponse } = await generateContent(args);
|
|
1657
|
+
const content = [];
|
|
1658
|
+
let usageMetadata;
|
|
1659
|
+
const firstPromptTokenCount = response.usageMetadata?.promptTokenCount;
|
|
1660
|
+
let isContinued = false;
|
|
1661
|
+
while (true) {
|
|
1662
|
+
const candidate = response.candidates?.[0];
|
|
1663
|
+
const continuationToken = candidate?.finishReason === "CONTINUATION" ? candidate.continuationToken : void 0;
|
|
1664
|
+
usageMetadata = addGoogleUsageMetadata(usageMetadata, response.usageMetadata ?? void 0);
|
|
1665
|
+
if (continuationToken == null) break;
|
|
1666
|
+
content.push(...GoogleLanguageModel.convertGenerateContentResponse({
|
|
1667
|
+
config: this.config,
|
|
1668
|
+
response,
|
|
1669
|
+
warnings,
|
|
1670
|
+
providerOptionsNames,
|
|
1671
|
+
toolNameMapping,
|
|
1672
|
+
jsonResponseToolName
|
|
1673
|
+
}).content);
|
|
1674
|
+
isContinued = true;
|
|
1675
|
+
({responseHeaders, value: response, rawValue: rawResponse} = await generateContent({
|
|
1676
|
+
...args,
|
|
1677
|
+
continuationToken
|
|
1678
|
+
}));
|
|
1679
|
+
}
|
|
1680
|
+
const lastResult = GoogleLanguageModel.convertGenerateContentResponse({
|
|
1557
1681
|
config: this.config,
|
|
1558
|
-
response
|
|
1682
|
+
response: {
|
|
1683
|
+
...response,
|
|
1684
|
+
usageMetadata
|
|
1685
|
+
},
|
|
1559
1686
|
warnings,
|
|
1560
1687
|
providerOptionsNames,
|
|
1561
1688
|
toolNameMapping,
|
|
1562
|
-
jsonResponseToolName
|
|
1689
|
+
jsonResponseToolName,
|
|
1690
|
+
initialPromptTokenCount: isContinued ? firstPromptTokenCount : void 0
|
|
1563
1691
|
});
|
|
1692
|
+
const result = {
|
|
1693
|
+
...lastResult,
|
|
1694
|
+
content: [...content, ...lastResult.content]
|
|
1695
|
+
};
|
|
1564
1696
|
return {
|
|
1565
1697
|
...result,
|
|
1566
1698
|
request: { body: args },
|
|
@@ -1575,25 +1707,40 @@ var GoogleLanguageModel = class GoogleLanguageModel {
|
|
|
1575
1707
|
const { args, warnings, providerOptionsNames, extraHeaders, toolNameMapping, jsonResponseToolName } = await this.getArgs(options, { isStreaming: true });
|
|
1576
1708
|
const wrapProviderMetadata = (payload) => Object.fromEntries(providerOptionsNames.map((name) => [name, payload]));
|
|
1577
1709
|
const headers = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers, extraHeaders);
|
|
1578
|
-
const
|
|
1710
|
+
const streamGenerateContent = (body) => postJsonToApi({
|
|
1579
1711
|
url: `${this.config.baseURL}/${getModelPath(this.modelId)}:streamGenerateContent?alt=sse`,
|
|
1580
1712
|
headers,
|
|
1581
|
-
body
|
|
1713
|
+
body,
|
|
1582
1714
|
failedResponseHandler: googleFailedResponseHandler,
|
|
1583
1715
|
successfulResponseHandler: createEventSourceResponseHandler(chunkSchema),
|
|
1584
1716
|
abortSignal: options.abortSignal,
|
|
1585
1717
|
fetch: this.config.fetch
|
|
1586
1718
|
});
|
|
1719
|
+
const { responseHeaders, value: firstResponse } = await streamGenerateContent(args);
|
|
1720
|
+
const response = continueGoogleStream({
|
|
1721
|
+
stream: firstResponse,
|
|
1722
|
+
getContinuationToken: (chunk) => {
|
|
1723
|
+
const candidate = chunk.candidates?.[0];
|
|
1724
|
+
return candidate?.finishReason === "CONTINUATION" ? candidate.continuationToken ?? void 0 : void 0;
|
|
1725
|
+
},
|
|
1726
|
+
continueStream: async (continuationToken) => (await streamGenerateContent({
|
|
1727
|
+
...args,
|
|
1728
|
+
continuationToken
|
|
1729
|
+
})).value
|
|
1730
|
+
});
|
|
1587
1731
|
let finishReason = {
|
|
1588
1732
|
unified: "other",
|
|
1589
1733
|
raw: void 0
|
|
1590
1734
|
};
|
|
1591
1735
|
let usage = void 0;
|
|
1736
|
+
let continuedUsage = void 0;
|
|
1737
|
+
let initialPromptTokenCount = void 0;
|
|
1592
1738
|
let promptFeedback = null;
|
|
1593
1739
|
let lastGroundingMetadata = null;
|
|
1594
1740
|
let lastUrlContextMetadata = null;
|
|
1595
1741
|
let lastSafetyRatings = null;
|
|
1596
1742
|
let lastFinishMessage = null;
|
|
1743
|
+
let lastContinuationToken = null;
|
|
1597
1744
|
let confirmedPromptBlockReason;
|
|
1598
1745
|
const generateId = this.config.generateId;
|
|
1599
1746
|
let hasToolCalls = false;
|
|
@@ -1675,6 +1822,7 @@ var GoogleLanguageModel = class GoogleLanguageModel {
|
|
|
1675
1822
|
if (candidate.urlContextMetadata != null) lastUrlContextMetadata = candidate.urlContextMetadata;
|
|
1676
1823
|
if (candidate.safetyRatings != null) lastSafetyRatings = candidate.safetyRatings;
|
|
1677
1824
|
if (candidate.finishMessage != null) lastFinishMessage = candidate.finishMessage;
|
|
1825
|
+
if (candidate.continuationToken != null) lastContinuationToken = candidate.continuationToken;
|
|
1678
1826
|
}
|
|
1679
1827
|
if (confirmedPromptBlockReason != null || candidate == null) return;
|
|
1680
1828
|
const content = candidate.content;
|
|
@@ -1925,6 +2073,11 @@ var GoogleLanguageModel = class GoogleLanguageModel {
|
|
|
1925
2073
|
}
|
|
1926
2074
|
}
|
|
1927
2075
|
}
|
|
2076
|
+
if (candidate.finishReason === "CONTINUATION") {
|
|
2077
|
+
if (continuedUsage == null) initialPromptTokenCount = usage?.promptTokenCount;
|
|
2078
|
+
continuedUsage = addGoogleUsageMetadata(continuedUsage, usage);
|
|
2079
|
+
usage = void 0;
|
|
2080
|
+
}
|
|
1928
2081
|
if (candidate.finishReason != null) finishReason = {
|
|
1929
2082
|
unified: mapGoogleFinishReason({
|
|
1930
2083
|
finishReason: candidate.finishReason,
|
|
@@ -1934,6 +2087,7 @@ var GoogleLanguageModel = class GoogleLanguageModel {
|
|
|
1934
2087
|
};
|
|
1935
2088
|
},
|
|
1936
2089
|
flush(controller) {
|
|
2090
|
+
usage = addGoogleUsageMetadata(continuedUsage, usage);
|
|
1937
2091
|
if (currentTextBlockId !== null) controller.enqueue({
|
|
1938
2092
|
type: "text-end",
|
|
1939
2093
|
id: currentTextBlockId
|
|
@@ -1953,7 +2107,9 @@ var GoogleLanguageModel = class GoogleLanguageModel {
|
|
|
1953
2107
|
safetyRatings: lastSafetyRatings,
|
|
1954
2108
|
usageMetadata: usage ?? null,
|
|
1955
2109
|
finishMessage: lastFinishMessage,
|
|
1956
|
-
serviceTier: usage?.serviceTier ?? null
|
|
2110
|
+
serviceTier: usage?.serviceTier ?? null,
|
|
2111
|
+
...lastContinuationToken != null && (finishReason.raw === "MAX_TOKENS" || finishReason.raw === "CONTINUATION") ? { continuationToken: lastContinuationToken } : {},
|
|
2112
|
+
...initialPromptTokenCount != null ? { initialPromptTokenCount } : {}
|
|
1957
2113
|
})
|
|
1958
2114
|
});
|
|
1959
2115
|
}
|
|
@@ -2248,6 +2404,7 @@ const responseSchema = lazySchema(() => zodSchema(z.object({
|
|
|
2248
2404
|
content: getContentSchema().nullish().or(z.object({}).strict()),
|
|
2249
2405
|
finishReason: z.string().nullish(),
|
|
2250
2406
|
finishMessage: z.string().nullish(),
|
|
2407
|
+
continuationToken: z.string().nullish(),
|
|
2251
2408
|
safetyRatings: z.array(getSafetyRatingSchema()).nullish(),
|
|
2252
2409
|
groundingMetadata: getGroundingMetadataSchema().nullish(),
|
|
2253
2410
|
urlContextMetadata: getUrlContextMetadataSchema().nullish()
|
|
@@ -2264,6 +2421,7 @@ const chunkSchema = lazySchema(() => zodSchema(z.object({
|
|
|
2264
2421
|
content: getContentSchema().nullish(),
|
|
2265
2422
|
finishReason: z.string().nullish(),
|
|
2266
2423
|
finishMessage: z.string().nullish(),
|
|
2424
|
+
continuationToken: z.string().nullish(),
|
|
2267
2425
|
safetyRatings: z.array(getSafetyRatingSchema()).nullish(),
|
|
2268
2426
|
groundingMetadata: getGroundingMetadataSchema().nullish(),
|
|
2269
2427
|
urlContextMetadata: getUrlContextMetadataSchema().nullish()
|
|
@@ -5346,7 +5504,7 @@ var GoogleInteractionsLanguageModel = class GoogleInteractionsLanguageModel {
|
|
|
5346
5504
|
};
|
|
5347
5505
|
}
|
|
5348
5506
|
async doGenerate(options) {
|
|
5349
|
-
const { args, warnings, isAgent, pollingTimeoutMs } = await this.getArgs(options);
|
|
5507
|
+
const { args, warnings, isAgent, isBackground, pollingTimeoutMs } = await this.getArgs(options);
|
|
5350
5508
|
const url = `${this.config.baseURL}/interactions`;
|
|
5351
5509
|
const mergedHeaders = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers);
|
|
5352
5510
|
let { responseHeaders, value: response, rawValue: rawResponse } = await postJsonToApi({
|
|
@@ -5358,7 +5516,7 @@ var GoogleInteractionsLanguageModel = class GoogleInteractionsLanguageModel {
|
|
|
5358
5516
|
abortSignal: options.abortSignal,
|
|
5359
5517
|
fetch: this.config.fetch
|
|
5360
5518
|
});
|
|
5361
|
-
if (isAgent && !isTerminalStatus(response.status)) {
|
|
5519
|
+
if ((isAgent || isBackground) && !isTerminalStatus(response.status)) {
|
|
5362
5520
|
const polled = await pollGoogleInteractionUntilTerminal({
|
|
5363
5521
|
baseURL: this.config.baseURL,
|
|
5364
5522
|
interactionId: response.id,
|