Skip to content
Merged
6 changes: 6 additions & 0 deletions .changeset/serious-jars-train.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@ai-sdk/google-vertex': patch
'@ai-sdk/google': patch
---

fix(vertex): allow 'vertex' as a key for providerOptions
46 changes: 46 additions & 0 deletions content/docs/08-migration-guides/24-migration-guide-6-0.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,52 @@ const result = await generateObject({
});
```

### Google Vertex

#### `providerMetadata` and `providerOptions` Key

The `@ai-sdk/google-vertex` provider now uses `vertex` as the key for `providerMetadata` and `providerOptions` instead of `google`. The `google` key is still supported for `providerOptions` input, but resulting `providerMetadata` output now uses `vertex`.

```tsx filename="AI SDK 5"
import { vertex } from '@ai-sdk/google-vertex';
import { generateText } from 'ai';

const result = await generateText({
model: vertex('gemini-2.5-flash'),
providerOptions: {
google: {
safetySettings: [
/* ... */
],
}, // Used 'google' key
},
prompt: 'Hello',
});

// Accessed metadata via 'google' key
console.log(result.providerMetadata?.google?.safetyRatings);
```

```tsx filename="AI SDK 6"
import { vertex } from '@ai-sdk/google-vertex';
import { generateText } from 'ai';

const result = await generateText({
model: vertex('gemini-2.5-flash'),
providerOptions: {
vertex: {
safetySettings: [
/* ... */
],
}, // Now uses 'vertex' key
},
prompt: 'Hello',
});

// Access metadata via 'vertex' key
console.log(result.providerMetadata?.vertex?.safetyRatings);
```

## `ai/test`

### Mock Classes
Expand Down
6 changes: 4 additions & 2 deletions examples/ai-core/src/generate-text/google-vertex-safety.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import 'dotenv/config';

async function main() {
const result = await generateText({
model: vertex('gemini-1.5-pro'),
model: vertex('gemini-2.5-flash'),
providerOptions: {
google: {
vertex: {
safetySettings: [
{
category: 'HARM_CATEGORY_UNSPECIFIED',
Expand All @@ -22,6 +22,8 @@ async function main() {
console.log();
console.log('Token usage:', result.usage);
console.log('Finish reason:', result.finishReason);
console.log();
console.log('Request body:', result.request?.body);
}

main().catch(console.error);
21 changes: 21 additions & 0 deletions packages/google-vertex/src/google-vertex-embedding-model.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,27 @@ describe('GoogleVertexEmbeddingModel', () => {
});
});

it('should accept vertex as provider options key', async () => {
prepareJsonResponse();

await model.doEmbed({
values: testValues,
providerOptions: { vertex: mockProviderOptions },
});

expect(await server.calls[0].requestBodyJson).toStrictEqual({
instances: testValues.map(value => ({
content: value,
task_type: mockProviderOptions.taskType,
title: mockProviderOptions.title,
})),
parameters: {
outputDimensionality: mockProviderOptions.outputDimensionality,
autoTruncate: mockProviderOptions.autoTruncate,
},
});
});

it('should pass the taskType setting in instances', async () => {
prepareJsonResponse();

Expand Down
16 changes: 12 additions & 4 deletions packages/google-vertex/src/google-vertex-embedding-model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,21 @@ export class GoogleVertexEmbeddingModel implements EmbeddingModelV3 {
}: Parameters<EmbeddingModelV3['doEmbed']>[0]): Promise<
Awaited<ReturnType<EmbeddingModelV3['doEmbed']>>
> {
// Parse provider options
const googleOptions =
(await parseProviderOptions({
let googleOptions = await parseProviderOptions({
provider: 'vertex',
providerOptions,
schema: googleVertexEmbeddingProviderOptions,
});

if (googleOptions == null) {
googleOptions = await parseProviderOptions({
provider: 'google',
providerOptions,
schema: googleVertexEmbeddingProviderOptions,
})) ?? {};
});
}

googleOptions = googleOptions ?? {};

if (values.length > this.maxEmbeddingsPerCall) {
throw new TooManyEmbeddingValuesForCallError({
Expand Down
Loading
Loading