ai 6.0.174 → 6.0.176
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 +16 -0
- package/dist/index.d.mts +18 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +92 -42
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +95 -43
- package/dist/index.mjs.map +1 -1
- package/dist/internal/index.js +1 -1
- package/dist/internal/index.mjs +1 -1
- package/docs/02-foundations/02-providers-and-models.mdx +3 -0
- package/docs/07-reference/01-ai-sdk-core/20-tool.mdx +3 -3
- package/docs/07-reference/01-ai-sdk-core/22-dynamic-tool.mdx +3 -3
- package/docs/07-reference/01-ai-sdk-core/23-create-mcp-client.mdx +9 -1
- package/package.json +3 -3
- package/src/generate-text/execute-tool-call.ts +6 -0
- package/src/generate-text/generate-text.ts +12 -0
- package/src/generate-text/parse-tool-call.ts +8 -33
- package/src/generate-text/run-tools-transformation.ts +10 -0
- package/src/generate-text/stream-text-result.ts +2 -0
- package/src/generate-text/stream-text.ts +15 -0
- package/src/generate-text/tool-call.ts +2 -0
- package/src/generate-text/tool-error.ts +3 -0
- package/src/generate-text/tool-result.ts +3 -0
- package/src/ui/process-ui-message-stream.ts +29 -1
- package/src/ui/ui-messages.ts +3 -0
- package/src/ui/validate-ui-messages.ts +25 -1
- package/src/ui-message-stream/ui-message-chunks.ts +17 -0
package/dist/internal/index.js
CHANGED
|
@@ -152,7 +152,7 @@ function detectMediaType({
|
|
|
152
152
|
var import_provider_utils2 = require("@ai-sdk/provider-utils");
|
|
153
153
|
|
|
154
154
|
// src/version.ts
|
|
155
|
-
var VERSION = true ? "6.0.
|
|
155
|
+
var VERSION = true ? "6.0.176" : "0.0.0-test";
|
|
156
156
|
|
|
157
157
|
// src/util/download/download.ts
|
|
158
158
|
var download = async ({
|
package/dist/internal/index.mjs
CHANGED
|
@@ -115,6 +115,7 @@ Here are the capabilities of popular models:
|
|
|
115
115
|
| [xAI Grok](/providers/ai-sdk-providers/xai) | `grok-3` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
116
116
|
| [xAI Grok](/providers/ai-sdk-providers/xai) | `grok-3-mini` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
117
117
|
| [Vercel](/providers/ai-sdk-providers/vercel) | `v0-1.0-md` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
118
|
+
| [OpenAI](/providers/ai-sdk-providers/openai) | `gpt-5.5` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
118
119
|
| [OpenAI](/providers/ai-sdk-providers/openai) | `gpt-5.4-pro` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
119
120
|
| [OpenAI](/providers/ai-sdk-providers/openai) | `gpt-5.4` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
120
121
|
| [OpenAI](/providers/ai-sdk-providers/openai) | `gpt-5.4-mini` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
@@ -142,7 +143,9 @@ Here are the capabilities of popular models:
|
|
|
142
143
|
| [Mistral](/providers/ai-sdk-providers/mistral) | `pixtral-large-latest` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
143
144
|
| [Mistral](/providers/ai-sdk-providers/mistral) | `mistral-large-latest` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
144
145
|
| [Mistral](/providers/ai-sdk-providers/mistral) | `mistral-medium-latest` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
146
|
+
| [Mistral](/providers/ai-sdk-providers/mistral) | `mistral-medium-3` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
145
147
|
| [Mistral](/providers/ai-sdk-providers/mistral) | `mistral-medium-2505` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
148
|
+
| [Mistral](/providers/ai-sdk-providers/mistral) | `mistral-medium-3.5` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
146
149
|
| [Mistral](/providers/ai-sdk-providers/mistral) | `mistral-small-latest` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
147
150
|
| [Mistral](/providers/ai-sdk-providers/mistral) | `pixtral-12b-2409` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
148
151
|
| [DeepSeek](/providers/ai-sdk-providers/deepseek) | `deepseek-chat` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
@@ -170,11 +170,11 @@ export const weatherTool = tool({
|
|
|
170
170
|
'Additional provider-specific metadata. They are passed through to the provider from the AI SDK and enable provider-specific functionality that can be fully encapsulated in the provider.',
|
|
171
171
|
},
|
|
172
172
|
{
|
|
173
|
-
name: '
|
|
173
|
+
name: 'metadata',
|
|
174
174
|
isOptional: true,
|
|
175
|
-
type: '
|
|
175
|
+
type: 'JSONObject',
|
|
176
176
|
description:
|
|
177
|
-
"Optional metadata about the tool itself (e.g. its source). It is propagated onto the resulting tool call's
|
|
177
|
+
"Optional metadata about the tool itself (e.g. its source). It is propagated onto the resulting tool call's toolMetadata so consumers can read it from tool call/result parts and UI message parts. Useful for sources of dynamic tools (e.g. an MCP server) to identify themselves.",
|
|
178
178
|
},
|
|
179
179
|
{
|
|
180
180
|
name: 'type',
|
|
@@ -154,11 +154,11 @@ export const customTool = dynamicTool({
|
|
|
154
154
|
description: 'Additional provider-specific metadata.'
|
|
155
155
|
},
|
|
156
156
|
{
|
|
157
|
-
name: '
|
|
157
|
+
name: 'metadata',
|
|
158
158
|
isOptional: true,
|
|
159
|
-
type: '
|
|
159
|
+
type: 'JSONObject',
|
|
160
160
|
description:
|
|
161
|
-
"Optional metadata about the tool itself (e.g. its source). It is propagated onto the resulting tool call's
|
|
161
|
+
"Optional metadata about the tool itself (e.g. its source). It is propagated onto the resulting tool call's toolMetadata so consumers can read it from tool call/result parts and UI message parts. Useful for sources of dynamic tools (e.g. an MCP server) to identify themselves."
|
|
162
162
|
}
|
|
163
163
|
]
|
|
164
164
|
}
|
|
@@ -119,11 +119,19 @@ It currently does not support accepting notifications from an MCP server, and cu
|
|
|
119
119
|
},
|
|
120
120
|
],
|
|
121
121
|
},
|
|
122
|
+
{
|
|
123
|
+
name: 'clientName',
|
|
124
|
+
type: 'string',
|
|
125
|
+
isOptional: true,
|
|
126
|
+
description:
|
|
127
|
+
'Client name. Defaults to "ai-sdk-mcp-client".',
|
|
128
|
+
},
|
|
122
129
|
{
|
|
123
130
|
name: 'name',
|
|
124
131
|
type: 'string',
|
|
125
132
|
isOptional: true,
|
|
126
|
-
description:
|
|
133
|
+
description:
|
|
134
|
+
'Deprecated. Use `clientName` instead. Defaults to "ai-sdk-mcp-client".',
|
|
127
135
|
},
|
|
128
136
|
{
|
|
129
137
|
name: 'version',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.176",
|
|
4
4
|
"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.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -45,9 +45,9 @@
|
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@opentelemetry/api": "1.9.0",
|
|
48
|
-
"@ai-sdk/gateway": "3.0.
|
|
48
|
+
"@ai-sdk/gateway": "3.0.111",
|
|
49
49
|
"@ai-sdk/provider": "3.0.10",
|
|
50
|
-
"@ai-sdk/provider-utils": "4.0.
|
|
50
|
+
"@ai-sdk/provider-utils": "4.0.27"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@edge-runtime/vm": "^5.0.0",
|
|
@@ -148,6 +148,9 @@ export async function executeToolCall<TOOLS extends ToolSet>({
|
|
|
148
148
|
...(toolCall.providerMetadata != null
|
|
149
149
|
? { providerMetadata: toolCall.providerMetadata }
|
|
150
150
|
: {}),
|
|
151
|
+
...(toolCall.toolMetadata != null
|
|
152
|
+
? { toolMetadata: toolCall.toolMetadata }
|
|
153
|
+
: {}),
|
|
151
154
|
} as TypedToolError<TOOLS>;
|
|
152
155
|
}
|
|
153
156
|
|
|
@@ -191,6 +194,9 @@ export async function executeToolCall<TOOLS extends ToolSet>({
|
|
|
191
194
|
...(toolCall.providerMetadata != null
|
|
192
195
|
? { providerMetadata: toolCall.providerMetadata }
|
|
193
196
|
: {}),
|
|
197
|
+
...(toolCall.toolMetadata != null
|
|
198
|
+
? { toolMetadata: toolCall.toolMetadata }
|
|
199
|
+
: {}),
|
|
194
200
|
} as TypedToolResult<TOOLS>;
|
|
195
201
|
},
|
|
196
202
|
});
|
|
@@ -1486,6 +1486,9 @@ function asContent<TOOLS extends ToolSet>({
|
|
|
1486
1486
|
...(part.providerMetadata != null
|
|
1487
1487
|
? { providerMetadata: part.providerMetadata }
|
|
1488
1488
|
: {}),
|
|
1489
|
+
...(tool?.metadata != null
|
|
1490
|
+
? { toolMetadata: tool.metadata }
|
|
1491
|
+
: {}),
|
|
1489
1492
|
} as TypedToolError<TOOLS>);
|
|
1490
1493
|
} else {
|
|
1491
1494
|
contentParts.push({
|
|
@@ -1499,6 +1502,9 @@ function asContent<TOOLS extends ToolSet>({
|
|
|
1499
1502
|
...(part.providerMetadata != null
|
|
1500
1503
|
? { providerMetadata: part.providerMetadata }
|
|
1501
1504
|
: {}),
|
|
1505
|
+
...(tool?.metadata != null
|
|
1506
|
+
? { toolMetadata: tool.metadata }
|
|
1507
|
+
: {}),
|
|
1502
1508
|
} as TypedToolResult<TOOLS>);
|
|
1503
1509
|
}
|
|
1504
1510
|
break;
|
|
@@ -1516,6 +1522,9 @@ function asContent<TOOLS extends ToolSet>({
|
|
|
1516
1522
|
...(part.providerMetadata != null
|
|
1517
1523
|
? { providerMetadata: part.providerMetadata }
|
|
1518
1524
|
: {}),
|
|
1525
|
+
...(toolCall.toolMetadata != null
|
|
1526
|
+
? { toolMetadata: toolCall.toolMetadata }
|
|
1527
|
+
: {}),
|
|
1519
1528
|
} as TypedToolError<TOOLS>);
|
|
1520
1529
|
} else {
|
|
1521
1530
|
contentParts.push({
|
|
@@ -1529,6 +1538,9 @@ function asContent<TOOLS extends ToolSet>({
|
|
|
1529
1538
|
...(part.providerMetadata != null
|
|
1530
1539
|
? { providerMetadata: part.providerMetadata }
|
|
1531
1540
|
: {}),
|
|
1541
|
+
...(toolCall.toolMetadata != null
|
|
1542
|
+
? { toolMetadata: toolCall.toolMetadata }
|
|
1543
|
+
: {}),
|
|
1532
1544
|
} as TypedToolResult<TOOLS>);
|
|
1533
1545
|
}
|
|
1534
1546
|
break;
|
|
@@ -9,31 +9,10 @@ import {
|
|
|
9
9
|
import { InvalidToolInputError } from '../error/invalid-tool-input-error';
|
|
10
10
|
import { NoSuchToolError } from '../error/no-such-tool-error';
|
|
11
11
|
import { ToolCallRepairError } from '../error/tool-call-repair-error';
|
|
12
|
-
import type { ProviderMetadata } from '../types';
|
|
13
12
|
import type { DynamicToolCall, TypedToolCall } from './tool-call';
|
|
14
13
|
import type { ToolCallRepairFunction } from './tool-call-repair-function';
|
|
15
14
|
import type { ToolSet } from './tool-set';
|
|
16
15
|
|
|
17
|
-
/**
|
|
18
|
-
* Merge the tool's static `providerMetadata` (e.g. an MCP server name)
|
|
19
|
-
* with the `providerMetadata` returned by the language model on the tool
|
|
20
|
-
* call. Model-supplied metadata wins on conflicting top-level namespaces.
|
|
21
|
-
*/
|
|
22
|
-
function mergeToolProviderMetadata(
|
|
23
|
-
toolMetadata: ProviderMetadata | undefined,
|
|
24
|
-
callMetadata: ProviderMetadata | undefined,
|
|
25
|
-
): ProviderMetadata | undefined {
|
|
26
|
-
if (toolMetadata == null) {
|
|
27
|
-
return callMetadata;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (callMetadata == null) {
|
|
31
|
-
return toolMetadata;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return { ...toolMetadata, ...callMetadata };
|
|
35
|
-
}
|
|
36
|
-
|
|
37
16
|
export async function parseToolCall<TOOLS extends ToolSet>({
|
|
38
17
|
toolCall,
|
|
39
18
|
tools,
|
|
@@ -102,6 +81,7 @@ export async function parseToolCall<TOOLS extends ToolSet>({
|
|
|
102
81
|
// use parsed input when possible
|
|
103
82
|
const parsedInput = await safeParseJSON({ text: toolCall.input });
|
|
104
83
|
const input = parsedInput.success ? parsedInput.value : toolCall.input;
|
|
84
|
+
const tool = tools?.[toolCall.toolName];
|
|
105
85
|
|
|
106
86
|
// TODO AI SDK 6: special invalid tool call parts
|
|
107
87
|
return {
|
|
@@ -112,12 +92,10 @@ export async function parseToolCall<TOOLS extends ToolSet>({
|
|
|
112
92
|
dynamic: true,
|
|
113
93
|
invalid: true,
|
|
114
94
|
error,
|
|
115
|
-
title:
|
|
95
|
+
title: tool?.title,
|
|
116
96
|
providerExecuted: toolCall.providerExecuted,
|
|
117
|
-
providerMetadata:
|
|
118
|
-
|
|
119
|
-
toolCall.providerMetadata,
|
|
120
|
-
),
|
|
97
|
+
providerMetadata: toolCall.providerMetadata,
|
|
98
|
+
...(tool?.metadata != null ? { toolMetadata: tool.metadata } : {}),
|
|
121
99
|
};
|
|
122
100
|
}
|
|
123
101
|
}
|
|
@@ -189,11 +167,6 @@ async function doParseToolCall<TOOLS extends ToolSet>({
|
|
|
189
167
|
});
|
|
190
168
|
}
|
|
191
169
|
|
|
192
|
-
const mergedProviderMetadata = mergeToolProviderMetadata(
|
|
193
|
-
tool.providerMetadata,
|
|
194
|
-
toolCall.providerMetadata,
|
|
195
|
-
);
|
|
196
|
-
|
|
197
170
|
return tool.type === 'dynamic'
|
|
198
171
|
? {
|
|
199
172
|
type: 'tool-call',
|
|
@@ -201,7 +174,8 @@ async function doParseToolCall<TOOLS extends ToolSet>({
|
|
|
201
174
|
toolName: toolCall.toolName,
|
|
202
175
|
input: parseResult.value,
|
|
203
176
|
providerExecuted: toolCall.providerExecuted,
|
|
204
|
-
providerMetadata:
|
|
177
|
+
providerMetadata: toolCall.providerMetadata,
|
|
178
|
+
...(tool.metadata != null ? { toolMetadata: tool.metadata } : {}),
|
|
205
179
|
dynamic: true,
|
|
206
180
|
title: tool.title,
|
|
207
181
|
}
|
|
@@ -211,7 +185,8 @@ async function doParseToolCall<TOOLS extends ToolSet>({
|
|
|
211
185
|
toolName,
|
|
212
186
|
input: parseResult.value,
|
|
213
187
|
providerExecuted: toolCall.providerExecuted,
|
|
214
|
-
providerMetadata:
|
|
188
|
+
providerMetadata: toolCall.providerMetadata,
|
|
189
|
+
...(tool.metadata != null ? { toolMetadata: tool.metadata } : {}),
|
|
215
190
|
title: tool.title,
|
|
216
191
|
};
|
|
217
192
|
}
|
|
@@ -295,6 +295,9 @@ export function runToolsTransformation<TOOLS extends ToolSet>({
|
|
|
295
295
|
error: getErrorMessage(toolCall.error!),
|
|
296
296
|
dynamic: true,
|
|
297
297
|
title: toolCall.title,
|
|
298
|
+
...(toolCall.toolMetadata != null
|
|
299
|
+
? { toolMetadata: toolCall.toolMetadata }
|
|
300
|
+
: {}),
|
|
298
301
|
});
|
|
299
302
|
break;
|
|
300
303
|
}
|
|
@@ -382,6 +385,7 @@ export function runToolsTransformation<TOOLS extends ToolSet>({
|
|
|
382
385
|
|
|
383
386
|
case 'tool-result': {
|
|
384
387
|
const toolName = chunk.toolName as keyof TOOLS & string;
|
|
388
|
+
const toolCall = toolCallsByToolCallId.get(chunk.toolCallId);
|
|
385
389
|
|
|
386
390
|
if (chunk.isError) {
|
|
387
391
|
toolResultsStreamController!.enqueue({
|
|
@@ -395,6 +399,9 @@ export function runToolsTransformation<TOOLS extends ToolSet>({
|
|
|
395
399
|
...(chunk.providerMetadata != null
|
|
396
400
|
? { providerMetadata: chunk.providerMetadata }
|
|
397
401
|
: {}),
|
|
402
|
+
...(toolCall?.toolMetadata != null
|
|
403
|
+
? { toolMetadata: toolCall.toolMetadata }
|
|
404
|
+
: {}),
|
|
398
405
|
} as TypedToolError<TOOLS>);
|
|
399
406
|
} else {
|
|
400
407
|
controller.enqueue({
|
|
@@ -408,6 +415,9 @@ export function runToolsTransformation<TOOLS extends ToolSet>({
|
|
|
408
415
|
...(chunk.providerMetadata != null
|
|
409
416
|
? { providerMetadata: chunk.providerMetadata }
|
|
410
417
|
: {}),
|
|
418
|
+
...(toolCall?.toolMetadata != null
|
|
419
|
+
? { toolMetadata: toolCall.toolMetadata }
|
|
420
|
+
: {}),
|
|
411
421
|
} as TypedToolResult<TOOLS>);
|
|
412
422
|
}
|
|
413
423
|
break;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { JSONObject } from '@ai-sdk/provider';
|
|
1
2
|
import type { IdGenerator } from '@ai-sdk/provider-utils';
|
|
2
3
|
import type { ServerResponse } from 'node:http';
|
|
3
4
|
import type {
|
|
@@ -409,6 +410,7 @@ export type TextStreamPart<TOOLS extends ToolSet> =
|
|
|
409
410
|
id: string;
|
|
410
411
|
toolName: string;
|
|
411
412
|
providerMetadata?: ProviderMetadata;
|
|
413
|
+
toolMetadata?: JSONObject;
|
|
412
414
|
providerExecuted?: boolean;
|
|
413
415
|
dynamic?: boolean;
|
|
414
416
|
title?: string;
|
|
@@ -2537,6 +2537,9 @@ class DefaultStreamTextResult<
|
|
|
2537
2537
|
...(part.providerMetadata != null
|
|
2538
2538
|
? { providerMetadata: part.providerMetadata }
|
|
2539
2539
|
: {}),
|
|
2540
|
+
...(part.toolMetadata != null
|
|
2541
|
+
? { toolMetadata: part.toolMetadata }
|
|
2542
|
+
: {}),
|
|
2540
2543
|
...(dynamic != null ? { dynamic } : {}),
|
|
2541
2544
|
...(part.title != null ? { title: part.title } : {}),
|
|
2542
2545
|
});
|
|
@@ -2567,6 +2570,9 @@ class DefaultStreamTextResult<
|
|
|
2567
2570
|
...(part.providerMetadata != null
|
|
2568
2571
|
? { providerMetadata: part.providerMetadata }
|
|
2569
2572
|
: {}),
|
|
2573
|
+
...(part.toolMetadata != null
|
|
2574
|
+
? { toolMetadata: part.toolMetadata }
|
|
2575
|
+
: {}),
|
|
2570
2576
|
...(dynamic != null ? { dynamic } : {}),
|
|
2571
2577
|
errorText: onError(part.error),
|
|
2572
2578
|
...(part.title != null ? { title: part.title } : {}),
|
|
@@ -2583,6 +2589,9 @@ class DefaultStreamTextResult<
|
|
|
2583
2589
|
...(part.providerMetadata != null
|
|
2584
2590
|
? { providerMetadata: part.providerMetadata }
|
|
2585
2591
|
: {}),
|
|
2592
|
+
...(part.toolMetadata != null
|
|
2593
|
+
? { toolMetadata: part.toolMetadata }
|
|
2594
|
+
: {}),
|
|
2586
2595
|
...(dynamic != null ? { dynamic } : {}),
|
|
2587
2596
|
...(part.title != null ? { title: part.title } : {}),
|
|
2588
2597
|
});
|
|
@@ -2613,6 +2622,9 @@ class DefaultStreamTextResult<
|
|
|
2613
2622
|
...(part.providerMetadata != null
|
|
2614
2623
|
? { providerMetadata: part.providerMetadata }
|
|
2615
2624
|
: {}),
|
|
2625
|
+
...(part.toolMetadata != null
|
|
2626
|
+
? { toolMetadata: part.toolMetadata }
|
|
2627
|
+
: {}),
|
|
2616
2628
|
...(part.preliminary != null
|
|
2617
2629
|
? { preliminary: part.preliminary }
|
|
2618
2630
|
: {}),
|
|
@@ -2638,6 +2650,9 @@ class DefaultStreamTextResult<
|
|
|
2638
2650
|
...(part.providerMetadata != null
|
|
2639
2651
|
? { providerMetadata: part.providerMetadata }
|
|
2640
2652
|
: {}),
|
|
2653
|
+
...(part.toolMetadata != null
|
|
2654
|
+
? { toolMetadata: part.toolMetadata }
|
|
2655
|
+
: {}),
|
|
2641
2656
|
...(dynamic != null ? { dynamic } : {}),
|
|
2642
2657
|
});
|
|
2643
2658
|
break;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { JSONObject } from '@ai-sdk/provider';
|
|
1
2
|
import type { Tool } from '@ai-sdk/provider-utils';
|
|
2
3
|
import type { ProviderMetadata } from '../types';
|
|
3
4
|
import type { ValueOf } from '../util/value-of';
|
|
@@ -8,6 +9,7 @@ type BaseToolCall = {
|
|
|
8
9
|
toolCallId: string;
|
|
9
10
|
providerExecuted?: boolean;
|
|
10
11
|
providerMetadata?: ProviderMetadata;
|
|
12
|
+
toolMetadata?: JSONObject;
|
|
11
13
|
};
|
|
12
14
|
|
|
13
15
|
export type StaticToolCall<TOOLS extends ToolSet> = ValueOf<{
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { JSONObject } from '@ai-sdk/provider';
|
|
1
2
|
import type { InferToolInput } from '@ai-sdk/provider-utils';
|
|
2
3
|
import type { ProviderMetadata } from '../types';
|
|
3
4
|
import type { ValueOf } from '../util/value-of';
|
|
@@ -12,6 +13,7 @@ export type StaticToolError<TOOLS extends ToolSet> = ValueOf<{
|
|
|
12
13
|
error: unknown;
|
|
13
14
|
providerExecuted?: boolean;
|
|
14
15
|
providerMetadata?: ProviderMetadata;
|
|
16
|
+
toolMetadata?: JSONObject;
|
|
15
17
|
dynamic?: false | undefined;
|
|
16
18
|
title?: string;
|
|
17
19
|
};
|
|
@@ -25,6 +27,7 @@ export type DynamicToolError = {
|
|
|
25
27
|
error: unknown;
|
|
26
28
|
providerExecuted?: boolean;
|
|
27
29
|
providerMetadata?: ProviderMetadata;
|
|
30
|
+
toolMetadata?: JSONObject;
|
|
28
31
|
dynamic: true;
|
|
29
32
|
title?: string;
|
|
30
33
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { JSONObject } from '@ai-sdk/provider';
|
|
1
2
|
import type { InferToolInput, InferToolOutput } from '@ai-sdk/provider-utils';
|
|
2
3
|
import type { ProviderMetadata } from '../types';
|
|
3
4
|
import type { ValueOf } from '../../src/util/value-of';
|
|
@@ -12,6 +13,7 @@ export type StaticToolResult<TOOLS extends ToolSet> = ValueOf<{
|
|
|
12
13
|
output: InferToolOutput<TOOLS[NAME]>;
|
|
13
14
|
providerExecuted?: boolean;
|
|
14
15
|
providerMetadata?: ProviderMetadata;
|
|
16
|
+
toolMetadata?: JSONObject;
|
|
15
17
|
dynamic?: false | undefined;
|
|
16
18
|
preliminary?: boolean;
|
|
17
19
|
title?: string;
|
|
@@ -26,6 +28,7 @@ export type DynamicToolResult = {
|
|
|
26
28
|
output: unknown;
|
|
27
29
|
providerExecuted?: boolean;
|
|
28
30
|
providerMetadata?: ProviderMetadata;
|
|
31
|
+
toolMetadata?: JSONObject;
|
|
29
32
|
dynamic: true;
|
|
30
33
|
preliminary?: boolean;
|
|
31
34
|
title?: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TypeValidationContext } from '@ai-sdk/provider';
|
|
1
|
+
import { TypeValidationContext, type JSONObject } from '@ai-sdk/provider';
|
|
2
2
|
import { validateTypes, type FlexibleSchema } from '@ai-sdk/provider-utils';
|
|
3
3
|
import { UIMessageStreamError } from '../error/ui-message-stream-error';
|
|
4
4
|
import type { ProviderMetadata } from '../types';
|
|
@@ -42,6 +42,7 @@ export type StreamingUIMessageState<UI_MESSAGE extends UIMessage> = {
|
|
|
42
42
|
toolName: string;
|
|
43
43
|
dynamic?: boolean;
|
|
44
44
|
title?: string;
|
|
45
|
+
toolMetadata?: JSONObject;
|
|
45
46
|
}
|
|
46
47
|
>;
|
|
47
48
|
finishReason?: FinishReason;
|
|
@@ -126,6 +127,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
126
127
|
toolCallId: string;
|
|
127
128
|
providerExecuted?: boolean;
|
|
128
129
|
title?: string;
|
|
130
|
+
toolMetadata?: JSONObject;
|
|
129
131
|
} & (
|
|
130
132
|
| {
|
|
131
133
|
state: 'input-streaming';
|
|
@@ -176,6 +178,9 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
176
178
|
if (options.title !== undefined) {
|
|
177
179
|
anyPart.title = options.title;
|
|
178
180
|
}
|
|
181
|
+
if (options.toolMetadata !== undefined) {
|
|
182
|
+
anyPart.toolMetadata = options.toolMetadata;
|
|
183
|
+
}
|
|
179
184
|
// once providerExecuted is set, it stays for streaming
|
|
180
185
|
anyPart.providerExecuted =
|
|
181
186
|
anyOptions.providerExecuted ?? part.providerExecuted;
|
|
@@ -203,6 +208,9 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
203
208
|
toolCallId: options.toolCallId,
|
|
204
209
|
state: options.state,
|
|
205
210
|
title: options.title,
|
|
211
|
+
...(options.toolMetadata !== undefined
|
|
212
|
+
? { toolMetadata: options.toolMetadata }
|
|
213
|
+
: {}),
|
|
206
214
|
input: anyOptions.input,
|
|
207
215
|
output: anyOptions.output,
|
|
208
216
|
rawInput: anyOptions.rawInput,
|
|
@@ -231,6 +239,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
231
239
|
toolCallId: string;
|
|
232
240
|
providerExecuted?: boolean;
|
|
233
241
|
title?: string;
|
|
242
|
+
toolMetadata?: JSONObject;
|
|
234
243
|
} & (
|
|
235
244
|
| {
|
|
236
245
|
state: 'input-streaming';
|
|
@@ -277,6 +286,9 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
277
286
|
if (options.title !== undefined) {
|
|
278
287
|
anyPart.title = options.title;
|
|
279
288
|
}
|
|
289
|
+
if (options.toolMetadata !== undefined) {
|
|
290
|
+
anyPart.toolMetadata = options.toolMetadata;
|
|
291
|
+
}
|
|
280
292
|
// once providerExecuted is set, it stays for streaming
|
|
281
293
|
anyPart.providerExecuted =
|
|
282
294
|
anyOptions.providerExecuted ?? part.providerExecuted;
|
|
@@ -310,6 +322,9 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
310
322
|
preliminary: anyOptions.preliminary,
|
|
311
323
|
providerExecuted: anyOptions.providerExecuted,
|
|
312
324
|
title: options.title,
|
|
325
|
+
...(options.toolMetadata !== undefined
|
|
326
|
+
? { toolMetadata: options.toolMetadata }
|
|
327
|
+
: {}),
|
|
313
328
|
...(anyOptions.providerMetadata != null &&
|
|
314
329
|
(options.state === 'output-available' ||
|
|
315
330
|
options.state === 'output-error')
|
|
@@ -503,6 +518,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
503
518
|
index: toolInvocations.length,
|
|
504
519
|
dynamic: chunk.dynamic,
|
|
505
520
|
title: chunk.title,
|
|
521
|
+
toolMetadata: chunk.toolMetadata,
|
|
506
522
|
};
|
|
507
523
|
|
|
508
524
|
if (chunk.dynamic) {
|
|
@@ -513,6 +529,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
513
529
|
input: undefined,
|
|
514
530
|
providerExecuted: chunk.providerExecuted,
|
|
515
531
|
title: chunk.title,
|
|
532
|
+
toolMetadata: chunk.toolMetadata,
|
|
516
533
|
providerMetadata: chunk.providerMetadata,
|
|
517
534
|
});
|
|
518
535
|
} else {
|
|
@@ -523,6 +540,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
523
540
|
input: undefined,
|
|
524
541
|
providerExecuted: chunk.providerExecuted,
|
|
525
542
|
title: chunk.title,
|
|
543
|
+
toolMetadata: chunk.toolMetadata,
|
|
526
544
|
providerMetadata: chunk.providerMetadata,
|
|
527
545
|
});
|
|
528
546
|
}
|
|
@@ -556,6 +574,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
556
574
|
state: 'input-streaming',
|
|
557
575
|
input: partialArgs,
|
|
558
576
|
title: partialToolCall.title,
|
|
577
|
+
toolMetadata: partialToolCall.toolMetadata,
|
|
559
578
|
});
|
|
560
579
|
} else {
|
|
561
580
|
updateToolPart({
|
|
@@ -564,6 +583,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
564
583
|
state: 'input-streaming',
|
|
565
584
|
input: partialArgs,
|
|
566
585
|
title: partialToolCall.title,
|
|
586
|
+
toolMetadata: partialToolCall.toolMetadata,
|
|
567
587
|
});
|
|
568
588
|
}
|
|
569
589
|
|
|
@@ -581,6 +601,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
581
601
|
providerExecuted: chunk.providerExecuted,
|
|
582
602
|
providerMetadata: chunk.providerMetadata,
|
|
583
603
|
title: chunk.title,
|
|
604
|
+
toolMetadata: chunk.toolMetadata,
|
|
584
605
|
});
|
|
585
606
|
} else {
|
|
586
607
|
updateToolPart({
|
|
@@ -591,6 +612,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
591
612
|
providerExecuted: chunk.providerExecuted,
|
|
592
613
|
providerMetadata: chunk.providerMetadata,
|
|
593
614
|
title: chunk.title,
|
|
615
|
+
toolMetadata: chunk.toolMetadata,
|
|
594
616
|
});
|
|
595
617
|
}
|
|
596
618
|
|
|
@@ -629,6 +651,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
629
651
|
errorText: chunk.errorText,
|
|
630
652
|
providerExecuted: chunk.providerExecuted,
|
|
631
653
|
providerMetadata: chunk.providerMetadata,
|
|
654
|
+
toolMetadata: chunk.toolMetadata,
|
|
632
655
|
});
|
|
633
656
|
} else {
|
|
634
657
|
updateToolPart({
|
|
@@ -640,6 +663,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
640
663
|
errorText: chunk.errorText,
|
|
641
664
|
providerExecuted: chunk.providerExecuted,
|
|
642
665
|
providerMetadata: chunk.providerMetadata,
|
|
666
|
+
toolMetadata: chunk.toolMetadata,
|
|
643
667
|
});
|
|
644
668
|
}
|
|
645
669
|
|
|
@@ -676,6 +700,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
676
700
|
providerExecuted: chunk.providerExecuted,
|
|
677
701
|
providerMetadata: chunk.providerMetadata,
|
|
678
702
|
title: toolInvocation.title,
|
|
703
|
+
toolMetadata: toolInvocation.toolMetadata,
|
|
679
704
|
});
|
|
680
705
|
} else {
|
|
681
706
|
updateToolPart({
|
|
@@ -688,6 +713,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
688
713
|
preliminary: chunk.preliminary,
|
|
689
714
|
providerMetadata: chunk.providerMetadata,
|
|
690
715
|
title: toolInvocation.title,
|
|
716
|
+
toolMetadata: toolInvocation.toolMetadata,
|
|
691
717
|
});
|
|
692
718
|
}
|
|
693
719
|
|
|
@@ -708,6 +734,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
708
734
|
providerExecuted: chunk.providerExecuted,
|
|
709
735
|
providerMetadata: chunk.providerMetadata,
|
|
710
736
|
title: toolInvocation.title,
|
|
737
|
+
toolMetadata: toolInvocation.toolMetadata,
|
|
711
738
|
});
|
|
712
739
|
} else {
|
|
713
740
|
updateToolPart({
|
|
@@ -720,6 +747,7 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
720
747
|
providerExecuted: chunk.providerExecuted,
|
|
721
748
|
providerMetadata: chunk.providerMetadata,
|
|
722
749
|
title: toolInvocation.title,
|
|
750
|
+
toolMetadata: toolInvocation.toolMetadata,
|
|
723
751
|
});
|
|
724
752
|
}
|
|
725
753
|
|
package/src/ui/ui-messages.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { JSONObject } from '@ai-sdk/provider';
|
|
1
2
|
import type {
|
|
2
3
|
InferToolInput,
|
|
3
4
|
InferToolOutput,
|
|
@@ -222,6 +223,7 @@ export type UIToolInvocation<TOOL extends UITool | Tool> = {
|
|
|
222
223
|
*/
|
|
223
224
|
toolCallId: string;
|
|
224
225
|
title?: string;
|
|
226
|
+
toolMetadata?: JSONObject;
|
|
225
227
|
|
|
226
228
|
/**
|
|
227
229
|
* Whether the tool call was executed by the provider.
|
|
@@ -329,6 +331,7 @@ export type DynamicToolUIPart = {
|
|
|
329
331
|
*/
|
|
330
332
|
toolCallId: string;
|
|
331
333
|
title?: string;
|
|
334
|
+
toolMetadata?: JSONObject;
|
|
332
335
|
|
|
333
336
|
/**
|
|
334
337
|
* Whether the tool call was executed by the provider.
|