@ai-sdk/voyage 1.0.0-beta.0

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 ADDED
@@ -0,0 +1,12 @@
1
+ # @ai-sdk/voyage
2
+
3
+ ## 1.0.0-beta.0
4
+
5
+ ### Major Changes
6
+
7
+ - 4963f11: add voyage ai provider with embedding and reranking support
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [2e98477]
12
+ - @ai-sdk/provider-utils@5.0.0-beta.26
package/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2023 Vercel, Inc.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
@@ -0,0 +1,48 @@
1
+ import { ProviderV4, EmbeddingModelV4, RerankingModelV4 } from '@ai-sdk/provider';
2
+ import { FetchFunction } from '@ai-sdk/provider-utils';
3
+ import { z } from 'zod/v4';
4
+
5
+ type VoyageEmbeddingModelId = 'voyage-4-large' | 'voyage-4' | 'voyage-4-lite' | 'voyage-4-nano' | 'voyage-code-3.5' | 'voyage-code-3' | 'voyage-3-large' | 'voyage-3.5' | 'voyage-3.5-lite' | 'voyage-3' | 'voyage-3-lite' | 'voyage-finance-2' | 'voyage-law-2' | 'voyage-multilingual-2' | 'voyage-code-2' | 'voyage-2' | (string & {});
6
+ declare const voyageEmbeddingModelOptions: z.ZodObject<{
7
+ inputType: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
8
+ query: "query";
9
+ document: "document";
10
+ }>>>;
11
+ truncation: z.ZodOptional<z.ZodBoolean>;
12
+ outputDimension: z.ZodOptional<z.ZodNumber>;
13
+ outputDtype: z.ZodOptional<z.ZodEnum<{
14
+ float: "float";
15
+ int8: "int8";
16
+ uint8: "uint8";
17
+ binary: "binary";
18
+ ubinary: "ubinary";
19
+ }>>;
20
+ }, z.core.$strip>;
21
+ type VoyageEmbeddingModelOptions = z.infer<typeof voyageEmbeddingModelOptions>;
22
+
23
+ type VoyageRerankingModelId = 'rerank-2.5' | 'rerank-2.5-lite' | 'rerank-2' | 'rerank-2-lite' | 'rerank-1' | 'rerank-lite-1' | (string & {});
24
+ type VoyageRerankingModelOptions = {
25
+ returnDocuments?: boolean;
26
+ truncation?: boolean;
27
+ };
28
+
29
+ interface VoyageProvider extends ProviderV4 {
30
+ embedding(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
31
+ embeddingModel(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
32
+ textEmbedding(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
33
+ textEmbeddingModel(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
34
+ reranking(modelId: VoyageRerankingModelId): RerankingModelV4;
35
+ rerankingModel(modelId: VoyageRerankingModelId): RerankingModelV4;
36
+ }
37
+ interface VoyageProviderSettings {
38
+ baseURL?: string;
39
+ apiKey?: string;
40
+ headers?: Record<string, string>;
41
+ fetch?: FetchFunction;
42
+ }
43
+ declare function createVoyage(options?: VoyageProviderSettings): VoyageProvider;
44
+ declare const voyage: VoyageProvider;
45
+
46
+ declare const VERSION: string;
47
+
48
+ export { VERSION, type VoyageEmbeddingModelOptions, type VoyageProvider, type VoyageProviderSettings, type VoyageRerankingModelOptions, createVoyage, voyage };
package/dist/index.js ADDED
@@ -0,0 +1,286 @@
1
+ // src/voyage-provider.ts
2
+ import {
3
+ NoSuchModelError
4
+ } from "@ai-sdk/provider";
5
+ import {
6
+ loadApiKey,
7
+ withoutTrailingSlash,
8
+ withUserAgentSuffix
9
+ } from "@ai-sdk/provider-utils";
10
+
11
+ // src/voyage-embedding-model.ts
12
+ import {
13
+ TooManyEmbeddingValuesForCallError
14
+ } from "@ai-sdk/provider";
15
+ import {
16
+ combineHeaders,
17
+ createJsonResponseHandler,
18
+ parseProviderOptions,
19
+ postJsonToApi,
20
+ serializeModelOptions,
21
+ WORKFLOW_SERIALIZE,
22
+ WORKFLOW_DESERIALIZE
23
+ } from "@ai-sdk/provider-utils";
24
+ import { z as z3 } from "zod/v4";
25
+
26
+ // src/voyage-embedding-options.ts
27
+ import { z } from "zod/v4";
28
+ var voyageEmbeddingModelOptions = z.object({
29
+ inputType: z.enum(["query", "document"]).nullable().optional(),
30
+ truncation: z.boolean().optional(),
31
+ outputDimension: z.number().optional(),
32
+ outputDtype: z.enum(["float", "int8", "uint8", "binary", "ubinary"]).optional()
33
+ });
34
+
35
+ // src/voyage-error.ts
36
+ import { createJsonErrorResponseHandler } from "@ai-sdk/provider-utils";
37
+ import { z as z2 } from "zod/v4";
38
+ var voyageErrorDataSchema = z2.object({
39
+ detail: z2.string()
40
+ });
41
+ var voyageFailedResponseHandler = createJsonErrorResponseHandler({
42
+ errorSchema: voyageErrorDataSchema,
43
+ errorToMessage: (data) => data.detail
44
+ });
45
+
46
+ // src/voyage-embedding-model.ts
47
+ var VoyageEmbeddingModel = class _VoyageEmbeddingModel {
48
+ constructor(modelId, config) {
49
+ this.specificationVersion = "v4";
50
+ this.maxEmbeddingsPerCall = 128;
51
+ this.supportsParallelCalls = true;
52
+ this.modelId = modelId;
53
+ this.config = config;
54
+ }
55
+ static [WORKFLOW_SERIALIZE](model) {
56
+ return serializeModelOptions({
57
+ modelId: model.modelId,
58
+ config: model.config
59
+ });
60
+ }
61
+ static [WORKFLOW_DESERIALIZE](options) {
62
+ return new _VoyageEmbeddingModel(options.modelId, options.config);
63
+ }
64
+ get provider() {
65
+ return this.config.provider;
66
+ }
67
+ async doEmbed({
68
+ values,
69
+ headers,
70
+ abortSignal,
71
+ providerOptions
72
+ }) {
73
+ var _a, _b, _c, _d;
74
+ const embeddingOptions = await parseProviderOptions({
75
+ provider: "voyage",
76
+ providerOptions,
77
+ schema: voyageEmbeddingModelOptions
78
+ });
79
+ if (values.length > this.maxEmbeddingsPerCall) {
80
+ throw new TooManyEmbeddingValuesForCallError({
81
+ provider: this.provider,
82
+ modelId: this.modelId,
83
+ maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,
84
+ values
85
+ });
86
+ }
87
+ const {
88
+ responseHeaders,
89
+ value: response,
90
+ rawValue
91
+ } = await postJsonToApi({
92
+ url: `${this.config.baseURL}/embeddings`,
93
+ headers: combineHeaders((_b = (_a = this.config).headers) == null ? void 0 : _b.call(_a), headers),
94
+ body: {
95
+ input: values,
96
+ model: this.modelId,
97
+ input_type: embeddingOptions == null ? void 0 : embeddingOptions.inputType,
98
+ truncation: embeddingOptions == null ? void 0 : embeddingOptions.truncation,
99
+ output_dimension: embeddingOptions == null ? void 0 : embeddingOptions.outputDimension,
100
+ output_dtype: embeddingOptions == null ? void 0 : embeddingOptions.outputDtype
101
+ },
102
+ failedResponseHandler: voyageFailedResponseHandler,
103
+ successfulResponseHandler: createJsonResponseHandler(
104
+ voyageEmbeddingResponseSchema
105
+ ),
106
+ abortSignal,
107
+ fetch: this.config.fetch
108
+ });
109
+ return {
110
+ warnings: [],
111
+ embeddings: response.data.sort((a, b) => a.index - b.index).map((item) => item.embedding),
112
+ usage: { tokens: (_d = (_c = response.usage) == null ? void 0 : _c.total_tokens) != null ? _d : 0 },
113
+ response: { headers: responseHeaders, body: rawValue }
114
+ };
115
+ }
116
+ };
117
+ var voyageEmbeddingResponseSchema = z3.object({
118
+ data: z3.array(
119
+ z3.object({
120
+ embedding: z3.array(z3.number()),
121
+ index: z3.number()
122
+ })
123
+ ),
124
+ model: z3.string(),
125
+ usage: z3.object({
126
+ total_tokens: z3.number()
127
+ }).nullish()
128
+ });
129
+
130
+ // src/reranking/voyage-reranking-model.ts
131
+ import {
132
+ combineHeaders as combineHeaders2,
133
+ createJsonResponseHandler as createJsonResponseHandler2,
134
+ lazySchema as lazySchema2,
135
+ parseProviderOptions as parseProviderOptions2,
136
+ postJsonToApi as postJsonToApi2,
137
+ zodSchema as zodSchema2
138
+ } from "@ai-sdk/provider-utils";
139
+ import { z as z5 } from "zod/v4";
140
+
141
+ // src/reranking/voyage-reranking-options.ts
142
+ import { lazySchema, zodSchema } from "@ai-sdk/provider-utils";
143
+ import { z as z4 } from "zod/v4";
144
+ var voyageRerankingModelOptionsSchema = lazySchema(
145
+ () => zodSchema(
146
+ z4.object({
147
+ returnDocuments: z4.boolean().optional(),
148
+ truncation: z4.boolean().optional()
149
+ })
150
+ )
151
+ );
152
+
153
+ // src/reranking/voyage-reranking-model.ts
154
+ var VoyageRerankingModel = class {
155
+ constructor(modelId, config) {
156
+ this.specificationVersion = "v4";
157
+ this.modelId = modelId;
158
+ this.config = config;
159
+ }
160
+ get provider() {
161
+ return this.config.provider;
162
+ }
163
+ async doRerank({
164
+ documents,
165
+ headers,
166
+ query,
167
+ topN,
168
+ abortSignal,
169
+ providerOptions
170
+ }) {
171
+ const rerankingOptions = await parseProviderOptions2({
172
+ provider: "voyage",
173
+ providerOptions,
174
+ schema: voyageRerankingModelOptionsSchema
175
+ });
176
+ const warnings = [];
177
+ if (documents.type === "object") {
178
+ warnings.push({
179
+ type: "compatibility",
180
+ feature: "object documents",
181
+ details: "Object documents are converted to strings."
182
+ });
183
+ }
184
+ const stringValues = documents.type === "text" ? documents.values : documents.values.map((value) => JSON.stringify(value));
185
+ const {
186
+ responseHeaders,
187
+ value: response,
188
+ rawValue
189
+ } = await postJsonToApi2({
190
+ url: `${this.config.baseURL}/rerank`,
191
+ headers: combineHeaders2(this.config.headers(), headers),
192
+ body: {
193
+ query,
194
+ documents: stringValues,
195
+ model: this.modelId,
196
+ top_k: topN,
197
+ return_documents: rerankingOptions == null ? void 0 : rerankingOptions.returnDocuments,
198
+ truncation: rerankingOptions == null ? void 0 : rerankingOptions.truncation
199
+ },
200
+ failedResponseHandler: voyageFailedResponseHandler,
201
+ successfulResponseHandler: createJsonResponseHandler2(
202
+ voyageRerankingResponseSchema
203
+ ),
204
+ abortSignal,
205
+ fetch: this.config.fetch
206
+ });
207
+ return {
208
+ ranking: response.data.map((result) => ({
209
+ index: result.index,
210
+ relevanceScore: result.relevance_score
211
+ })),
212
+ warnings,
213
+ response: {
214
+ headers: responseHeaders,
215
+ body: rawValue
216
+ }
217
+ };
218
+ }
219
+ };
220
+ var voyageRerankingResponseSchema = lazySchema2(
221
+ () => zodSchema2(
222
+ z5.object({
223
+ data: z5.array(
224
+ z5.object({
225
+ index: z5.number(),
226
+ relevance_score: z5.number()
227
+ })
228
+ )
229
+ })
230
+ )
231
+ );
232
+
233
+ // src/version.ts
234
+ var VERSION = true ? "1.0.0-beta.0" : "0.0.0-test";
235
+
236
+ // src/voyage-provider.ts
237
+ function createVoyage(options = {}) {
238
+ var _a;
239
+ const baseURL = (_a = withoutTrailingSlash(options.baseURL)) != null ? _a : "https://api.voyageai.com/v1";
240
+ const getHeaders = () => withUserAgentSuffix(
241
+ {
242
+ Authorization: `Bearer ${loadApiKey({
243
+ apiKey: options.apiKey,
244
+ environmentVariableName: "VOYAGE_API_KEY",
245
+ description: "Voyage"
246
+ })}`,
247
+ ...options.headers
248
+ },
249
+ `ai-sdk/voyage/${VERSION}`
250
+ );
251
+ const createEmbeddingModel = (modelId) => new VoyageEmbeddingModel(modelId, {
252
+ provider: "voyage.embedding",
253
+ baseURL,
254
+ headers: getHeaders,
255
+ fetch: options.fetch
256
+ });
257
+ const createRerankingModel = (modelId) => new VoyageRerankingModel(modelId, {
258
+ provider: "voyage.reranking",
259
+ baseURL,
260
+ headers: getHeaders,
261
+ fetch: options.fetch
262
+ });
263
+ const provider = {
264
+ specificationVersion: "v4",
265
+ embedding: createEmbeddingModel,
266
+ embeddingModel: createEmbeddingModel,
267
+ textEmbedding: createEmbeddingModel,
268
+ textEmbeddingModel: createEmbeddingModel,
269
+ reranking: createRerankingModel,
270
+ rerankingModel: createRerankingModel,
271
+ languageModel: (modelId) => {
272
+ throw new NoSuchModelError({ modelId, modelType: "languageModel" });
273
+ },
274
+ imageModel: (modelId) => {
275
+ throw new NoSuchModelError({ modelId, modelType: "imageModel" });
276
+ }
277
+ };
278
+ return provider;
279
+ }
280
+ var voyage = createVoyage();
281
+ export {
282
+ VERSION,
283
+ createVoyage,
284
+ voyage
285
+ };
286
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/voyage-provider.ts","../src/voyage-embedding-model.ts","../src/voyage-embedding-options.ts","../src/voyage-error.ts","../src/reranking/voyage-reranking-model.ts","../src/reranking/voyage-reranking-options.ts","../src/version.ts"],"sourcesContent":["import {\n EmbeddingModelV4,\n NoSuchModelError,\n RerankingModelV4,\n ProviderV4,\n} from '@ai-sdk/provider';\n\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { VoyageEmbeddingModel } from './voyage-embedding-model';\nimport { VoyageEmbeddingModelId } from './voyage-embedding-options';\nimport { VoyageRerankingModelId } from './reranking/voyage-reranking-options';\nimport { VoyageRerankingModel } from './reranking/voyage-reranking-model';\nimport { VERSION } from './version';\n\nexport interface VoyageProvider extends ProviderV4 {\n embedding(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;\n embeddingModel(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;\n textEmbedding(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;\n textEmbeddingModel(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;\n reranking(modelId: VoyageRerankingModelId): RerankingModelV4;\n rerankingModel(modelId: VoyageRerankingModelId): RerankingModelV4;\n}\n\nexport interface VoyageProviderSettings {\n baseURL?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n fetch?: FetchFunction;\n}\n\nexport function createVoyage(\n options: VoyageProviderSettings = {},\n): VoyageProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? 'https://api.voyageai.com/v1';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'VOYAGE_API_KEY',\n description: 'Voyage',\n })}`,\n ...options.headers,\n },\n `ai-sdk/voyage/${VERSION}`,\n );\n\n const createEmbeddingModel = (modelId: VoyageEmbeddingModelId) =>\n new VoyageEmbeddingModel(modelId, {\n provider: 'voyage.embedding',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createRerankingModel = (modelId: VoyageRerankingModelId) =>\n new VoyageRerankingModel(modelId, {\n provider: 'voyage.reranking',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider: VoyageProvider = {\n specificationVersion: 'v4' as const,\n embedding: createEmbeddingModel,\n embeddingModel: createEmbeddingModel,\n textEmbedding: createEmbeddingModel,\n textEmbeddingModel: createEmbeddingModel,\n reranking: createRerankingModel,\n rerankingModel: createRerankingModel,\n\n languageModel: (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'languageModel' });\n },\n\n imageModel: (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n },\n };\n\n return provider;\n}\n\nexport const voyage = createVoyage();\n","import {\n EmbeddingModelV4,\n TooManyEmbeddingValuesForCallError,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n FetchFunction,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n VoyageEmbeddingModelId,\n voyageEmbeddingModelOptions,\n} from './voyage-embedding-options';\nimport { voyageFailedResponseHandler } from './voyage-error';\n\ntype VoyageEmbeddingConfig = {\n provider: string;\n baseURL: string;\n headers?: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class VoyageEmbeddingModel implements EmbeddingModelV4 {\n readonly specificationVersion = 'v4';\n readonly modelId: VoyageEmbeddingModelId;\n\n readonly maxEmbeddingsPerCall = 128;\n readonly supportsParallelCalls = true;\n\n private readonly config: VoyageEmbeddingConfig;\n\n static [WORKFLOW_SERIALIZE](model: VoyageEmbeddingModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: VoyageEmbeddingModelId;\n config: VoyageEmbeddingConfig;\n }) {\n return new VoyageEmbeddingModel(options.modelId, options.config);\n }\n\n constructor(modelId: VoyageEmbeddingModelId, config: VoyageEmbeddingConfig) {\n this.modelId = modelId;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions,\n }: Parameters<EmbeddingModelV4['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV4['doEmbed']>>\n > {\n const embeddingOptions = await parseProviderOptions({\n provider: 'voyage',\n providerOptions,\n schema: voyageEmbeddingModelOptions,\n });\n\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values,\n });\n }\n\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/embeddings`,\n headers: combineHeaders(this.config.headers?.(), headers),\n body: {\n input: values,\n model: this.modelId,\n input_type: embeddingOptions?.inputType,\n truncation: embeddingOptions?.truncation,\n output_dimension: embeddingOptions?.outputDimension,\n output_dtype: embeddingOptions?.outputDtype,\n },\n failedResponseHandler: voyageFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n voyageEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n warnings: [],\n embeddings: response.data\n .sort((a, b) => a.index - b.index)\n .map(item => item.embedding),\n usage: { tokens: response.usage?.total_tokens ?? 0 },\n response: { headers: responseHeaders, body: rawValue },\n };\n }\n}\n\nconst voyageEmbeddingResponseSchema = z.object({\n data: z.array(\n z.object({\n embedding: z.array(z.number()),\n index: z.number(),\n }),\n ),\n model: z.string(),\n usage: z\n .object({\n total_tokens: z.number(),\n })\n .nullish(),\n});\n","import { z } from 'zod/v4';\n\nexport type VoyageEmbeddingModelId =\n | 'voyage-4-large'\n | 'voyage-4'\n | 'voyage-4-lite'\n | 'voyage-4-nano'\n | 'voyage-code-3.5'\n | 'voyage-code-3'\n | 'voyage-3-large'\n | 'voyage-3.5'\n | 'voyage-3.5-lite'\n | 'voyage-3'\n | 'voyage-3-lite'\n | 'voyage-finance-2'\n | 'voyage-law-2'\n | 'voyage-multilingual-2'\n | 'voyage-code-2'\n | 'voyage-2'\n | (string & {});\n\nexport const voyageEmbeddingModelOptions = z.object({\n inputType: z.enum(['query', 'document']).nullable().optional(),\n truncation: z.boolean().optional(),\n outputDimension: z.number().optional(),\n outputDtype: z\n .enum(['float', 'int8', 'uint8', 'binary', 'ubinary'])\n .optional(),\n});\n\nexport type VoyageEmbeddingModelOptions = z.infer<\n typeof voyageEmbeddingModelOptions\n>;\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst voyageErrorDataSchema = z.object({\n detail: z.string(),\n});\n\nexport type VoyageErrorData = z.infer<typeof voyageErrorDataSchema>;\n\nexport const voyageFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: voyageErrorDataSchema,\n errorToMessage: data => data.detail,\n});\n","import { RerankingModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n FetchFunction,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n zodSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { voyageFailedResponseHandler } from '../voyage-error';\nimport {\n VoyageRerankingModelId,\n voyageRerankingModelOptionsSchema,\n} from './voyage-reranking-options';\n\ntype VoyageRerankingConfig = {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class VoyageRerankingModel implements RerankingModelV4 {\n readonly specificationVersion = 'v4';\n readonly modelId: VoyageRerankingModelId;\n\n private readonly config: VoyageRerankingConfig;\n\n constructor(modelId: VoyageRerankingModelId, config: VoyageRerankingConfig) {\n this.modelId = modelId;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n async doRerank({\n documents,\n headers,\n query,\n topN,\n abortSignal,\n providerOptions,\n }: Parameters<RerankingModelV4['doRerank']>[0]): Promise<\n Awaited<ReturnType<RerankingModelV4['doRerank']>>\n > {\n const rerankingOptions = await parseProviderOptions({\n provider: 'voyage',\n providerOptions,\n schema: voyageRerankingModelOptionsSchema,\n });\n\n const warnings: SharedV4Warning[] = [];\n\n if (documents.type === 'object') {\n warnings.push({\n type: 'compatibility',\n feature: 'object documents',\n details: 'Object documents are converted to strings.',\n });\n }\n\n const stringValues =\n documents.type === 'text'\n ? documents.values\n : documents.values.map(value => JSON.stringify(value));\n\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/rerank`,\n headers: combineHeaders(this.config.headers(), headers),\n body: {\n query,\n documents: stringValues,\n model: this.modelId,\n top_k: topN,\n return_documents: rerankingOptions?.returnDocuments,\n truncation: rerankingOptions?.truncation,\n },\n failedResponseHandler: voyageFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n voyageRerankingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n ranking: response.data.map(result => ({\n index: result.index,\n relevanceScore: result.relevance_score,\n })),\n warnings,\n response: {\n headers: responseHeaders,\n body: rawValue,\n },\n };\n }\n}\n\nconst voyageRerankingResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n data: z.array(\n z.object({\n index: z.number(),\n relevance_score: z.number(),\n }),\n ),\n }),\n ),\n);\n","import { FlexibleSchema, lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type VoyageRerankingModelId =\n | 'rerank-2.5'\n | 'rerank-2.5-lite'\n | 'rerank-2'\n | 'rerank-2-lite'\n | 'rerank-1'\n | 'rerank-lite-1'\n | (string & {});\n\nexport type VoyageRerankingModelOptions = {\n returnDocuments?: boolean;\n truncation?: boolean;\n};\n\nexport const voyageRerankingModelOptionsSchema: FlexibleSchema<VoyageRerankingModelOptions> =\n lazySchema(() =>\n zodSchema(\n z.object({\n returnDocuments: z.boolean().optional(),\n truncation: z.boolean().optional(),\n }),\n ),\n );\n","declare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z","z","combineHeaders","createJsonResponseHandler","lazySchema","parseProviderOptions","postJsonToApi","zodSchema","z","z","parseProviderOptions","postJsonToApi","combineHeaders","createJsonResponseHandler","lazySchema","zodSchema","z"]}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@ai-sdk/voyage",
3
+ "version": "1.0.0-beta.0",
4
+ "type": "module",
5
+ "license": "Apache-2.0",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist/**/*",
11
+ "src",
12
+ "!src/**/*.test.ts",
13
+ "!src/**/*.test-d.ts",
14
+ "!src/**/__snapshots__",
15
+ "!src/**/__fixtures__",
16
+ "CHANGELOG.md",
17
+ "README.md"
18
+ ],
19
+ "exports": {
20
+ "./package.json": "./package.json",
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "default": "./dist/index.js"
25
+ }
26
+ },
27
+ "dependencies": {
28
+ "@ai-sdk/provider": "4.0.0-beta.12",
29
+ "@ai-sdk/provider-utils": "5.0.0-beta.26"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "20.17.24",
33
+ "tsup": "^8",
34
+ "typescript": "5.8.3",
35
+ "zod": "3.25.76",
36
+ "@ai-sdk/test-server": "2.0.0-beta.1",
37
+ "@vercel/ai-tsconfig": "0.0.0"
38
+ },
39
+ "peerDependencies": {
40
+ "zod": "^3.25.76 || ^4.1.8"
41
+ },
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "homepage": "https://ai-sdk.dev/docs",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+https://github.com/vercel/ai.git"
52
+ },
53
+ "bugs": {
54
+ "url": "https://github.com/vercel/ai/issues"
55
+ },
56
+ "keywords": [
57
+ "ai"
58
+ ],
59
+ "scripts": {
60
+ "build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
61
+ "build:watch": "pnpm clean && tsup --watch",
62
+ "clean": "del-cli dist *.tsbuildinfo",
63
+ "type-check": "tsc --build",
64
+ "test": "pnpm test:node && pnpm test:edge",
65
+ "test:update": "pnpm test:node -u",
66
+ "test:watch": "vitest --config vitest.node.config.js",
67
+ "test:edge": "vitest --config vitest.edge.config.js --run",
68
+ "test:node": "vitest --config vitest.node.config.js --run"
69
+ }
70
+ }
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { voyage, createVoyage } from './voyage-provider';
2
+ export type { VoyageProvider, VoyageProviderSettings } from './voyage-provider';
3
+ export type { VoyageEmbeddingModelOptions } from './voyage-embedding-options';
4
+ export type { VoyageRerankingModelOptions } from './reranking/voyage-reranking-options';
5
+ export { VERSION } from './version';
@@ -0,0 +1,119 @@
1
+ import { RerankingModelV4, SharedV4Warning } from '@ai-sdk/provider';
2
+ import {
3
+ combineHeaders,
4
+ createJsonResponseHandler,
5
+ FetchFunction,
6
+ lazySchema,
7
+ parseProviderOptions,
8
+ postJsonToApi,
9
+ zodSchema,
10
+ } from '@ai-sdk/provider-utils';
11
+ import { z } from 'zod/v4';
12
+ import { voyageFailedResponseHandler } from '../voyage-error';
13
+ import {
14
+ VoyageRerankingModelId,
15
+ voyageRerankingModelOptionsSchema,
16
+ } from './voyage-reranking-options';
17
+
18
+ type VoyageRerankingConfig = {
19
+ provider: string;
20
+ baseURL: string;
21
+ headers: () => Record<string, string | undefined>;
22
+ fetch?: FetchFunction;
23
+ };
24
+
25
+ export class VoyageRerankingModel implements RerankingModelV4 {
26
+ readonly specificationVersion = 'v4';
27
+ readonly modelId: VoyageRerankingModelId;
28
+
29
+ private readonly config: VoyageRerankingConfig;
30
+
31
+ constructor(modelId: VoyageRerankingModelId, config: VoyageRerankingConfig) {
32
+ this.modelId = modelId;
33
+ this.config = config;
34
+ }
35
+
36
+ get provider(): string {
37
+ return this.config.provider;
38
+ }
39
+
40
+ async doRerank({
41
+ documents,
42
+ headers,
43
+ query,
44
+ topN,
45
+ abortSignal,
46
+ providerOptions,
47
+ }: Parameters<RerankingModelV4['doRerank']>[0]): Promise<
48
+ Awaited<ReturnType<RerankingModelV4['doRerank']>>
49
+ > {
50
+ const rerankingOptions = await parseProviderOptions({
51
+ provider: 'voyage',
52
+ providerOptions,
53
+ schema: voyageRerankingModelOptionsSchema,
54
+ });
55
+
56
+ const warnings: SharedV4Warning[] = [];
57
+
58
+ if (documents.type === 'object') {
59
+ warnings.push({
60
+ type: 'compatibility',
61
+ feature: 'object documents',
62
+ details: 'Object documents are converted to strings.',
63
+ });
64
+ }
65
+
66
+ const stringValues =
67
+ documents.type === 'text'
68
+ ? documents.values
69
+ : documents.values.map(value => JSON.stringify(value));
70
+
71
+ const {
72
+ responseHeaders,
73
+ value: response,
74
+ rawValue,
75
+ } = await postJsonToApi({
76
+ url: `${this.config.baseURL}/rerank`,
77
+ headers: combineHeaders(this.config.headers(), headers),
78
+ body: {
79
+ query,
80
+ documents: stringValues,
81
+ model: this.modelId,
82
+ top_k: topN,
83
+ return_documents: rerankingOptions?.returnDocuments,
84
+ truncation: rerankingOptions?.truncation,
85
+ },
86
+ failedResponseHandler: voyageFailedResponseHandler,
87
+ successfulResponseHandler: createJsonResponseHandler(
88
+ voyageRerankingResponseSchema,
89
+ ),
90
+ abortSignal,
91
+ fetch: this.config.fetch,
92
+ });
93
+
94
+ return {
95
+ ranking: response.data.map(result => ({
96
+ index: result.index,
97
+ relevanceScore: result.relevance_score,
98
+ })),
99
+ warnings,
100
+ response: {
101
+ headers: responseHeaders,
102
+ body: rawValue,
103
+ },
104
+ };
105
+ }
106
+ }
107
+
108
+ const voyageRerankingResponseSchema = lazySchema(() =>
109
+ zodSchema(
110
+ z.object({
111
+ data: z.array(
112
+ z.object({
113
+ index: z.number(),
114
+ relevance_score: z.number(),
115
+ }),
116
+ ),
117
+ }),
118
+ ),
119
+ );
@@ -0,0 +1,26 @@
1
+ import { FlexibleSchema, lazySchema, zodSchema } from '@ai-sdk/provider-utils';
2
+ import { z } from 'zod/v4';
3
+
4
+ export type VoyageRerankingModelId =
5
+ | 'rerank-2.5'
6
+ | 'rerank-2.5-lite'
7
+ | 'rerank-2'
8
+ | 'rerank-2-lite'
9
+ | 'rerank-1'
10
+ | 'rerank-lite-1'
11
+ | (string & {});
12
+
13
+ export type VoyageRerankingModelOptions = {
14
+ returnDocuments?: boolean;
15
+ truncation?: boolean;
16
+ };
17
+
18
+ export const voyageRerankingModelOptionsSchema: FlexibleSchema<VoyageRerankingModelOptions> =
19
+ lazySchema(() =>
20
+ zodSchema(
21
+ z.object({
22
+ returnDocuments: z.boolean().optional(),
23
+ truncation: z.boolean().optional(),
24
+ }),
25
+ ),
26
+ );
package/src/version.ts ADDED
@@ -0,0 +1,5 @@
1
+ declare const __PACKAGE_VERSION__: string | undefined;
2
+ export const VERSION: string =
3
+ typeof __PACKAGE_VERSION__ !== 'undefined'
4
+ ? __PACKAGE_VERSION__
5
+ : '0.0.0-test';
@@ -0,0 +1,131 @@
1
+ import {
2
+ EmbeddingModelV4,
3
+ TooManyEmbeddingValuesForCallError,
4
+ } from '@ai-sdk/provider';
5
+ import {
6
+ combineHeaders,
7
+ createJsonResponseHandler,
8
+ FetchFunction,
9
+ parseProviderOptions,
10
+ postJsonToApi,
11
+ serializeModelOptions,
12
+ WORKFLOW_SERIALIZE,
13
+ WORKFLOW_DESERIALIZE,
14
+ } from '@ai-sdk/provider-utils';
15
+ import { z } from 'zod/v4';
16
+ import {
17
+ VoyageEmbeddingModelId,
18
+ voyageEmbeddingModelOptions,
19
+ } from './voyage-embedding-options';
20
+ import { voyageFailedResponseHandler } from './voyage-error';
21
+
22
+ type VoyageEmbeddingConfig = {
23
+ provider: string;
24
+ baseURL: string;
25
+ headers?: () => Record<string, string | undefined>;
26
+ fetch?: FetchFunction;
27
+ };
28
+
29
+ export class VoyageEmbeddingModel implements EmbeddingModelV4 {
30
+ readonly specificationVersion = 'v4';
31
+ readonly modelId: VoyageEmbeddingModelId;
32
+
33
+ readonly maxEmbeddingsPerCall = 128;
34
+ readonly supportsParallelCalls = true;
35
+
36
+ private readonly config: VoyageEmbeddingConfig;
37
+
38
+ static [WORKFLOW_SERIALIZE](model: VoyageEmbeddingModel) {
39
+ return serializeModelOptions({
40
+ modelId: model.modelId,
41
+ config: model.config,
42
+ });
43
+ }
44
+
45
+ static [WORKFLOW_DESERIALIZE](options: {
46
+ modelId: VoyageEmbeddingModelId;
47
+ config: VoyageEmbeddingConfig;
48
+ }) {
49
+ return new VoyageEmbeddingModel(options.modelId, options.config);
50
+ }
51
+
52
+ constructor(modelId: VoyageEmbeddingModelId, config: VoyageEmbeddingConfig) {
53
+ this.modelId = modelId;
54
+ this.config = config;
55
+ }
56
+
57
+ get provider(): string {
58
+ return this.config.provider;
59
+ }
60
+
61
+ async doEmbed({
62
+ values,
63
+ headers,
64
+ abortSignal,
65
+ providerOptions,
66
+ }: Parameters<EmbeddingModelV4['doEmbed']>[0]): Promise<
67
+ Awaited<ReturnType<EmbeddingModelV4['doEmbed']>>
68
+ > {
69
+ const embeddingOptions = await parseProviderOptions({
70
+ provider: 'voyage',
71
+ providerOptions,
72
+ schema: voyageEmbeddingModelOptions,
73
+ });
74
+
75
+ if (values.length > this.maxEmbeddingsPerCall) {
76
+ throw new TooManyEmbeddingValuesForCallError({
77
+ provider: this.provider,
78
+ modelId: this.modelId,
79
+ maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,
80
+ values,
81
+ });
82
+ }
83
+
84
+ const {
85
+ responseHeaders,
86
+ value: response,
87
+ rawValue,
88
+ } = await postJsonToApi({
89
+ url: `${this.config.baseURL}/embeddings`,
90
+ headers: combineHeaders(this.config.headers?.(), headers),
91
+ body: {
92
+ input: values,
93
+ model: this.modelId,
94
+ input_type: embeddingOptions?.inputType,
95
+ truncation: embeddingOptions?.truncation,
96
+ output_dimension: embeddingOptions?.outputDimension,
97
+ output_dtype: embeddingOptions?.outputDtype,
98
+ },
99
+ failedResponseHandler: voyageFailedResponseHandler,
100
+ successfulResponseHandler: createJsonResponseHandler(
101
+ voyageEmbeddingResponseSchema,
102
+ ),
103
+ abortSignal,
104
+ fetch: this.config.fetch,
105
+ });
106
+
107
+ return {
108
+ warnings: [],
109
+ embeddings: response.data
110
+ .sort((a, b) => a.index - b.index)
111
+ .map(item => item.embedding),
112
+ usage: { tokens: response.usage?.total_tokens ?? 0 },
113
+ response: { headers: responseHeaders, body: rawValue },
114
+ };
115
+ }
116
+ }
117
+
118
+ const voyageEmbeddingResponseSchema = z.object({
119
+ data: z.array(
120
+ z.object({
121
+ embedding: z.array(z.number()),
122
+ index: z.number(),
123
+ }),
124
+ ),
125
+ model: z.string(),
126
+ usage: z
127
+ .object({
128
+ total_tokens: z.number(),
129
+ })
130
+ .nullish(),
131
+ });
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod/v4';
2
+
3
+ export type VoyageEmbeddingModelId =
4
+ | 'voyage-4-large'
5
+ | 'voyage-4'
6
+ | 'voyage-4-lite'
7
+ | 'voyage-4-nano'
8
+ | 'voyage-code-3.5'
9
+ | 'voyage-code-3'
10
+ | 'voyage-3-large'
11
+ | 'voyage-3.5'
12
+ | 'voyage-3.5-lite'
13
+ | 'voyage-3'
14
+ | 'voyage-3-lite'
15
+ | 'voyage-finance-2'
16
+ | 'voyage-law-2'
17
+ | 'voyage-multilingual-2'
18
+ | 'voyage-code-2'
19
+ | 'voyage-2'
20
+ | (string & {});
21
+
22
+ export const voyageEmbeddingModelOptions = z.object({
23
+ inputType: z.enum(['query', 'document']).nullable().optional(),
24
+ truncation: z.boolean().optional(),
25
+ outputDimension: z.number().optional(),
26
+ outputDtype: z
27
+ .enum(['float', 'int8', 'uint8', 'binary', 'ubinary'])
28
+ .optional(),
29
+ });
30
+
31
+ export type VoyageEmbeddingModelOptions = z.infer<
32
+ typeof voyageEmbeddingModelOptions
33
+ >;
@@ -0,0 +1,13 @@
1
+ import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';
2
+ import { z } from 'zod/v4';
3
+
4
+ const voyageErrorDataSchema = z.object({
5
+ detail: z.string(),
6
+ });
7
+
8
+ export type VoyageErrorData = z.infer<typeof voyageErrorDataSchema>;
9
+
10
+ export const voyageFailedResponseHandler = createJsonErrorResponseHandler({
11
+ errorSchema: voyageErrorDataSchema,
12
+ errorToMessage: data => data.detail,
13
+ });
@@ -0,0 +1,92 @@
1
+ import {
2
+ EmbeddingModelV4,
3
+ NoSuchModelError,
4
+ RerankingModelV4,
5
+ ProviderV4,
6
+ } from '@ai-sdk/provider';
7
+
8
+ import {
9
+ FetchFunction,
10
+ loadApiKey,
11
+ withoutTrailingSlash,
12
+ withUserAgentSuffix,
13
+ } from '@ai-sdk/provider-utils';
14
+ import { VoyageEmbeddingModel } from './voyage-embedding-model';
15
+ import { VoyageEmbeddingModelId } from './voyage-embedding-options';
16
+ import { VoyageRerankingModelId } from './reranking/voyage-reranking-options';
17
+ import { VoyageRerankingModel } from './reranking/voyage-reranking-model';
18
+ import { VERSION } from './version';
19
+
20
+ export interface VoyageProvider extends ProviderV4 {
21
+ embedding(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
22
+ embeddingModel(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
23
+ textEmbedding(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
24
+ textEmbeddingModel(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
25
+ reranking(modelId: VoyageRerankingModelId): RerankingModelV4;
26
+ rerankingModel(modelId: VoyageRerankingModelId): RerankingModelV4;
27
+ }
28
+
29
+ export interface VoyageProviderSettings {
30
+ baseURL?: string;
31
+ apiKey?: string;
32
+ headers?: Record<string, string>;
33
+ fetch?: FetchFunction;
34
+ }
35
+
36
+ export function createVoyage(
37
+ options: VoyageProviderSettings = {},
38
+ ): VoyageProvider {
39
+ const baseURL =
40
+ withoutTrailingSlash(options.baseURL) ?? 'https://api.voyageai.com/v1';
41
+
42
+ const getHeaders = () =>
43
+ withUserAgentSuffix(
44
+ {
45
+ Authorization: `Bearer ${loadApiKey({
46
+ apiKey: options.apiKey,
47
+ environmentVariableName: 'VOYAGE_API_KEY',
48
+ description: 'Voyage',
49
+ })}`,
50
+ ...options.headers,
51
+ },
52
+ `ai-sdk/voyage/${VERSION}`,
53
+ );
54
+
55
+ const createEmbeddingModel = (modelId: VoyageEmbeddingModelId) =>
56
+ new VoyageEmbeddingModel(modelId, {
57
+ provider: 'voyage.embedding',
58
+ baseURL,
59
+ headers: getHeaders,
60
+ fetch: options.fetch,
61
+ });
62
+
63
+ const createRerankingModel = (modelId: VoyageRerankingModelId) =>
64
+ new VoyageRerankingModel(modelId, {
65
+ provider: 'voyage.reranking',
66
+ baseURL,
67
+ headers: getHeaders,
68
+ fetch: options.fetch,
69
+ });
70
+
71
+ const provider: VoyageProvider = {
72
+ specificationVersion: 'v4' as const,
73
+ embedding: createEmbeddingModel,
74
+ embeddingModel: createEmbeddingModel,
75
+ textEmbedding: createEmbeddingModel,
76
+ textEmbeddingModel: createEmbeddingModel,
77
+ reranking: createRerankingModel,
78
+ rerankingModel: createRerankingModel,
79
+
80
+ languageModel: (modelId: string) => {
81
+ throw new NoSuchModelError({ modelId, modelType: 'languageModel' });
82
+ },
83
+
84
+ imageModel: (modelId: string) => {
85
+ throw new NoSuchModelError({ modelId, modelType: 'imageModel' });
86
+ },
87
+ };
88
+
89
+ return provider;
90
+ }
91
+
92
+ export const voyage = createVoyage();