ai 0.0.0-8777c42a-20250115032312 → 0.0.0-9477ebb9-20250403064906

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +660 -2
  2. package/README.md +19 -6
  3. package/dist/index.d.mts +3036 -1314
  4. package/dist/index.d.ts +3036 -1314
  5. package/dist/index.js +2705 -985
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +2667 -962
  8. package/dist/index.mjs.map +1 -1
  9. package/mcp-stdio/create-child-process.test.ts +92 -0
  10. package/mcp-stdio/create-child-process.ts +21 -0
  11. package/mcp-stdio/dist/index.d.mts +169 -0
  12. package/mcp-stdio/dist/index.d.ts +169 -0
  13. package/mcp-stdio/dist/index.js +352 -0
  14. package/mcp-stdio/dist/index.js.map +1 -0
  15. package/mcp-stdio/dist/index.mjs +337 -0
  16. package/mcp-stdio/dist/index.mjs.map +1 -0
  17. package/mcp-stdio/get-environment.ts +43 -0
  18. package/mcp-stdio/index.ts +4 -0
  19. package/mcp-stdio/mcp-stdio-transport.test.ts +262 -0
  20. package/mcp-stdio/mcp-stdio-transport.ts +157 -0
  21. package/package.json +14 -10
  22. package/react/dist/index.d.mts +12 -4
  23. package/react/dist/index.d.ts +12 -4
  24. package/react/dist/index.js +0 -3
  25. package/react/dist/index.js.map +1 -1
  26. package/react/dist/index.mjs +0 -3
  27. package/react/dist/index.mjs.map +1 -1
  28. package/rsc/dist/index.d.ts +108 -18
  29. package/rsc/dist/rsc-server.d.mts +108 -18
  30. package/rsc/dist/rsc-server.mjs +550 -256
  31. package/rsc/dist/rsc-server.mjs.map +1 -1
  32. package/rsc/dist/rsc-shared.mjs +1 -3
  33. package/rsc/dist/rsc-shared.mjs.map +1 -1
  34. package/test/dist/index.d.mts +2 -4
  35. package/test/dist/index.d.ts +2 -4
  36. package/test/dist/index.js +4 -14
  37. package/test/dist/index.js.map +1 -1
  38. package/test/dist/index.mjs +7 -14
  39. package/test/dist/index.mjs.map +1 -1
@@ -240,14 +240,11 @@ var DownloadError = class extends AISDKError {
240
240
  _a = symbol;
241
241
 
242
242
  // util/download.ts
243
- async function download({
244
- url,
245
- fetchImplementation = fetch
246
- }) {
243
+ async function download({ url }) {
247
244
  var _a9;
248
245
  const urlText = url.toString();
249
246
  try {
250
- const response = await fetchImplementation(urlText);
247
+ const response = await fetch(urlText);
251
248
  if (!response.ok) {
252
249
  throw new DownloadError({
253
250
  url: urlText,
@@ -269,15 +266,82 @@ async function download({
269
266
 
270
267
  // core/util/detect-image-mimetype.ts
271
268
  var mimeTypeSignatures = [
272
- { mimeType: "image/gif", bytes: [71, 73, 70] },
273
- { mimeType: "image/png", bytes: [137, 80, 78, 71] },
274
- { mimeType: "image/jpeg", bytes: [255, 216] },
275
- { mimeType: "image/webp", bytes: [82, 73, 70, 70] }
269
+ {
270
+ mimeType: "image/gif",
271
+ bytesPrefix: [71, 73, 70],
272
+ base64Prefix: "R0lG"
273
+ },
274
+ {
275
+ mimeType: "image/png",
276
+ bytesPrefix: [137, 80, 78, 71],
277
+ base64Prefix: "iVBORw"
278
+ },
279
+ {
280
+ mimeType: "image/jpeg",
281
+ bytesPrefix: [255, 216],
282
+ base64Prefix: "/9j/"
283
+ },
284
+ {
285
+ mimeType: "image/webp",
286
+ bytesPrefix: [82, 73, 70, 70],
287
+ base64Prefix: "UklGRg"
288
+ },
289
+ {
290
+ mimeType: "image/bmp",
291
+ bytesPrefix: [66, 77],
292
+ base64Prefix: "Qk"
293
+ },
294
+ {
295
+ mimeType: "image/tiff",
296
+ bytesPrefix: [73, 73, 42, 0],
297
+ base64Prefix: "SUkqAA"
298
+ },
299
+ {
300
+ mimeType: "image/tiff",
301
+ bytesPrefix: [77, 77, 0, 42],
302
+ base64Prefix: "TU0AKg"
303
+ },
304
+ {
305
+ mimeType: "image/avif",
306
+ bytesPrefix: [
307
+ 0,
308
+ 0,
309
+ 0,
310
+ 32,
311
+ 102,
312
+ 116,
313
+ 121,
314
+ 112,
315
+ 97,
316
+ 118,
317
+ 105,
318
+ 102
319
+ ],
320
+ base64Prefix: "AAAAIGZ0eXBhdmlm"
321
+ },
322
+ {
323
+ mimeType: "image/heic",
324
+ bytesPrefix: [
325
+ 0,
326
+ 0,
327
+ 0,
328
+ 32,
329
+ 102,
330
+ 116,
331
+ 121,
332
+ 112,
333
+ 104,
334
+ 101,
335
+ 105,
336
+ 99
337
+ ],
338
+ base64Prefix: "AAAAIGZ0eXBoZWlj"
339
+ }
276
340
  ];
277
341
  function detectImageMimeType(image) {
278
- for (const { bytes, mimeType } of mimeTypeSignatures) {
279
- if (image.length >= bytes.length && bytes.every((byte, index) => image[index] === byte)) {
280
- return mimeType;
342
+ for (const signature of mimeTypeSignatures) {
343
+ if (typeof image === "string" ? image.startsWith(signature.base64Prefix) : image.length >= signature.bytesPrefix.length && signature.bytesPrefix.every((byte, index) => image[index] === byte)) {
344
+ return signature.mimeType;
281
345
  }
282
346
  }
283
347
  return void 0;
@@ -421,13 +485,14 @@ async function convertToLanguageModelPrompt({
421
485
  ];
422
486
  }
423
487
  function convertToLanguageModelMessage(message, downloadedAssets) {
488
+ var _a9, _b, _c, _d, _e, _f;
424
489
  const role = message.role;
425
490
  switch (role) {
426
491
  case "system": {
427
492
  return {
428
493
  role: "system",
429
494
  content: message.content,
430
- providerMetadata: message.experimental_providerMetadata
495
+ providerMetadata: (_a9 = message.providerOptions) != null ? _a9 : message.experimental_providerMetadata
431
496
  };
432
497
  }
433
498
  case "user": {
@@ -435,13 +500,13 @@ function convertToLanguageModelMessage(message, downloadedAssets) {
435
500
  return {
436
501
  role: "user",
437
502
  content: [{ type: "text", text: message.content }],
438
- providerMetadata: message.experimental_providerMetadata
503
+ providerMetadata: (_b = message.providerOptions) != null ? _b : message.experimental_providerMetadata
439
504
  };
440
505
  }
441
506
  return {
442
507
  role: "user",
443
508
  content: message.content.map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== "text" || part.text !== ""),
444
- providerMetadata: message.experimental_providerMetadata
509
+ providerMetadata: (_c = message.providerOptions) != null ? _c : message.experimental_providerMetadata
445
510
  };
446
511
  }
447
512
  case "assistant": {
@@ -449,7 +514,7 @@ function convertToLanguageModelMessage(message, downloadedAssets) {
449
514
  return {
450
515
  role: "assistant",
451
516
  content: [{ type: "text", text: message.content }],
452
- providerMetadata: message.experimental_providerMetadata
517
+ providerMetadata: (_d = message.providerOptions) != null ? _d : message.experimental_providerMetadata
453
518
  };
454
519
  }
455
520
  return {
@@ -458,28 +523,70 @@ function convertToLanguageModelMessage(message, downloadedAssets) {
458
523
  // remove empty text parts:
459
524
  (part) => part.type !== "text" || part.text !== ""
460
525
  ).map((part) => {
461
- const { experimental_providerMetadata, ...rest } = part;
462
- return {
463
- ...rest,
464
- providerMetadata: experimental_providerMetadata
465
- };
526
+ var _a10;
527
+ const providerOptions = (_a10 = part.providerOptions) != null ? _a10 : part.experimental_providerMetadata;
528
+ switch (part.type) {
529
+ case "file": {
530
+ return {
531
+ type: "file",
532
+ data: part.data instanceof URL ? part.data : convertDataContentToBase64String(part.data),
533
+ filename: part.filename,
534
+ mimeType: part.mimeType,
535
+ providerMetadata: providerOptions
536
+ };
537
+ }
538
+ case "reasoning": {
539
+ return {
540
+ type: "reasoning",
541
+ text: part.text,
542
+ signature: part.signature,
543
+ providerMetadata: providerOptions
544
+ };
545
+ }
546
+ case "redacted-reasoning": {
547
+ return {
548
+ type: "redacted-reasoning",
549
+ data: part.data,
550
+ providerMetadata: providerOptions
551
+ };
552
+ }
553
+ case "text": {
554
+ return {
555
+ type: "text",
556
+ text: part.text,
557
+ providerMetadata: providerOptions
558
+ };
559
+ }
560
+ case "tool-call": {
561
+ return {
562
+ type: "tool-call",
563
+ toolCallId: part.toolCallId,
564
+ toolName: part.toolName,
565
+ args: part.args,
566
+ providerMetadata: providerOptions
567
+ };
568
+ }
569
+ }
466
570
  }),
467
- providerMetadata: message.experimental_providerMetadata
571
+ providerMetadata: (_e = message.providerOptions) != null ? _e : message.experimental_providerMetadata
468
572
  };
469
573
  }
470
574
  case "tool": {
471
575
  return {
472
576
  role: "tool",
473
- content: message.content.map((part) => ({
474
- type: "tool-result",
475
- toolCallId: part.toolCallId,
476
- toolName: part.toolName,
477
- result: part.result,
478
- content: part.experimental_content,
479
- isError: part.isError,
480
- providerMetadata: part.experimental_providerMetadata
481
- })),
482
- providerMetadata: message.experimental_providerMetadata
577
+ content: message.content.map((part) => {
578
+ var _a10;
579
+ return {
580
+ type: "tool-result",
581
+ toolCallId: part.toolCallId,
582
+ toolName: part.toolName,
583
+ result: part.result,
584
+ content: part.experimental_content,
585
+ isError: part.isError,
586
+ providerMetadata: (_a10 = part.providerOptions) != null ? _a10 : part.experimental_providerMetadata
587
+ };
588
+ }),
589
+ providerMetadata: (_f = message.providerOptions) != null ? _f : message.experimental_providerMetadata
483
590
  };
484
591
  }
485
592
  default: {
@@ -512,12 +619,12 @@ async function downloadAssets(messages, downloadImplementation, modelSupportsIma
512
619
  );
513
620
  }
514
621
  function convertPartToLanguageModelPart(part, downloadedAssets) {
515
- var _a9;
622
+ var _a9, _b, _c, _d;
516
623
  if (part.type === "text") {
517
624
  return {
518
625
  type: "text",
519
626
  text: part.text,
520
- providerMetadata: part.experimental_providerMetadata
627
+ providerMetadata: (_a9 = part.providerOptions) != null ? _a9 : part.experimental_providerMetadata
521
628
  };
522
629
  }
523
630
  let mimeType = part.mimeType;
@@ -565,13 +672,13 @@ function convertPartToLanguageModelPart(part, downloadedAssets) {
565
672
  switch (type) {
566
673
  case "image": {
567
674
  if (normalizedData instanceof Uint8Array) {
568
- mimeType = (_a9 = detectImageMimeType(normalizedData)) != null ? _a9 : mimeType;
675
+ mimeType = (_b = detectImageMimeType(normalizedData)) != null ? _b : mimeType;
569
676
  }
570
677
  return {
571
678
  type: "image",
572
679
  image: normalizedData,
573
680
  mimeType,
574
- providerMetadata: part.experimental_providerMetadata
681
+ providerMetadata: (_c = part.providerOptions) != null ? _c : part.experimental_providerMetadata
575
682
  };
576
683
  }
577
684
  case "file": {
@@ -581,8 +688,9 @@ function convertPartToLanguageModelPart(part, downloadedAssets) {
581
688
  return {
582
689
  type: "file",
583
690
  data: normalizedData instanceof Uint8Array ? convertDataContentToBase64String(normalizedData) : normalizedData,
691
+ filename: part.filename,
584
692
  mimeType,
585
- providerMetadata: part.experimental_providerMetadata
693
+ providerMetadata: (_d = part.providerOptions) != null ? _d : part.experimental_providerMetadata
586
694
  };
587
695
  }
588
696
  }
@@ -697,6 +805,7 @@ function prepareCallSettings({
697
805
  }
698
806
  return {
699
807
  maxTokens,
808
+ // TODO v5 remove default 0 for temperature
700
809
  temperature: temperature != null ? temperature : 0,
701
810
  topP,
702
811
  topK,
@@ -709,12 +818,7 @@ function prepareCallSettings({
709
818
 
710
819
  // util/retry-with-exponential-backoff.ts
711
820
  import { APICallError } from "@ai-sdk/provider";
712
- import { getErrorMessage, isAbortError } from "@ai-sdk/provider-utils";
713
-
714
- // util/delay.ts
715
- async function delay(delayInMs) {
716
- return delayInMs == null ? Promise.resolve() : new Promise((resolve) => setTimeout(resolve, delayInMs));
717
- }
821
+ import { delay, getErrorMessage, isAbortError } from "@ai-sdk/provider-utils";
718
822
 
719
823
  // util/retry-error.ts
720
824
  import { AISDKError as AISDKError5 } from "@ai-sdk/provider";
@@ -877,150 +981,6 @@ import { InvalidPromptError } from "@ai-sdk/provider";
877
981
  import { safeValidateTypes } from "@ai-sdk/provider-utils";
878
982
  import { z as z7 } from "zod";
879
983
 
880
- // core/prompt/message.ts
881
- import { z as z6 } from "zod";
882
-
883
- // core/types/provider-metadata.ts
884
- import { z as z3 } from "zod";
885
-
886
- // core/types/json-value.ts
887
- import { z as z2 } from "zod";
888
- var jsonValueSchema = z2.lazy(
889
- () => z2.union([
890
- z2.null(),
891
- z2.string(),
892
- z2.number(),
893
- z2.boolean(),
894
- z2.record(z2.string(), jsonValueSchema),
895
- z2.array(jsonValueSchema)
896
- ])
897
- );
898
-
899
- // core/types/provider-metadata.ts
900
- var providerMetadataSchema = z3.record(
901
- z3.string(),
902
- z3.record(z3.string(), jsonValueSchema)
903
- );
904
-
905
- // core/prompt/content-part.ts
906
- import { z as z5 } from "zod";
907
-
908
- // core/prompt/tool-result-content.ts
909
- import { z as z4 } from "zod";
910
- var toolResultContentSchema = z4.array(
911
- z4.union([
912
- z4.object({ type: z4.literal("text"), text: z4.string() }),
913
- z4.object({
914
- type: z4.literal("image"),
915
- data: z4.string(),
916
- mimeType: z4.string().optional()
917
- })
918
- ])
919
- );
920
-
921
- // core/prompt/content-part.ts
922
- var textPartSchema = z5.object({
923
- type: z5.literal("text"),
924
- text: z5.string(),
925
- experimental_providerMetadata: providerMetadataSchema.optional()
926
- });
927
- var imagePartSchema = z5.object({
928
- type: z5.literal("image"),
929
- image: z5.union([dataContentSchema, z5.instanceof(URL)]),
930
- mimeType: z5.string().optional(),
931
- experimental_providerMetadata: providerMetadataSchema.optional()
932
- });
933
- var filePartSchema = z5.object({
934
- type: z5.literal("file"),
935
- data: z5.union([dataContentSchema, z5.instanceof(URL)]),
936
- mimeType: z5.string(),
937
- experimental_providerMetadata: providerMetadataSchema.optional()
938
- });
939
- var toolCallPartSchema = z5.object({
940
- type: z5.literal("tool-call"),
941
- toolCallId: z5.string(),
942
- toolName: z5.string(),
943
- args: z5.unknown()
944
- });
945
- var toolResultPartSchema = z5.object({
946
- type: z5.literal("tool-result"),
947
- toolCallId: z5.string(),
948
- toolName: z5.string(),
949
- result: z5.unknown(),
950
- content: toolResultContentSchema.optional(),
951
- isError: z5.boolean().optional(),
952
- experimental_providerMetadata: providerMetadataSchema.optional()
953
- });
954
-
955
- // core/prompt/message.ts
956
- var coreSystemMessageSchema = z6.object({
957
- role: z6.literal("system"),
958
- content: z6.string(),
959
- experimental_providerMetadata: providerMetadataSchema.optional()
960
- });
961
- var coreUserMessageSchema = z6.object({
962
- role: z6.literal("user"),
963
- content: z6.union([
964
- z6.string(),
965
- z6.array(z6.union([textPartSchema, imagePartSchema, filePartSchema]))
966
- ]),
967
- experimental_providerMetadata: providerMetadataSchema.optional()
968
- });
969
- var coreAssistantMessageSchema = z6.object({
970
- role: z6.literal("assistant"),
971
- content: z6.union([
972
- z6.string(),
973
- z6.array(z6.union([textPartSchema, toolCallPartSchema]))
974
- ]),
975
- experimental_providerMetadata: providerMetadataSchema.optional()
976
- });
977
- var coreToolMessageSchema = z6.object({
978
- role: z6.literal("tool"),
979
- content: z6.array(toolResultPartSchema),
980
- experimental_providerMetadata: providerMetadataSchema.optional()
981
- });
982
- var coreMessageSchema = z6.union([
983
- coreSystemMessageSchema,
984
- coreUserMessageSchema,
985
- coreAssistantMessageSchema,
986
- coreToolMessageSchema
987
- ]);
988
-
989
- // core/prompt/detect-prompt-type.ts
990
- function detectPromptType(prompt) {
991
- if (!Array.isArray(prompt)) {
992
- return "other";
993
- }
994
- if (prompt.length === 0) {
995
- return "messages";
996
- }
997
- const characteristics = prompt.map(detectSingleMessageCharacteristics);
998
- if (characteristics.some((c) => c === "has-ui-specific-parts")) {
999
- return "ui-messages";
1000
- } else if (characteristics.every(
1001
- (c) => c === "has-core-specific-parts" || c === "message"
1002
- )) {
1003
- return "messages";
1004
- } else {
1005
- return "other";
1006
- }
1007
- }
1008
- function detectSingleMessageCharacteristics(message) {
1009
- if (typeof message === "object" && message !== null && (message.role === "function" || // UI-only role
1010
- message.role === "data" || // UI-only role
1011
- "toolInvocations" in message || // UI-specific field
1012
- "experimental_attachments" in message)) {
1013
- return "has-ui-specific-parts";
1014
- } else if (typeof message === "object" && message !== null && "content" in message && (Array.isArray(message.content) || // Core messages can have array content
1015
- "experimental_providerMetadata" in message)) {
1016
- return "has-core-specific-parts";
1017
- } else if (typeof message === "object" && message !== null && "role" in message && "content" in message && typeof message.content === "string" && ["system", "user", "assistant", "tool"].includes(message.role)) {
1018
- return "message";
1019
- } else {
1020
- return "other";
1021
- }
1022
- }
1023
-
1024
984
  // core/prompt/attachments-to-parts.ts
1025
985
  function attachmentsToParts(attachments) {
1026
986
  var _a9, _b, _c;
@@ -1121,11 +1081,13 @@ _a6 = symbol6;
1121
1081
 
1122
1082
  // core/prompt/convert-to-core-messages.ts
1123
1083
  function convertToCoreMessages(messages, options) {
1124
- var _a9;
1084
+ var _a9, _b;
1125
1085
  const tools = (_a9 = options == null ? void 0 : options.tools) != null ? _a9 : {};
1126
1086
  const coreMessages = [];
1127
- for (const message of messages) {
1128
- const { role, content, toolInvocations, experimental_attachments } = message;
1087
+ for (let i = 0; i < messages.length; i++) {
1088
+ const message = messages[i];
1089
+ const isLastMessage = i === messages.length - 1;
1090
+ const { role, content, experimental_attachments } = message;
1129
1091
  switch (role) {
1130
1092
  case "system": {
1131
1093
  coreMessages.push({
@@ -1135,59 +1097,204 @@ function convertToCoreMessages(messages, options) {
1135
1097
  break;
1136
1098
  }
1137
1099
  case "user": {
1138
- coreMessages.push({
1139
- role: "user",
1140
- content: experimental_attachments ? [
1141
- { type: "text", text: content },
1142
- ...attachmentsToParts(experimental_attachments)
1143
- ] : content
1144
- });
1100
+ if (message.parts == null) {
1101
+ coreMessages.push({
1102
+ role: "user",
1103
+ content: experimental_attachments ? [
1104
+ { type: "text", text: content },
1105
+ ...attachmentsToParts(experimental_attachments)
1106
+ ] : content
1107
+ });
1108
+ } else {
1109
+ const textParts = message.parts.filter((part) => part.type === "text").map((part) => ({
1110
+ type: "text",
1111
+ text: part.text
1112
+ }));
1113
+ coreMessages.push({
1114
+ role: "user",
1115
+ content: experimental_attachments ? [...textParts, ...attachmentsToParts(experimental_attachments)] : textParts
1116
+ });
1117
+ }
1145
1118
  break;
1146
1119
  }
1147
1120
  case "assistant": {
1148
- if (toolInvocations == null) {
1121
+ if (message.parts != null) {
1122
+ let processBlock2 = function() {
1123
+ const content2 = [];
1124
+ for (const part of block) {
1125
+ switch (part.type) {
1126
+ case "file":
1127
+ case "text": {
1128
+ content2.push(part);
1129
+ break;
1130
+ }
1131
+ case "reasoning": {
1132
+ for (const detail of part.details) {
1133
+ switch (detail.type) {
1134
+ case "text":
1135
+ content2.push({
1136
+ type: "reasoning",
1137
+ text: detail.text,
1138
+ signature: detail.signature
1139
+ });
1140
+ break;
1141
+ case "redacted":
1142
+ content2.push({
1143
+ type: "redacted-reasoning",
1144
+ data: detail.data
1145
+ });
1146
+ break;
1147
+ }
1148
+ }
1149
+ break;
1150
+ }
1151
+ case "tool-invocation":
1152
+ content2.push({
1153
+ type: "tool-call",
1154
+ toolCallId: part.toolInvocation.toolCallId,
1155
+ toolName: part.toolInvocation.toolName,
1156
+ args: part.toolInvocation.args
1157
+ });
1158
+ break;
1159
+ default: {
1160
+ const _exhaustiveCheck = part;
1161
+ throw new Error(`Unsupported part: ${_exhaustiveCheck}`);
1162
+ }
1163
+ }
1164
+ }
1165
+ coreMessages.push({
1166
+ role: "assistant",
1167
+ content: content2
1168
+ });
1169
+ const stepInvocations = block.filter(
1170
+ (part) => part.type === "tool-invocation"
1171
+ ).map((part) => part.toolInvocation);
1172
+ if (stepInvocations.length > 0) {
1173
+ coreMessages.push({
1174
+ role: "tool",
1175
+ content: stepInvocations.map(
1176
+ (toolInvocation) => {
1177
+ if (!("result" in toolInvocation)) {
1178
+ throw new MessageConversionError({
1179
+ originalMessage: message,
1180
+ message: "ToolInvocation must have a result: " + JSON.stringify(toolInvocation)
1181
+ });
1182
+ }
1183
+ const { toolCallId, toolName, result } = toolInvocation;
1184
+ const tool = tools[toolName];
1185
+ return (tool == null ? void 0 : tool.experimental_toToolResultContent) != null ? {
1186
+ type: "tool-result",
1187
+ toolCallId,
1188
+ toolName,
1189
+ result: tool.experimental_toToolResultContent(result),
1190
+ experimental_content: tool.experimental_toToolResultContent(result)
1191
+ } : {
1192
+ type: "tool-result",
1193
+ toolCallId,
1194
+ toolName,
1195
+ result
1196
+ };
1197
+ }
1198
+ )
1199
+ });
1200
+ }
1201
+ block = [];
1202
+ blockHasToolInvocations = false;
1203
+ currentStep++;
1204
+ };
1205
+ var processBlock = processBlock2;
1206
+ let currentStep = 0;
1207
+ let blockHasToolInvocations = false;
1208
+ let block = [];
1209
+ for (const part of message.parts) {
1210
+ switch (part.type) {
1211
+ case "text": {
1212
+ if (blockHasToolInvocations) {
1213
+ processBlock2();
1214
+ }
1215
+ block.push(part);
1216
+ break;
1217
+ }
1218
+ case "file":
1219
+ case "reasoning": {
1220
+ block.push(part);
1221
+ break;
1222
+ }
1223
+ case "tool-invocation": {
1224
+ if (((_b = part.toolInvocation.step) != null ? _b : 0) !== currentStep) {
1225
+ processBlock2();
1226
+ }
1227
+ block.push(part);
1228
+ blockHasToolInvocations = true;
1229
+ break;
1230
+ }
1231
+ }
1232
+ }
1233
+ processBlock2();
1234
+ break;
1235
+ }
1236
+ const toolInvocations = message.toolInvocations;
1237
+ if (toolInvocations == null || toolInvocations.length === 0) {
1149
1238
  coreMessages.push({ role: "assistant", content });
1150
1239
  break;
1151
1240
  }
1152
- coreMessages.push({
1153
- role: "assistant",
1154
- content: [
1155
- { type: "text", text: content },
1156
- ...toolInvocations.map(
1157
- ({ toolCallId, toolName, args }) => ({
1158
- type: "tool-call",
1241
+ const maxStep = toolInvocations.reduce((max, toolInvocation) => {
1242
+ var _a10;
1243
+ return Math.max(max, (_a10 = toolInvocation.step) != null ? _a10 : 0);
1244
+ }, 0);
1245
+ for (let i2 = 0; i2 <= maxStep; i2++) {
1246
+ const stepInvocations = toolInvocations.filter(
1247
+ (toolInvocation) => {
1248
+ var _a10;
1249
+ return ((_a10 = toolInvocation.step) != null ? _a10 : 0) === i2;
1250
+ }
1251
+ );
1252
+ if (stepInvocations.length === 0) {
1253
+ continue;
1254
+ }
1255
+ coreMessages.push({
1256
+ role: "assistant",
1257
+ content: [
1258
+ ...isLastMessage && content && i2 === 0 ? [{ type: "text", text: content }] : [],
1259
+ ...stepInvocations.map(
1260
+ ({ toolCallId, toolName, args }) => ({
1261
+ type: "tool-call",
1262
+ toolCallId,
1263
+ toolName,
1264
+ args
1265
+ })
1266
+ )
1267
+ ]
1268
+ });
1269
+ coreMessages.push({
1270
+ role: "tool",
1271
+ content: stepInvocations.map((toolInvocation) => {
1272
+ if (!("result" in toolInvocation)) {
1273
+ throw new MessageConversionError({
1274
+ originalMessage: message,
1275
+ message: "ToolInvocation must have a result: " + JSON.stringify(toolInvocation)
1276
+ });
1277
+ }
1278
+ const { toolCallId, toolName, result } = toolInvocation;
1279
+ const tool = tools[toolName];
1280
+ return (tool == null ? void 0 : tool.experimental_toToolResultContent) != null ? {
1281
+ type: "tool-result",
1159
1282
  toolCallId,
1160
1283
  toolName,
1161
- args
1162
- })
1163
- )
1164
- ]
1165
- });
1166
- coreMessages.push({
1167
- role: "tool",
1168
- content: toolInvocations.map((toolInvocation) => {
1169
- if (!("result" in toolInvocation)) {
1170
- throw new MessageConversionError({
1171
- originalMessage: message,
1172
- message: "ToolInvocation must have a result: " + JSON.stringify(toolInvocation)
1173
- });
1174
- }
1175
- const { toolCallId, toolName, result } = toolInvocation;
1176
- const tool = tools[toolName];
1177
- return (tool == null ? void 0 : tool.experimental_toToolResultContent) != null ? {
1178
- type: "tool-result",
1179
- toolCallId,
1180
- toolName,
1181
- result: tool.experimental_toToolResultContent(result),
1182
- experimental_content: tool.experimental_toToolResultContent(result)
1183
- } : {
1184
- type: "tool-result",
1185
- toolCallId,
1186
- toolName,
1187
- result
1188
- };
1189
- })
1190
- });
1284
+ result: tool.experimental_toToolResultContent(result),
1285
+ experimental_content: tool.experimental_toToolResultContent(result)
1286
+ } : {
1287
+ type: "tool-result",
1288
+ toolCallId,
1289
+ toolName,
1290
+ result
1291
+ };
1292
+ })
1293
+ });
1294
+ }
1295
+ if (content && !isLastMessage) {
1296
+ coreMessages.push({ role: "assistant", content });
1297
+ }
1191
1298
  break;
1192
1299
  }
1193
1300
  case "data": {
@@ -1205,6 +1312,182 @@ function convertToCoreMessages(messages, options) {
1205
1312
  return coreMessages;
1206
1313
  }
1207
1314
 
1315
+ // core/prompt/detect-prompt-type.ts
1316
+ function detectPromptType(prompt) {
1317
+ if (!Array.isArray(prompt)) {
1318
+ return "other";
1319
+ }
1320
+ if (prompt.length === 0) {
1321
+ return "messages";
1322
+ }
1323
+ const characteristics = prompt.map(detectSingleMessageCharacteristics);
1324
+ if (characteristics.some((c) => c === "has-ui-specific-parts")) {
1325
+ return "ui-messages";
1326
+ } else if (characteristics.every(
1327
+ (c) => c === "has-core-specific-parts" || c === "message"
1328
+ )) {
1329
+ return "messages";
1330
+ } else {
1331
+ return "other";
1332
+ }
1333
+ }
1334
+ function detectSingleMessageCharacteristics(message) {
1335
+ if (typeof message === "object" && message !== null && (message.role === "function" || // UI-only role
1336
+ message.role === "data" || // UI-only role
1337
+ "toolInvocations" in message || // UI-specific field
1338
+ "parts" in message || // UI-specific field
1339
+ "experimental_attachments" in message)) {
1340
+ return "has-ui-specific-parts";
1341
+ } else if (typeof message === "object" && message !== null && "content" in message && (Array.isArray(message.content) || // Core messages can have array content
1342
+ "experimental_providerMetadata" in message || "providerOptions" in message)) {
1343
+ return "has-core-specific-parts";
1344
+ } else if (typeof message === "object" && message !== null && "role" in message && "content" in message && typeof message.content === "string" && ["system", "user", "assistant", "tool"].includes(message.role)) {
1345
+ return "message";
1346
+ } else {
1347
+ return "other";
1348
+ }
1349
+ }
1350
+
1351
+ // core/prompt/message.ts
1352
+ import { z as z6 } from "zod";
1353
+
1354
+ // core/types/provider-metadata.ts
1355
+ import { z as z3 } from "zod";
1356
+
1357
+ // core/types/json-value.ts
1358
+ import { z as z2 } from "zod";
1359
+ var jsonValueSchema = z2.lazy(
1360
+ () => z2.union([
1361
+ z2.null(),
1362
+ z2.string(),
1363
+ z2.number(),
1364
+ z2.boolean(),
1365
+ z2.record(z2.string(), jsonValueSchema),
1366
+ z2.array(jsonValueSchema)
1367
+ ])
1368
+ );
1369
+
1370
+ // core/types/provider-metadata.ts
1371
+ var providerMetadataSchema = z3.record(
1372
+ z3.string(),
1373
+ z3.record(z3.string(), jsonValueSchema)
1374
+ );
1375
+
1376
+ // core/prompt/content-part.ts
1377
+ import { z as z5 } from "zod";
1378
+
1379
+ // core/prompt/tool-result-content.ts
1380
+ import { z as z4 } from "zod";
1381
+ var toolResultContentSchema = z4.array(
1382
+ z4.union([
1383
+ z4.object({ type: z4.literal("text"), text: z4.string() }),
1384
+ z4.object({
1385
+ type: z4.literal("image"),
1386
+ data: z4.string(),
1387
+ mimeType: z4.string().optional()
1388
+ })
1389
+ ])
1390
+ );
1391
+
1392
+ // core/prompt/content-part.ts
1393
+ var textPartSchema = z5.object({
1394
+ type: z5.literal("text"),
1395
+ text: z5.string(),
1396
+ providerOptions: providerMetadataSchema.optional(),
1397
+ experimental_providerMetadata: providerMetadataSchema.optional()
1398
+ });
1399
+ var imagePartSchema = z5.object({
1400
+ type: z5.literal("image"),
1401
+ image: z5.union([dataContentSchema, z5.instanceof(URL)]),
1402
+ mimeType: z5.string().optional(),
1403
+ providerOptions: providerMetadataSchema.optional(),
1404
+ experimental_providerMetadata: providerMetadataSchema.optional()
1405
+ });
1406
+ var filePartSchema = z5.object({
1407
+ type: z5.literal("file"),
1408
+ data: z5.union([dataContentSchema, z5.instanceof(URL)]),
1409
+ filename: z5.string().optional(),
1410
+ mimeType: z5.string(),
1411
+ providerOptions: providerMetadataSchema.optional(),
1412
+ experimental_providerMetadata: providerMetadataSchema.optional()
1413
+ });
1414
+ var reasoningPartSchema = z5.object({
1415
+ type: z5.literal("reasoning"),
1416
+ text: z5.string(),
1417
+ providerOptions: providerMetadataSchema.optional(),
1418
+ experimental_providerMetadata: providerMetadataSchema.optional()
1419
+ });
1420
+ var redactedReasoningPartSchema = z5.object({
1421
+ type: z5.literal("redacted-reasoning"),
1422
+ data: z5.string(),
1423
+ providerOptions: providerMetadataSchema.optional(),
1424
+ experimental_providerMetadata: providerMetadataSchema.optional()
1425
+ });
1426
+ var toolCallPartSchema = z5.object({
1427
+ type: z5.literal("tool-call"),
1428
+ toolCallId: z5.string(),
1429
+ toolName: z5.string(),
1430
+ args: z5.unknown(),
1431
+ providerOptions: providerMetadataSchema.optional(),
1432
+ experimental_providerMetadata: providerMetadataSchema.optional()
1433
+ });
1434
+ var toolResultPartSchema = z5.object({
1435
+ type: z5.literal("tool-result"),
1436
+ toolCallId: z5.string(),
1437
+ toolName: z5.string(),
1438
+ result: z5.unknown(),
1439
+ content: toolResultContentSchema.optional(),
1440
+ isError: z5.boolean().optional(),
1441
+ providerOptions: providerMetadataSchema.optional(),
1442
+ experimental_providerMetadata: providerMetadataSchema.optional()
1443
+ });
1444
+
1445
+ // core/prompt/message.ts
1446
+ var coreSystemMessageSchema = z6.object({
1447
+ role: z6.literal("system"),
1448
+ content: z6.string(),
1449
+ providerOptions: providerMetadataSchema.optional(),
1450
+ experimental_providerMetadata: providerMetadataSchema.optional()
1451
+ });
1452
+ var coreUserMessageSchema = z6.object({
1453
+ role: z6.literal("user"),
1454
+ content: z6.union([
1455
+ z6.string(),
1456
+ z6.array(z6.union([textPartSchema, imagePartSchema, filePartSchema]))
1457
+ ]),
1458
+ providerOptions: providerMetadataSchema.optional(),
1459
+ experimental_providerMetadata: providerMetadataSchema.optional()
1460
+ });
1461
+ var coreAssistantMessageSchema = z6.object({
1462
+ role: z6.literal("assistant"),
1463
+ content: z6.union([
1464
+ z6.string(),
1465
+ z6.array(
1466
+ z6.union([
1467
+ textPartSchema,
1468
+ filePartSchema,
1469
+ reasoningPartSchema,
1470
+ redactedReasoningPartSchema,
1471
+ toolCallPartSchema
1472
+ ])
1473
+ )
1474
+ ]),
1475
+ providerOptions: providerMetadataSchema.optional(),
1476
+ experimental_providerMetadata: providerMetadataSchema.optional()
1477
+ });
1478
+ var coreToolMessageSchema = z6.object({
1479
+ role: z6.literal("tool"),
1480
+ content: z6.array(toolResultPartSchema),
1481
+ providerOptions: providerMetadataSchema.optional(),
1482
+ experimental_providerMetadata: providerMetadataSchema.optional()
1483
+ });
1484
+ var coreMessageSchema = z6.union([
1485
+ coreSystemMessageSchema,
1486
+ coreUserMessageSchema,
1487
+ coreAssistantMessageSchema,
1488
+ coreToolMessageSchema
1489
+ ]);
1490
+
1208
1491
  // core/prompt/standardize-prompt.ts
1209
1492
  function standardizePrompt({
1210
1493
  prompt,
@@ -1257,6 +1540,12 @@ function standardizePrompt({
1257
1540
  const messages = promptType === "ui-messages" ? convertToCoreMessages(prompt.messages, {
1258
1541
  tools
1259
1542
  }) : prompt.messages;
1543
+ if (messages.length === 0) {
1544
+ throw new InvalidPromptError({
1545
+ prompt,
1546
+ message: "messages must not be empty"
1547
+ });
1548
+ }
1260
1549
  const validationResult = safeValidateTypes({
1261
1550
  value: messages,
1262
1551
  schema: z7.array(coreMessageSchema)
@@ -1471,7 +1760,8 @@ async function streamUI({
1471
1760
  headers,
1472
1761
  initial,
1473
1762
  text,
1474
- experimental_providerMetadata: providerMetadata,
1763
+ experimental_providerMetadata,
1764
+ providerOptions = experimental_providerMetadata,
1475
1765
  onFinish,
1476
1766
  ...settings
1477
1767
  }) {
@@ -1543,26 +1833,30 @@ async function streamUI({
1543
1833
  // streamUI tools don't support multi-modal tool result conversion
1544
1834
  });
1545
1835
  const result = await retry(
1546
- async () => model.doStream({
1547
- mode: {
1548
- type: "regular",
1549
- ...prepareToolsAndToolChoice({
1550
- tools,
1551
- toolChoice,
1552
- activeTools: void 0
1553
- })
1554
- },
1555
- ...prepareCallSettings(settings),
1556
- inputFormat: validatedPrompt.type,
1557
- prompt: await convertToLanguageModelPrompt({
1558
- prompt: validatedPrompt,
1559
- modelSupportsImageUrls: model.supportsImageUrls,
1560
- modelSupportsUrl: model.supportsUrl
1561
- }),
1562
- providerMetadata,
1563
- abortSignal,
1564
- headers
1565
- })
1836
+ async () => {
1837
+ var _a9;
1838
+ return model.doStream({
1839
+ mode: {
1840
+ type: "regular",
1841
+ ...prepareToolsAndToolChoice({
1842
+ tools,
1843
+ toolChoice,
1844
+ activeTools: void 0
1845
+ })
1846
+ },
1847
+ ...prepareCallSettings(settings),
1848
+ inputFormat: validatedPrompt.type,
1849
+ prompt: await convertToLanguageModelPrompt({
1850
+ prompt: validatedPrompt,
1851
+ modelSupportsImageUrls: model.supportsImageUrls,
1852
+ modelSupportsUrl: (_a9 = model.supportsUrl) == null ? void 0 : _a9.bind(model)
1853
+ // support 'this' context
1854
+ }),
1855
+ providerMetadata: providerOptions,
1856
+ abortSignal,
1857
+ headers
1858
+ });
1859
+ }
1566
1860
  );
1567
1861
  const [stream, forkedStream] = result.stream.tee();
1568
1862
  (async () => {