@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.
- package/CHANGELOG.md +34 -0
- package/dist/index.d.ts +11 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +262 -113
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +9 -0
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +249 -99
- package/dist/internal/index.js.map +1 -1
- package/docs/15-google.mdx +27 -3
- package/package.json +3 -3
- package/src/convert-to-google-messages.ts +16 -5
- package/src/google-batch.ts +3 -4
- package/src/google-embedding-model.ts +2 -1
- package/src/google-files.ts +7 -7
- package/src/google-json-accumulator.ts +26 -14
- package/src/google-language-model.ts +42 -90
- package/src/google-model-capabilities.ts +7 -40
- package/src/google-model-catalog.ts +319 -0
- package/src/google-prompt.ts +15 -0
- package/src/google-provider.ts +15 -11
- package/src/index.ts +1 -0
- 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
package/dist/internal/index.d.ts
CHANGED
|
@@ -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":";;;;
|
|
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
|
@@ -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":
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
})
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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-
|
|
857
|
+
//#region src/google-model-catalog.ts
|
|
831
858
|
const gemini1ModelPattern = /(^|[/.])gemini-1(?:[.-]|$)/i;
|
|
832
859
|
const gemini2ModelPattern = /(^|[/.])gemini-2(?:[.-]|$)/i;
|
|
833
|
-
const gemini25ModelPattern
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1417
|
-
const
|
|
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
|
|
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") &&
|
|
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
|
|
1683
|
-
const generateContent = (body) => postJsonToApi({
|
|
1857
|
+
const generateContent = async (body) => postJsonToApi({
|
|
1684
1858
|
url: `${this.config.baseURL}/${getModelPath(this.modelId)}:generateContent`,
|
|
1685
|
-
headers:
|
|
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
|
|
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 (
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
2256
|
-
const
|
|
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:
|
|
2259
|
-
maxReasoningBudget:
|
|
2260
|
-
minReasoningBudget:
|
|
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:
|
|
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 =
|
|
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 =
|
|
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),
|