ai 7.0.21 → 7.0.23
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 +14 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +178 -166
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +1 -1
- package/dist/internal/index.js +1 -1
- package/dist/internal/index.js.map +1 -1
- package/docs/03-ai-sdk-core/36-transcription.mdx +1 -0
- package/docs/03-ai-sdk-core/37-speech.mdx +4 -0
- package/package.json +2 -2
- package/src/embed/embed-many.ts +219 -207
- package/src/realtime/browser-realtime-transport.ts +10 -1
- package/src/telemetry/tracing-channel.ts +1 -0
|
@@ -306,5 +306,6 @@ try {
|
|
|
306
306
|
| [Google Vertex](/providers/ai-sdk-providers/google-vertex#transcription-models) | `chirp_3` |
|
|
307
307
|
| [Google Vertex](/providers/ai-sdk-providers/google-vertex#transcription-models) | `telephony` |
|
|
308
308
|
| [xAI](/providers/ai-sdk-providers/xai#transcription-models) | `default` |
|
|
309
|
+
| [Cartesia](/providers/ai-sdk-providers/cartesia#transcription-models) | `ink-whisper` |
|
|
309
310
|
|
|
310
311
|
Above are a small subset of the transcription models supported by the AI SDK providers. For more, see the respective provider documentation.
|
|
@@ -168,5 +168,9 @@ try {
|
|
|
168
168
|
| [Google Vertex](/providers/ai-sdk-providers/google-vertex#speech-models) | `gemini-2.5-flash-lite-preview-tts` |
|
|
169
169
|
| [Google Vertex](/providers/ai-sdk-providers/google-vertex#speech-models) | `gemini-3.1-flash-tts-preview` |
|
|
170
170
|
| [xAI](/providers/ai-sdk-providers/xai#speech-models) | `default` |
|
|
171
|
+
| [Cartesia](/providers/ai-sdk-providers/cartesia#speech-models) | `sonic-3.5` |
|
|
172
|
+
| [Cartesia](/providers/ai-sdk-providers/cartesia#speech-models) | `sonic-3` |
|
|
173
|
+
| [Cartesia](/providers/ai-sdk-providers/cartesia#speech-models) | `sonic-2` |
|
|
174
|
+
| [Cartesia](/providers/ai-sdk-providers/cartesia#speech-models) | `sonic-turbo` |
|
|
171
175
|
|
|
172
176
|
Above are a small subset of the speech models supported by the AI SDK providers. For more, see the respective provider documentation.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.23",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AI SDK by Vercel - build apps like ChatGPT, Claude, Gemini, and more with a single interface for any model using the Vercel AI Gateway or go direct to OpenAI, Anthropic, Google, or any other model provider.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@ai-sdk/gateway": "4.0.
|
|
45
|
+
"@ai-sdk/gateway": "4.0.17",
|
|
46
46
|
"@ai-sdk/provider": "4.0.3",
|
|
47
47
|
"@ai-sdk/provider-utils": "5.0.7"
|
|
48
48
|
},
|
package/src/embed/embed-many.ts
CHANGED
|
@@ -171,236 +171,248 @@ export async function embedMany({
|
|
|
171
171
|
telemetry,
|
|
172
172
|
});
|
|
173
173
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
const [maxEmbeddingsPerCall, supportsParallelCalls] = await Promise.all([
|
|
190
|
-
model.maxEmbeddingsPerCall,
|
|
191
|
-
model.supportsParallelCalls,
|
|
192
|
-
]);
|
|
174
|
+
const runInTracingChannelSpan =
|
|
175
|
+
telemetryDispatcher.runInTracingChannelSpan ??
|
|
176
|
+
(async <T>({ execute }: { execute: () => PromiseLike<T> }) =>
|
|
177
|
+
await execute());
|
|
178
|
+
|
|
179
|
+
const startEvent = {
|
|
180
|
+
callId,
|
|
181
|
+
operationId: 'ai.embedMany',
|
|
182
|
+
provider: model.provider,
|
|
183
|
+
modelId: model.modelId,
|
|
184
|
+
value: values,
|
|
185
|
+
maxRetries,
|
|
186
|
+
headers: headersWithUserAgent,
|
|
187
|
+
providerOptions,
|
|
188
|
+
};
|
|
193
189
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
190
|
+
return await runInTracingChannelSpan({
|
|
191
|
+
type: 'embedMany',
|
|
192
|
+
event: startEvent,
|
|
193
|
+
execute: async () => {
|
|
194
|
+
await notify({
|
|
195
|
+
event: startEvent,
|
|
196
|
+
callbacks: [resolvedOnStart, telemetryDispatcher.onStart],
|
|
197
|
+
});
|
|
198
198
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
199
|
+
try {
|
|
200
|
+
const [maxEmbeddingsPerCall, supportsParallelCalls] = await Promise.all(
|
|
201
|
+
[model.maxEmbeddingsPerCall, model.supportsParallelCalls],
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
if (maxEmbeddingsPerCall == null || maxEmbeddingsPerCall === Infinity) {
|
|
205
|
+
const { embeddings, usage, warnings, response, providerMetadata } =
|
|
206
|
+
await retry(async () => {
|
|
207
|
+
const embedCallId = generateCallId();
|
|
208
|
+
|
|
209
|
+
await notify({
|
|
210
|
+
event: {
|
|
211
|
+
callId,
|
|
212
|
+
embedCallId,
|
|
213
|
+
operationId: 'ai.embedMany.doEmbed',
|
|
214
|
+
provider: model.provider,
|
|
215
|
+
modelId: model.modelId,
|
|
216
|
+
values,
|
|
217
|
+
},
|
|
218
|
+
callbacks: [telemetryDispatcher.onEmbedStart],
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
const modelResponse = await model.doEmbed({
|
|
222
|
+
values,
|
|
223
|
+
abortSignal,
|
|
224
|
+
headers: headersWithUserAgent,
|
|
225
|
+
providerOptions,
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
const embeddings = modelResponse.embeddings;
|
|
229
|
+
const usage = modelResponse.usage ?? { tokens: NaN };
|
|
230
|
+
|
|
231
|
+
await notify({
|
|
232
|
+
event: {
|
|
233
|
+
callId,
|
|
234
|
+
embedCallId,
|
|
235
|
+
operationId: 'ai.embedMany.doEmbed',
|
|
236
|
+
provider: model.provider,
|
|
237
|
+
modelId: model.modelId,
|
|
238
|
+
values,
|
|
239
|
+
embeddings,
|
|
240
|
+
usage,
|
|
241
|
+
},
|
|
242
|
+
callbacks: [telemetryDispatcher.onEmbedEnd],
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
return {
|
|
246
|
+
embeddings,
|
|
247
|
+
usage,
|
|
248
|
+
warnings: modelResponse.warnings ?? [],
|
|
249
|
+
providerMetadata: modelResponse.providerMetadata,
|
|
250
|
+
response: modelResponse.response,
|
|
251
|
+
};
|
|
252
|
+
});
|
|
210
253
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
providerOptions,
|
|
254
|
+
logWarnings({
|
|
255
|
+
warnings,
|
|
256
|
+
provider: model.provider,
|
|
257
|
+
model: model.modelId,
|
|
216
258
|
});
|
|
217
259
|
|
|
218
|
-
const embeddings = modelResponse.embeddings;
|
|
219
|
-
const usage = modelResponse.usage ?? { tokens: NaN };
|
|
220
|
-
|
|
221
260
|
await notify({
|
|
222
261
|
event: {
|
|
223
262
|
callId,
|
|
224
|
-
|
|
225
|
-
operationId: 'ai.embedMany.doEmbed',
|
|
263
|
+
operationId: 'ai.embedMany',
|
|
226
264
|
provider: model.provider,
|
|
227
265
|
modelId: model.modelId,
|
|
228
|
-
values,
|
|
229
|
-
embeddings,
|
|
266
|
+
value: values,
|
|
267
|
+
embedding: embeddings,
|
|
230
268
|
usage,
|
|
269
|
+
warnings,
|
|
270
|
+
providerMetadata,
|
|
271
|
+
response: [response],
|
|
231
272
|
},
|
|
232
|
-
callbacks: [telemetryDispatcher.
|
|
273
|
+
callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd],
|
|
233
274
|
});
|
|
234
275
|
|
|
235
|
-
return {
|
|
276
|
+
return new DefaultEmbedManyResult({
|
|
277
|
+
values,
|
|
236
278
|
embeddings,
|
|
237
279
|
usage,
|
|
238
|
-
warnings
|
|
239
|
-
providerMetadata
|
|
240
|
-
|
|
241
|
-
};
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
logWarnings({
|
|
245
|
-
warnings,
|
|
246
|
-
provider: model.provider,
|
|
247
|
-
model: model.modelId,
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
await notify({
|
|
251
|
-
event: {
|
|
252
|
-
callId,
|
|
253
|
-
operationId: 'ai.embedMany',
|
|
254
|
-
provider: model.provider,
|
|
255
|
-
modelId: model.modelId,
|
|
256
|
-
value: values,
|
|
257
|
-
embedding: embeddings,
|
|
258
|
-
usage,
|
|
259
|
-
warnings,
|
|
260
|
-
providerMetadata,
|
|
261
|
-
response: [response],
|
|
262
|
-
},
|
|
263
|
-
callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd],
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
return new DefaultEmbedManyResult({
|
|
267
|
-
values,
|
|
268
|
-
embeddings,
|
|
269
|
-
usage,
|
|
270
|
-
warnings,
|
|
271
|
-
providerMetadata,
|
|
272
|
-
responses: [response],
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
const valueChunks = splitArray(values, maxEmbeddingsPerCall);
|
|
277
|
-
|
|
278
|
-
const embeddings: Array<Embedding> = [];
|
|
279
|
-
const warnings: Array<Warning> = [];
|
|
280
|
-
const responses: Array<
|
|
281
|
-
| {
|
|
282
|
-
headers?: Record<string, string>;
|
|
283
|
-
body?: unknown;
|
|
280
|
+
warnings,
|
|
281
|
+
providerMetadata,
|
|
282
|
+
responses: [response],
|
|
283
|
+
});
|
|
284
284
|
}
|
|
285
|
-
| undefined
|
|
286
|
-
> = [];
|
|
287
|
-
let tokens = 0;
|
|
288
|
-
let providerMetadata: ProviderMetadata | undefined;
|
|
289
|
-
|
|
290
|
-
const parallelChunks = splitArray(
|
|
291
|
-
valueChunks,
|
|
292
|
-
supportsParallelCalls ? maxParallelCalls : 1,
|
|
293
|
-
);
|
|
294
|
-
|
|
295
|
-
for (const parallelChunk of parallelChunks) {
|
|
296
|
-
const results = await Promise.all(
|
|
297
|
-
parallelChunk.map(chunk => {
|
|
298
|
-
return retry(async () => {
|
|
299
|
-
const embedCallId = generateCallId();
|
|
300
|
-
|
|
301
|
-
await notify({
|
|
302
|
-
event: {
|
|
303
|
-
callId,
|
|
304
|
-
embedCallId,
|
|
305
|
-
operationId: 'ai.embedMany.doEmbed',
|
|
306
|
-
provider: model.provider,
|
|
307
|
-
modelId: model.modelId,
|
|
308
|
-
values: chunk,
|
|
309
|
-
},
|
|
310
|
-
callbacks: [telemetryDispatcher.onEmbedStart],
|
|
311
|
-
});
|
|
312
285
|
|
|
313
|
-
|
|
314
|
-
values: chunk,
|
|
315
|
-
abortSignal,
|
|
316
|
-
headers: headersWithUserAgent,
|
|
317
|
-
providerOptions,
|
|
318
|
-
});
|
|
286
|
+
const valueChunks = splitArray(values, maxEmbeddingsPerCall);
|
|
319
287
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
288
|
+
const embeddings: Array<Embedding> = [];
|
|
289
|
+
const warnings: Array<Warning> = [];
|
|
290
|
+
const responses: Array<
|
|
291
|
+
| {
|
|
292
|
+
headers?: Record<string, string>;
|
|
293
|
+
body?: unknown;
|
|
294
|
+
}
|
|
295
|
+
| undefined
|
|
296
|
+
> = [];
|
|
297
|
+
let tokens = 0;
|
|
298
|
+
let providerMetadata: ProviderMetadata | undefined;
|
|
299
|
+
|
|
300
|
+
const parallelChunks = splitArray(
|
|
301
|
+
valueChunks,
|
|
302
|
+
supportsParallelCalls ? maxParallelCalls : 1,
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
for (const parallelChunk of parallelChunks) {
|
|
306
|
+
const results = await Promise.all(
|
|
307
|
+
parallelChunk.map(chunk => {
|
|
308
|
+
return retry(async () => {
|
|
309
|
+
const embedCallId = generateCallId();
|
|
310
|
+
|
|
311
|
+
await notify({
|
|
312
|
+
event: {
|
|
313
|
+
callId,
|
|
314
|
+
embedCallId,
|
|
315
|
+
operationId: 'ai.embedMany.doEmbed',
|
|
316
|
+
provider: model.provider,
|
|
317
|
+
modelId: model.modelId,
|
|
318
|
+
values: chunk,
|
|
319
|
+
},
|
|
320
|
+
callbacks: [telemetryDispatcher.onEmbedStart],
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
const modelResponse = await model.doEmbed({
|
|
324
|
+
values: chunk,
|
|
325
|
+
abortSignal,
|
|
326
|
+
headers: headersWithUserAgent,
|
|
327
|
+
providerOptions,
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
const chunkEmbeddings = modelResponse.embeddings;
|
|
331
|
+
const usage = modelResponse.usage ?? { tokens: NaN };
|
|
332
|
+
|
|
333
|
+
await notify({
|
|
334
|
+
event: {
|
|
335
|
+
callId,
|
|
336
|
+
embedCallId,
|
|
337
|
+
operationId: 'ai.embedMany.doEmbed',
|
|
338
|
+
provider: model.provider,
|
|
339
|
+
modelId: model.modelId,
|
|
340
|
+
values: chunk,
|
|
341
|
+
embeddings: chunkEmbeddings,
|
|
342
|
+
usage,
|
|
343
|
+
},
|
|
344
|
+
callbacks: [telemetryDispatcher.onEmbedEnd],
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
return {
|
|
348
|
+
embeddings: chunkEmbeddings,
|
|
349
|
+
usage,
|
|
350
|
+
warnings: modelResponse.warnings ?? [],
|
|
351
|
+
providerMetadata: modelResponse.providerMetadata,
|
|
352
|
+
response: modelResponse.response,
|
|
353
|
+
};
|
|
354
|
+
});
|
|
355
|
+
}),
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
for (const result of results) {
|
|
359
|
+
embeddings.push(...result.embeddings);
|
|
360
|
+
warnings.push(...result.warnings);
|
|
361
|
+
responses.push(result.response);
|
|
362
|
+
tokens += result.usage.tokens;
|
|
363
|
+
if (result.providerMetadata) {
|
|
364
|
+
if (!providerMetadata) {
|
|
365
|
+
providerMetadata = { ...result.providerMetadata };
|
|
366
|
+
} else {
|
|
367
|
+
for (const [providerName, metadata] of Object.entries(
|
|
368
|
+
result.providerMetadata,
|
|
369
|
+
)) {
|
|
370
|
+
providerMetadata[providerName] = {
|
|
371
|
+
...(providerMetadata[providerName] ?? {}),
|
|
372
|
+
...metadata,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
}
|
|
364
376
|
}
|
|
365
377
|
}
|
|
366
378
|
}
|
|
379
|
+
|
|
380
|
+
logWarnings({
|
|
381
|
+
warnings,
|
|
382
|
+
provider: model.provider,
|
|
383
|
+
model: model.modelId,
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
await notify({
|
|
387
|
+
event: {
|
|
388
|
+
callId,
|
|
389
|
+
operationId: 'ai.embedMany',
|
|
390
|
+
provider: model.provider,
|
|
391
|
+
modelId: model.modelId,
|
|
392
|
+
value: values,
|
|
393
|
+
embedding: embeddings,
|
|
394
|
+
usage: { tokens },
|
|
395
|
+
warnings,
|
|
396
|
+
providerMetadata,
|
|
397
|
+
response: responses,
|
|
398
|
+
},
|
|
399
|
+
callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd],
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
return new DefaultEmbedManyResult({
|
|
403
|
+
values,
|
|
404
|
+
embeddings,
|
|
405
|
+
usage: { tokens },
|
|
406
|
+
warnings,
|
|
407
|
+
providerMetadata: providerMetadata,
|
|
408
|
+
responses,
|
|
409
|
+
});
|
|
410
|
+
} catch (error) {
|
|
411
|
+
await telemetryDispatcher.onError?.({ callId, error });
|
|
412
|
+
throw error;
|
|
367
413
|
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
logWarnings({
|
|
371
|
-
warnings,
|
|
372
|
-
provider: model.provider,
|
|
373
|
-
model: model.modelId,
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
await notify({
|
|
377
|
-
event: {
|
|
378
|
-
callId,
|
|
379
|
-
operationId: 'ai.embedMany',
|
|
380
|
-
provider: model.provider,
|
|
381
|
-
modelId: model.modelId,
|
|
382
|
-
value: values,
|
|
383
|
-
embedding: embeddings,
|
|
384
|
-
usage: { tokens },
|
|
385
|
-
warnings,
|
|
386
|
-
providerMetadata,
|
|
387
|
-
response: responses,
|
|
388
|
-
},
|
|
389
|
-
callbacks: [resolvedOnEnd, telemetryDispatcher.onEnd],
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
return new DefaultEmbedManyResult({
|
|
393
|
-
values,
|
|
394
|
-
embeddings,
|
|
395
|
-
usage: { tokens },
|
|
396
|
-
warnings,
|
|
397
|
-
providerMetadata: providerMetadata,
|
|
398
|
-
responses,
|
|
399
|
-
});
|
|
400
|
-
} catch (error) {
|
|
401
|
-
await telemetryDispatcher.onError?.({ callId, error });
|
|
402
|
-
throw error;
|
|
403
|
-
}
|
|
414
|
+
},
|
|
415
|
+
});
|
|
404
416
|
}
|
|
405
417
|
|
|
406
418
|
class DefaultEmbedManyResult implements EmbedManyResult {
|
|
@@ -94,7 +94,16 @@ export class BrowserRealtimeTransport {
|
|
|
94
94
|
|
|
95
95
|
sendRaw(data: unknown): void {
|
|
96
96
|
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
97
|
-
|
|
97
|
+
if (
|
|
98
|
+
typeof data === 'string' ||
|
|
99
|
+
data instanceof ArrayBuffer ||
|
|
100
|
+
ArrayBuffer.isView(data) ||
|
|
101
|
+
data instanceof Blob
|
|
102
|
+
) {
|
|
103
|
+
this.ws.send(data);
|
|
104
|
+
} else {
|
|
105
|
+
this.ws.send(JSON.stringify(data));
|
|
106
|
+
}
|
|
98
107
|
}
|
|
99
108
|
}
|
|
100
109
|
|