Skip to content

Commit 3bd3c0b

Browse files
authored
chore(providers/openai): update embedding model to use providerOptions (#5867)
1 parent 311d7a6 commit 3bd3c0b

8 files changed

Lines changed: 58 additions & 21 deletions

File tree

.changeset/cool-gifts-film.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@ai-sdk/openai': patch
3+
---
4+
5+
chore(providers/openai): update embedding model to use providerOptions

content/providers/01-ai-sdk-providers/02-openai.mdx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -796,17 +796,23 @@ using the `.embedding()` factory method.
796796
const model = openai.embedding('text-embedding-3-large');
797797
```
798798

799-
OpenAI embedding models support several additional settings.
799+
OpenAI embedding models support several additional provider options.
800800
You can pass them as an options argument:
801801

802802
```ts
803-
const model = openai.embedding('text-embedding-3-large', {
804-
dimensions: 512 // optional, number of dimensions for the embedding
805-
user: 'test-user' // optional unique user identifier
806-
})
803+
const model = openai.embedding('text-embedding-3-large');
804+
805+
await model.doEmbed({
806+
providerOptions: {
807+
openai: {
808+
dimensions: 512 // optional, number of dimensions for the embedding
809+
user: 'test-user' // optional unique user identifier
810+
}
811+
}
812+
});
807813
```
808814

809-
The following optional settings are available for OpenAI embedding models:
815+
The following optional provider options are available for OpenAI embedding models:
810816

811817
- **dimensions**: _number_
812818

content/providers/01-ai-sdk-providers/03-azure.mdx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -443,13 +443,19 @@ Azure OpenAI embedding models support several aditional settings.
443443
You can pass them as an options argument:
444444

445445
```ts
446-
const model = azure.embedding('your-embedding-deployment', {
447-
dimensions: 512 // optional, number of dimensions for the embedding
448-
user: 'test-user' // optional unique user identifier
446+
const model = azure.embedding('your-embedding-deployment');
447+
448+
await model.doEmbed({
449+
providerOptions: {
450+
'azure-openai': {
451+
dimensions: 512 // optional, number of dimensions for the embedding
452+
user: 'test-user' // optional unique user identifier
453+
}
454+
}
449455
})
450456
```
451457

452-
The following optional settings are available for Azure OpenAI embedding models:
458+
The following optional provider options are available for Azure OpenAI embedding models:
453459

454460
- **dimensions**: _number_
455461

packages/openai/src/internal/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ export * from '../openai-chat-options';
33
export * from '../openai-completion-language-model';
44
export * from '../openai-completion-settings';
55
export * from '../openai-embedding-model';
6-
export * from '../openai-embedding-settings';
6+
export * from '../openai-embedding-options';
77
export * from '../openai-image-model';
88
export * from '../openai-image-settings';
99
export * from '../openai-transcription-model';

packages/openai/src/openai-embedding-model.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,10 @@ describe('doEmbed', () => {
9494
it('should pass the dimensions setting', async () => {
9595
prepareJsonResponse();
9696

97-
await provider
98-
.embedding('text-embedding-3-large', { dimensions: 64 })
99-
.doEmbed({ values: testValues });
97+
await provider.embedding('text-embedding-3-large').doEmbed({
98+
values: testValues,
99+
providerOptions: { openai: { dimensions: 64 } },
100+
});
100101

101102
expect(await server.calls[0].requestBody).toStrictEqual({
102103
model: 'text-embedding-3-large',

packages/openai/src/openai-embedding-model.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ import {
55
import {
66
combineHeaders,
77
createJsonResponseHandler,
8+
parseProviderOptions,
89
postJsonToApi,
910
} from '@ai-sdk/provider-utils';
1011
import { z } from 'zod';
1112
import { OpenAIConfig } from './openai-config';
1213
import {
1314
OpenAIEmbeddingModelId,
15+
openaiEmbeddingProviderOptions,
1416
OpenAIEmbeddingSettings,
15-
} from './openai-embedding-settings';
17+
} from './openai-embedding-options';
1618
import { openaiFailedResponseHandler } from './openai-error';
1719

1820
export class OpenAIEmbeddingModel implements EmbeddingModelV2<string> {
@@ -48,6 +50,7 @@ export class OpenAIEmbeddingModel implements EmbeddingModelV2<string> {
4850
values,
4951
headers,
5052
abortSignal,
53+
providerOptions,
5154
}: Parameters<EmbeddingModelV2<string>['doEmbed']>[0]): Promise<
5255
Awaited<ReturnType<EmbeddingModelV2<string>['doEmbed']>>
5356
> {
@@ -60,6 +63,14 @@ export class OpenAIEmbeddingModel implements EmbeddingModelV2<string> {
6063
});
6164
}
6265

66+
// Parse provider options
67+
const openaiOptions =
68+
parseProviderOptions({
69+
provider: 'openai',
70+
providerOptions,
71+
schema: openaiEmbeddingProviderOptions,
72+
}) ?? {};
73+
6374
const {
6475
responseHeaders,
6576
value: response,
@@ -74,8 +85,8 @@ export class OpenAIEmbeddingModel implements EmbeddingModelV2<string> {
7485
model: this.modelId,
7586
input: values,
7687
encoding_format: 'float',
77-
dimensions: this.settings.dimensions,
78-
user: this.settings.user,
88+
dimensions: openaiOptions.dimensions,
89+
user: openaiOptions.user,
7990
},
8091
failedResponseHandler: openaiFailedResponseHandler,
8192
successfulResponseHandler: createJsonResponseHandler(

packages/openai/src/openai-embedding-settings.ts renamed to packages/openai/src/openai-embedding-options.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { z } from 'zod';
2+
13
export type OpenAIEmbeddingModelId =
24
| 'text-embedding-3-small'
35
| 'text-embedding-3-large'
@@ -14,16 +16,22 @@ Override the maximum number of embeddings per call.
1416
Override the parallelism of embedding calls.
1517
*/
1618
supportsParallelCalls?: boolean;
19+
}
1720

21+
export const openaiEmbeddingProviderOptions = z.object({
1822
/**
1923
The number of dimensions the resulting output embeddings should have.
2024
Only supported in text-embedding-3 and later models.
2125
*/
22-
dimensions?: number;
26+
dimensions: z.number().optional(),
2327

2428
/**
2529
A unique identifier representing your end-user, which can help OpenAI to
2630
monitor and detect abuse. Learn more.
2731
*/
28-
user?: string;
29-
}
32+
user: z.string().optional(),
33+
});
34+
35+
export type OpenAIEmbeddingProviderOptions = z.infer<
36+
typeof openaiEmbeddingProviderOptions
37+
>;

packages/openai/src/openai-provider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { OpenAIEmbeddingModel } from './openai-embedding-model';
2222
import {
2323
OpenAIEmbeddingModelId,
2424
OpenAIEmbeddingSettings,
25-
} from './openai-embedding-settings';
25+
} from './openai-embedding-options';
2626
import { OpenAIImageModel } from './openai-image-model';
2727
import {
2828
OpenAIImageModelId,

0 commit comments

Comments
 (0)