Skip to content

Commit 393138b

Browse files
authored
feat(embedding-model-v2): add providerOptions (#5698)
1 parent d9c98f4 commit 393138b

File tree

7 files changed

+86
-4
lines changed

7 files changed

+86
-4
lines changed

‎.changeset/tender-tables-trade.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@ai-sdk/provider': patch
3+
---
4+
5+
feat(embedding-model-v2): add providerOptions

‎packages/ai/core/embed/embed-many.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,35 @@ describe('options.headers', () => {
123123
});
124124
});
125125

126+
describe('options.providerOptions', () => {
127+
it('should pass provider options to model', async () => {
128+
const model = new MockEmbeddingModelV2({
129+
doEmbed: async ({ providerOptions }) => {
130+
return { embeddings: [[1, 2, 3]] };
131+
},
132+
});
133+
134+
vi.spyOn(model, 'doEmbed');
135+
136+
await embedMany({
137+
model,
138+
values: ['test-input'],
139+
providerOptions: {
140+
aProvider: { someKey: 'someValue' },
141+
},
142+
});
143+
144+
expect(model.doEmbed).toHaveBeenCalledWith({
145+
abortSignal: undefined,
146+
headers: undefined,
147+
providerOptions: {
148+
aProvider: { someKey: 'someValue' },
149+
},
150+
values: ['test-input'],
151+
});
152+
});
153+
});
154+
126155
describe('telemetry', () => {
127156
let tracer: MockTracer;
128157

‎packages/ai/core/embed/embed-many.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { getTracer } from '../telemetry/get-tracer';
55
import { recordSpan } from '../telemetry/record-span';
66
import { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';
77
import { TelemetrySettings } from '../telemetry/telemetry-settings';
8-
import { Embedding, EmbeddingModel } from '../types';
8+
import { Embedding, EmbeddingModel, ProviderOptions } from '../types';
99
import { splitArray } from '../util/split-array';
1010
import { EmbedManyResult } from './embed-many-result';
1111

@@ -31,6 +31,7 @@ export async function embedMany<VALUE>({
3131
maxRetries: maxRetriesArg,
3232
abortSignal,
3333
headers,
34+
providerOptions,
3435
experimental_telemetry: telemetry,
3536
}: {
3637
/**
@@ -65,6 +66,13 @@ Only applicable for HTTP-based providers.
6566
* Optional telemetry configuration (experimental).
6667
*/
6768
experimental_telemetry?: TelemetrySettings;
69+
70+
/**
71+
Additional provider-specific options. They are passed through
72+
to the provider from the AI SDK and enable provider-specific
73+
functionality that can be fully encapsulated in the provider.
74+
*/
75+
providerOptions?: ProviderOptions;
6876
}): Promise<EmbedManyResult<VALUE>> {
6977
const { maxRetries, retry } = prepareRetries({ maxRetries: maxRetriesArg });
7078

@@ -121,6 +129,7 @@ Only applicable for HTTP-based providers.
121129
values,
122130
abortSignal,
123131
headers,
132+
providerOptions,
124133
});
125134

126135
const embeddings = modelResponse.embeddings;
@@ -192,6 +201,7 @@ Only applicable for HTTP-based providers.
192201
values: chunk,
193202
abortSignal,
194203
headers,
204+
providerOptions,
195205
});
196206

197207
const embeddings = modelResponse.embeddings;

‎packages/ai/core/embed/embed.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,28 @@ describe('options.headers', () => {
6868
});
6969
});
7070

71+
describe('options.providerOptions', () => {
72+
it('should pass provider options to model', async () => {
73+
const result = await embed({
74+
model: new MockEmbeddingModelV2({
75+
doEmbed: async ({ providerOptions }) => {
76+
expect(providerOptions).toStrictEqual({
77+
aProvider: { someKey: 'someValue' },
78+
});
79+
80+
return { embeddings: [[1, 2, 3]] };
81+
},
82+
}),
83+
value: 'test-input',
84+
providerOptions: {
85+
aProvider: { someKey: 'someValue' },
86+
},
87+
});
88+
89+
expect(result.embedding).toStrictEqual([1, 2, 3]);
90+
});
91+
});
92+
7193
describe('telemetry', () => {
7294
let tracer: MockTracer;
7395

‎packages/ai/core/embed/embed.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { getTracer } from '../telemetry/get-tracer';
55
import { recordSpan } from '../telemetry/record-span';
66
import { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';
77
import { TelemetrySettings } from '../telemetry/telemetry-settings';
8-
import { EmbeddingModel } from '../types';
8+
import { EmbeddingModel, ProviderOptions } from '../types';
99
import { EmbedResult } from './embed-result';
1010

1111
/**
@@ -23,6 +23,7 @@ Embed a value using an embedding model. The type of the value is defined by the
2323
export async function embed<VALUE>({
2424
model,
2525
value,
26+
providerOptions,
2627
maxRetries: maxRetriesArg,
2728
abortSignal,
2829
headers,
@@ -56,6 +57,13 @@ Only applicable for HTTP-based providers.
5657
*/
5758
headers?: Record<string, string>;
5859

60+
/**
61+
Additional provider-specific options. They are passed through
62+
to the provider from the AI SDK and enable provider-specific
63+
functionality that can be fully encapsulated in the provider.
64+
*/
65+
providerOptions?: ProviderOptions;
66+
5967
/**
6068
* Optional telemetry configuration (experimental).
6169
*/
@@ -106,6 +114,7 @@ Only applicable for HTTP-based providers.
106114
values: [value],
107115
abortSignal,
108116
headers,
117+
providerOptions,
109118
});
110119

111120
const embedding = modelResponse.embeddings[0];

‎packages/ai/core/generate-text/generate-text.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ import { getTracer } from '../telemetry/get-tracer';
1717
import { recordSpan } from '../telemetry/record-span';
1818
import { selectTelemetryAttributes } from '../telemetry/select-telemetry-attributes';
1919
import { TelemetrySettings } from '../telemetry/telemetry-settings';
20-
import { LanguageModel, ToolChoice } from '../types';
21-
import { ProviderOptions } from '../types/provider-metadata';
20+
import { LanguageModel, ToolChoice, ProviderOptions } from '../types';
2221
import {
2322
addLanguageModelUsage,
2423
calculateLanguageModelUsage,

‎packages/provider/src/embedding-model/v2/embedding-model-v2.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { SharedV2ProviderOptions } from '../../shared';
12
import { EmbeddingModelV2Embedding } from './embedding-model-v2-embedding';
23

34
/**
@@ -55,6 +56,13 @@ Abort signal for cancelling the operation.
5556
*/
5657
abortSignal?: AbortSignal;
5758

59+
/**
60+
Additional provider-specific options. They are passed through
61+
to the provider from the AI SDK and enable provider-specific
62+
functionality that can be fully encapsulated in the provider.
63+
*/
64+
providerOptions?: SharedV2ProviderOptions;
65+
5866
/**
5967
Additional HTTP headers to be sent with the request.
6068
Only applicable for HTTP-based providers.

0 commit comments

Comments
 (0)