@ai-sdk/google 4.0.94 → 4.0.96

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.
@@ -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":"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"}
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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"}
@@ -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": return "length";
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 { responseHeaders, value: response, rawValue: rawResponse } = await postJsonToApi({
1647
+ const generateContent = (body) => postJsonToApi({
1548
1648
  url: `${this.config.baseURL}/${getModelPath(this.modelId)}:generateContent`,
1549
1649
  headers: mergedHeaders,
1550
- body: args,
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
- const result = GoogleLanguageModel.convertGenerateContentResponse({
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 { responseHeaders, value: response } = await postJsonToApi({
1710
+ const streamGenerateContent = (body) => postJsonToApi({
1579
1711
  url: `${this.config.baseURL}/${getModelPath(this.modelId)}:streamGenerateContent?alt=sse`,
1580
1712
  headers,
1581
- body: args,
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,