@ai-sdk/google 4.0.107 → 4.0.109

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.
@@ -11,6 +11,13 @@ type GoogleContent = {
11
11
  role: 'user' | 'model';
12
12
  parts: Array<GoogleContentPart>;
13
13
  };
14
+ declare const googleVideoMetadataSchema: z.ZodObject<{
15
+ startOffset: z.ZodOptional<z.ZodString>;
16
+ endOffset: z.ZodOptional<z.ZodString>;
17
+ fps: z.ZodOptional<z.ZodNumber>;
18
+ }, z.core.$strip>;
19
+ /** Metadata for preprocessing video file parts. */
20
+ type GoogleVideoMetadata = z.infer<typeof googleVideoMetadataSchema>;
14
21
  type GoogleContentPart = {
15
22
  text: string;
16
23
  thought?: boolean;
@@ -20,6 +27,7 @@ type GoogleContentPart = {
20
27
  mimeType: string;
21
28
  data: string;
22
29
  };
30
+ videoMetadata?: GoogleVideoMetadata;
23
31
  thought?: boolean;
24
32
  thoughtSignature?: string;
25
33
  } | {
@@ -41,6 +49,7 @@ type GoogleContentPart = {
41
49
  mimeType: string;
42
50
  fileUri: string;
43
51
  };
52
+ videoMetadata?: GoogleVideoMetadata;
44
53
  thought?: boolean;
45
54
  thoughtSignature?: string;
46
55
  } | {
@@ -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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"}
@@ -116,6 +116,16 @@ function addTokenDetails(a, b) {
116
116
  }));
117
117
  }
118
118
  //#endregion
119
+ //#region src/google-prompt.ts
120
+ const googleVideoMetadataSchema = z.object({
121
+ /** Start offset as a duration in seconds, e.g. `'3.5s'`. */
122
+ startOffset: z.string().optional(),
123
+ /** End offset as a duration in seconds, e.g. `'10s'`. */
124
+ endOffset: z.string().optional(),
125
+ /** Frames per second in the range (0, 24]. Defaults to 1. */
126
+ fps: z.number().gt(0).max(24).optional()
127
+ });
128
+ //#endregion
119
129
  //#region src/tool/code-execution.ts
120
130
  const codeExecutionInputSchema = z.object({
121
131
  language: z.string().describe("The programming language of the code."),
@@ -276,33 +286,50 @@ function convertToGoogleMessages(prompt, options) {
276
286
  case "text":
277
287
  parts.push({ text: part.text });
278
288
  break;
279
- case "file": switch (part.data.type) {
280
- case "url":
281
- parts.push({ fileData: {
282
- mimeType: resolveFullMediaType({ part }),
283
- fileUri: part.data.url.protocol === "gs:" && part.data.originalUrl != null ? part.data.originalUrl : part.data.url.toString()
284
- } });
285
- break;
286
- case "reference":
287
- if (isVertexLike) throw new UnsupportedFunctionalityError({ functionality: "file parts with provider references" });
288
- parts.push({ fileData: {
289
- mimeType: resolveFullMediaType({ part }),
290
- fileUri: resolveProviderReference({
291
- reference: part.data.reference,
292
- provider: "google"
293
- })
294
- } });
295
- break;
296
- case "text":
297
- parts.push({ inlineData: {
298
- mimeType: isFullMediaType(part.mediaType) ? part.mediaType : "text/plain",
299
- data: convertToBase64(new TextEncoder().encode(part.data.text))
300
- } });
301
- break;
302
- case "data": parts.push({ inlineData: {
303
- mimeType: resolveFullMediaType({ part }),
304
- data: convertToBase64(part.data.data)
305
- } });
289
+ case "file": {
290
+ const rawVideoMetadata = readProviderOpts(part)?.videoMetadata;
291
+ const videoMetadata = rawVideoMetadata == null ? void 0 : googleVideoMetadataSchema.parse(rawVideoMetadata);
292
+ switch (part.data.type) {
293
+ case "url":
294
+ parts.push({
295
+ fileData: {
296
+ mimeType: resolveFullMediaType({ part }),
297
+ fileUri: part.data.url.protocol === "gs:" && part.data.originalUrl != null ? part.data.originalUrl : part.data.url.toString()
298
+ },
299
+ ...videoMetadata != null ? { videoMetadata } : {}
300
+ });
301
+ break;
302
+ case "reference":
303
+ if (isVertexLike) throw new UnsupportedFunctionalityError({ functionality: "file parts with provider references" });
304
+ parts.push({
305
+ fileData: {
306
+ mimeType: resolveFullMediaType({ part }),
307
+ fileUri: resolveProviderReference({
308
+ reference: part.data.reference,
309
+ provider: "google"
310
+ })
311
+ },
312
+ ...videoMetadata != null ? { videoMetadata } : {}
313
+ });
314
+ break;
315
+ case "text":
316
+ parts.push({
317
+ inlineData: {
318
+ mimeType: isFullMediaType(part.mediaType) ? part.mediaType : "text/plain",
319
+ data: convertToBase64(new TextEncoder().encode(part.data.text))
320
+ },
321
+ ...videoMetadata != null ? { videoMetadata } : {}
322
+ });
323
+ break;
324
+ case "data": parts.push({
325
+ inlineData: {
326
+ mimeType: resolveFullMediaType({ part }),
327
+ data: convertToBase64(part.data.data)
328
+ },
329
+ ...videoMetadata != null ? { videoMetadata } : {}
330
+ });
331
+ }
332
+ break;
306
333
  }
307
334
  }
308
335
  contents.push({
@@ -827,11 +854,129 @@ const googleLanguageModelOptions = lazySchema(() => zodSchema(z.object({
827
854
  requestType: z.enum(["shared"]).optional()
828
855
  })));
829
856
  //#endregion
830
- //#region src/google-model-capabilities.ts
857
+ //#region src/google-model-catalog.ts
831
858
  const gemini1ModelPattern = /(^|[/.])gemini-1(?:[.-]|$)/i;
832
859
  const gemini2ModelPattern = /(^|[/.])gemini-2(?:[.-]|$)/i;
833
- const gemini25ModelPattern$1 = /(^|[/.])gemini-2\.5(?:[.-]|$)/i;
860
+ const gemini25ModelPattern = /(^|[/.])gemini-2\.5(?:[.-]|$)/i;
834
861
  const geminiModelPattern = /(^|[/.])gemini-/i;
862
+ /** Options accepted under providerOptions.google (or googleVertex on Vertex). */
863
+ const googleProviderOptions = { language: {
864
+ responseModalities: { description: "Response modalities to generate." },
865
+ thinkingConfig: { description: "Thinking budget, level, and thought output." },
866
+ cachedContent: { description: "Cached content to use as request context." },
867
+ structuredOutputs: { description: "Whether to send the JSON response schema." },
868
+ safetySettings: { description: "Safety settings for the request." },
869
+ threshold: { description: "Default threshold for configurable safety categories." },
870
+ audioTimestamp: { description: "Enable timestamp understanding for audio." },
871
+ labels: { description: "Billing labels. Vertex AI only." },
872
+ mediaResolution: { description: "Resolution used to process media inputs." },
873
+ imageConfig: { description: "Image generation configuration." },
874
+ retrievalConfig: { description: "Retrieval configuration for tools." },
875
+ streamFunctionCallArguments: { description: "Stream function arguments. Vertex AI only." },
876
+ serviceTier: { description: "Service tier. Gemini API only." },
877
+ continuationToken: { description: "Resume a response using its continuation token." },
878
+ sharedRequestType: { description: "Shared PayGo tier. Vertex AI only." },
879
+ requestType: { description: "Request routing type. Vertex AI only." }
880
+ } };
881
+ const standard = {
882
+ image: true,
883
+ objectGeneration: true,
884
+ tools: true,
885
+ streaming: true,
886
+ googleSearch: true,
887
+ urlContext: true
888
+ };
889
+ const googleModelCatalog = Object.fromEntries(Object.entries({
890
+ "gemini-nano-banana-2.1": {
891
+ image: true,
892
+ objectGeneration: false,
893
+ tools: false,
894
+ streaming: false,
895
+ googleSearch: true,
896
+ urlContext: false
897
+ },
898
+ "gemini-4-argon": standard,
899
+ "gemini-3.8-flash": standard,
900
+ "gemini-3.7-flash": standard,
901
+ "gemini-3.6-flash": standard,
902
+ "gemini-3.5-flash": standard,
903
+ "gemini-3.5-flash-lite": standard,
904
+ "gemini-3.1-pro-preview": standard,
905
+ "gemini-3.1-flash-image-preview": standard,
906
+ "gemini-3.1-flash-lite-preview": standard,
907
+ "gemini-3-pro-preview": standard,
908
+ "gemini-3-pro-image-preview": standard,
909
+ "gemini-3-flash-preview": standard,
910
+ "gemini-2.5-pro": standard,
911
+ "gemini-2.5-flash": standard,
912
+ "gemini-2.5-flash-lite": standard,
913
+ "gemini-2.5-flash-lite-preview-06-17": standard,
914
+ "gemini-2.0-flash": standard
915
+ }).map(([modelId, documented]) => [modelId, createGoogleLanguageModelEntry(modelId, documented)]));
916
+ function getGoogleLanguageModelEntry(modelId) {
917
+ return Object.prototype.hasOwnProperty.call(googleModelCatalog, modelId) ? googleModelCatalog[modelId] : createGoogleLanguageModelEntry(modelId);
918
+ }
919
+ function createGoogleLanguageModelEntry(modelId, documented) {
920
+ const runtime = resolveRuntimeDefinition(modelId);
921
+ const declared = documented != null;
922
+ const id = modelId.toLowerCase();
923
+ const thinkingFormat = runtime.usesGemini3Features && !modelId.includes("gemini-3-pro-image") ? "level" : "budget";
924
+ const minLevel = getMinimumThinkingLevelForGemini3Model(modelId);
925
+ return {
926
+ capabilities: { language: {
927
+ inputs: {
928
+ image: documented?.image ?? "unknown",
929
+ audio: "unknown"
930
+ },
931
+ objectGeneration: documented?.objectGeneration ?? "unknown",
932
+ tools: {
933
+ usage: documented?.tools ?? "unknown",
934
+ streaming: documented?.streaming ?? "unknown",
935
+ gemini2: runtime.supportsGemini2Tools,
936
+ googleSearch: documented?.googleSearch ?? "unknown",
937
+ urlContext: documented?.urlContext ?? "unknown",
938
+ fileSearch: runtime.supportsFileSearch,
939
+ mixed: runtime.usesGemini3Features,
940
+ functionResponseParts: runtime.usesGemini3Features
941
+ },
942
+ reasoning: {
943
+ support: "unknown",
944
+ efforts: thinkingFormat === "level" ? [
945
+ ...minLevel === "minimal" ? ["minimal"] : [],
946
+ "low",
947
+ "medium",
948
+ "high"
949
+ ] : void 0,
950
+ minBudget: id.includes("2.5-pro") ? 128 : 0,
951
+ maxBudget: id.includes("2.5-pro") || id.includes("gemini-3-pro-image") ? 32768 : 24576
952
+ },
953
+ sampling: {
954
+ temperature: "unknown",
955
+ topP: "unknown",
956
+ topK: "unknown",
957
+ logprobs: false,
958
+ penalties: gemini25ModelPattern.test(modelId) ? { condition: "Only supported on the Vertex AI API." } : true
959
+ },
960
+ structuredOutput: { withFunctionTools: runtime.usesGemini3Features }
961
+ } },
962
+ providerOptions: { language: declareProviderOptions(declared ? true : "unknown", {
963
+ labels: { condition: "Only supported on the Vertex AI API." },
964
+ sharedRequestType: { condition: "Only supported on the Vertex AI API." },
965
+ requestType: { condition: "Only supported on the Vertex AI API." },
966
+ serviceTier: { condition: "Only supported on the Gemini API." },
967
+ streamFunctionCallArguments: { condition: "Only supported for streaming requests on the Vertex AI API with Gemini 3 or newer." }
968
+ }) },
969
+ requestConfig: { language: {
970
+ systemInstruction: id.startsWith("gemma-") ? "user" : "system",
971
+ thinkingFormat,
972
+ reasoningMaxOutputTokens: 65536,
973
+ jsonResponseTool: /(^|\/)gemini-/i.test(modelId)
974
+ } }
975
+ };
976
+ }
977
+ function declareProviderOptions(support, exceptions) {
978
+ return Object.fromEntries(Object.keys(googleProviderOptions.language).map((option) => [option, exceptions[option] ?? support]));
979
+ }
835
980
  function isKnownPreGemini2Model(modelId) {
836
981
  return gemini1ModelPattern.test(modelId) || /(^|[/.])gemini-pro(?:-vision)?$/i.test(modelId) || /(^|[/.])gemini-robotics-er-1\.5(?:[.-]|$)/i.test(modelId);
837
982
  }
@@ -842,17 +987,39 @@ function isKnownPreGemini2Model(modelId) {
842
987
  * intentionally inherit the newest supported behavior. Add exceptions here
843
988
  * only when a model is known to require a legacy request shape.
844
989
  */
845
- function getGoogleModelCapabilities(modelId) {
990
+ function resolveRuntimeDefinition(modelId) {
846
991
  const isGeminiModel = geminiModelPattern.test(modelId);
847
992
  const isGemini2Model = gemini2ModelPattern.test(modelId);
848
993
  const isKnownPreGemini2 = isKnownPreGemini2Model(modelId);
849
994
  const usesGemini3Features = isGeminiModel && !(isKnownPreGemini2 || isGemini2Model);
850
995
  return {
851
996
  supportsGemini2Tools: isGeminiModel && !isKnownPreGemini2 || modelId.toLowerCase().includes("nano-banana"),
852
- supportsFileSearch: gemini25ModelPattern$1.test(modelId) || usesGemini3Features,
997
+ supportsFileSearch: gemini25ModelPattern.test(modelId) || usesGemini3Features,
853
998
  usesGemini3Features
854
999
  };
855
1000
  }
1001
+ function getMinimumThinkingLevelForGemini3Model(modelId) {
1002
+ const modelName = /(?:^|[/.])(gemini-[^/]*)$/i.exec(modelId)?.[1].toLowerCase();
1003
+ if (modelName === "gemini-flash-latest") return "low";
1004
+ const proVersionMatch = /^gemini-(\d+)(?:\.\d+)?-pro(?:$|-)/.exec(modelName ?? "");
1005
+ if (Number(proVersionMatch?.[1]) >= 3) return "low";
1006
+ const versionMatch = /^gemini-(\d+)\.(\d+)-flash(?:$|-(?!lite(?:-|$)))/.exec(modelName ?? "");
1007
+ if (versionMatch == null) return "minimal";
1008
+ const majorVersion = Number(versionMatch[1]);
1009
+ const minorVersion = Number(versionMatch[2]);
1010
+ return majorVersion > 3 || majorVersion === 3 && minorVersion >= 7 ? "low" : "minimal";
1011
+ }
1012
+ //#endregion
1013
+ //#region src/google-model-capabilities.ts
1014
+ /** Compatibility projection of the resolved catalog for existing request code. */
1015
+ function getGoogleModelCapabilities(modelId) {
1016
+ const { tools } = getGoogleLanguageModelEntry(modelId).capabilities.language;
1017
+ return {
1018
+ supportsGemini2Tools: tools.gemini2,
1019
+ supportsFileSearch: tools.fileSearch,
1020
+ usesGemini3Features: tools.mixed
1021
+ };
1022
+ }
856
1023
  //#endregion
857
1024
  //#region src/google-prepare-tools.ts
858
1025
  function prepareTools({ tools, toolChoice, modelId, isVertexProvider = false }) {
@@ -1057,11 +1224,16 @@ var GoogleJSONAccumulator = class {
1057
1224
  const escaped = JSON.stringify(arg.stringValue).slice(1, -1);
1058
1225
  setNestedValue(this.accumulatedArgs, segments, existingValue + arg.stringValue);
1059
1226
  delta += escaped;
1227
+ if (arg.willContinue !== true) delta += this.closeOpenString();
1060
1228
  continue;
1061
1229
  }
1062
1230
  const resolved = resolvePartialArgValue(arg);
1063
1231
  if (resolved == null) {
1064
- if (existingValue !== void 0 || arg.willContinue === true) continue;
1232
+ if (existingValue !== void 0) {
1233
+ if (typeof existingValue === "string" && arg.willContinue !== true) delta += this.closeOpenString();
1234
+ continue;
1235
+ }
1236
+ if (arg.willContinue === true) continue;
1065
1237
  setNestedValue(this.accumulatedArgs, segments, isArrayTerminator ? [] : {});
1066
1238
  delta += this.emitContainer(segments, isArrayTerminator);
1067
1239
  continue;
@@ -1087,6 +1259,15 @@ var GoogleJSONAccumulator = class {
1087
1259
  };
1088
1260
  }
1089
1261
  /**
1262
+ * Input: stringOpen=true
1263
+ * Output: '"' (and stringOpen=false), or '' when no string is open
1264
+ */
1265
+ closeOpenString() {
1266
+ if (!this.stringOpen) return "";
1267
+ this.stringOpen = false;
1268
+ return "\"";
1269
+ }
1270
+ /**
1090
1271
  * Input: pathStack=[] (first call) or pathStack=[root,...] (subsequent calls)
1091
1272
  * Output: '{' (first call) or '' (subsequent calls)
1092
1273
  */
@@ -1109,11 +1290,7 @@ var GoogleJSONAccumulator = class {
1109
1290
  * Output: '{"recipe":{"name":"Lasagna"'
1110
1291
  */
1111
1292
  emitNavigationTo(targetSegments, arg, valueJson) {
1112
- let fragment = "";
1113
- if (this.stringOpen) {
1114
- fragment += "\"";
1115
- this.stringOpen = false;
1116
- }
1293
+ let fragment = this.closeOpenString();
1117
1294
  fragment += this.ensureRoot();
1118
1295
  const targetContainerSegments = targetSegments.slice(0, -1);
1119
1296
  const leafSegment = targetSegments[targetSegments.length - 1];
@@ -1132,11 +1309,7 @@ var GoogleJSONAccumulator = class {
1132
1309
  * Output: '{"nested":{"tags":['
1133
1310
  */
1134
1311
  emitContainer(targetSegments, isArray) {
1135
- let fragment = "";
1136
- if (this.stringOpen) {
1137
- fragment += "\"";
1138
- this.stringOpen = false;
1139
- }
1312
+ let fragment = this.closeOpenString();
1140
1313
  fragment += this.ensureRoot();
1141
1314
  const commonDepth = this.findCommonStackDepth(targetSegments);
1142
1315
  fragment += this.closeDownTo(commonDepth);
@@ -1328,7 +1501,6 @@ const configurableSafetySettingCategories = [
1328
1501
  "HARM_CATEGORY_HARASSMENT",
1329
1502
  "HARM_CATEGORY_SEXUALLY_EXPLICIT"
1330
1503
  ];
1331
- const gemini25ModelPattern = /(^|[/.])gemini-2\.5(?:[.-]|$)/i;
1332
1504
  const googleCloudStorageFunctionResponseUrls = {
1333
1505
  "image/png": [/^gs:\/\/.*$/],
1334
1506
  "image/jpeg": [/^gs:\/\/.*$/],
@@ -1413,8 +1585,9 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1413
1585
  imageConfig = geminiApiImageConfig;
1414
1586
  }
1415
1587
  }
1416
- const isGemmaModel = modelId.toLowerCase().startsWith("gemma-");
1417
- const isGemini25DeveloperApiModel = !isVertexProvider && gemini25ModelPattern.test(modelId);
1588
+ const entry = getGoogleLanguageModelEntry(modelId);
1589
+ const isGemmaModel = entry.requestConfig.language.systemInstruction === "user";
1590
+ const isGemini25DeveloperApiModel = !isVertexProvider && entry.capabilities.language.sampling.penalties !== true;
1418
1591
  if (isGemini25DeveloperApiModel && frequencyPenalty != null) warnings.push({
1419
1592
  type: "unsupported",
1420
1593
  feature: "frequencyPenalty"
@@ -1423,7 +1596,7 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1423
1596
  type: "unsupported",
1424
1597
  feature: "presencePenalty"
1425
1598
  });
1426
- const { usesGemini3Features } = getGoogleModelCapabilities(modelId);
1599
+ const usesGemini3Features = entry.capabilities.language.tools.functionResponseParts;
1427
1600
  const supportedFunctionResponseUrls = usesGemini3Features && config.downloadToolResultFiles?.supportsGoogleCloudStorageUrls ? googleCloudStorageFunctionResponseUrls : void 0;
1428
1601
  const { contents, systemInstruction } = convertToGoogleMessages(config.downloadToolResultFiles ? await downloadToolResultFiles(prompt, {
1429
1602
  abortSignal,
@@ -1508,8 +1681,10 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1508
1681
  }
1509
1682
  async getArgs(options, { isStreaming = false } = {}) {
1510
1683
  const { responseFormat, tools, toolChoice } = options;
1684
+ const entry = getGoogleLanguageModelEntry(this.modelId);
1685
+ const { structuredOutput } = entry.capabilities.language;
1511
1686
  let jsonResponseTool;
1512
- if (responseFormat?.type === "json" && responseFormat.schema != null && tools?.some((tool) => tool.type === "function") && /(^|\/)gemini-/i.test(this.modelId) && (!getGoogleModelCapabilities(this.modelId).usesGemini3Features || toolChoice?.type === "required" || toolChoice?.type === "tool")) {
1687
+ if (responseFormat?.type === "json" && responseFormat.schema != null && tools?.some((tool) => tool.type === "function") && entry.requestConfig.language.jsonResponseTool && (!structuredOutput.withFunctionTools || toolChoice?.type === "required" || toolChoice?.type === "tool")) {
1513
1688
  let name = "json";
1514
1689
  for (let suffix = 1; tools.some((tool) => tool.name === name); suffix++) name = `json_${suffix}`;
1515
1690
  jsonResponseTool = {
@@ -1679,10 +1854,9 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1679
1854
  }
1680
1855
  async doGenerate(options) {
1681
1856
  const { args, warnings, providerOptionsNames, extraHeaders, toolNameMapping, jsonResponseToolName } = await this.getArgs(options);
1682
- const mergedHeaders = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers, extraHeaders);
1683
- const generateContent = (body) => postJsonToApi({
1857
+ const generateContent = async (body) => postJsonToApi({
1684
1858
  url: `${this.config.baseURL}/${getModelPath(this.modelId)}:generateContent`,
1685
- headers: mergedHeaders,
1859
+ headers: combineHeaders(await resolve(this.config.headers), options.headers, extraHeaders),
1686
1860
  body,
1687
1861
  failedResponseHandler: googleFailedResponseHandler,
1688
1862
  successfulResponseHandler: createJsonResponseHandler(responseSchema),
@@ -1745,10 +1919,9 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1745
1919
  async doStream(options) {
1746
1920
  const { args, warnings, providerOptionsNames, extraHeaders, toolNameMapping, jsonResponseToolName } = await this.getArgs(options, { isStreaming: true });
1747
1921
  const wrapProviderMetadata = (payload) => Object.fromEntries(providerOptionsNames.map((name) => [name, payload]));
1748
- const headers = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers, extraHeaders);
1749
- const streamGenerateContent = (body) => postJsonToApi({
1922
+ const streamGenerateContent = async (body) => postJsonToApi({
1750
1923
  url: `${this.config.baseURL}/${getModelPath(this.modelId)}:streamGenerateContent?alt=sse`,
1751
- headers,
1924
+ headers: combineHeaders(await resolve(this.config.headers), options.headers, extraHeaders),
1752
1925
  body,
1753
1926
  failedResponseHandler: googleFailedResponseHandler,
1754
1927
  successfulResponseHandler: createEventSourceResponseHandler(chunkSchema),
@@ -2201,17 +2374,9 @@ var GoogleLanguageModel = class GoogleLanguageModel {
2201
2374
  };
2202
2375
  }
2203
2376
  };
2204
- function getMaxOutputTokensForGemini25Model() {
2205
- return 65536;
2206
- }
2207
- function getMaxThinkingTokensForGemini25Model(modelId) {
2208
- const id = modelId.toLowerCase();
2209
- if (id.includes("2.5-pro") || id.includes("gemini-3-pro-image")) return 32768;
2210
- return 24576;
2211
- }
2212
2377
  function resolveThinkingConfig({ reasoning, modelId, warnings }) {
2213
2378
  if (!isCustomReasoning(reasoning)) return;
2214
- if (getGoogleModelCapabilities(modelId).usesGemini3Features && !modelId.includes("gemini-3-pro-image")) return resolveGemini3ThinkingConfig({
2379
+ if (getGoogleLanguageModelEntry(modelId).requestConfig.language.thinkingFormat === "level") return resolveGemini3ThinkingConfig({
2215
2380
  reasoning,
2216
2381
  modelId,
2217
2382
  warnings
@@ -2223,45 +2388,31 @@ function resolveThinkingConfig({ reasoning, modelId, warnings }) {
2223
2388
  });
2224
2389
  }
2225
2390
  function resolveGemini3ThinkingConfig({ reasoning, modelId, warnings }) {
2226
- const minimumThinkingLevel = getMinimumThinkingLevelForGemini3Model(modelId);
2227
- if (reasoning === "none") return { thinkingLevel: minimumThinkingLevel };
2391
+ const minimumThinkingLevel = getGoogleLanguageModelEntry(modelId).capabilities.language.reasoning.efforts?.[0];
2228
2392
  const thinkingLevel = mapReasoningToProviderEffort({
2229
2393
  reasoning,
2230
2394
  effortMap: {
2231
- minimal: minimumThinkingLevel,
2395
+ ...minimumThinkingLevel === "minimal" && { minimal: "minimal" },
2232
2396
  low: "low",
2233
2397
  medium: "medium",
2234
- high: "high",
2235
- xhigh: "high",
2236
- max: "high"
2398
+ high: "high"
2237
2399
  },
2238
2400
  warnings
2239
2401
  });
2240
2402
  if (thinkingLevel == null) return;
2241
2403
  return { thinkingLevel };
2242
2404
  }
2243
- function getMinimumThinkingLevelForGemini3Model(modelId) {
2244
- const modelName = /(?:^|[/.])(gemini-[^/]*)$/i.exec(modelId)?.[1].toLowerCase();
2245
- if (modelName === "gemini-flash-latest") return "low";
2246
- const proVersionMatch = /^gemini-(\d+)(?:\.\d+)?-pro(?:$|-)/.exec(modelName ?? "");
2247
- if (Number(proVersionMatch?.[1]) >= 3) return "low";
2248
- const versionMatch = /^gemini-(\d+)\.(\d+)-flash(?:$|-(?!lite(?:-|$)))/.exec(modelName ?? "");
2249
- if (versionMatch == null) return "minimal";
2250
- const majorVersion = Number(versionMatch[1]);
2251
- const minorVersion = Number(versionMatch[2]);
2252
- return majorVersion > 3 || majorVersion === 3 && minorVersion >= 7 ? "low" : "minimal";
2253
- }
2254
2405
  function resolveGemini25ThinkingConfig({ reasoning, modelId, warnings }) {
2255
- if (reasoning === "none") return { thinkingBudget: 0 };
2256
- const thinkingBudget = mapReasoningToProviderBudget({
2406
+ const entry = getGoogleLanguageModelEntry(modelId);
2407
+ const minThinkingBudget = entry.capabilities.language.reasoning.minBudget;
2408
+ if (reasoning === "none" && minThinkingBudget === 0) return { thinkingBudget: 0 };
2409
+ return { thinkingBudget: mapReasoningToProviderBudget({
2257
2410
  reasoning,
2258
- maxOutputTokens: getMaxOutputTokensForGemini25Model(),
2259
- maxReasoningBudget: getMaxThinkingTokensForGemini25Model(modelId),
2260
- minReasoningBudget: 0,
2411
+ maxOutputTokens: entry.requestConfig.language.reasoningMaxOutputTokens,
2412
+ maxReasoningBudget: entry.capabilities.language.reasoning.maxBudget,
2413
+ minReasoningBudget: minThinkingBudget,
2261
2414
  warnings
2262
- });
2263
- if (thinkingBudget == null) return;
2264
- return { thinkingBudget };
2415
+ }) };
2265
2416
  }
2266
2417
  function extractSources({ groundingMetadata, generateId }) {
2267
2418
  if (!groundingMetadata?.groundingChunks) return;
@@ -4836,7 +4987,7 @@ async function cancelGoogleInteraction({ baseURL, interactionId, headers, fetch
4836
4987
  try {
4837
4988
  const response = await fetch(url, {
4838
4989
  method: "POST",
4839
- headers: withUserAgentSuffix(combineHeaders({ "Content-Type": "application/json" }, headers), getRuntimeEnvironmentUserAgent()),
4990
+ headers: withUserAgentSuffix(combineHeaders({ "Content-Type": "application/json" }, await resolve(headers)), getRuntimeEnvironmentUserAgent()),
4840
4991
  body: "{}"
4841
4992
  });
4842
4993
  try {
@@ -4886,7 +5037,7 @@ async function pollGoogleInteractionUntilTerminal({ baseURL, interactionId, head
4886
5037
  const { value: response, rawValue: rawResponse, responseHeaders } = await getFromApi({
4887
5038
  url,
4888
5039
  validateUrl: false,
4889
- headers,
5040
+ headers: await resolve(headers),
4890
5041
  failedResponseHandler: googleFailedResponseHandler,
4891
5042
  successfulResponseHandler: createJsonResponseHandler(googleInteractionsResponseSchema),
4892
5043
  abortSignal,
@@ -5081,10 +5232,6 @@ const DEFAULT_RETRY_DELAY_MS = 500;
5081
5232
  */
5082
5233
  function streamGoogleInteractionEvents({ baseURL, interactionId, headers, fetch, abortSignal, maxRetries = DEFAULT_MAX_RETRIES, retryDelayMs = DEFAULT_RETRY_DELAY_MS }) {
5083
5234
  if (interactionId.length === 0) throw new Error("google.interactions: cannot stream a background interaction without an id.");
5084
- const eventSourceHeaders = {
5085
- ...headers,
5086
- accept: "text/event-stream"
5087
- };
5088
5235
  let lastEventId;
5089
5236
  let complete = false;
5090
5237
  let attempt = 0;
@@ -5107,7 +5254,10 @@ function streamGoogleInteractionEvents({ baseURL, interactionId, headers, fetch,
5107
5254
  const { value: stream } = await getFromApi({
5108
5255
  url: buildUrl(),
5109
5256
  validateUrl: false,
5110
- headers: eventSourceHeaders,
5257
+ headers: {
5258
+ ...await resolve(headers),
5259
+ accept: "text/event-stream"
5260
+ },
5111
5261
  failedResponseHandler: googleFailedResponseHandler,
5112
5262
  successfulResponseHandler: createEventSourceResponseHandler(googleInteractionsEventSchema),
5113
5263
  abortSignal: effectiveSignal,
@@ -5578,10 +5728,10 @@ var GoogleInteractionsLanguageModel = class GoogleInteractionsLanguageModel {
5578
5728
  async doGenerate(options) {
5579
5729
  const { args, warnings, isAgent, isBackground, pollingTimeoutMs } = await this.getArgs(options);
5580
5730
  const url = `${this.config.baseURL}/interactions`;
5581
- const mergedHeaders = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers);
5731
+ const mergedHeaders = async () => combineHeaders(await resolve(this.config.headers), options.headers);
5582
5732
  let { responseHeaders, value: response, rawValue: rawResponse } = await postJsonToApi({
5583
5733
  url,
5584
- headers: mergedHeaders,
5734
+ headers: await resolve(mergedHeaders),
5585
5735
  body: args,
5586
5736
  failedResponseHandler: googleFailedResponseHandler,
5587
5737
  successfulResponseHandler: createJsonResponseHandler(googleInteractionsResponseSchema),
@@ -5645,7 +5795,7 @@ var GoogleInteractionsLanguageModel = class GoogleInteractionsLanguageModel {
5645
5795
  async doStream(options) {
5646
5796
  const { args, warnings, isBackground, pollingTimeoutMs } = await this.getArgs(options);
5647
5797
  const url = `${this.config.baseURL}/interactions`;
5648
- const mergedHeaders = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers);
5798
+ const mergedHeaders = async () => combineHeaders(await resolve(this.config.headers), options.headers);
5649
5799
  if (isBackground) return this.doStreamBackground({
5650
5800
  args,
5651
5801
  warnings,
@@ -5660,7 +5810,7 @@ var GoogleInteractionsLanguageModel = class GoogleInteractionsLanguageModel {
5660
5810
  };
5661
5811
  const { responseHeaders, value: response } = await postJsonToApi({
5662
5812
  url,
5663
- headers: mergedHeaders,
5813
+ headers: await resolve(mergedHeaders),
5664
5814
  body,
5665
5815
  failedResponseHandler: googleFailedResponseHandler,
5666
5816
  successfulResponseHandler: createEventSourceResponseHandler(googleInteractionsEventSchema),
@@ -5683,7 +5833,7 @@ var GoogleInteractionsLanguageModel = class GoogleInteractionsLanguageModel {
5683
5833
  async doStreamBackground({ args, warnings, url, mergedHeaders, options, pollingTimeoutMs }) {
5684
5834
  const { responseHeaders: postHeaders, value: postResponse } = await postJsonToApi({
5685
5835
  url,
5686
- headers: mergedHeaders,
5836
+ headers: await resolve(mergedHeaders),
5687
5837
  body: args,
5688
5838
  failedResponseHandler: googleFailedResponseHandler,
5689
5839
  successfulResponseHandler: createJsonResponseHandler(googleInteractionsResponseSchema),