ai 5.0.0-beta.20 → 5.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/dist/index.mjs CHANGED
@@ -1804,7 +1804,11 @@ function toResponseMessages({
1804
1804
  ).filter((part) => part.type !== "text" || part.text.length > 0).map((part) => {
1805
1805
  switch (part.type) {
1806
1806
  case "text":
1807
- return part;
1807
+ return {
1808
+ type: "text",
1809
+ text: part.text,
1810
+ providerOptions: part.providerMetadata
1811
+ };
1808
1812
  case "reasoning":
1809
1813
  return {
1810
1814
  type: "reasoning",
@@ -2552,16 +2556,19 @@ import { z as z7 } from "zod/v4";
2552
2556
  var uiMessageChunkSchema = z7.union([
2553
2557
  z7.strictObject({
2554
2558
  type: z7.literal("text-start"),
2555
- id: z7.string()
2559
+ id: z7.string(),
2560
+ providerMetadata: providerMetadataSchema.optional()
2556
2561
  }),
2557
2562
  z7.strictObject({
2558
2563
  type: z7.literal("text-delta"),
2559
2564
  id: z7.string(),
2560
- delta: z7.string()
2565
+ delta: z7.string(),
2566
+ providerMetadata: providerMetadataSchema.optional()
2561
2567
  }),
2562
2568
  z7.strictObject({
2563
2569
  type: z7.literal("text-end"),
2564
- id: z7.string()
2570
+ id: z7.string(),
2571
+ providerMetadata: providerMetadataSchema.optional()
2565
2572
  }),
2566
2573
  z7.strictObject({
2567
2574
  type: z7.literal("error"),
@@ -2583,7 +2590,8 @@ var uiMessageChunkSchema = z7.union([
2583
2590
  toolCallId: z7.string(),
2584
2591
  toolName: z7.string(),
2585
2592
  input: z7.unknown(),
2586
- providerExecuted: z7.boolean().optional()
2593
+ providerExecuted: z7.boolean().optional(),
2594
+ providerMetadata: providerMetadataSchema.optional()
2587
2595
  }),
2588
2596
  z7.strictObject({
2589
2597
  type: z7.literal("tool-output-available"),
@@ -2600,23 +2608,23 @@ var uiMessageChunkSchema = z7.union([
2600
2608
  z7.strictObject({
2601
2609
  type: z7.literal("reasoning"),
2602
2610
  text: z7.string(),
2603
- providerMetadata: z7.record(z7.string(), z7.any()).optional()
2611
+ providerMetadata: providerMetadataSchema.optional()
2604
2612
  }),
2605
2613
  z7.strictObject({
2606
2614
  type: z7.literal("reasoning-start"),
2607
2615
  id: z7.string(),
2608
- providerMetadata: z7.record(z7.string(), z7.any()).optional()
2616
+ providerMetadata: providerMetadataSchema.optional()
2609
2617
  }),
2610
2618
  z7.strictObject({
2611
2619
  type: z7.literal("reasoning-delta"),
2612
2620
  id: z7.string(),
2613
2621
  delta: z7.string(),
2614
- providerMetadata: z7.record(z7.string(), z7.any()).optional()
2622
+ providerMetadata: providerMetadataSchema.optional()
2615
2623
  }),
2616
2624
  z7.strictObject({
2617
2625
  type: z7.literal("reasoning-end"),
2618
2626
  id: z7.string(),
2619
- providerMetadata: z7.record(z7.string(), z7.any()).optional()
2627
+ providerMetadata: providerMetadataSchema.optional()
2620
2628
  }),
2621
2629
  z7.strictObject({
2622
2630
  type: z7.literal("reasoning-part-finish")
@@ -2626,8 +2634,7 @@ var uiMessageChunkSchema = z7.union([
2626
2634
  sourceId: z7.string(),
2627
2635
  url: z7.string(),
2628
2636
  title: z7.string().optional(),
2629
- providerMetadata: z7.any().optional()
2630
- // Use z.any() for generic metadata
2637
+ providerMetadata: providerMetadataSchema.optional()
2631
2638
  }),
2632
2639
  z7.strictObject({
2633
2640
  type: z7.literal("source-document"),
@@ -2635,13 +2642,13 @@ var uiMessageChunkSchema = z7.union([
2635
2642
  mediaType: z7.string(),
2636
2643
  title: z7.string(),
2637
2644
  filename: z7.string().optional(),
2638
- providerMetadata: z7.any().optional()
2639
- // Use z.any() for generic metadata
2645
+ providerMetadata: providerMetadataSchema.optional()
2640
2646
  }),
2641
2647
  z7.strictObject({
2642
2648
  type: z7.literal("file"),
2643
2649
  url: z7.string(),
2644
- mediaType: z7.string()
2650
+ mediaType: z7.string(),
2651
+ providerMetadata: providerMetadataSchema.optional()
2645
2652
  }),
2646
2653
  z7.strictObject({
2647
2654
  type: z7.string().startsWith("data-"),
@@ -3079,22 +3086,25 @@ function processUIMessageStream({
3079
3086
  }) {
3080
3087
  return stream.pipeThrough(
3081
3088
  new TransformStream({
3082
- async transform(part, controller) {
3089
+ async transform(chunk, controller) {
3083
3090
  await runUpdateMessageJob(async ({ state, write }) => {
3084
- var _a16, _b;
3091
+ var _a16, _b, _c, _d;
3085
3092
  function updateToolInvocationPart(options) {
3086
3093
  var _a17;
3087
- const part2 = state.message.parts.find(
3088
- (part3) => isToolUIPart(part3) && part3.toolCallId === options.toolCallId
3094
+ const part = state.message.parts.find(
3095
+ (part2) => isToolUIPart(part2) && part2.toolCallId === options.toolCallId
3089
3096
  );
3090
3097
  const anyOptions = options;
3091
- const anyPart = part2;
3092
- if (part2 != null) {
3093
- part2.state = options.state;
3098
+ const anyPart = part;
3099
+ if (part != null) {
3100
+ part.state = options.state;
3094
3101
  anyPart.input = anyOptions.input;
3095
3102
  anyPart.output = anyOptions.output;
3096
3103
  anyPart.errorText = anyOptions.errorText;
3097
- anyPart.providerExecuted = (_a17 = anyOptions.providerExecuted) != null ? _a17 : part2.providerExecuted;
3104
+ anyPart.providerExecuted = (_a17 = anyOptions.providerExecuted) != null ? _a17 : part.providerExecuted;
3105
+ if (anyOptions.providerMetadata != null && part.state === "input-available") {
3106
+ part.callProviderMetadata = anyOptions.providerMetadata;
3107
+ }
3098
3108
  } else {
3099
3109
  state.message.parts.push({
3100
3110
  type: `tool-${options.toolName}`,
@@ -3103,7 +3113,8 @@ function processUIMessageStream({
3103
3113
  input: anyOptions.input,
3104
3114
  output: anyOptions.output,
3105
3115
  errorText: anyOptions.errorText,
3106
- providerExecuted: anyOptions.providerExecuted
3116
+ providerExecuted: anyOptions.providerExecuted,
3117
+ ...anyOptions.providerMetadata != null ? { callProviderMetadata: anyOptions.providerMetadata } : {}
3107
3118
  });
3108
3119
  }
3109
3120
  }
@@ -3119,27 +3130,31 @@ function processUIMessageStream({
3119
3130
  state.message.metadata = mergedMetadata;
3120
3131
  }
3121
3132
  }
3122
- switch (part.type) {
3133
+ switch (chunk.type) {
3123
3134
  case "text-start": {
3124
3135
  const textPart = {
3125
3136
  type: "text",
3126
3137
  text: "",
3138
+ providerMetadata: chunk.providerMetadata,
3127
3139
  state: "streaming"
3128
3140
  };
3129
- state.activeTextParts[part.id] = textPart;
3141
+ state.activeTextParts[chunk.id] = textPart;
3130
3142
  state.message.parts.push(textPart);
3131
3143
  write();
3132
3144
  break;
3133
3145
  }
3134
3146
  case "text-delta": {
3135
- state.activeTextParts[part.id].text += part.delta;
3147
+ const textPart = state.activeTextParts[chunk.id];
3148
+ textPart.text += chunk.delta;
3149
+ textPart.providerMetadata = (_a16 = chunk.providerMetadata) != null ? _a16 : textPart.providerMetadata;
3136
3150
  write();
3137
3151
  break;
3138
3152
  }
3139
3153
  case "text-end": {
3140
- const textPart = state.activeTextParts[part.id];
3154
+ const textPart = state.activeTextParts[chunk.id];
3141
3155
  textPart.state = "done";
3142
- delete state.activeTextParts[part.id];
3156
+ textPart.providerMetadata = (_b = chunk.providerMetadata) != null ? _b : textPart.providerMetadata;
3157
+ delete state.activeTextParts[chunk.id];
3143
3158
  write();
3144
3159
  break;
3145
3160
  }
@@ -3147,34 +3162,34 @@ function processUIMessageStream({
3147
3162
  const reasoningPart = {
3148
3163
  type: "reasoning",
3149
3164
  text: "",
3150
- providerMetadata: part.providerMetadata,
3165
+ providerMetadata: chunk.providerMetadata,
3151
3166
  state: "streaming"
3152
3167
  };
3153
- state.activeReasoningParts[part.id] = reasoningPart;
3168
+ state.activeReasoningParts[chunk.id] = reasoningPart;
3154
3169
  state.message.parts.push(reasoningPart);
3155
3170
  write();
3156
3171
  break;
3157
3172
  }
3158
3173
  case "reasoning-delta": {
3159
- const reasoningPart = state.activeReasoningParts[part.id];
3160
- reasoningPart.text += part.delta;
3161
- reasoningPart.providerMetadata = (_a16 = part.providerMetadata) != null ? _a16 : reasoningPart.providerMetadata;
3174
+ const reasoningPart = state.activeReasoningParts[chunk.id];
3175
+ reasoningPart.text += chunk.delta;
3176
+ reasoningPart.providerMetadata = (_c = chunk.providerMetadata) != null ? _c : reasoningPart.providerMetadata;
3162
3177
  write();
3163
3178
  break;
3164
3179
  }
3165
3180
  case "reasoning-end": {
3166
- const reasoningPart = state.activeReasoningParts[part.id];
3167
- reasoningPart.providerMetadata = (_b = part.providerMetadata) != null ? _b : reasoningPart.providerMetadata;
3181
+ const reasoningPart = state.activeReasoningParts[chunk.id];
3182
+ reasoningPart.providerMetadata = (_d = chunk.providerMetadata) != null ? _d : reasoningPart.providerMetadata;
3168
3183
  reasoningPart.state = "done";
3169
- delete state.activeReasoningParts[part.id];
3184
+ delete state.activeReasoningParts[chunk.id];
3170
3185
  write();
3171
3186
  break;
3172
3187
  }
3173
3188
  case "file": {
3174
3189
  state.message.parts.push({
3175
3190
  type: "file",
3176
- mediaType: part.mediaType,
3177
- url: part.url
3191
+ mediaType: chunk.mediaType,
3192
+ url: chunk.url
3178
3193
  });
3179
3194
  write();
3180
3195
  break;
@@ -3182,10 +3197,10 @@ function processUIMessageStream({
3182
3197
  case "source-url": {
3183
3198
  state.message.parts.push({
3184
3199
  type: "source-url",
3185
- sourceId: part.sourceId,
3186
- url: part.url,
3187
- title: part.title,
3188
- providerMetadata: part.providerMetadata
3200
+ sourceId: chunk.sourceId,
3201
+ url: chunk.url,
3202
+ title: chunk.title,
3203
+ providerMetadata: chunk.providerMetadata
3189
3204
  });
3190
3205
  write();
3191
3206
  break;
@@ -3193,40 +3208,40 @@ function processUIMessageStream({
3193
3208
  case "source-document": {
3194
3209
  state.message.parts.push({
3195
3210
  type: "source-document",
3196
- sourceId: part.sourceId,
3197
- mediaType: part.mediaType,
3198
- title: part.title,
3199
- filename: part.filename,
3200
- providerMetadata: part.providerMetadata
3211
+ sourceId: chunk.sourceId,
3212
+ mediaType: chunk.mediaType,
3213
+ title: chunk.title,
3214
+ filename: chunk.filename,
3215
+ providerMetadata: chunk.providerMetadata
3201
3216
  });
3202
3217
  write();
3203
3218
  break;
3204
3219
  }
3205
3220
  case "tool-input-start": {
3206
3221
  const toolInvocations = state.message.parts.filter(isToolUIPart);
3207
- state.partialToolCalls[part.toolCallId] = {
3222
+ state.partialToolCalls[chunk.toolCallId] = {
3208
3223
  text: "",
3209
- toolName: part.toolName,
3224
+ toolName: chunk.toolName,
3210
3225
  index: toolInvocations.length
3211
3226
  };
3212
3227
  updateToolInvocationPart({
3213
- toolCallId: part.toolCallId,
3214
- toolName: part.toolName,
3228
+ toolCallId: chunk.toolCallId,
3229
+ toolName: chunk.toolName,
3215
3230
  state: "input-streaming",
3216
3231
  input: void 0,
3217
- providerExecuted: part.providerExecuted
3232
+ providerExecuted: chunk.providerExecuted
3218
3233
  });
3219
3234
  write();
3220
3235
  break;
3221
3236
  }
3222
3237
  case "tool-input-delta": {
3223
- const partialToolCall = state.partialToolCalls[part.toolCallId];
3224
- partialToolCall.text += part.inputTextDelta;
3238
+ const partialToolCall = state.partialToolCalls[chunk.toolCallId];
3239
+ partialToolCall.text += chunk.inputTextDelta;
3225
3240
  const { value: partialArgs } = await parsePartialJson(
3226
3241
  partialToolCall.text
3227
3242
  );
3228
3243
  updateToolInvocationPart({
3229
- toolCallId: part.toolCallId,
3244
+ toolCallId: chunk.toolCallId,
3230
3245
  toolName: partialToolCall.toolName,
3231
3246
  state: "input-streaming",
3232
3247
  input: partialArgs
@@ -3236,23 +3251,24 @@ function processUIMessageStream({
3236
3251
  }
3237
3252
  case "tool-input-available": {
3238
3253
  updateToolInvocationPart({
3239
- toolCallId: part.toolCallId,
3240
- toolName: part.toolName,
3254
+ toolCallId: chunk.toolCallId,
3255
+ toolName: chunk.toolName,
3241
3256
  state: "input-available",
3242
- input: part.input,
3243
- providerExecuted: part.providerExecuted
3257
+ input: chunk.input,
3258
+ providerExecuted: chunk.providerExecuted,
3259
+ providerMetadata: chunk.providerMetadata
3244
3260
  });
3245
3261
  write();
3246
- if (onToolCall && !part.providerExecuted) {
3262
+ if (onToolCall && !chunk.providerExecuted) {
3247
3263
  const result = await onToolCall({
3248
- toolCall: part
3264
+ toolCall: chunk
3249
3265
  });
3250
3266
  if (result != null) {
3251
3267
  updateToolInvocationPart({
3252
- toolCallId: part.toolCallId,
3253
- toolName: part.toolName,
3268
+ toolCallId: chunk.toolCallId,
3269
+ toolName: chunk.toolName,
3254
3270
  state: "output-available",
3255
- input: part.input,
3271
+ input: chunk.input,
3256
3272
  output: result
3257
3273
  });
3258
3274
  write();
@@ -3266,7 +3282,7 @@ function processUIMessageStream({
3266
3282
  throw new Error("tool_result must be preceded by a tool_call");
3267
3283
  }
3268
3284
  const toolInvocationIndex = toolInvocations.findIndex(
3269
- (invocation) => invocation.toolCallId === part.toolCallId
3285
+ (invocation) => invocation.toolCallId === chunk.toolCallId
3270
3286
  );
3271
3287
  if (toolInvocationIndex === -1) {
3272
3288
  throw new Error(
@@ -3277,12 +3293,12 @@ function processUIMessageStream({
3277
3293
  toolInvocations[toolInvocationIndex]
3278
3294
  );
3279
3295
  updateToolInvocationPart({
3280
- toolCallId: part.toolCallId,
3296
+ toolCallId: chunk.toolCallId,
3281
3297
  toolName,
3282
3298
  state: "output-available",
3283
3299
  input: toolInvocations[toolInvocationIndex].input,
3284
- output: part.output,
3285
- providerExecuted: part.providerExecuted
3300
+ output: chunk.output,
3301
+ providerExecuted: chunk.providerExecuted
3286
3302
  });
3287
3303
  write();
3288
3304
  break;
@@ -3293,7 +3309,7 @@ function processUIMessageStream({
3293
3309
  throw new Error("tool_result must be preceded by a tool_call");
3294
3310
  }
3295
3311
  const toolInvocationIndex = toolInvocations.findIndex(
3296
- (invocation) => invocation.toolCallId === part.toolCallId
3312
+ (invocation) => invocation.toolCallId === chunk.toolCallId
3297
3313
  );
3298
3314
  if (toolInvocationIndex === -1) {
3299
3315
  throw new Error(
@@ -3304,12 +3320,12 @@ function processUIMessageStream({
3304
3320
  toolInvocations[toolInvocationIndex]
3305
3321
  );
3306
3322
  updateToolInvocationPart({
3307
- toolCallId: part.toolCallId,
3323
+ toolCallId: chunk.toolCallId,
3308
3324
  toolName,
3309
3325
  state: "output-error",
3310
3326
  input: toolInvocations[toolInvocationIndex].input,
3311
- errorText: part.errorText,
3312
- providerExecuted: part.providerExecuted
3327
+ errorText: chunk.errorText,
3328
+ providerExecuted: chunk.providerExecuted
3313
3329
  });
3314
3330
  write();
3315
3331
  break;
@@ -3324,62 +3340,65 @@ function processUIMessageStream({
3324
3340
  break;
3325
3341
  }
3326
3342
  case "start": {
3327
- if (part.messageId != null) {
3328
- state.message.id = part.messageId;
3343
+ if (chunk.messageId != null) {
3344
+ state.message.id = chunk.messageId;
3329
3345
  }
3330
- await updateMessageMetadata(part.messageMetadata);
3331
- if (part.messageId != null || part.messageMetadata != null) {
3346
+ await updateMessageMetadata(chunk.messageMetadata);
3347
+ if (chunk.messageId != null || chunk.messageMetadata != null) {
3332
3348
  write();
3333
3349
  }
3334
3350
  break;
3335
3351
  }
3336
3352
  case "finish": {
3337
- await updateMessageMetadata(part.messageMetadata);
3338
- if (part.messageMetadata != null) {
3353
+ await updateMessageMetadata(chunk.messageMetadata);
3354
+ if (chunk.messageMetadata != null) {
3339
3355
  write();
3340
3356
  }
3341
3357
  break;
3342
3358
  }
3343
3359
  case "message-metadata": {
3344
- await updateMessageMetadata(part.messageMetadata);
3345
- if (part.messageMetadata != null) {
3360
+ await updateMessageMetadata(chunk.messageMetadata);
3361
+ if (chunk.messageMetadata != null) {
3346
3362
  write();
3347
3363
  }
3348
3364
  break;
3349
3365
  }
3350
3366
  case "error": {
3351
- onError == null ? void 0 : onError(new Error(part.errorText));
3367
+ onError == null ? void 0 : onError(new Error(chunk.errorText));
3352
3368
  break;
3353
3369
  }
3354
3370
  default: {
3355
- if (isDataUIMessageChunk(part)) {
3356
- const dataPart = part;
3357
- if (dataPart.transient) {
3358
- onData == null ? void 0 : onData(dataPart);
3371
+ if (isDataUIMessageChunk(chunk)) {
3372
+ if ((dataPartSchemas == null ? void 0 : dataPartSchemas[chunk.type]) != null) {
3373
+ await validateTypes({
3374
+ value: chunk.data,
3375
+ schema: dataPartSchemas[chunk.type]
3376
+ });
3377
+ }
3378
+ const dataChunk = chunk;
3379
+ if (dataChunk.transient) {
3380
+ onData == null ? void 0 : onData(dataChunk);
3359
3381
  break;
3360
3382
  }
3361
- const existingPart = dataPart.id != null ? state.message.parts.find(
3362
- (partArg) => dataPart.type === partArg.type && dataPart.id === partArg.id
3383
+ const existingUIPart = dataChunk.id != null ? state.message.parts.find(
3384
+ (chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id
3363
3385
  ) : void 0;
3364
- if (existingPart != null) {
3365
- existingPart.data = isObject(existingPart.data) && isObject(dataPart.data) ? mergeObjects(existingPart.data, dataPart.data) : dataPart.data;
3386
+ if (existingUIPart != null) {
3387
+ existingUIPart.data = dataChunk.data;
3366
3388
  } else {
3367
- state.message.parts.push(dataPart);
3389
+ state.message.parts.push(dataChunk);
3368
3390
  }
3369
- onData == null ? void 0 : onData(dataPart);
3391
+ onData == null ? void 0 : onData(dataChunk);
3370
3392
  write();
3371
3393
  }
3372
3394
  }
3373
3395
  }
3374
- controller.enqueue(part);
3396
+ controller.enqueue(chunk);
3375
3397
  });
3376
3398
  }
3377
3399
  })
3378
3400
  );
3379
3401
  }
3380
- function isObject(value) {
3381
- return typeof value === "object" && value !== null;
3382
- }
3383
3402
 
3384
3403
  // src/ui-message-stream/handle-ui-message-stream-finish.ts
3385
3404
  function handleUIMessageStreamFinish({
@@ -4043,7 +4062,7 @@ var DefaultStreamTextResult = class {
4043
4062
  let activeReasoningContent = {};
4044
4063
  const eventProcessor = new TransformStream({
4045
4064
  async transform(chunk, controller) {
4046
- var _a16, _b;
4065
+ var _a16, _b, _c;
4047
4066
  controller.enqueue(chunk);
4048
4067
  const { part } = chunk;
4049
4068
  if (part.type === "text" || part.type === "reasoning" || part.type === "source" || part.type === "tool-call" || part.type === "tool-result" || part.type === "tool-input-start" || part.type === "tool-input-delta" || part.type === "raw") {
@@ -4073,7 +4092,7 @@ var DefaultStreamTextResult = class {
4073
4092
  return;
4074
4093
  }
4075
4094
  activeText.text += part.text;
4076
- activeText.providerMetadata = part.providerMetadata;
4095
+ activeText.providerMetadata = (_a16 = part.providerMetadata) != null ? _a16 : activeText.providerMetadata;
4077
4096
  }
4078
4097
  if (part.type === "text-end") {
4079
4098
  delete activeTextContent[part.id];
@@ -4099,7 +4118,7 @@ var DefaultStreamTextResult = class {
4099
4118
  return;
4100
4119
  }
4101
4120
  activeReasoning.text += part.text;
4102
- activeReasoning.providerMetadata = (_a16 = part.providerMetadata) != null ? _a16 : activeReasoning.providerMetadata;
4121
+ activeReasoning.providerMetadata = (_b = part.providerMetadata) != null ? _b : activeReasoning.providerMetadata;
4103
4122
  }
4104
4123
  if (part.type === "reasoning-end") {
4105
4124
  const activeReasoning = activeReasoningContent[part.id];
@@ -4113,7 +4132,7 @@ var DefaultStreamTextResult = class {
4113
4132
  });
4114
4133
  return;
4115
4134
  }
4116
- activeReasoning.providerMetadata = (_b = part.providerMetadata) != null ? _b : activeReasoning.providerMetadata;
4135
+ activeReasoning.providerMetadata = (_c = part.providerMetadata) != null ? _c : activeReasoning.providerMetadata;
4117
4136
  delete activeReasoningContent[part.id];
4118
4137
  }
4119
4138
  if (part.type === "file") {
@@ -4802,10 +4821,10 @@ var DefaultStreamTextResult = class {
4802
4821
  sendFinish = true,
4803
4822
  onError = getErrorMessage5
4804
4823
  } = {}) {
4805
- const responseMessageId = getResponseUIMessageId({
4824
+ const responseMessageId = generateMessageId != null ? getResponseUIMessageId({
4806
4825
  originalMessages,
4807
- responseMessageId: this.generateId
4808
- });
4826
+ responseMessageId: generateMessageId
4827
+ }) : void 0;
4809
4828
  const baseStream = this.fullStream.pipeThrough(
4810
4829
  new TransformStream({
4811
4830
  transform: async (part, controller) => {
@@ -4813,26 +4832,35 @@ var DefaultStreamTextResult = class {
4813
4832
  const partType = part.type;
4814
4833
  switch (partType) {
4815
4834
  case "text-start": {
4816
- controller.enqueue({ type: "text-start", id: part.id });
4835
+ controller.enqueue({
4836
+ type: "text-start",
4837
+ id: part.id,
4838
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4839
+ });
4817
4840
  break;
4818
4841
  }
4819
4842
  case "text": {
4820
4843
  controller.enqueue({
4821
4844
  type: "text-delta",
4822
4845
  id: part.id,
4823
- delta: part.text
4846
+ delta: part.text,
4847
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4824
4848
  });
4825
4849
  break;
4826
4850
  }
4827
4851
  case "text-end": {
4828
- controller.enqueue({ type: "text-end", id: part.id });
4852
+ controller.enqueue({
4853
+ type: "text-end",
4854
+ id: part.id,
4855
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4856
+ });
4829
4857
  break;
4830
4858
  }
4831
4859
  case "reasoning-start": {
4832
4860
  controller.enqueue({
4833
4861
  type: "reasoning-start",
4834
4862
  id: part.id,
4835
- providerMetadata: part.providerMetadata
4863
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4836
4864
  });
4837
4865
  break;
4838
4866
  }
@@ -4842,7 +4870,7 @@ var DefaultStreamTextResult = class {
4842
4870
  type: "reasoning-delta",
4843
4871
  id: part.id,
4844
4872
  delta: part.text,
4845
- providerMetadata: part.providerMetadata
4873
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4846
4874
  });
4847
4875
  }
4848
4876
  break;
@@ -4851,7 +4879,7 @@ var DefaultStreamTextResult = class {
4851
4879
  controller.enqueue({
4852
4880
  type: "reasoning-end",
4853
4881
  id: part.id,
4854
- providerMetadata: part.providerMetadata
4882
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4855
4883
  });
4856
4884
  break;
4857
4885
  }
@@ -4870,7 +4898,7 @@ var DefaultStreamTextResult = class {
4870
4898
  sourceId: part.id,
4871
4899
  url: part.url,
4872
4900
  title: part.title,
4873
- providerMetadata: part.providerMetadata
4901
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4874
4902
  });
4875
4903
  }
4876
4904
  if (sendSources && part.sourceType === "document") {
@@ -4880,7 +4908,7 @@ var DefaultStreamTextResult = class {
4880
4908
  mediaType: part.mediaType,
4881
4909
  title: part.title,
4882
4910
  filename: part.filename,
4883
- providerMetadata: part.providerMetadata
4911
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4884
4912
  });
4885
4913
  }
4886
4914
  break;
@@ -4908,7 +4936,8 @@ var DefaultStreamTextResult = class {
4908
4936
  toolCallId: part.toolCallId,
4909
4937
  toolName: part.toolName,
4910
4938
  input: part.input,
4911
- providerExecuted: part.providerExecuted
4939
+ providerExecuted: part.providerExecuted,
4940
+ providerMetadata: part.providerMetadata
4912
4941
  });
4913
4942
  break;
4914
4943
  }
@@ -4949,8 +4978,8 @@ var DefaultStreamTextResult = class {
4949
4978
  if (sendStart) {
4950
4979
  controller.enqueue({
4951
4980
  type: "start",
4952
- messageId: responseMessageId,
4953
- messageMetadata: messageMetadataValue
4981
+ ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {},
4982
+ ...responseMessageId != null ? { messageId: responseMessageId } : {}
4954
4983
  });
4955
4984
  }
4956
4985
  break;
@@ -4959,7 +4988,7 @@ var DefaultStreamTextResult = class {
4959
4988
  if (sendFinish) {
4960
4989
  controller.enqueue({
4961
4990
  type: "finish",
4962
- messageMetadata: messageMetadataValue
4991
+ ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {}
4963
4992
  });
4964
4993
  }
4965
4994
  break;
@@ -7386,6 +7415,28 @@ var doWrap = ({
7386
7415
  };
7387
7416
  };
7388
7417
 
7418
+ // src/middleware/wrap-provider.ts
7419
+ function wrapProvider({
7420
+ provider,
7421
+ languageModelMiddleware
7422
+ }) {
7423
+ const wrappedProvider = {
7424
+ languageModel(modelId) {
7425
+ let model = provider.languageModel(modelId);
7426
+ model = wrapLanguageModel({
7427
+ model,
7428
+ middleware: languageModelMiddleware
7429
+ });
7430
+ return model;
7431
+ },
7432
+ textEmbeddingModel: provider.textEmbeddingModel,
7433
+ imageModel: provider.imageModel,
7434
+ transcriptionModel: provider.transcriptionModel,
7435
+ speechModel: provider.speechModel
7436
+ };
7437
+ return wrappedProvider;
7438
+ }
7439
+
7389
7440
  // src/registry/custom-provider.ts
7390
7441
  import {
7391
7442
  NoSuchModelError as NoSuchModelError2
@@ -7478,10 +7529,12 @@ import {
7478
7529
  NoSuchModelError as NoSuchModelError4
7479
7530
  } from "@ai-sdk/provider";
7480
7531
  function createProviderRegistry(providers, {
7481
- separator = ":"
7532
+ separator = ":",
7533
+ languageModelMiddleware
7482
7534
  } = {}) {
7483
7535
  const registry = new DefaultProviderRegistry({
7484
- separator
7536
+ separator,
7537
+ languageModelMiddleware
7485
7538
  });
7486
7539
  for (const [id, provider] of Object.entries(providers)) {
7487
7540
  registry.registerProvider({ id, provider });
@@ -7490,9 +7543,13 @@ function createProviderRegistry(providers, {
7490
7543
  }
7491
7544
  var experimental_createProviderRegistry = createProviderRegistry;
7492
7545
  var DefaultProviderRegistry = class {
7493
- constructor({ separator }) {
7546
+ constructor({
7547
+ separator,
7548
+ languageModelMiddleware
7549
+ }) {
7494
7550
  this.providers = {};
7495
7551
  this.separator = separator;
7552
+ this.languageModelMiddleware = languageModelMiddleware;
7496
7553
  }
7497
7554
  registerProvider({
7498
7555
  id,
@@ -7526,13 +7583,19 @@ var DefaultProviderRegistry = class {
7526
7583
  languageModel(id) {
7527
7584
  var _a16, _b;
7528
7585
  const [providerId, modelId] = this.splitId(id, "languageModel");
7529
- const model = (_b = (_a16 = this.getProvider(providerId, "languageModel")).languageModel) == null ? void 0 : _b.call(
7586
+ let model = (_b = (_a16 = this.getProvider(providerId, "languageModel")).languageModel) == null ? void 0 : _b.call(
7530
7587
  _a16,
7531
7588
  modelId
7532
7589
  );
7533
7590
  if (model == null) {
7534
7591
  throw new NoSuchModelError4({ modelId: id, modelType: "languageModel" });
7535
7592
  }
7593
+ if (this.languageModelMiddleware != null) {
7594
+ model = wrapLanguageModel({
7595
+ model,
7596
+ middleware: this.languageModelMiddleware
7597
+ });
7598
+ }
7536
7599
  return model;
7537
7600
  }
7538
7601
  textEmbeddingModel(id) {
@@ -8915,7 +8978,8 @@ function convertToModelMessages(messages, options) {
8915
8978
  if (part.type === "text") {
8916
8979
  content.push({
8917
8980
  type: "text",
8918
- text: part.text
8981
+ text: part.text,
8982
+ ...part.providerMetadata != null ? { providerOptions: part.providerMetadata } : {}
8919
8983
  });
8920
8984
  } else if (part.type === "file") {
8921
8985
  content.push({
@@ -8942,7 +9006,8 @@ function convertToModelMessages(messages, options) {
8942
9006
  toolCallId: part.toolCallId,
8943
9007
  toolName,
8944
9008
  input: part.input,
8945
- providerExecuted: part.providerExecuted
9009
+ providerExecuted: part.providerExecuted,
9010
+ ...part.callProviderMetadata != null ? { providerOptions: part.callProviderMetadata } : {}
8946
9011
  });
8947
9012
  if (part.providerExecuted === true && (part.state === "output-available" || part.state === "output-error")) {
8948
9013
  content.push({
@@ -9275,6 +9340,7 @@ export {
9275
9340
  tool2 as tool,
9276
9341
  toolModelMessageSchema,
9277
9342
  userModelMessageSchema,
9278
- wrapLanguageModel
9343
+ wrapLanguageModel,
9344
+ wrapProvider
9279
9345
  };
9280
9346
  //# sourceMappingURL=index.mjs.map