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
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
15 changes: 15 additions & 0 deletions packages/google-vertex/src/google-vertex-provider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,21 @@ describe('google-vertex-provider', () => {
);
});

it('should pass providerOptionsName as vertex to language model', () => {
const provider = createVertex({
project: 'test-project',
location: 'test-location',
});
provider('test-model-id');

expect(GoogleGenerativeAILanguageModel).toHaveBeenCalledWith(
'test-model-id',
expect.objectContaining({
providerOptionsName: 'vertex',
}),
);
});

it('should throw an error when using new keyword', () => {
const provider = createVertex({ project: 'test-project' });

Expand Down
1 change: 1 addition & 0 deletions packages/google-vertex/src/google-vertex-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ export function createVertex(
/^gs:\/\/.*$/,
],
}),
providerOptionsName: 'vertex',
});
};

Expand Down
27 changes: 22 additions & 5 deletions packages/google/src/google-generative-ai-language-model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ type GoogleGenerativeAIConfig = {
* The supported URLs for the model.
*/
supportedUrls?: () => LanguageModelV3['supportedUrls'];

/**
* This allows Vertex to use 'vertex' as the primary provider options key
* while maintaining backward compatibility with 'google'.
*/
providerOptionsName?: string;
};

export class GoogleGenerativeAILanguageModel implements LanguageModelV3 {
Expand Down Expand Up @@ -91,11 +97,22 @@ export class GoogleGenerativeAILanguageModel implements LanguageModelV3 {
}: Parameters<LanguageModelV3['doGenerate']>[0]) {
const warnings: SharedV3Warning[] = [];

const googleOptions = await parseProviderOptions({
provider: 'google',
providerOptions,
schema: googleGenerativeAIProviderOptions,
});
const providerOptionsName = this.config.providerOptionsName;
let googleOptions = providerOptionsName
? await parseProviderOptions({
provider: providerOptionsName,
providerOptions,
schema: googleGenerativeAIProviderOptions,
})
: undefined;

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

// Add warning if Vertex rag tools are used with a non-Vertex Google provider
if (
Expand Down
Loading