@ai-sdk/voyage 0.0.0-cca10482-20260708215408
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 +290 -0
- package/LICENSE +13 -0
- package/README.md +46 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +289 -0
- package/dist/index.js.map +1 -0
- package/package.json +72 -0
- package/src/index.ts +5 -0
- package/src/reranking/voyage-reranking-model-options.ts +30 -0
- package/src/reranking/voyage-reranking-model.ts +118 -0
- package/src/version.ts +5 -0
- package/src/voyage-embedding-model-options.ts +33 -0
- package/src/voyage-embedding-model.ts +131 -0
- package/src/voyage-error.ts +13 -0
- package/src/voyage-provider.ts +91 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
# @ai-sdk/voyage
|
|
2
|
+
|
|
3
|
+
## 0.0.0-cca10482-20260708215408
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [90cd96d]
|
|
8
|
+
- Updated dependencies [0f93c57]
|
|
9
|
+
- @ai-sdk/provider-utils@0.0.0-cca10482-20260708215408
|
|
10
|
+
- @ai-sdk/provider@0.0.0-cca10482-20260708215408
|
|
11
|
+
|
|
12
|
+
## 2.0.6
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- Updated dependencies [ac306ed]
|
|
17
|
+
- @ai-sdk/provider-utils@5.0.6
|
|
18
|
+
|
|
19
|
+
## 2.0.5
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- 5c5c0f5: Add experimental streaming transcription support for transcription models, including OpenAI `gpt-realtime-whisper` and xAI WebSocket STT.
|
|
24
|
+
- Updated dependencies [5c5c0f5]
|
|
25
|
+
- @ai-sdk/provider@4.0.2
|
|
26
|
+
- @ai-sdk/provider-utils@5.0.5
|
|
27
|
+
|
|
28
|
+
## 2.0.4
|
|
29
|
+
|
|
30
|
+
### Patch Changes
|
|
31
|
+
|
|
32
|
+
- Updated dependencies [c6f5e62]
|
|
33
|
+
- @ai-sdk/provider-utils@5.0.4
|
|
34
|
+
|
|
35
|
+
## 2.0.3
|
|
36
|
+
|
|
37
|
+
### Patch Changes
|
|
38
|
+
|
|
39
|
+
- Updated dependencies [8c616f0]
|
|
40
|
+
- @ai-sdk/provider-utils@5.0.3
|
|
41
|
+
|
|
42
|
+
## 2.0.2
|
|
43
|
+
|
|
44
|
+
### Patch Changes
|
|
45
|
+
|
|
46
|
+
- Updated dependencies [0274f34]
|
|
47
|
+
- @ai-sdk/provider@4.0.1
|
|
48
|
+
- @ai-sdk/provider-utils@5.0.2
|
|
49
|
+
|
|
50
|
+
## 2.0.1
|
|
51
|
+
|
|
52
|
+
### Patch Changes
|
|
53
|
+
|
|
54
|
+
- Updated dependencies [6a436e3]
|
|
55
|
+
- @ai-sdk/provider-utils@5.0.1
|
|
56
|
+
|
|
57
|
+
## 2.0.0
|
|
58
|
+
|
|
59
|
+
### Major Changes
|
|
60
|
+
|
|
61
|
+
- 4963f11: add voyage ai provider with embedding and reranking support
|
|
62
|
+
- 04e9009: chore: make provider implementations code patterns more consistent, including renaming certain exported symbols
|
|
63
|
+
|
|
64
|
+
For all externally exported symbols that were renamed, the old names continue to work via deprecated aliases.
|
|
65
|
+
|
|
66
|
+
### Patch Changes
|
|
67
|
+
|
|
68
|
+
- 9f0e36c: trigger release for all packages after provenance setup
|
|
69
|
+
- 7fc6bd6: Raise minimum supported Node.js version to 22. Supported versions: 22, 24, and 26.
|
|
70
|
+
- 0c4c275: trigger initial canary release
|
|
71
|
+
- 258c093: chore: ensure consistent import handling and avoid import duplicates or cycles
|
|
72
|
+
- b8396f0: trigger initial beta release
|
|
73
|
+
- c25eb7a: chore(voyage): trigger canary release at 2.0.0
|
|
74
|
+
|
|
75
|
+
## 2.0.0-beta.25
|
|
76
|
+
|
|
77
|
+
### Patch Changes
|
|
78
|
+
|
|
79
|
+
- Updated dependencies [0416e3e]
|
|
80
|
+
- @ai-sdk/provider@4.0.0-beta.20
|
|
81
|
+
- @ai-sdk/provider-utils@5.0.0-beta.50
|
|
82
|
+
|
|
83
|
+
## 2.0.0-beta.24
|
|
84
|
+
|
|
85
|
+
### Patch Changes
|
|
86
|
+
|
|
87
|
+
- b8396f0: trigger initial beta release
|
|
88
|
+
- Updated dependencies [b8396f0]
|
|
89
|
+
- @ai-sdk/provider-utils@5.0.0-beta.49
|
|
90
|
+
- @ai-sdk/provider@4.0.0-beta.19
|
|
91
|
+
|
|
92
|
+
## 2.0.0-canary.23
|
|
93
|
+
|
|
94
|
+
### Patch Changes
|
|
95
|
+
|
|
96
|
+
- Updated dependencies [aeda373]
|
|
97
|
+
- Updated dependencies [375fdd7]
|
|
98
|
+
- Updated dependencies [b4507d5]
|
|
99
|
+
- @ai-sdk/provider-utils@5.0.0-canary.48
|
|
100
|
+
|
|
101
|
+
## 2.0.0-canary.22
|
|
102
|
+
|
|
103
|
+
### Patch Changes
|
|
104
|
+
|
|
105
|
+
- Updated dependencies [bae5e2b]
|
|
106
|
+
- @ai-sdk/provider-utils@5.0.0-canary.47
|
|
107
|
+
|
|
108
|
+
## 2.0.0-canary.21
|
|
109
|
+
|
|
110
|
+
### Patch Changes
|
|
111
|
+
|
|
112
|
+
- Updated dependencies [ce769dd]
|
|
113
|
+
- @ai-sdk/provider@4.0.0-canary.18
|
|
114
|
+
- @ai-sdk/provider-utils@5.0.0-canary.46
|
|
115
|
+
|
|
116
|
+
## 2.0.0-canary.20
|
|
117
|
+
|
|
118
|
+
### Patch Changes
|
|
119
|
+
|
|
120
|
+
- Updated dependencies [ee798eb]
|
|
121
|
+
- Updated dependencies [daf6637]
|
|
122
|
+
- @ai-sdk/provider-utils@5.0.0-canary.45
|
|
123
|
+
|
|
124
|
+
## 2.0.0-canary.19
|
|
125
|
+
|
|
126
|
+
### Patch Changes
|
|
127
|
+
|
|
128
|
+
- Updated dependencies [6c93e36]
|
|
129
|
+
- Updated dependencies [f617ac2]
|
|
130
|
+
- @ai-sdk/provider-utils@5.0.0-canary.44
|
|
131
|
+
|
|
132
|
+
## 2.0.0-canary.18
|
|
133
|
+
|
|
134
|
+
### Patch Changes
|
|
135
|
+
|
|
136
|
+
- 7fc6bd6: Raise minimum supported Node.js version to 22. Supported versions: 22, 24, and 26.
|
|
137
|
+
- Updated dependencies [7fc6bd6]
|
|
138
|
+
- @ai-sdk/provider-utils@5.0.0-canary.43
|
|
139
|
+
- @ai-sdk/provider@4.0.0-canary.17
|
|
140
|
+
|
|
141
|
+
## 2.0.0-canary.17
|
|
142
|
+
|
|
143
|
+
### Patch Changes
|
|
144
|
+
|
|
145
|
+
- Updated dependencies [a6617c5]
|
|
146
|
+
- @ai-sdk/provider-utils@5.0.0-canary.42
|
|
147
|
+
|
|
148
|
+
## 2.0.0-canary.16
|
|
149
|
+
|
|
150
|
+
### Patch Changes
|
|
151
|
+
|
|
152
|
+
- Updated dependencies [28dfa06]
|
|
153
|
+
- Updated dependencies [e93fa91]
|
|
154
|
+
- @ai-sdk/provider-utils@5.0.0-canary.41
|
|
155
|
+
|
|
156
|
+
## 2.0.0-canary.15
|
|
157
|
+
|
|
158
|
+
### Patch Changes
|
|
159
|
+
|
|
160
|
+
- Updated dependencies [a7de9c9]
|
|
161
|
+
- @ai-sdk/provider-utils@5.0.0-canary.40
|
|
162
|
+
|
|
163
|
+
## 2.0.0-canary.14
|
|
164
|
+
|
|
165
|
+
### Patch Changes
|
|
166
|
+
|
|
167
|
+
- Updated dependencies [105f95b]
|
|
168
|
+
- @ai-sdk/provider-utils@5.0.0-canary.39
|
|
169
|
+
|
|
170
|
+
## 2.0.0-canary.13
|
|
171
|
+
|
|
172
|
+
### Patch Changes
|
|
173
|
+
|
|
174
|
+
- Updated dependencies [ca446f8]
|
|
175
|
+
- @ai-sdk/provider-utils@5.0.0-canary.38
|
|
176
|
+
|
|
177
|
+
## 2.0.0-canary.12
|
|
178
|
+
|
|
179
|
+
### Patch Changes
|
|
180
|
+
|
|
181
|
+
- Updated dependencies [d848405]
|
|
182
|
+
- @ai-sdk/provider-utils@5.0.0-canary.37
|
|
183
|
+
|
|
184
|
+
## 2.0.0-canary.11
|
|
185
|
+
|
|
186
|
+
### Patch Changes
|
|
187
|
+
|
|
188
|
+
- Updated dependencies [ca39020]
|
|
189
|
+
- @ai-sdk/provider-utils@5.0.0-canary.36
|
|
190
|
+
|
|
191
|
+
## 2.0.0-canary.10
|
|
192
|
+
|
|
193
|
+
### Patch Changes
|
|
194
|
+
|
|
195
|
+
- Updated dependencies [f634bac]
|
|
196
|
+
- @ai-sdk/provider-utils@5.0.0-canary.35
|
|
197
|
+
|
|
198
|
+
## 2.0.0-canary.9
|
|
199
|
+
|
|
200
|
+
### Patch Changes
|
|
201
|
+
|
|
202
|
+
- Updated dependencies [69254e0]
|
|
203
|
+
- Updated dependencies [3015fc3]
|
|
204
|
+
- @ai-sdk/provider-utils@5.0.0-canary.34
|
|
205
|
+
|
|
206
|
+
## 2.0.0-canary.8
|
|
207
|
+
|
|
208
|
+
### Patch Changes
|
|
209
|
+
|
|
210
|
+
- c25eb7a: chore(voyage): trigger canary release at 2.0.0
|
|
211
|
+
|
|
212
|
+
## 1.0.0-canary.7
|
|
213
|
+
|
|
214
|
+
### Patch Changes
|
|
215
|
+
|
|
216
|
+
- Updated dependencies [2427d88]
|
|
217
|
+
- @ai-sdk/provider-utils@5.0.0-canary.33
|
|
218
|
+
|
|
219
|
+
## 1.0.0-canary.6
|
|
220
|
+
|
|
221
|
+
### Patch Changes
|
|
222
|
+
|
|
223
|
+
- Updated dependencies [5463d0d]
|
|
224
|
+
- @ai-sdk/provider-utils@5.0.0-canary.32
|
|
225
|
+
- @ai-sdk/provider@4.0.0-canary.16
|
|
226
|
+
|
|
227
|
+
## 1.0.0-canary.5
|
|
228
|
+
|
|
229
|
+
### Patch Changes
|
|
230
|
+
|
|
231
|
+
- 0c4c275: trigger initial canary release
|
|
232
|
+
- Updated dependencies [0c4c275]
|
|
233
|
+
- @ai-sdk/provider-utils@5.0.0-canary.31
|
|
234
|
+
- @ai-sdk/provider@4.0.0-canary.15
|
|
235
|
+
|
|
236
|
+
## 1.0.0-beta.4
|
|
237
|
+
|
|
238
|
+
### Major Changes
|
|
239
|
+
|
|
240
|
+
- 04e9009: chore: make provider implementations code patterns more consistent, including renaming certain exported symbols
|
|
241
|
+
|
|
242
|
+
For all externally exported symbols that were renamed, the old names continue to work via deprecated aliases.
|
|
243
|
+
|
|
244
|
+
### Patch Changes
|
|
245
|
+
|
|
246
|
+
- Updated dependencies [08d2129]
|
|
247
|
+
- @ai-sdk/provider-utils@5.0.0-beta.30
|
|
248
|
+
|
|
249
|
+
## 1.0.0-beta.3
|
|
250
|
+
|
|
251
|
+
### Patch Changes
|
|
252
|
+
|
|
253
|
+
- 258c093: chore: ensure consistent import handling and avoid import duplicates or cycles
|
|
254
|
+
- Updated dependencies [9bd6512]
|
|
255
|
+
- Updated dependencies [258c093]
|
|
256
|
+
- Updated dependencies [b6783da]
|
|
257
|
+
- @ai-sdk/provider-utils@5.0.0-beta.29
|
|
258
|
+
- @ai-sdk/provider@4.0.0-beta.14
|
|
259
|
+
|
|
260
|
+
## 1.0.0-beta.2
|
|
261
|
+
|
|
262
|
+
### Patch Changes
|
|
263
|
+
|
|
264
|
+
- 9f0e36c: trigger release for all packages after provenance setup
|
|
265
|
+
- Updated dependencies [9f0e36c]
|
|
266
|
+
- @ai-sdk/provider@4.0.0-beta.13
|
|
267
|
+
- @ai-sdk/provider-utils@5.0.0-beta.28
|
|
268
|
+
|
|
269
|
+
## 1.0.0-beta.1
|
|
270
|
+
|
|
271
|
+
### Patch Changes
|
|
272
|
+
|
|
273
|
+
- Updated dependencies [785fe16]
|
|
274
|
+
- Updated dependencies [67df0a0]
|
|
275
|
+
- Updated dependencies [befb78c]
|
|
276
|
+
- Updated dependencies [0458559]
|
|
277
|
+
- Updated dependencies [5852c0a]
|
|
278
|
+
- Updated dependencies [fc92055]
|
|
279
|
+
- @ai-sdk/provider-utils@5.0.0-beta.27
|
|
280
|
+
|
|
281
|
+
## 1.0.0-beta.0
|
|
282
|
+
|
|
283
|
+
### Major Changes
|
|
284
|
+
|
|
285
|
+
- 4963f11: add voyage ai provider with embedding and reranking support
|
|
286
|
+
|
|
287
|
+
### Patch Changes
|
|
288
|
+
|
|
289
|
+
- Updated dependencies [2e98477]
|
|
290
|
+
- @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.
|
package/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# AI SDK - Voyage AI Provider
|
|
2
|
+
|
|
3
|
+
The **[Voyage AI provider](https://ai-sdk.dev/providers/ai-sdk-providers/voyage)** for the [AI SDK](https://ai-sdk.dev/docs) contains embedding and reranking model support for the [Voyage AI](https://voyageai.com/) APIs.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
The Voyage AI provider is available in the `@ai-sdk/voyage` module. You can install it with
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm i @ai-sdk/voyage
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Skill for Coding Agents
|
|
14
|
+
|
|
15
|
+
If you use coding agents such as Claude Code or Cursor, we highly recommend adding the AI SDK skill to your repository:
|
|
16
|
+
|
|
17
|
+
```shell
|
|
18
|
+
npx skills add vercel/ai
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Provider Instance
|
|
22
|
+
|
|
23
|
+
You can import the default provider instance `voyage` from `@ai-sdk/voyage`:
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { voyage } from '@ai-sdk/voyage';
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Example
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { voyage } from '@ai-sdk/voyage';
|
|
33
|
+
import { embedMany } from 'ai';
|
|
34
|
+
|
|
35
|
+
const { embeddings } = await embedMany({
|
|
36
|
+
model: voyage.textEmbedding('voyage-3'),
|
|
37
|
+
values: [
|
|
38
|
+
'Sunny days are great for hiking',
|
|
39
|
+
'Machine learning is a subset of AI',
|
|
40
|
+
],
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Documentation
|
|
45
|
+
|
|
46
|
+
Please check out the **[Voyage AI provider documentation](https://ai-sdk.dev/providers/ai-sdk-providers/voyage)** for more information.
|
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,289 @@
|
|
|
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-model-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-model-options.ts
|
|
142
|
+
import {
|
|
143
|
+
lazySchema,
|
|
144
|
+
zodSchema
|
|
145
|
+
} from "@ai-sdk/provider-utils";
|
|
146
|
+
import { z as z4 } from "zod/v4";
|
|
147
|
+
var voyageRerankingModelOptionsSchema = lazySchema(
|
|
148
|
+
() => zodSchema(
|
|
149
|
+
z4.object({
|
|
150
|
+
returnDocuments: z4.boolean().optional(),
|
|
151
|
+
truncation: z4.boolean().optional()
|
|
152
|
+
})
|
|
153
|
+
)
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// src/reranking/voyage-reranking-model.ts
|
|
157
|
+
var VoyageRerankingModel = class {
|
|
158
|
+
constructor(modelId, config) {
|
|
159
|
+
this.specificationVersion = "v4";
|
|
160
|
+
this.modelId = modelId;
|
|
161
|
+
this.config = config;
|
|
162
|
+
}
|
|
163
|
+
get provider() {
|
|
164
|
+
return this.config.provider;
|
|
165
|
+
}
|
|
166
|
+
async doRerank({
|
|
167
|
+
documents,
|
|
168
|
+
headers,
|
|
169
|
+
query,
|
|
170
|
+
topN,
|
|
171
|
+
abortSignal,
|
|
172
|
+
providerOptions
|
|
173
|
+
}) {
|
|
174
|
+
const rerankingOptions = await parseProviderOptions2({
|
|
175
|
+
provider: "voyage",
|
|
176
|
+
providerOptions,
|
|
177
|
+
schema: voyageRerankingModelOptionsSchema
|
|
178
|
+
});
|
|
179
|
+
const warnings = [];
|
|
180
|
+
if (documents.type === "object") {
|
|
181
|
+
warnings.push({
|
|
182
|
+
type: "compatibility",
|
|
183
|
+
feature: "object documents",
|
|
184
|
+
details: "Object documents are converted to strings."
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
const stringValues = documents.type === "text" ? documents.values : documents.values.map((value) => JSON.stringify(value));
|
|
188
|
+
const {
|
|
189
|
+
responseHeaders,
|
|
190
|
+
value: response,
|
|
191
|
+
rawValue
|
|
192
|
+
} = await postJsonToApi2({
|
|
193
|
+
url: `${this.config.baseURL}/rerank`,
|
|
194
|
+
headers: combineHeaders2(this.config.headers(), headers),
|
|
195
|
+
body: {
|
|
196
|
+
query,
|
|
197
|
+
documents: stringValues,
|
|
198
|
+
model: this.modelId,
|
|
199
|
+
top_k: topN,
|
|
200
|
+
return_documents: rerankingOptions == null ? void 0 : rerankingOptions.returnDocuments,
|
|
201
|
+
truncation: rerankingOptions == null ? void 0 : rerankingOptions.truncation
|
|
202
|
+
},
|
|
203
|
+
failedResponseHandler: voyageFailedResponseHandler,
|
|
204
|
+
successfulResponseHandler: createJsonResponseHandler2(
|
|
205
|
+
voyageRerankingResponseSchema
|
|
206
|
+
),
|
|
207
|
+
abortSignal,
|
|
208
|
+
fetch: this.config.fetch
|
|
209
|
+
});
|
|
210
|
+
return {
|
|
211
|
+
ranking: response.data.map((result) => ({
|
|
212
|
+
index: result.index,
|
|
213
|
+
relevanceScore: result.relevance_score
|
|
214
|
+
})),
|
|
215
|
+
warnings,
|
|
216
|
+
response: {
|
|
217
|
+
headers: responseHeaders,
|
|
218
|
+
body: rawValue
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
var voyageRerankingResponseSchema = lazySchema2(
|
|
224
|
+
() => zodSchema2(
|
|
225
|
+
z5.object({
|
|
226
|
+
data: z5.array(
|
|
227
|
+
z5.object({
|
|
228
|
+
index: z5.number(),
|
|
229
|
+
relevance_score: z5.number()
|
|
230
|
+
})
|
|
231
|
+
)
|
|
232
|
+
})
|
|
233
|
+
)
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
// src/version.ts
|
|
237
|
+
var VERSION = true ? "0.0.0-cca10482-20260708215408" : "0.0.0-test";
|
|
238
|
+
|
|
239
|
+
// src/voyage-provider.ts
|
|
240
|
+
function createVoyage(options = {}) {
|
|
241
|
+
var _a;
|
|
242
|
+
const baseURL = (_a = withoutTrailingSlash(options.baseURL)) != null ? _a : "https://api.voyageai.com/v1";
|
|
243
|
+
const getHeaders = () => withUserAgentSuffix(
|
|
244
|
+
{
|
|
245
|
+
Authorization: `Bearer ${loadApiKey({
|
|
246
|
+
apiKey: options.apiKey,
|
|
247
|
+
environmentVariableName: "VOYAGE_API_KEY",
|
|
248
|
+
description: "Voyage"
|
|
249
|
+
})}`,
|
|
250
|
+
...options.headers
|
|
251
|
+
},
|
|
252
|
+
`ai-sdk/voyage/${VERSION}`
|
|
253
|
+
);
|
|
254
|
+
const createEmbeddingModel = (modelId) => new VoyageEmbeddingModel(modelId, {
|
|
255
|
+
provider: "voyage.embedding",
|
|
256
|
+
baseURL,
|
|
257
|
+
headers: getHeaders,
|
|
258
|
+
fetch: options.fetch
|
|
259
|
+
});
|
|
260
|
+
const createRerankingModel = (modelId) => new VoyageRerankingModel(modelId, {
|
|
261
|
+
provider: "voyage.reranking",
|
|
262
|
+
baseURL,
|
|
263
|
+
headers: getHeaders,
|
|
264
|
+
fetch: options.fetch
|
|
265
|
+
});
|
|
266
|
+
const provider = {
|
|
267
|
+
specificationVersion: "v4",
|
|
268
|
+
embedding: createEmbeddingModel,
|
|
269
|
+
embeddingModel: createEmbeddingModel,
|
|
270
|
+
textEmbedding: createEmbeddingModel,
|
|
271
|
+
textEmbeddingModel: createEmbeddingModel,
|
|
272
|
+
reranking: createRerankingModel,
|
|
273
|
+
rerankingModel: createRerankingModel,
|
|
274
|
+
languageModel: (modelId) => {
|
|
275
|
+
throw new NoSuchModelError({ modelId, modelType: "languageModel" });
|
|
276
|
+
},
|
|
277
|
+
imageModel: (modelId) => {
|
|
278
|
+
throw new NoSuchModelError({ modelId, modelType: "imageModel" });
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
return provider;
|
|
282
|
+
}
|
|
283
|
+
var voyage = createVoyage();
|
|
284
|
+
export {
|
|
285
|
+
VERSION,
|
|
286
|
+
createVoyage,
|
|
287
|
+
voyage
|
|
288
|
+
};
|
|
289
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/voyage-provider.ts","../src/voyage-embedding-model.ts","../src/voyage-embedding-model-options.ts","../src/voyage-error.ts","../src/reranking/voyage-reranking-model.ts","../src/reranking/voyage-reranking-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type EmbeddingModelV4,\n type RerankingModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { VoyageEmbeddingModel } from './voyage-embedding-model';\nimport type { VoyageEmbeddingModelId } from './voyage-embedding-model-options';\nimport type { VoyageRerankingModelId } from './reranking/voyage-reranking-model-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 TooManyEmbeddingValuesForCallError,\n type EmbeddingModelV4,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n voyageEmbeddingModelOptions,\n type VoyageEmbeddingModelId,\n} from './voyage-embedding-model-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 type { RerankingModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n lazySchema,\n parseProviderOptions,\n postJsonToApi,\n zodSchema,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { voyageFailedResponseHandler } from '../voyage-error';\nimport {\n voyageRerankingModelOptionsSchema,\n type VoyageRerankingModelId,\n} from './voyage-reranking-model-options';\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 {\n lazySchema,\n zodSchema,\n type FlexibleSchema,\n} 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,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ai-sdk/voyage",
|
|
3
|
+
"version": "0.0.0-cca10482-20260708215408",
|
|
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": "0.0.0-cca10482-20260708215408",
|
|
29
|
+
"@ai-sdk/provider-utils": "0.0.0-cca10482-20260708215408"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "22.19.19",
|
|
33
|
+
"tsup": "^8.5.1",
|
|
34
|
+
"typescript": "5.8.3",
|
|
35
|
+
"zod": "3.25.76",
|
|
36
|
+
"@ai-sdk/test-server": "2.0.0",
|
|
37
|
+
"@vercel/ai-tsconfig": "0.0.0"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"zod": "^3.25.76 || ^4.1.8"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22"
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public",
|
|
47
|
+
"provenance": true
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://ai-sdk.dev/docs",
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "https://github.com/vercel/ai",
|
|
53
|
+
"directory": "packages/voyage"
|
|
54
|
+
},
|
|
55
|
+
"bugs": {
|
|
56
|
+
"url": "https://github.com/vercel/ai/issues"
|
|
57
|
+
},
|
|
58
|
+
"keywords": [
|
|
59
|
+
"ai"
|
|
60
|
+
],
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
|
|
63
|
+
"build:watch": "pnpm clean && tsup --watch",
|
|
64
|
+
"clean": "del-cli dist *.tsbuildinfo",
|
|
65
|
+
"type-check": "tsc --build",
|
|
66
|
+
"test": "pnpm test:node && pnpm test:edge",
|
|
67
|
+
"test:update": "pnpm test:node -u",
|
|
68
|
+
"test:watch": "vitest --config vitest.node.config.js",
|
|
69
|
+
"test:edge": "vitest --config vitest.edge.config.js --run",
|
|
70
|
+
"test:node": "vitest --config vitest.node.config.js --run"
|
|
71
|
+
}
|
|
72
|
+
}
|
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-model-options';
|
|
4
|
+
export type { VoyageRerankingModelOptions } from './reranking/voyage-reranking-model-options';
|
|
5
|
+
export { VERSION } from './version';
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {
|
|
2
|
+
lazySchema,
|
|
3
|
+
zodSchema,
|
|
4
|
+
type FlexibleSchema,
|
|
5
|
+
} from '@ai-sdk/provider-utils';
|
|
6
|
+
import { z } from 'zod/v4';
|
|
7
|
+
|
|
8
|
+
export type VoyageRerankingModelId =
|
|
9
|
+
| 'rerank-2.5'
|
|
10
|
+
| 'rerank-2.5-lite'
|
|
11
|
+
| 'rerank-2'
|
|
12
|
+
| 'rerank-2-lite'
|
|
13
|
+
| 'rerank-1'
|
|
14
|
+
| 'rerank-lite-1'
|
|
15
|
+
| (string & {});
|
|
16
|
+
|
|
17
|
+
export type VoyageRerankingModelOptions = {
|
|
18
|
+
returnDocuments?: boolean;
|
|
19
|
+
truncation?: boolean;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const voyageRerankingModelOptionsSchema: FlexibleSchema<VoyageRerankingModelOptions> =
|
|
23
|
+
lazySchema(() =>
|
|
24
|
+
zodSchema(
|
|
25
|
+
z.object({
|
|
26
|
+
returnDocuments: z.boolean().optional(),
|
|
27
|
+
truncation: z.boolean().optional(),
|
|
28
|
+
}),
|
|
29
|
+
),
|
|
30
|
+
);
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { RerankingModelV4, SharedV4Warning } from '@ai-sdk/provider';
|
|
2
|
+
import {
|
|
3
|
+
combineHeaders,
|
|
4
|
+
createJsonResponseHandler,
|
|
5
|
+
lazySchema,
|
|
6
|
+
parseProviderOptions,
|
|
7
|
+
postJsonToApi,
|
|
8
|
+
zodSchema,
|
|
9
|
+
type FetchFunction,
|
|
10
|
+
} from '@ai-sdk/provider-utils';
|
|
11
|
+
import { z } from 'zod/v4';
|
|
12
|
+
import { voyageFailedResponseHandler } from '../voyage-error';
|
|
13
|
+
import {
|
|
14
|
+
voyageRerankingModelOptionsSchema,
|
|
15
|
+
type VoyageRerankingModelId,
|
|
16
|
+
} from './voyage-reranking-model-options';
|
|
17
|
+
type VoyageRerankingConfig = {
|
|
18
|
+
provider: string;
|
|
19
|
+
baseURL: string;
|
|
20
|
+
headers: () => Record<string, string | undefined>;
|
|
21
|
+
fetch?: FetchFunction;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export class VoyageRerankingModel implements RerankingModelV4 {
|
|
25
|
+
readonly specificationVersion = 'v4';
|
|
26
|
+
readonly modelId: VoyageRerankingModelId;
|
|
27
|
+
|
|
28
|
+
private readonly config: VoyageRerankingConfig;
|
|
29
|
+
|
|
30
|
+
constructor(modelId: VoyageRerankingModelId, config: VoyageRerankingConfig) {
|
|
31
|
+
this.modelId = modelId;
|
|
32
|
+
this.config = config;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
get provider(): string {
|
|
36
|
+
return this.config.provider;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async doRerank({
|
|
40
|
+
documents,
|
|
41
|
+
headers,
|
|
42
|
+
query,
|
|
43
|
+
topN,
|
|
44
|
+
abortSignal,
|
|
45
|
+
providerOptions,
|
|
46
|
+
}: Parameters<RerankingModelV4['doRerank']>[0]): Promise<
|
|
47
|
+
Awaited<ReturnType<RerankingModelV4['doRerank']>>
|
|
48
|
+
> {
|
|
49
|
+
const rerankingOptions = await parseProviderOptions({
|
|
50
|
+
provider: 'voyage',
|
|
51
|
+
providerOptions,
|
|
52
|
+
schema: voyageRerankingModelOptionsSchema,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const warnings: SharedV4Warning[] = [];
|
|
56
|
+
|
|
57
|
+
if (documents.type === 'object') {
|
|
58
|
+
warnings.push({
|
|
59
|
+
type: 'compatibility',
|
|
60
|
+
feature: 'object documents',
|
|
61
|
+
details: 'Object documents are converted to strings.',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const stringValues =
|
|
66
|
+
documents.type === 'text'
|
|
67
|
+
? documents.values
|
|
68
|
+
: documents.values.map(value => JSON.stringify(value));
|
|
69
|
+
|
|
70
|
+
const {
|
|
71
|
+
responseHeaders,
|
|
72
|
+
value: response,
|
|
73
|
+
rawValue,
|
|
74
|
+
} = await postJsonToApi({
|
|
75
|
+
url: `${this.config.baseURL}/rerank`,
|
|
76
|
+
headers: combineHeaders(this.config.headers(), headers),
|
|
77
|
+
body: {
|
|
78
|
+
query,
|
|
79
|
+
documents: stringValues,
|
|
80
|
+
model: this.modelId,
|
|
81
|
+
top_k: topN,
|
|
82
|
+
return_documents: rerankingOptions?.returnDocuments,
|
|
83
|
+
truncation: rerankingOptions?.truncation,
|
|
84
|
+
},
|
|
85
|
+
failedResponseHandler: voyageFailedResponseHandler,
|
|
86
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
87
|
+
voyageRerankingResponseSchema,
|
|
88
|
+
),
|
|
89
|
+
abortSignal,
|
|
90
|
+
fetch: this.config.fetch,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
ranking: response.data.map(result => ({
|
|
95
|
+
index: result.index,
|
|
96
|
+
relevanceScore: result.relevance_score,
|
|
97
|
+
})),
|
|
98
|
+
warnings,
|
|
99
|
+
response: {
|
|
100
|
+
headers: responseHeaders,
|
|
101
|
+
body: rawValue,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const voyageRerankingResponseSchema = lazySchema(() =>
|
|
108
|
+
zodSchema(
|
|
109
|
+
z.object({
|
|
110
|
+
data: z.array(
|
|
111
|
+
z.object({
|
|
112
|
+
index: z.number(),
|
|
113
|
+
relevance_score: z.number(),
|
|
114
|
+
}),
|
|
115
|
+
),
|
|
116
|
+
}),
|
|
117
|
+
),
|
|
118
|
+
);
|
package/src/version.ts
ADDED
|
@@ -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,131 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TooManyEmbeddingValuesForCallError,
|
|
3
|
+
type EmbeddingModelV4,
|
|
4
|
+
} from '@ai-sdk/provider';
|
|
5
|
+
import {
|
|
6
|
+
combineHeaders,
|
|
7
|
+
createJsonResponseHandler,
|
|
8
|
+
parseProviderOptions,
|
|
9
|
+
postJsonToApi,
|
|
10
|
+
serializeModelOptions,
|
|
11
|
+
WORKFLOW_SERIALIZE,
|
|
12
|
+
WORKFLOW_DESERIALIZE,
|
|
13
|
+
type FetchFunction,
|
|
14
|
+
} from '@ai-sdk/provider-utils';
|
|
15
|
+
import { z } from 'zod/v4';
|
|
16
|
+
import {
|
|
17
|
+
voyageEmbeddingModelOptions,
|
|
18
|
+
type VoyageEmbeddingModelId,
|
|
19
|
+
} from './voyage-embedding-model-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,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,91 @@
|
|
|
1
|
+
import {
|
|
2
|
+
NoSuchModelError,
|
|
3
|
+
type EmbeddingModelV4,
|
|
4
|
+
type RerankingModelV4,
|
|
5
|
+
type ProviderV4,
|
|
6
|
+
} from '@ai-sdk/provider';
|
|
7
|
+
import {
|
|
8
|
+
loadApiKey,
|
|
9
|
+
withoutTrailingSlash,
|
|
10
|
+
withUserAgentSuffix,
|
|
11
|
+
type FetchFunction,
|
|
12
|
+
} from '@ai-sdk/provider-utils';
|
|
13
|
+
import { VoyageEmbeddingModel } from './voyage-embedding-model';
|
|
14
|
+
import type { VoyageEmbeddingModelId } from './voyage-embedding-model-options';
|
|
15
|
+
import type { VoyageRerankingModelId } from './reranking/voyage-reranking-model-options';
|
|
16
|
+
import { VoyageRerankingModel } from './reranking/voyage-reranking-model';
|
|
17
|
+
import { VERSION } from './version';
|
|
18
|
+
|
|
19
|
+
export interface VoyageProvider extends ProviderV4 {
|
|
20
|
+
embedding(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
|
|
21
|
+
embeddingModel(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
|
|
22
|
+
textEmbedding(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
|
|
23
|
+
textEmbeddingModel(modelId: VoyageEmbeddingModelId): EmbeddingModelV4;
|
|
24
|
+
reranking(modelId: VoyageRerankingModelId): RerankingModelV4;
|
|
25
|
+
rerankingModel(modelId: VoyageRerankingModelId): RerankingModelV4;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface VoyageProviderSettings {
|
|
29
|
+
baseURL?: string;
|
|
30
|
+
apiKey?: string;
|
|
31
|
+
headers?: Record<string, string>;
|
|
32
|
+
fetch?: FetchFunction;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function createVoyage(
|
|
36
|
+
options: VoyageProviderSettings = {},
|
|
37
|
+
): VoyageProvider {
|
|
38
|
+
const baseURL =
|
|
39
|
+
withoutTrailingSlash(options.baseURL) ?? 'https://api.voyageai.com/v1';
|
|
40
|
+
|
|
41
|
+
const getHeaders = () =>
|
|
42
|
+
withUserAgentSuffix(
|
|
43
|
+
{
|
|
44
|
+
Authorization: `Bearer ${loadApiKey({
|
|
45
|
+
apiKey: options.apiKey,
|
|
46
|
+
environmentVariableName: 'VOYAGE_API_KEY',
|
|
47
|
+
description: 'Voyage',
|
|
48
|
+
})}`,
|
|
49
|
+
...options.headers,
|
|
50
|
+
},
|
|
51
|
+
`ai-sdk/voyage/${VERSION}`,
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const createEmbeddingModel = (modelId: VoyageEmbeddingModelId) =>
|
|
55
|
+
new VoyageEmbeddingModel(modelId, {
|
|
56
|
+
provider: 'voyage.embedding',
|
|
57
|
+
baseURL,
|
|
58
|
+
headers: getHeaders,
|
|
59
|
+
fetch: options.fetch,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const createRerankingModel = (modelId: VoyageRerankingModelId) =>
|
|
63
|
+
new VoyageRerankingModel(modelId, {
|
|
64
|
+
provider: 'voyage.reranking',
|
|
65
|
+
baseURL,
|
|
66
|
+
headers: getHeaders,
|
|
67
|
+
fetch: options.fetch,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const provider: VoyageProvider = {
|
|
71
|
+
specificationVersion: 'v4' as const,
|
|
72
|
+
embedding: createEmbeddingModel,
|
|
73
|
+
embeddingModel: createEmbeddingModel,
|
|
74
|
+
textEmbedding: createEmbeddingModel,
|
|
75
|
+
textEmbeddingModel: createEmbeddingModel,
|
|
76
|
+
reranking: createRerankingModel,
|
|
77
|
+
rerankingModel: createRerankingModel,
|
|
78
|
+
|
|
79
|
+
languageModel: (modelId: string) => {
|
|
80
|
+
throw new NoSuchModelError({ modelId, modelType: 'languageModel' });
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
imageModel: (modelId: string) => {
|
|
84
|
+
throw new NoSuchModelError({ modelId, modelType: 'imageModel' });
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
return provider;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export const voyage = createVoyage();
|