ai 7.0.0-beta.21 → 7.0.0-beta.22

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.
Files changed (33) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/index.js +41 -37
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +41 -37
  5. package/dist/index.mjs.map +1 -1
  6. package/dist/internal/index.js +1 -1
  7. package/dist/internal/index.mjs +1 -1
  8. package/docs/03-ai-sdk-core/16-mcp-tools.mdx +6 -0
  9. package/docs/03-ai-sdk-core/35-image-generation.mdx +1 -1
  10. package/docs/03-ai-sdk-core/40-middleware.mdx +13 -13
  11. package/docs/03-ai-sdk-core/55-testing.mdx +10 -10
  12. package/docs/03-ai-sdk-core/65-event-listeners.mdx +1 -1
  13. package/docs/06-advanced/04-caching.mdx +10 -10
  14. package/docs/07-reference/01-ai-sdk-core/01-generate-text.mdx +3 -3
  15. package/docs/07-reference/01-ai-sdk-core/02-stream-text.mdx +3 -3
  16. package/docs/07-reference/01-ai-sdk-core/10-generate-image.mdx +1 -1
  17. package/docs/07-reference/01-ai-sdk-core/11-transcribe.mdx +1 -1
  18. package/docs/07-reference/01-ai-sdk-core/12-generate-speech.mdx +1 -1
  19. package/docs/07-reference/01-ai-sdk-core/13-generate-video.mdx +1 -1
  20. package/docs/07-reference/01-ai-sdk-core/16-tool-loop-agent.mdx +1 -1
  21. package/docs/07-reference/01-ai-sdk-core/23-create-mcp-client.mdx +7 -0
  22. package/docs/07-reference/01-ai-sdk-core/30-model-message.mdx +2 -2
  23. package/docs/07-reference/01-ai-sdk-core/60-wrap-language-model.mdx +4 -4
  24. package/docs/07-reference/01-ai-sdk-core/61-wrap-image-model.mdx +4 -4
  25. package/docs/07-reference/01-ai-sdk-core/65-language-model-v2-middleware.mdx +9 -9
  26. package/docs/07-reference/01-ai-sdk-core/66-extract-reasoning-middleware.mdx +1 -1
  27. package/docs/07-reference/01-ai-sdk-core/68-default-settings-middleware.mdx +1 -1
  28. package/docs/08-migration-guides/23-migration-guide-7-0.mdx +29 -0
  29. package/docs/09-troubleshooting/30-model-is-not-assignable-to-type.mdx +1 -1
  30. package/package.json +2 -2
  31. package/src/generate-text/create-stream-text-part-transform.ts +64 -12
  32. package/src/generate-text/run-tools-transformation.ts +34 -53
  33. package/src/telemetry/open-telemetry-integration.ts +2 -2
@@ -1,18 +1,44 @@
1
1
  import { LanguageModelV4StreamPart } from '@ai-sdk/provider';
2
2
  import { ProviderMetadata } from '../types/provider-metadata';
3
+ import { DefaultGeneratedFileWithType, GeneratedFile } from './generated-file';
3
4
 
4
5
  export type UglyTransformedStreamTextPart =
5
6
  | Exclude<
6
7
  LanguageModelV4StreamPart,
7
- {
8
- type: 'text-delta';
9
- }
8
+ | {
9
+ type: 'text-delta';
10
+ }
11
+ | {
12
+ type: 'reasoning-delta';
13
+ }
14
+ | {
15
+ type: 'file';
16
+ }
17
+ | {
18
+ type: 'reasoning-file';
19
+ }
10
20
  >
11
21
  | {
12
22
  type: 'text-delta';
13
23
  id: string;
14
24
  providerMetadata?: ProviderMetadata;
15
25
  text: string;
26
+ }
27
+ | {
28
+ type: 'reasoning-delta';
29
+ id: string;
30
+ providerMetadata?: ProviderMetadata;
31
+ text: string;
32
+ }
33
+ | {
34
+ type: 'file';
35
+ file: GeneratedFile;
36
+ providerMetadata?: ProviderMetadata;
37
+ }
38
+ | {
39
+ type: 'reasoning-file';
40
+ file: GeneratedFile;
41
+ providerMetadata?: ProviderMetadata;
16
42
  };
17
43
 
18
44
  export function createStreamTextPartTransform() {
@@ -21,15 +47,41 @@ export function createStreamTextPartTransform() {
21
47
  UglyTransformedStreamTextPart
22
48
  >({
23
49
  async transform(chunk, controller) {
24
- if (chunk.type === 'text-delta') {
25
- controller.enqueue({
26
- type: 'text-delta',
27
- id: chunk.id,
28
- text: chunk.delta,
29
- providerMetadata: chunk.providerMetadata,
30
- });
31
- } else {
32
- controller.enqueue(chunk);
50
+ switch (chunk.type) {
51
+ case 'text-delta':
52
+ controller.enqueue({
53
+ type: 'text-delta',
54
+ id: chunk.id,
55
+ text: chunk.delta,
56
+ providerMetadata: chunk.providerMetadata,
57
+ });
58
+ break;
59
+
60
+ case 'reasoning-delta':
61
+ controller.enqueue({
62
+ type: 'reasoning-delta',
63
+ id: chunk.id,
64
+ text: chunk.delta,
65
+ providerMetadata: chunk.providerMetadata,
66
+ });
67
+ break;
68
+
69
+ case 'file':
70
+ case 'reasoning-file': {
71
+ controller.enqueue({
72
+ type: chunk.type,
73
+ file: new DefaultGeneratedFileWithType({
74
+ data: chunk.data,
75
+ mediaType: chunk.mediaType,
76
+ }),
77
+ providerMetadata: chunk.providerMetadata,
78
+ });
79
+ break;
80
+ }
81
+
82
+ default:
83
+ controller.enqueue(chunk);
84
+ break;
33
85
  }
34
86
  },
35
87
  });
@@ -13,7 +13,7 @@ import { Source } from '../types/language-model';
13
13
  import { asLanguageModelUsage } from '../types/usage';
14
14
  import { UglyTransformedStreamTextPart } from './create-stream-text-part-transform';
15
15
  import { executeToolCall } from './execute-tool-call';
16
- import { DefaultGeneratedFileWithType, GeneratedFile } from './generated-file';
16
+ import { GeneratedFile } from './generated-file';
17
17
  import { isApprovalNeeded } from './is-approval-needed';
18
18
  import { parseToolCall } from './parse-tool-call';
19
19
  import {
@@ -153,7 +153,8 @@ export function runToolsTransformation<TOOLS extends ToolSet>({
153
153
  | Array<StreamTextOnToolCallFinishCallback<TOOLS> | undefined | null>;
154
154
  executeToolInTelemetryContext?: TelemetryIntegration['executeTool'];
155
155
  }): ReadableStream<SingleRequestTextStreamPart<TOOLS>> {
156
- // tool results stream
156
+ // there is a separate stream for tool results, because
157
+ // tool results might be emitted after the generator stream has finished
157
158
  let toolResultsStreamController: ReadableStreamDefaultController<
158
159
  SingleRequestTextStreamPart<TOOLS>
159
160
  > | null = null;
@@ -213,10 +214,13 @@ export function runToolsTransformation<TOOLS extends ToolSet>({
213
214
  case 'text-delta':
214
215
  case 'text-end':
215
216
  case 'reasoning-start':
217
+ case 'reasoning-delta':
216
218
  case 'reasoning-end':
217
219
  case 'tool-input-start':
218
220
  case 'tool-input-delta':
219
221
  case 'tool-input-end':
222
+ case 'file':
223
+ case 'reasoning-file':
220
224
  case 'source':
221
225
  case 'response-metadata':
222
226
  case 'error':
@@ -225,30 +229,6 @@ export function runToolsTransformation<TOOLS extends ToolSet>({
225
229
  break;
226
230
  }
227
231
 
228
- case 'reasoning-delta':
229
- controller.enqueue({
230
- type: 'reasoning-delta',
231
- id: chunk.id,
232
- text: chunk.delta,
233
- providerMetadata: chunk.providerMetadata,
234
- });
235
- break;
236
-
237
- case 'file':
238
- case 'reasoning-file': {
239
- controller.enqueue({
240
- type: chunk.type,
241
- file: new DefaultGeneratedFileWithType({
242
- data: chunk.data,
243
- mediaType: chunk.mediaType,
244
- }),
245
- ...(chunk.providerMetadata != null
246
- ? { providerMetadata: chunk.providerMetadata }
247
- : {}),
248
- });
249
- break;
250
- }
251
-
252
232
  case 'finish': {
253
233
  finishChunk = {
254
234
  type: 'finish',
@@ -394,33 +374,34 @@ export function runToolsTransformation<TOOLS extends ToolSet>({
394
374
  case 'tool-result': {
395
375
  const toolName = chunk.toolName as keyof TOOLS & string;
396
376
 
397
- if (chunk.isError) {
398
- toolResultsStreamController!.enqueue({
399
- type: 'tool-error',
400
- toolCallId: chunk.toolCallId,
401
- toolName,
402
- input: toolInputs.get(chunk.toolCallId),
403
- providerExecuted: true,
404
- error: chunk.result,
405
- dynamic: chunk.dynamic,
406
- ...(chunk.providerMetadata != null
407
- ? { providerMetadata: chunk.providerMetadata }
408
- : {}),
409
- } as TypedToolError<TOOLS>);
410
- } else {
411
- controller.enqueue({
412
- type: 'tool-result',
413
- toolCallId: chunk.toolCallId,
414
- toolName,
415
- input: toolInputs.get(chunk.toolCallId),
416
- output: chunk.result,
417
- providerExecuted: true,
418
- dynamic: chunk.dynamic,
419
- ...(chunk.providerMetadata != null
420
- ? { providerMetadata: chunk.providerMetadata }
421
- : {}),
422
- } as TypedToolResult<TOOLS>);
423
- }
377
+ controller.enqueue(
378
+ chunk.isError
379
+ ? ({
380
+ type: 'tool-error',
381
+ toolCallId: chunk.toolCallId,
382
+ toolName,
383
+ input: toolInputs.get(chunk.toolCallId),
384
+ providerExecuted: true,
385
+ error: chunk.result,
386
+ dynamic: chunk.dynamic,
387
+ ...(chunk.providerMetadata != null
388
+ ? { providerMetadata: chunk.providerMetadata }
389
+ : {}),
390
+ } as TypedToolError<TOOLS>)
391
+ : ({
392
+ type: 'tool-result',
393
+ toolCallId: chunk.toolCallId,
394
+ toolName,
395
+ input: toolInputs.get(chunk.toolCallId),
396
+ output: chunk.result,
397
+ providerExecuted: true,
398
+ dynamic: chunk.dynamic,
399
+ ...(chunk.providerMetadata != null
400
+ ? { providerMetadata: chunk.providerMetadata }
401
+ : {}),
402
+ } as TypedToolResult<TOOLS>),
403
+ );
404
+
424
405
  break;
425
406
  }
426
407
 
@@ -1,4 +1,4 @@
1
- import { LanguageModelV3Prompt } from '@ai-sdk/provider';
1
+ import { LanguageModelV4Prompt } from '@ai-sdk/provider';
2
2
  import {
3
3
  context,
4
4
  trace,
@@ -99,7 +99,7 @@ interface OtelStepStartEvent<
99
99
  TOOLS extends ToolSet = ToolSet,
100
100
  OUTPUT extends Output = Output,
101
101
  > extends OnStepStartEvent<TOOLS, OUTPUT> {
102
- readonly promptMessages?: LanguageModelV3Prompt;
102
+ readonly promptMessages?: LanguageModelV4Prompt;
103
103
  readonly stepTools?: ReadonlyArray<Record<string, unknown>>;
104
104
  readonly stepToolChoice?: unknown;
105
105
  }