@ai-sdk/google 4.0.108 → 4.0.110

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.
@@ -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,4 +1,4 @@
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";
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, stringifyWithBigIntAndCycles, withUserAgentSuffix, zodSchema } from "@ai-sdk/provider-utils";
2
2
  import { z } from "zod/v4";
3
3
  import { InvalidArgumentError, UnsupportedFunctionalityError } from "@ai-sdk/provider";
4
4
  //#region src/continue-google-stream.ts
@@ -175,13 +175,28 @@ function convertUrlToolResultPart(url) {
175
175
  data: parsedDataUrl.data
176
176
  } };
177
177
  }
178
- function containsJSONSchemaReference(value) {
179
- if (Array.isArray(value)) return value.some(containsJSONSchemaReference);
180
- if (typeof value !== "object" || value === null) return false;
181
- return Object.entries(value).some(([key, nestedValue]) => key === "$ref" || containsJSONSchemaReference(nestedValue));
178
+ function containsJSONSchemaReference(value, seen = /* @__PURE__ */ new WeakSet()) {
179
+ if (value === null || typeof value !== "object") return false;
180
+ if (seen.has(value)) return false;
181
+ seen.add(value);
182
+ if (Array.isArray(value)) return value.some((item) => containsJSONSchemaReference(item, seen));
183
+ return Object.entries(value).some(([key, nestedValue]) => key === "$ref" || containsJSONSchemaReference(nestedValue, seen));
182
184
  }
183
185
  function serializeFunctionResponseContent(value) {
184
- return containsJSONSchemaReference(value) ? JSON.stringify(value) : value;
186
+ if (containsJSONSchemaReference(value)) return stringifyWithBigIntAndCycles(value);
187
+ return containsNonJsonValue(value) ? secureJsonParse(stringifyWithBigIntAndCycles(value)) : value;
188
+ }
189
+ function containsNonJsonValue(value, ancestors = /* @__PURE__ */ new Set()) {
190
+ if (typeof value === "bigint") return true;
191
+ if (typeof value !== "object" || value === null) return false;
192
+ if (typeof value.toJSON === "function") return true;
193
+ if (ancestors.has(value)) return true;
194
+ ancestors.add(value);
195
+ try {
196
+ return Object.values(value).some((item) => containsNonJsonValue(item, ancestors));
197
+ } finally {
198
+ ancestors.delete(value);
199
+ }
185
200
  }
186
201
  function appendToolResultParts(parts, toolName, outputValue, toolCallId, includeFunctionCallIds = true, supportedUrls = {}) {
187
202
  const functionResponseParts = [];
@@ -422,7 +437,7 @@ function convertToGoogleMessages(prompt, options) {
422
437
  functionCall: {
423
438
  ...includeFunctionCallIds && part.toolCallId != null ? { id: part.toolCallId } : {},
424
439
  name: part.toolName,
425
- args: part.input
440
+ args: parseToolCallInput(part.input)
426
441
  },
427
442
  thoughtSignature: effectiveThoughtSignature
428
443
  };
@@ -510,6 +525,14 @@ function convertToGoogleMessages(prompt, options) {
510
525
  contents
511
526
  };
512
527
  }
528
+ function parseToolCallInput(input) {
529
+ if (typeof input !== "string") return input;
530
+ try {
531
+ return secureJsonParse(input);
532
+ } catch {
533
+ return input;
534
+ }
535
+ }
513
536
  //#endregion
514
537
  //#region src/download-tool-result-files.ts
515
538
  /**
@@ -618,6 +641,27 @@ const googleFailedResponseHandler = createJsonErrorResponseHandler({
618
641
  errorSchema: googleErrorDataSchema,
619
642
  errorToMessage: (data) => data.error.message
620
643
  });
644
+ function mapGoogleErrorStatusToHttpStatusCode(status) {
645
+ switch (status) {
646
+ case "CANCELLED": return 499;
647
+ case "INVALID_ARGUMENT":
648
+ case "FAILED_PRECONDITION":
649
+ case "OUT_OF_RANGE": return 400;
650
+ case "DEADLINE_EXCEEDED": return 504;
651
+ case "NOT_FOUND": return 404;
652
+ case "ALREADY_EXISTS":
653
+ case "ABORTED": return 409;
654
+ case "PERMISSION_DENIED": return 403;
655
+ case "UNAUTHENTICATED": return 401;
656
+ case "RESOURCE_EXHAUSTED": return 429;
657
+ case "UNIMPLEMENTED": return 501;
658
+ case "UNKNOWN":
659
+ case "INTERNAL":
660
+ case "DATA_LOSS": return 500;
661
+ case "UNAVAILABLE": return 503;
662
+ default: return;
663
+ }
664
+ }
621
665
  //#endregion
622
666
  //#region src/sanitize-response-json-schema.ts
623
667
  /**
@@ -854,11 +898,129 @@ const googleLanguageModelOptions = lazySchema(() => zodSchema(z.object({
854
898
  requestType: z.enum(["shared"]).optional()
855
899
  })));
856
900
  //#endregion
857
- //#region src/google-model-capabilities.ts
901
+ //#region src/google-model-catalog.ts
858
902
  const gemini1ModelPattern = /(^|[/.])gemini-1(?:[.-]|$)/i;
859
903
  const gemini2ModelPattern = /(^|[/.])gemini-2(?:[.-]|$)/i;
860
- const gemini25ModelPattern$1 = /(^|[/.])gemini-2\.5(?:[.-]|$)/i;
904
+ const gemini25ModelPattern = /(^|[/.])gemini-2\.5(?:[.-]|$)/i;
861
905
  const geminiModelPattern = /(^|[/.])gemini-/i;
906
+ /** Options accepted under providerOptions.google (or googleVertex on Vertex). */
907
+ const googleProviderOptions = { language: {
908
+ responseModalities: { description: "Response modalities to generate." },
909
+ thinkingConfig: { description: "Thinking budget, level, and thought output." },
910
+ cachedContent: { description: "Cached content to use as request context." },
911
+ structuredOutputs: { description: "Whether to send the JSON response schema." },
912
+ safetySettings: { description: "Safety settings for the request." },
913
+ threshold: { description: "Default threshold for configurable safety categories." },
914
+ audioTimestamp: { description: "Enable timestamp understanding for audio." },
915
+ labels: { description: "Billing labels. Vertex AI only." },
916
+ mediaResolution: { description: "Resolution used to process media inputs." },
917
+ imageConfig: { description: "Image generation configuration." },
918
+ retrievalConfig: { description: "Retrieval configuration for tools." },
919
+ streamFunctionCallArguments: { description: "Stream function arguments. Vertex AI only." },
920
+ serviceTier: { description: "Service tier. Gemini API only." },
921
+ continuationToken: { description: "Resume a response using its continuation token." },
922
+ sharedRequestType: { description: "Shared PayGo tier. Vertex AI only." },
923
+ requestType: { description: "Request routing type. Vertex AI only." }
924
+ } };
925
+ const standard = {
926
+ image: true,
927
+ objectGeneration: true,
928
+ tools: true,
929
+ streaming: true,
930
+ googleSearch: true,
931
+ urlContext: true
932
+ };
933
+ const googleModelCatalog = Object.fromEntries(Object.entries({
934
+ "gemini-nano-banana-2.1": {
935
+ image: true,
936
+ objectGeneration: false,
937
+ tools: false,
938
+ streaming: false,
939
+ googleSearch: true,
940
+ urlContext: false
941
+ },
942
+ "gemini-4-argon": standard,
943
+ "gemini-3.8-flash": standard,
944
+ "gemini-3.7-flash": standard,
945
+ "gemini-3.6-flash": standard,
946
+ "gemini-3.5-flash": standard,
947
+ "gemini-3.5-flash-lite": standard,
948
+ "gemini-3.1-pro-preview": standard,
949
+ "gemini-3.1-flash-image-preview": standard,
950
+ "gemini-3.1-flash-lite-preview": standard,
951
+ "gemini-3-pro-preview": standard,
952
+ "gemini-3-pro-image-preview": standard,
953
+ "gemini-3-flash-preview": standard,
954
+ "gemini-2.5-pro": standard,
955
+ "gemini-2.5-flash": standard,
956
+ "gemini-2.5-flash-lite": standard,
957
+ "gemini-2.5-flash-lite-preview-06-17": standard,
958
+ "gemini-2.0-flash": standard
959
+ }).map(([modelId, documented]) => [modelId, createGoogleLanguageModelEntry(modelId, documented)]));
960
+ function getGoogleLanguageModelEntry(modelId) {
961
+ return Object.prototype.hasOwnProperty.call(googleModelCatalog, modelId) ? googleModelCatalog[modelId] : createGoogleLanguageModelEntry(modelId);
962
+ }
963
+ function createGoogleLanguageModelEntry(modelId, documented) {
964
+ const runtime = resolveRuntimeDefinition(modelId);
965
+ const declared = documented != null;
966
+ const id = modelId.toLowerCase();
967
+ const thinkingFormat = runtime.usesGemini3Features && !modelId.includes("gemini-3-pro-image") ? "level" : "budget";
968
+ const minLevel = getMinimumThinkingLevelForGemini3Model(modelId);
969
+ return {
970
+ capabilities: { language: {
971
+ inputs: {
972
+ image: documented?.image ?? "unknown",
973
+ audio: "unknown"
974
+ },
975
+ objectGeneration: documented?.objectGeneration ?? "unknown",
976
+ tools: {
977
+ usage: documented?.tools ?? "unknown",
978
+ streaming: documented?.streaming ?? "unknown",
979
+ gemini2: runtime.supportsGemini2Tools,
980
+ googleSearch: documented?.googleSearch ?? "unknown",
981
+ urlContext: documented?.urlContext ?? "unknown",
982
+ fileSearch: runtime.supportsFileSearch,
983
+ mixed: runtime.usesGemini3Features,
984
+ functionResponseParts: runtime.usesGemini3Features
985
+ },
986
+ reasoning: {
987
+ support: "unknown",
988
+ efforts: thinkingFormat === "level" ? [
989
+ ...minLevel === "minimal" ? ["minimal"] : [],
990
+ "low",
991
+ "medium",
992
+ "high"
993
+ ] : void 0,
994
+ minBudget: id.includes("2.5-pro") ? 128 : 0,
995
+ maxBudget: id.includes("2.5-pro") || id.includes("gemini-3-pro-image") ? 32768 : 24576
996
+ },
997
+ sampling: {
998
+ temperature: "unknown",
999
+ topP: "unknown",
1000
+ topK: "unknown",
1001
+ logprobs: false,
1002
+ penalties: gemini25ModelPattern.test(modelId) ? { condition: "Only supported on the Vertex AI API." } : true
1003
+ },
1004
+ structuredOutput: { withFunctionTools: runtime.usesGemini3Features }
1005
+ } },
1006
+ providerOptions: { language: declareProviderOptions(declared ? true : "unknown", {
1007
+ labels: { condition: "Only supported on the Vertex AI API." },
1008
+ sharedRequestType: { condition: "Only supported on the Vertex AI API." },
1009
+ requestType: { condition: "Only supported on the Vertex AI API." },
1010
+ serviceTier: { condition: "Only supported on the Gemini API." },
1011
+ streamFunctionCallArguments: { condition: "Only supported for streaming requests on the Vertex AI API with Gemini 3 or newer." }
1012
+ }) },
1013
+ requestConfig: { language: {
1014
+ systemInstruction: id.startsWith("gemma-") ? "user" : "system",
1015
+ thinkingFormat,
1016
+ reasoningMaxOutputTokens: 65536,
1017
+ jsonResponseTool: /(^|\/)gemini-/i.test(modelId)
1018
+ } }
1019
+ };
1020
+ }
1021
+ function declareProviderOptions(support, exceptions) {
1022
+ return Object.fromEntries(Object.keys(googleProviderOptions.language).map((option) => [option, exceptions[option] ?? support]));
1023
+ }
862
1024
  function isKnownPreGemini2Model(modelId) {
863
1025
  return gemini1ModelPattern.test(modelId) || /(^|[/.])gemini-pro(?:-vision)?$/i.test(modelId) || /(^|[/.])gemini-robotics-er-1\.5(?:[.-]|$)/i.test(modelId);
864
1026
  }
@@ -869,17 +1031,39 @@ function isKnownPreGemini2Model(modelId) {
869
1031
  * intentionally inherit the newest supported behavior. Add exceptions here
870
1032
  * only when a model is known to require a legacy request shape.
871
1033
  */
872
- function getGoogleModelCapabilities(modelId) {
1034
+ function resolveRuntimeDefinition(modelId) {
873
1035
  const isGeminiModel = geminiModelPattern.test(modelId);
874
1036
  const isGemini2Model = gemini2ModelPattern.test(modelId);
875
1037
  const isKnownPreGemini2 = isKnownPreGemini2Model(modelId);
876
1038
  const usesGemini3Features = isGeminiModel && !(isKnownPreGemini2 || isGemini2Model);
877
1039
  return {
878
1040
  supportsGemini2Tools: isGeminiModel && !isKnownPreGemini2 || modelId.toLowerCase().includes("nano-banana"),
879
- supportsFileSearch: gemini25ModelPattern$1.test(modelId) || usesGemini3Features,
1041
+ supportsFileSearch: gemini25ModelPattern.test(modelId) || usesGemini3Features,
880
1042
  usesGemini3Features
881
1043
  };
882
1044
  }
1045
+ function getMinimumThinkingLevelForGemini3Model(modelId) {
1046
+ const modelName = /(?:^|[/.])(gemini-[^/]*)$/i.exec(modelId)?.[1].toLowerCase();
1047
+ if (modelName === "gemini-flash-latest") return "low";
1048
+ const proVersionMatch = /^gemini-(\d+)(?:\.\d+)?-pro(?:$|-)/.exec(modelName ?? "");
1049
+ if (Number(proVersionMatch?.[1]) >= 3) return "low";
1050
+ const versionMatch = /^gemini-(\d+)\.(\d+)-flash(?:$|-(?!lite(?:-|$)))/.exec(modelName ?? "");
1051
+ if (versionMatch == null) return "minimal";
1052
+ const majorVersion = Number(versionMatch[1]);
1053
+ const minorVersion = Number(versionMatch[2]);
1054
+ return majorVersion > 3 || majorVersion === 3 && minorVersion >= 7 ? "low" : "minimal";
1055
+ }
1056
+ //#endregion
1057
+ //#region src/google-model-capabilities.ts
1058
+ /** Compatibility projection of the resolved catalog for existing request code. */
1059
+ function getGoogleModelCapabilities(modelId) {
1060
+ const { tools } = getGoogleLanguageModelEntry(modelId).capabilities.language;
1061
+ return {
1062
+ supportsGemini2Tools: tools.gemini2,
1063
+ supportsFileSearch: tools.fileSearch,
1064
+ usesGemini3Features: tools.mixed
1065
+ };
1066
+ }
883
1067
  //#endregion
884
1068
  //#region src/google-prepare-tools.ts
885
1069
  function prepareTools({ tools, toolChoice, modelId, isVertexProvider = false }) {
@@ -1361,7 +1545,6 @@ const configurableSafetySettingCategories = [
1361
1545
  "HARM_CATEGORY_HARASSMENT",
1362
1546
  "HARM_CATEGORY_SEXUALLY_EXPLICIT"
1363
1547
  ];
1364
- const gemini25ModelPattern = /(^|[/.])gemini-2\.5(?:[.-]|$)/i;
1365
1548
  const googleCloudStorageFunctionResponseUrls = {
1366
1549
  "image/png": [/^gs:\/\/.*$/],
1367
1550
  "image/jpeg": [/^gs:\/\/.*$/],
@@ -1446,8 +1629,9 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1446
1629
  imageConfig = geminiApiImageConfig;
1447
1630
  }
1448
1631
  }
1449
- const isGemmaModel = modelId.toLowerCase().startsWith("gemma-");
1450
- const isGemini25DeveloperApiModel = !isVertexProvider && gemini25ModelPattern.test(modelId);
1632
+ const entry = getGoogleLanguageModelEntry(modelId);
1633
+ const isGemmaModel = entry.requestConfig.language.systemInstruction === "user";
1634
+ const isGemini25DeveloperApiModel = !isVertexProvider && entry.capabilities.language.sampling.penalties !== true;
1451
1635
  if (isGemini25DeveloperApiModel && frequencyPenalty != null) warnings.push({
1452
1636
  type: "unsupported",
1453
1637
  feature: "frequencyPenalty"
@@ -1456,7 +1640,7 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1456
1640
  type: "unsupported",
1457
1641
  feature: "presencePenalty"
1458
1642
  });
1459
- const { usesGemini3Features } = getGoogleModelCapabilities(modelId);
1643
+ const usesGemini3Features = entry.capabilities.language.tools.functionResponseParts;
1460
1644
  const supportedFunctionResponseUrls = usesGemini3Features && config.downloadToolResultFiles?.supportsGoogleCloudStorageUrls ? googleCloudStorageFunctionResponseUrls : void 0;
1461
1645
  const { contents, systemInstruction } = convertToGoogleMessages(config.downloadToolResultFiles ? await downloadToolResultFiles(prompt, {
1462
1646
  abortSignal,
@@ -1541,8 +1725,10 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1541
1725
  }
1542
1726
  async getArgs(options, { isStreaming = false } = {}) {
1543
1727
  const { responseFormat, tools, toolChoice } = options;
1728
+ const entry = getGoogleLanguageModelEntry(this.modelId);
1729
+ const { structuredOutput } = entry.capabilities.language;
1544
1730
  let jsonResponseTool;
1545
- 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")) {
1731
+ 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")) {
1546
1732
  let name = "json";
1547
1733
  for (let suffix = 1; tools.some((tool) => tool.name === name); suffix++) name = `json_${suffix}`;
1548
1734
  jsonResponseTool = {
@@ -1712,10 +1898,9 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1712
1898
  }
1713
1899
  async doGenerate(options) {
1714
1900
  const { args, warnings, providerOptionsNames, extraHeaders, toolNameMapping, jsonResponseToolName } = await this.getArgs(options);
1715
- const mergedHeaders = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers, extraHeaders);
1716
- const generateContent = (body) => postJsonToApi({
1901
+ const generateContent = async (body) => postJsonToApi({
1717
1902
  url: `${this.config.baseURL}/${getModelPath(this.modelId)}:generateContent`,
1718
- headers: mergedHeaders,
1903
+ headers: combineHeaders(await resolve(this.config.headers), options.headers, extraHeaders),
1719
1904
  body,
1720
1905
  failedResponseHandler: googleFailedResponseHandler,
1721
1906
  successfulResponseHandler: createJsonResponseHandler(responseSchema),
@@ -1778,10 +1963,9 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1778
1963
  async doStream(options) {
1779
1964
  const { args, warnings, providerOptionsNames, extraHeaders, toolNameMapping, jsonResponseToolName } = await this.getArgs(options, { isStreaming: true });
1780
1965
  const wrapProviderMetadata = (payload) => Object.fromEntries(providerOptionsNames.map((name) => [name, payload]));
1781
- const headers = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers, extraHeaders);
1782
- const streamGenerateContent = (body) => postJsonToApi({
1966
+ const streamGenerateContent = async (body) => postJsonToApi({
1783
1967
  url: `${this.config.baseURL}/${getModelPath(this.modelId)}:streamGenerateContent?alt=sse`,
1784
- headers,
1968
+ headers: combineHeaders(await resolve(this.config.headers), options.headers, extraHeaders),
1785
1969
  body,
1786
1970
  failedResponseHandler: googleFailedResponseHandler,
1787
1971
  successfulResponseHandler: createEventSourceResponseHandler(chunkSchema),
@@ -1894,14 +2078,15 @@ var GoogleLanguageModel = class GoogleLanguageModel {
1894
2078
  raw: void 0
1895
2079
  };
1896
2080
  const error = value.error;
2081
+ const statusCode = error.code ?? mapGoogleErrorStatusToHttpStatusCode(error.status);
1897
2082
  controller.enqueue({
1898
2083
  type: "error",
1899
2084
  error: createProviderStreamError({
1900
2085
  message: error.message,
1901
2086
  type: error.status,
1902
2087
  code: error.code ?? void 0,
1903
- statusCode: error.code ?? void 0,
1904
- isRetryable: error.code != null && (error.code === 408 || error.code === 409 || error.code === 429 || error.code >= 500),
2088
+ statusCode,
2089
+ isRetryable: statusCode != null && (statusCode === 408 || statusCode === 409 || statusCode === 429 || statusCode >= 500),
1905
2090
  data: error
1906
2091
  })
1907
2092
  });
@@ -2234,25 +2419,9 @@ var GoogleLanguageModel = class GoogleLanguageModel {
2234
2419
  };
2235
2420
  }
2236
2421
  };
2237
- function getMaxOutputTokensForGemini25Model() {
2238
- return 65536;
2239
- }
2240
- function getMaxThinkingTokensForGemini25Model(modelId) {
2241
- const id = modelId.toLowerCase();
2242
- if (id.includes("2.5-pro") || id.includes("gemini-3-pro-image")) return 32768;
2243
- return 24576;
2244
- }
2245
- /**
2246
- * Gemini 2.5 Pro cannot disable thinking and requires a thinking budget of at
2247
- * least 128 tokens. Other Gemini 2.5 models can disable thinking with a budget
2248
- * of 0.
2249
- */
2250
- function getMinThinkingTokensForGemini25Model(modelId) {
2251
- return modelId.toLowerCase().includes("2.5-pro") ? 128 : 0;
2252
- }
2253
2422
  function resolveThinkingConfig({ reasoning, modelId, warnings }) {
2254
2423
  if (!isCustomReasoning(reasoning)) return;
2255
- if (getGoogleModelCapabilities(modelId).usesGemini3Features && !modelId.includes("gemini-3-pro-image")) return resolveGemini3ThinkingConfig({
2424
+ if (getGoogleLanguageModelEntry(modelId).requestConfig.language.thinkingFormat === "level") return resolveGemini3ThinkingConfig({
2256
2425
  reasoning,
2257
2426
  modelId,
2258
2427
  warnings
@@ -2264,7 +2433,7 @@ function resolveThinkingConfig({ reasoning, modelId, warnings }) {
2264
2433
  });
2265
2434
  }
2266
2435
  function resolveGemini3ThinkingConfig({ reasoning, modelId, warnings }) {
2267
- const minimumThinkingLevel = getMinimumThinkingLevelForGemini3Model(modelId);
2436
+ const minimumThinkingLevel = getGoogleLanguageModelEntry(modelId).capabilities.language.reasoning.efforts?.[0];
2268
2437
  const thinkingLevel = mapReasoningToProviderEffort({
2269
2438
  reasoning,
2270
2439
  effortMap: {
@@ -2278,24 +2447,14 @@ function resolveGemini3ThinkingConfig({ reasoning, modelId, warnings }) {
2278
2447
  if (thinkingLevel == null) return;
2279
2448
  return { thinkingLevel };
2280
2449
  }
2281
- function getMinimumThinkingLevelForGemini3Model(modelId) {
2282
- const modelName = /(?:^|[/.])(gemini-[^/]*)$/i.exec(modelId)?.[1].toLowerCase();
2283
- if (modelName === "gemini-flash-latest") return "low";
2284
- const proVersionMatch = /^gemini-(\d+)(?:\.\d+)?-pro(?:$|-)/.exec(modelName ?? "");
2285
- if (Number(proVersionMatch?.[1]) >= 3) return "low";
2286
- const versionMatch = /^gemini-(\d+)\.(\d+)-flash(?:$|-(?!lite(?:-|$)))/.exec(modelName ?? "");
2287
- if (versionMatch == null) return "minimal";
2288
- const majorVersion = Number(versionMatch[1]);
2289
- const minorVersion = Number(versionMatch[2]);
2290
- return majorVersion > 3 || majorVersion === 3 && minorVersion >= 7 ? "low" : "minimal";
2291
- }
2292
2450
  function resolveGemini25ThinkingConfig({ reasoning, modelId, warnings }) {
2293
- const minThinkingBudget = getMinThinkingTokensForGemini25Model(modelId);
2451
+ const entry = getGoogleLanguageModelEntry(modelId);
2452
+ const minThinkingBudget = entry.capabilities.language.reasoning.minBudget;
2294
2453
  if (reasoning === "none" && minThinkingBudget === 0) return { thinkingBudget: 0 };
2295
2454
  return { thinkingBudget: mapReasoningToProviderBudget({
2296
2455
  reasoning,
2297
- maxOutputTokens: getMaxOutputTokensForGemini25Model(),
2298
- maxReasoningBudget: getMaxThinkingTokensForGemini25Model(modelId),
2456
+ maxOutputTokens: entry.requestConfig.language.reasoningMaxOutputTokens,
2457
+ maxReasoningBudget: entry.capabilities.language.reasoning.maxBudget,
2299
2458
  minReasoningBudget: minThinkingBudget,
2300
2459
  warnings
2301
2460
  }) };
@@ -4873,7 +5032,7 @@ async function cancelGoogleInteraction({ baseURL, interactionId, headers, fetch
4873
5032
  try {
4874
5033
  const response = await fetch(url, {
4875
5034
  method: "POST",
4876
- headers: withUserAgentSuffix(combineHeaders({ "Content-Type": "application/json" }, headers), getRuntimeEnvironmentUserAgent()),
5035
+ headers: withUserAgentSuffix(combineHeaders({ "Content-Type": "application/json" }, await resolve(headers)), getRuntimeEnvironmentUserAgent()),
4877
5036
  body: "{}"
4878
5037
  });
4879
5038
  try {
@@ -4923,7 +5082,7 @@ async function pollGoogleInteractionUntilTerminal({ baseURL, interactionId, head
4923
5082
  const { value: response, rawValue: rawResponse, responseHeaders } = await getFromApi({
4924
5083
  url,
4925
5084
  validateUrl: false,
4926
- headers,
5085
+ headers: await resolve(headers),
4927
5086
  failedResponseHandler: googleFailedResponseHandler,
4928
5087
  successfulResponseHandler: createJsonResponseHandler(googleInteractionsResponseSchema),
4929
5088
  abortSignal,
@@ -5118,10 +5277,6 @@ const DEFAULT_RETRY_DELAY_MS = 500;
5118
5277
  */
5119
5278
  function streamGoogleInteractionEvents({ baseURL, interactionId, headers, fetch, abortSignal, maxRetries = DEFAULT_MAX_RETRIES, retryDelayMs = DEFAULT_RETRY_DELAY_MS }) {
5120
5279
  if (interactionId.length === 0) throw new Error("google.interactions: cannot stream a background interaction without an id.");
5121
- const eventSourceHeaders = {
5122
- ...headers,
5123
- accept: "text/event-stream"
5124
- };
5125
5280
  let lastEventId;
5126
5281
  let complete = false;
5127
5282
  let attempt = 0;
@@ -5144,7 +5299,10 @@ function streamGoogleInteractionEvents({ baseURL, interactionId, headers, fetch,
5144
5299
  const { value: stream } = await getFromApi({
5145
5300
  url: buildUrl(),
5146
5301
  validateUrl: false,
5147
- headers: eventSourceHeaders,
5302
+ headers: {
5303
+ ...await resolve(headers),
5304
+ accept: "text/event-stream"
5305
+ },
5148
5306
  failedResponseHandler: googleFailedResponseHandler,
5149
5307
  successfulResponseHandler: createEventSourceResponseHandler(googleInteractionsEventSchema),
5150
5308
  abortSignal: effectiveSignal,
@@ -5615,10 +5773,10 @@ var GoogleInteractionsLanguageModel = class GoogleInteractionsLanguageModel {
5615
5773
  async doGenerate(options) {
5616
5774
  const { args, warnings, isAgent, isBackground, pollingTimeoutMs } = await this.getArgs(options);
5617
5775
  const url = `${this.config.baseURL}/interactions`;
5618
- const mergedHeaders = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers);
5776
+ const mergedHeaders = async () => combineHeaders(await resolve(this.config.headers), options.headers);
5619
5777
  let { responseHeaders, value: response, rawValue: rawResponse } = await postJsonToApi({
5620
5778
  url,
5621
- headers: mergedHeaders,
5779
+ headers: await resolve(mergedHeaders),
5622
5780
  body: args,
5623
5781
  failedResponseHandler: googleFailedResponseHandler,
5624
5782
  successfulResponseHandler: createJsonResponseHandler(googleInteractionsResponseSchema),
@@ -5682,7 +5840,7 @@ var GoogleInteractionsLanguageModel = class GoogleInteractionsLanguageModel {
5682
5840
  async doStream(options) {
5683
5841
  const { args, warnings, isBackground, pollingTimeoutMs } = await this.getArgs(options);
5684
5842
  const url = `${this.config.baseURL}/interactions`;
5685
- const mergedHeaders = combineHeaders(this.config.headers ? await resolve(this.config.headers) : void 0, options.headers);
5843
+ const mergedHeaders = async () => combineHeaders(await resolve(this.config.headers), options.headers);
5686
5844
  if (isBackground) return this.doStreamBackground({
5687
5845
  args,
5688
5846
  warnings,
@@ -5697,7 +5855,7 @@ var GoogleInteractionsLanguageModel = class GoogleInteractionsLanguageModel {
5697
5855
  };
5698
5856
  const { responseHeaders, value: response } = await postJsonToApi({
5699
5857
  url,
5700
- headers: mergedHeaders,
5858
+ headers: await resolve(mergedHeaders),
5701
5859
  body,
5702
5860
  failedResponseHandler: googleFailedResponseHandler,
5703
5861
  successfulResponseHandler: createEventSourceResponseHandler(googleInteractionsEventSchema),
@@ -5720,7 +5878,7 @@ var GoogleInteractionsLanguageModel = class GoogleInteractionsLanguageModel {
5720
5878
  async doStreamBackground({ args, warnings, url, mergedHeaders, options, pollingTimeoutMs }) {
5721
5879
  const { responseHeaders: postHeaders, value: postResponse } = await postJsonToApi({
5722
5880
  url,
5723
- headers: mergedHeaders,
5881
+ headers: await resolve(mergedHeaders),
5724
5882
  body: args,
5725
5883
  failedResponseHandler: googleFailedResponseHandler,
5726
5884
  successfulResponseHandler: createJsonResponseHandler(googleInteractionsResponseSchema),