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.
@@ -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.21",
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.16",
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
  },
@@ -171,236 +171,248 @@ export async function embedMany({
171
171
  telemetry,
172
172
  });
173
173
 
174
- await notify({
175
- event: {
176
- callId,
177
- operationId: 'ai.embedMany',
178
- provider: model.provider,
179
- modelId: model.modelId,
180
- value: values,
181
- maxRetries,
182
- headers: headersWithUserAgent,
183
- providerOptions,
184
- },
185
- callbacks: [resolvedOnStart, telemetryDispatcher.onStart],
186
- });
187
-
188
- try {
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
- if (maxEmbeddingsPerCall == null || maxEmbeddingsPerCall === Infinity) {
195
- const { embeddings, usage, warnings, response, providerMetadata } =
196
- await retry(async () => {
197
- const embedCallId = generateCallId();
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
- await notify({
200
- event: {
201
- callId,
202
- embedCallId,
203
- operationId: 'ai.embedMany.doEmbed',
204
- provider: model.provider,
205
- modelId: model.modelId,
206
- values,
207
- },
208
- callbacks: [telemetryDispatcher.onEmbedStart],
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
- const modelResponse = await model.doEmbed({
212
- values,
213
- abortSignal,
214
- headers: headersWithUserAgent,
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
- embedCallId,
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.onEmbedEnd],
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: modelResponse.warnings ?? [],
239
- providerMetadata: modelResponse.providerMetadata,
240
- response: modelResponse.response,
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
- const modelResponse = await model.doEmbed({
314
- values: chunk,
315
- abortSignal,
316
- headers: headersWithUserAgent,
317
- providerOptions,
318
- });
286
+ const valueChunks = splitArray(values, maxEmbeddingsPerCall);
319
287
 
320
- const chunkEmbeddings = modelResponse.embeddings;
321
- const usage = modelResponse.usage ?? { tokens: NaN };
322
-
323
- await notify({
324
- event: {
325
- callId,
326
- embedCallId,
327
- operationId: 'ai.embedMany.doEmbed',
328
- provider: model.provider,
329
- modelId: model.modelId,
330
- values: chunk,
331
- embeddings: chunkEmbeddings,
332
- usage,
333
- },
334
- callbacks: [telemetryDispatcher.onEmbedEnd],
335
- });
336
-
337
- return {
338
- embeddings: chunkEmbeddings,
339
- usage,
340
- warnings: modelResponse.warnings ?? [],
341
- providerMetadata: modelResponse.providerMetadata,
342
- response: modelResponse.response,
343
- };
344
- });
345
- }),
346
- );
347
-
348
- for (const result of results) {
349
- embeddings.push(...result.embeddings);
350
- warnings.push(...result.warnings);
351
- responses.push(result.response);
352
- tokens += result.usage.tokens;
353
- if (result.providerMetadata) {
354
- if (!providerMetadata) {
355
- providerMetadata = { ...result.providerMetadata };
356
- } else {
357
- for (const [providerName, metadata] of Object.entries(
358
- result.providerMetadata,
359
- )) {
360
- providerMetadata[providerName] = {
361
- ...(providerMetadata[providerName] ?? {}),
362
- ...metadata,
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
- this.ws.send(JSON.stringify(data));
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
 
@@ -7,6 +7,7 @@ export type TelemetryTracingEventType =
7
7
  | 'languageModelCall'
8
8
  | 'executeTool'
9
9
  | 'embed'
10
+ | 'embedMany'
10
11
  | 'rerank';
11
12
 
12
13
  export type TelemetryTracingChannelMessage<EVENT = unknown> = {