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.
- package/CHANGELOG.md +7 -0
- package/dist/index.js +41 -37
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41 -37
- package/dist/index.mjs.map +1 -1
- package/dist/internal/index.js +1 -1
- package/dist/internal/index.mjs +1 -1
- package/docs/03-ai-sdk-core/16-mcp-tools.mdx +6 -0
- package/docs/03-ai-sdk-core/35-image-generation.mdx +1 -1
- package/docs/03-ai-sdk-core/40-middleware.mdx +13 -13
- package/docs/03-ai-sdk-core/55-testing.mdx +10 -10
- package/docs/03-ai-sdk-core/65-event-listeners.mdx +1 -1
- package/docs/06-advanced/04-caching.mdx +10 -10
- package/docs/07-reference/01-ai-sdk-core/01-generate-text.mdx +3 -3
- package/docs/07-reference/01-ai-sdk-core/02-stream-text.mdx +3 -3
- package/docs/07-reference/01-ai-sdk-core/10-generate-image.mdx +1 -1
- package/docs/07-reference/01-ai-sdk-core/11-transcribe.mdx +1 -1
- package/docs/07-reference/01-ai-sdk-core/12-generate-speech.mdx +1 -1
- package/docs/07-reference/01-ai-sdk-core/13-generate-video.mdx +1 -1
- package/docs/07-reference/01-ai-sdk-core/16-tool-loop-agent.mdx +1 -1
- package/docs/07-reference/01-ai-sdk-core/23-create-mcp-client.mdx +7 -0
- package/docs/07-reference/01-ai-sdk-core/30-model-message.mdx +2 -2
- package/docs/07-reference/01-ai-sdk-core/60-wrap-language-model.mdx +4 -4
- package/docs/07-reference/01-ai-sdk-core/61-wrap-image-model.mdx +4 -4
- package/docs/07-reference/01-ai-sdk-core/65-language-model-v2-middleware.mdx +9 -9
- package/docs/07-reference/01-ai-sdk-core/66-extract-reasoning-middleware.mdx +1 -1
- package/docs/07-reference/01-ai-sdk-core/68-default-settings-middleware.mdx +1 -1
- package/docs/08-migration-guides/23-migration-guide-7-0.mdx +29 -0
- package/docs/09-troubleshooting/30-model-is-not-assignable-to-type.mdx +1 -1
- package/package.json +2 -2
- package/src/generate-text/create-stream-text-part-transform.ts +64 -12
- package/src/generate-text/run-tools-transformation.ts +34 -53
- 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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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 {
|
|
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
|
|
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
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
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 {
|
|
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?:
|
|
102
|
+
readonly promptMessages?: LanguageModelV4Prompt;
|
|
103
103
|
readonly stepTools?: ReadonlyArray<Record<string, unknown>>;
|
|
104
104
|
readonly stepToolChoice?: unknown;
|
|
105
105
|
}
|