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.
@@ -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.174" : "0.0.0-test";
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 ({
@@ -131,7 +131,7 @@ import {
131
131
  } from "@ai-sdk/provider-utils";
132
132
 
133
133
  // src/version.ts
134
- var VERSION = true ? "6.0.174" : "0.0.0-test";
134
+ var VERSION = true ? "6.0.176" : "0.0.0-test";
135
135
 
136
136
  // src/util/download/download.ts
137
137
  var download = async ({
@@ -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: 'providerMetadata',
173
+ name: 'metadata',
174
174
  isOptional: true,
175
- type: 'ProviderMetadata',
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 providerMetadata 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.",
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: 'providerMetadata',
157
+ name: 'metadata',
158
158
  isOptional: true,
159
- type: 'ProviderMetadata',
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 providerMetadata 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."
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: 'Client name. Defaults to "ai-sdk-mcp-client"',
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.174",
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.109",
48
+ "@ai-sdk/gateway": "3.0.111",
49
49
  "@ai-sdk/provider": "3.0.10",
50
- "@ai-sdk/provider-utils": "4.0.26"
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: tools?.[toolCall.toolName]?.title,
95
+ title: tool?.title,
116
96
  providerExecuted: toolCall.providerExecuted,
117
- providerMetadata: mergeToolProviderMetadata(
118
- tools?.[toolCall.toolName]?.providerMetadata,
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: mergedProviderMetadata,
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: mergedProviderMetadata,
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
 
@@ -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.