@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 +12 -0
- package/LICENSE +13 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +286 -0
- package/dist/index.js.map +1 -0
- package/package.json +70 -0
- package/src/index.ts +5 -0
- package/src/reranking/voyage-reranking-model.ts +119 -0
- package/src/reranking/voyage-reranking-options.ts +26 -0
- package/src/version.ts +5 -0
- package/src/voyage-embedding-model.ts +131 -0
- package/src/voyage-embedding-options.ts +33 -0
- package/src/voyage-error.ts +13 -0
- package/src/voyage-provider.ts +92 -0
package/CHANGELOG.md
ADDED
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.
|
package/dist/index.d.ts
ADDED
|
@@ -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,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();
|