@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.
- package/CHANGELOG.md +26 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +238 -81
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +226 -68
- package/dist/internal/index.js.map +1 -1
- package/docs/15-google.mdx +23 -11
- package/package.json +3 -3
- package/src/convert-to-google-messages.ts +61 -7
- package/src/google-batch.ts +3 -4
- package/src/google-embedding-model.ts +2 -1
- package/src/google-error.ts +37 -0
- package/src/google-files.ts +7 -7
- package/src/google-language-model.ts +43 -92
- package/src/google-model-capabilities.ts +7 -40
- package/src/google-model-catalog.ts +319 -0
- package/src/google-provider.ts +15 -11
- package/src/interactions/cancel-google-interaction.ts +7 -2
- package/src/interactions/google-interactions-language-model.ts +8 -12
- package/src/interactions/poll-google-interactions.ts +4 -2
- package/src/interactions/stream-google-interactions.ts +4 -7
- package/src/realtime/google-realtime-model.ts +7 -3
- package/src/speech-translation/google-speech-translation-model.ts +7 -2
|
@@ -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":";;;;KAcY;EACV,OAAO;IAAQ;;;KAGL;EACV;EACA,OAAO,MAAM;;cAGF,2BAAyB,EAAA;;;;GAOpC,EAAA,KAAA;;KAGU,sBAAsB,EAAE,aAAa;KAErC;EACN;EAAc;EAAmB;;EAEjC;IAAc;IAAkB;;EAChC,gBAAgB;EAChB;EACA;;EAGA;IAAgB;IAAa;IAAc;;EAC3C;;EAGA;IACE;IACA;IACA;IACA,QAAQ,MAAM;;;EAIhB;IAAY;IAAkB;;EAC9B,gBAAgB;EAChB;EACA;;EAGA;IACE;IACA;IACA;;EAEF;;EAGA;IACE;IACA;IACA;;EAEF;;EAGA;IACE;IACA;;;EAIF;IACE;IACA;;;KAII;EAEN;IAAc;IAAkB;;;EAGhC;IAAY;IAAkB;;;;;KCxFxB;;;
|
|
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,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 (
|
|
180
|
-
if (
|
|
181
|
-
|
|
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
|
-
|
|
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-
|
|
901
|
+
//#region src/google-model-catalog.ts
|
|
858
902
|
const gemini1ModelPattern = /(^|[/.])gemini-1(?:[.-]|$)/i;
|
|
859
903
|
const gemini2ModelPattern = /(^|[/.])gemini-2(?:[.-]|$)/i;
|
|
860
|
-
const gemini25ModelPattern
|
|
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
|
|
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
|
|
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
|
|
1450
|
-
const
|
|
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
|
|
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") &&
|
|
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
|
|
1716
|
-
const generateContent = (body) => postJsonToApi({
|
|
1901
|
+
const generateContent = async (body) => postJsonToApi({
|
|
1717
1902
|
url: `${this.config.baseURL}/${getModelPath(this.modelId)}:generateContent`,
|
|
1718
|
-
headers:
|
|
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
|
|
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
|
|
1904
|
-
isRetryable:
|
|
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 (
|
|
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 =
|
|
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
|
|
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:
|
|
2298
|
-
maxReasoningBudget:
|
|
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:
|
|
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 =
|
|
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 =
|
|
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),
|