@ai-sdk/google 3.0.121 → 3.0.123
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 +15 -0
- package/dist/index.js +74 -59
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +74 -59
- package/dist/index.mjs.map +1 -1
- package/dist/internal/index.js +57 -54
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/index.mjs +57 -54
- package/dist/internal/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/google-generative-ai-image-model.ts +23 -5
- package/src/google-generative-ai-language-model.ts +63 -51
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/google",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.123",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@ai-sdk/provider": "3.0.
|
|
40
|
-
"@ai-sdk/provider-utils": "4.0.
|
|
39
|
+
"@ai-sdk/provider": "3.0.16",
|
|
40
|
+
"@ai-sdk/provider-utils": "4.0.51"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "20.17.24",
|
|
@@ -159,7 +159,9 @@ export class GoogleGenerativeAIImageModel implements ImageModelV3 {
|
|
|
159
159
|
};
|
|
160
160
|
|
|
161
161
|
const { responseHeaders, value: response } = await postJsonToApi<{
|
|
162
|
-
predictions: Array<
|
|
162
|
+
predictions: Array<
|
|
163
|
+
{ bytesBase64Encoded: string } | { raiFilteredReason: string }
|
|
164
|
+
>;
|
|
163
165
|
}>({
|
|
164
166
|
url: `${this.config.baseURL}/models/${this.modelId}:predict`,
|
|
165
167
|
headers: combineHeaders(await resolve(this.config.headers), headers),
|
|
@@ -171,14 +173,22 @@ export class GoogleGenerativeAIImageModel implements ImageModelV3 {
|
|
|
171
173
|
abortSignal,
|
|
172
174
|
fetch: this.config.fetch,
|
|
173
175
|
});
|
|
176
|
+
const imagePredictions = response.predictions.filter(
|
|
177
|
+
(prediction): prediction is { bytesBase64Encoded: string } =>
|
|
178
|
+
'bytesBase64Encoded' in prediction,
|
|
179
|
+
);
|
|
180
|
+
|
|
174
181
|
return {
|
|
175
|
-
images:
|
|
176
|
-
(
|
|
182
|
+
images: imagePredictions.map(
|
|
183
|
+
({ bytesBase64Encoded }) => bytesBase64Encoded,
|
|
177
184
|
),
|
|
185
|
+
...(response.predictions.some(
|
|
186
|
+
prediction => 'raiFilteredReason' in prediction,
|
|
187
|
+
) && { isRetryable: false }),
|
|
178
188
|
warnings,
|
|
179
189
|
providerMetadata: {
|
|
180
190
|
google: {
|
|
181
|
-
images:
|
|
191
|
+
images: imagePredictions.map(() => ({
|
|
182
192
|
// Add any prediction-specific metadata here
|
|
183
193
|
})),
|
|
184
194
|
},
|
|
@@ -341,6 +351,9 @@ export class GoogleGenerativeAIImageModel implements ImageModelV3 {
|
|
|
341
351
|
|
|
342
352
|
return {
|
|
343
353
|
images,
|
|
354
|
+
...(result.finishReason.unified === 'content-filter'
|
|
355
|
+
? { isRetryable: false }
|
|
356
|
+
: {}),
|
|
344
357
|
warnings,
|
|
345
358
|
providerMetadata: {
|
|
346
359
|
google: {
|
|
@@ -375,7 +388,12 @@ const googleImageResponseSchema = lazySchema(() =>
|
|
|
375
388
|
zodSchema(
|
|
376
389
|
z.object({
|
|
377
390
|
predictions: z
|
|
378
|
-
.array(
|
|
391
|
+
.array(
|
|
392
|
+
z.union([
|
|
393
|
+
z.object({ bytesBase64Encoded: z.string() }),
|
|
394
|
+
z.object({ raiFilteredReason: z.string() }),
|
|
395
|
+
]),
|
|
396
|
+
)
|
|
379
397
|
.default([]),
|
|
380
398
|
}),
|
|
381
399
|
),
|
|
@@ -615,9 +615,12 @@ export class GoogleGenerativeAILanguageModel implements LanguageModelV3 {
|
|
|
615
615
|
raw: undefined,
|
|
616
616
|
};
|
|
617
617
|
let usage: GoogleGenerativeAIUsageMetadata | undefined = undefined;
|
|
618
|
-
let
|
|
618
|
+
let promptFeedback: PromptFeedbackSchema | null = null;
|
|
619
619
|
let lastGroundingMetadata: GroundingMetadataSchema | null = null;
|
|
620
620
|
let lastUrlContextMetadata: UrlContextMetadataSchema | null = null;
|
|
621
|
+
let lastSafetyRatings: SafetyRatingSchema[] | null = null;
|
|
622
|
+
let lastFinishMessage: string | null = null;
|
|
623
|
+
let confirmedPromptBlockReason: string | undefined;
|
|
621
624
|
|
|
622
625
|
const generateId = this.config.generateId;
|
|
623
626
|
let hasToolCalls = false;
|
|
@@ -714,40 +717,48 @@ export class GoogleGenerativeAILanguageModel implements LanguageModelV3 {
|
|
|
714
717
|
usage = usageMetadata;
|
|
715
718
|
}
|
|
716
719
|
|
|
717
|
-
|
|
720
|
+
if (
|
|
721
|
+
value.promptFeedback != null &&
|
|
722
|
+
confirmedPromptBlockReason == null
|
|
723
|
+
) {
|
|
724
|
+
promptFeedback = value.promptFeedback;
|
|
718
725
|
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
726
|
+
if (
|
|
727
|
+
isConfirmedPromptBlockReason(value.promptFeedback.blockReason)
|
|
728
|
+
) {
|
|
729
|
+
confirmedPromptBlockReason = value.promptFeedback.blockReason;
|
|
723
730
|
finishReason = {
|
|
724
731
|
unified: 'content-filter',
|
|
725
|
-
raw:
|
|
726
|
-
};
|
|
727
|
-
providerMetadata = {
|
|
728
|
-
[providerOptionsName]: {
|
|
729
|
-
promptFeedback: value.promptFeedback ?? null,
|
|
730
|
-
groundingMetadata: lastGroundingMetadata,
|
|
731
|
-
urlContextMetadata: lastUrlContextMetadata,
|
|
732
|
-
safetyRatings: null,
|
|
733
|
-
usageMetadata: usageMetadata ?? null,
|
|
734
|
-
finishMessage: null,
|
|
735
|
-
serviceTier: usage?.serviceTier ?? null,
|
|
736
|
-
} satisfies GoogleGenerativeAIProviderMetadata,
|
|
732
|
+
raw: confirmedPromptBlockReason,
|
|
737
733
|
};
|
|
738
734
|
}
|
|
739
|
-
return;
|
|
740
735
|
}
|
|
741
736
|
|
|
742
|
-
const
|
|
737
|
+
const candidate = value.candidates?.[0];
|
|
743
738
|
|
|
744
|
-
if (candidate
|
|
745
|
-
|
|
739
|
+
if (candidate != null) {
|
|
740
|
+
if (candidate.groundingMetadata != null) {
|
|
741
|
+
lastGroundingMetadata = candidate.groundingMetadata;
|
|
742
|
+
}
|
|
743
|
+
if (candidate.urlContextMetadata != null) {
|
|
744
|
+
lastUrlContextMetadata = candidate.urlContextMetadata;
|
|
745
|
+
}
|
|
746
|
+
if (candidate.safetyRatings != null) {
|
|
747
|
+
lastSafetyRatings = candidate.safetyRatings;
|
|
748
|
+
}
|
|
749
|
+
if (candidate.finishMessage != null) {
|
|
750
|
+
lastFinishMessage = candidate.finishMessage;
|
|
751
|
+
}
|
|
746
752
|
}
|
|
747
|
-
|
|
748
|
-
|
|
753
|
+
|
|
754
|
+
// A confirmed prompt block is terminal for generated content, but
|
|
755
|
+
// later chunks can still contribute usage and provider metadata.
|
|
756
|
+
if (confirmedPromptBlockReason != null || candidate == null) {
|
|
757
|
+
return;
|
|
749
758
|
}
|
|
750
759
|
|
|
760
|
+
const content = candidate.content;
|
|
761
|
+
|
|
751
762
|
const sources = extractSources({
|
|
752
763
|
groundingMetadata: candidate.groundingMetadata,
|
|
753
764
|
generateId,
|
|
@@ -1125,33 +1136,13 @@ export class GoogleGenerativeAILanguageModel implements LanguageModelV3 {
|
|
|
1125
1136
|
}
|
|
1126
1137
|
}
|
|
1127
1138
|
|
|
1128
|
-
|
|
1129
|
-
const isPromptBlocked =
|
|
1130
|
-
candidate.finishReason == null && promptBlockReason != null;
|
|
1131
|
-
const rawFinishReason =
|
|
1132
|
-
candidate.finishReason ?? promptBlockReason ?? undefined;
|
|
1133
|
-
|
|
1134
|
-
if (rawFinishReason != null) {
|
|
1139
|
+
if (candidate.finishReason != null) {
|
|
1135
1140
|
finishReason = {
|
|
1136
|
-
unified:
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
}),
|
|
1142
|
-
raw: rawFinishReason,
|
|
1143
|
-
};
|
|
1144
|
-
|
|
1145
|
-
providerMetadata = {
|
|
1146
|
-
[providerOptionsName]: {
|
|
1147
|
-
promptFeedback: value.promptFeedback ?? null,
|
|
1148
|
-
groundingMetadata: lastGroundingMetadata,
|
|
1149
|
-
urlContextMetadata: lastUrlContextMetadata,
|
|
1150
|
-
safetyRatings: candidate.safetyRatings ?? null,
|
|
1151
|
-
usageMetadata: usageMetadata ?? null,
|
|
1152
|
-
finishMessage: candidate.finishMessage ?? null,
|
|
1153
|
-
serviceTier: usage?.serviceTier ?? null,
|
|
1154
|
-
} satisfies GoogleGenerativeAIProviderMetadata,
|
|
1141
|
+
unified: mapGoogleGenerativeAIFinishReason({
|
|
1142
|
+
finishReason: candidate.finishReason,
|
|
1143
|
+
hasToolCalls,
|
|
1144
|
+
}),
|
|
1145
|
+
raw: candidate.finishReason,
|
|
1155
1146
|
};
|
|
1156
1147
|
}
|
|
1157
1148
|
},
|
|
@@ -1174,7 +1165,17 @@ export class GoogleGenerativeAILanguageModel implements LanguageModelV3 {
|
|
|
1174
1165
|
type: 'finish',
|
|
1175
1166
|
finishReason,
|
|
1176
1167
|
usage: convertGoogleGenerativeAIUsage(usage),
|
|
1177
|
-
providerMetadata
|
|
1168
|
+
providerMetadata: {
|
|
1169
|
+
[providerOptionsName]: {
|
|
1170
|
+
promptFeedback,
|
|
1171
|
+
groundingMetadata: lastGroundingMetadata,
|
|
1172
|
+
urlContextMetadata: lastUrlContextMetadata,
|
|
1173
|
+
safetyRatings: lastSafetyRatings,
|
|
1174
|
+
usageMetadata: usage ?? null,
|
|
1175
|
+
finishMessage: lastFinishMessage,
|
|
1176
|
+
serviceTier: usage?.serviceTier ?? null,
|
|
1177
|
+
} satisfies GoogleGenerativeAIProviderMetadata,
|
|
1178
|
+
},
|
|
1178
1179
|
});
|
|
1179
1180
|
},
|
|
1180
1181
|
}),
|
|
@@ -1609,3 +1610,14 @@ const chunkSchema = lazySchema(() =>
|
|
|
1609
1610
|
);
|
|
1610
1611
|
|
|
1611
1612
|
type ChunkSchema = InferSchema<typeof chunkSchema>;
|
|
1613
|
+
|
|
1614
|
+
function isConfirmedPromptBlockReason(
|
|
1615
|
+
blockReason: string | null | undefined,
|
|
1616
|
+
): blockReason is string {
|
|
1617
|
+
return (
|
|
1618
|
+
blockReason != null &&
|
|
1619
|
+
blockReason !== '' &&
|
|
1620
|
+
blockReason !== 'BLOCK_REASON_UNSPECIFIED' &&
|
|
1621
|
+
blockReason !== 'BLOCKED_REASON_UNSPECIFIED'
|
|
1622
|
+
);
|
|
1623
|
+
}
|