ai 0.0.0-156c9f7b-20250115085202 → 0.0.0-677c097b-20250505090413

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.
@@ -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,
@@ -267,17 +264,102 @@ async function download({
267
264
  }
268
265
  }
269
266
 
270
- // core/util/detect-image-mimetype.ts
271
- 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] }
267
+ // core/util/detect-mimetype.ts
268
+ import { convertBase64ToUint8Array } from "@ai-sdk/provider-utils";
269
+ var imageMimeTypeSignatures = [
270
+ {
271
+ mimeType: "image/gif",
272
+ bytesPrefix: [71, 73, 70],
273
+ base64Prefix: "R0lG"
274
+ },
275
+ {
276
+ mimeType: "image/png",
277
+ bytesPrefix: [137, 80, 78, 71],
278
+ base64Prefix: "iVBORw"
279
+ },
280
+ {
281
+ mimeType: "image/jpeg",
282
+ bytesPrefix: [255, 216],
283
+ base64Prefix: "/9j/"
284
+ },
285
+ {
286
+ mimeType: "image/webp",
287
+ bytesPrefix: [82, 73, 70, 70],
288
+ base64Prefix: "UklGRg"
289
+ },
290
+ {
291
+ mimeType: "image/bmp",
292
+ bytesPrefix: [66, 77],
293
+ base64Prefix: "Qk"
294
+ },
295
+ {
296
+ mimeType: "image/tiff",
297
+ bytesPrefix: [73, 73, 42, 0],
298
+ base64Prefix: "SUkqAA"
299
+ },
300
+ {
301
+ mimeType: "image/tiff",
302
+ bytesPrefix: [77, 77, 0, 42],
303
+ base64Prefix: "TU0AKg"
304
+ },
305
+ {
306
+ mimeType: "image/avif",
307
+ bytesPrefix: [
308
+ 0,
309
+ 0,
310
+ 0,
311
+ 32,
312
+ 102,
313
+ 116,
314
+ 121,
315
+ 112,
316
+ 97,
317
+ 118,
318
+ 105,
319
+ 102
320
+ ],
321
+ base64Prefix: "AAAAIGZ0eXBhdmlm"
322
+ },
323
+ {
324
+ mimeType: "image/heic",
325
+ bytesPrefix: [
326
+ 0,
327
+ 0,
328
+ 0,
329
+ 32,
330
+ 102,
331
+ 116,
332
+ 121,
333
+ 112,
334
+ 104,
335
+ 101,
336
+ 105,
337
+ 99
338
+ ],
339
+ base64Prefix: "AAAAIGZ0eXBoZWlj"
340
+ }
276
341
  ];
277
- 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
+ var stripID3 = (data) => {
343
+ const bytes = typeof data === "string" ? convertBase64ToUint8Array(data) : data;
344
+ const id3Size = (bytes[6] & 127) << 21 | (bytes[7] & 127) << 14 | (bytes[8] & 127) << 7 | bytes[9] & 127;
345
+ return bytes.slice(id3Size + 10);
346
+ };
347
+ function stripID3TagsIfPresent(data) {
348
+ const hasId3 = typeof data === "string" && data.startsWith("SUQz") || typeof data !== "string" && data.length > 10 && data[0] === 73 && // 'I'
349
+ data[1] === 68 && // 'D'
350
+ data[2] === 51;
351
+ return hasId3 ? stripID3(data) : data;
352
+ }
353
+ function detectMimeType({
354
+ data,
355
+ signatures
356
+ }) {
357
+ const processedData = stripID3TagsIfPresent(data);
358
+ for (const signature of signatures) {
359
+ if (typeof processedData === "string" ? processedData.startsWith(signature.base64Prefix) : processedData.length >= signature.bytesPrefix.length && signature.bytesPrefix.every(
360
+ (byte, index) => processedData[index] === byte
361
+ )) {
362
+ return signature.mimeType;
281
363
  }
282
364
  }
283
365
  return void 0;
@@ -285,7 +367,7 @@ function detectImageMimeType(image) {
285
367
 
286
368
  // core/prompt/data-content.ts
287
369
  import {
288
- convertBase64ToUint8Array,
370
+ convertBase64ToUint8Array as convertBase64ToUint8Array2,
289
371
  convertUint8ArrayToBase64
290
372
  } from "@ai-sdk/provider-utils";
291
373
 
@@ -341,7 +423,7 @@ function convertDataContentToUint8Array(content) {
341
423
  }
342
424
  if (typeof content === "string") {
343
425
  try {
344
- return convertBase64ToUint8Array(content);
426
+ return convertBase64ToUint8Array2(content);
345
427
  } catch (error) {
346
428
  throw new InvalidDataContentError({
347
429
  message: "Invalid data content. Content string is not a base64-encoded media.",
@@ -421,13 +503,14 @@ async function convertToLanguageModelPrompt({
421
503
  ];
422
504
  }
423
505
  function convertToLanguageModelMessage(message, downloadedAssets) {
506
+ var _a9, _b, _c, _d, _e, _f;
424
507
  const role = message.role;
425
508
  switch (role) {
426
509
  case "system": {
427
510
  return {
428
511
  role: "system",
429
512
  content: message.content,
430
- providerMetadata: message.experimental_providerMetadata
513
+ providerMetadata: (_a9 = message.providerOptions) != null ? _a9 : message.experimental_providerMetadata
431
514
  };
432
515
  }
433
516
  case "user": {
@@ -435,13 +518,13 @@ function convertToLanguageModelMessage(message, downloadedAssets) {
435
518
  return {
436
519
  role: "user",
437
520
  content: [{ type: "text", text: message.content }],
438
- providerMetadata: message.experimental_providerMetadata
521
+ providerMetadata: (_b = message.providerOptions) != null ? _b : message.experimental_providerMetadata
439
522
  };
440
523
  }
441
524
  return {
442
525
  role: "user",
443
526
  content: message.content.map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== "text" || part.text !== ""),
444
- providerMetadata: message.experimental_providerMetadata
527
+ providerMetadata: (_c = message.providerOptions) != null ? _c : message.experimental_providerMetadata
445
528
  };
446
529
  }
447
530
  case "assistant": {
@@ -449,7 +532,7 @@ function convertToLanguageModelMessage(message, downloadedAssets) {
449
532
  return {
450
533
  role: "assistant",
451
534
  content: [{ type: "text", text: message.content }],
452
- providerMetadata: message.experimental_providerMetadata
535
+ providerMetadata: (_d = message.providerOptions) != null ? _d : message.experimental_providerMetadata
453
536
  };
454
537
  }
455
538
  return {
@@ -458,28 +541,70 @@ function convertToLanguageModelMessage(message, downloadedAssets) {
458
541
  // remove empty text parts:
459
542
  (part) => part.type !== "text" || part.text !== ""
460
543
  ).map((part) => {
461
- const { experimental_providerMetadata, ...rest } = part;
462
- return {
463
- ...rest,
464
- providerMetadata: experimental_providerMetadata
465
- };
544
+ var _a10;
545
+ const providerOptions = (_a10 = part.providerOptions) != null ? _a10 : part.experimental_providerMetadata;
546
+ switch (part.type) {
547
+ case "file": {
548
+ return {
549
+ type: "file",
550
+ data: part.data instanceof URL ? part.data : convertDataContentToBase64String(part.data),
551
+ filename: part.filename,
552
+ mimeType: part.mimeType,
553
+ providerMetadata: providerOptions
554
+ };
555
+ }
556
+ case "reasoning": {
557
+ return {
558
+ type: "reasoning",
559
+ text: part.text,
560
+ signature: part.signature,
561
+ providerMetadata: providerOptions
562
+ };
563
+ }
564
+ case "redacted-reasoning": {
565
+ return {
566
+ type: "redacted-reasoning",
567
+ data: part.data,
568
+ providerMetadata: providerOptions
569
+ };
570
+ }
571
+ case "text": {
572
+ return {
573
+ type: "text",
574
+ text: part.text,
575
+ providerMetadata: providerOptions
576
+ };
577
+ }
578
+ case "tool-call": {
579
+ return {
580
+ type: "tool-call",
581
+ toolCallId: part.toolCallId,
582
+ toolName: part.toolName,
583
+ args: part.args,
584
+ providerMetadata: providerOptions
585
+ };
586
+ }
587
+ }
466
588
  }),
467
- providerMetadata: message.experimental_providerMetadata
589
+ providerMetadata: (_e = message.providerOptions) != null ? _e : message.experimental_providerMetadata
468
590
  };
469
591
  }
470
592
  case "tool": {
471
593
  return {
472
594
  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
595
+ content: message.content.map((part) => {
596
+ var _a10;
597
+ return {
598
+ type: "tool-result",
599
+ toolCallId: part.toolCallId,
600
+ toolName: part.toolName,
601
+ result: part.result,
602
+ content: part.experimental_content,
603
+ isError: part.isError,
604
+ providerMetadata: (_a10 = part.providerOptions) != null ? _a10 : part.experimental_providerMetadata
605
+ };
606
+ }),
607
+ providerMetadata: (_f = message.providerOptions) != null ? _f : message.experimental_providerMetadata
483
608
  };
484
609
  }
485
610
  default: {
@@ -512,12 +637,12 @@ async function downloadAssets(messages, downloadImplementation, modelSupportsIma
512
637
  );
513
638
  }
514
639
  function convertPartToLanguageModelPart(part, downloadedAssets) {
515
- var _a9;
640
+ var _a9, _b, _c, _d;
516
641
  if (part.type === "text") {
517
642
  return {
518
643
  type: "text",
519
644
  text: part.text,
520
- providerMetadata: part.experimental_providerMetadata
645
+ providerMetadata: (_a9 = part.providerOptions) != null ? _a9 : part.experimental_providerMetadata
521
646
  };
522
647
  }
523
648
  let mimeType = part.mimeType;
@@ -565,13 +690,16 @@ function convertPartToLanguageModelPart(part, downloadedAssets) {
565
690
  switch (type) {
566
691
  case "image": {
567
692
  if (normalizedData instanceof Uint8Array) {
568
- mimeType = (_a9 = detectImageMimeType(normalizedData)) != null ? _a9 : mimeType;
693
+ mimeType = (_b = detectMimeType({
694
+ data: normalizedData,
695
+ signatures: imageMimeTypeSignatures
696
+ })) != null ? _b : mimeType;
569
697
  }
570
698
  return {
571
699
  type: "image",
572
700
  image: normalizedData,
573
701
  mimeType,
574
- providerMetadata: part.experimental_providerMetadata
702
+ providerMetadata: (_c = part.providerOptions) != null ? _c : part.experimental_providerMetadata
575
703
  };
576
704
  }
577
705
  case "file": {
@@ -581,8 +709,9 @@ function convertPartToLanguageModelPart(part, downloadedAssets) {
581
709
  return {
582
710
  type: "file",
583
711
  data: normalizedData instanceof Uint8Array ? convertDataContentToBase64String(normalizedData) : normalizedData,
712
+ filename: part.filename,
584
713
  mimeType,
585
- providerMetadata: part.experimental_providerMetadata
714
+ providerMetadata: (_d = part.providerOptions) != null ? _d : part.experimental_providerMetadata
586
715
  };
587
716
  }
588
717
  }
@@ -697,6 +826,7 @@ function prepareCallSettings({
697
826
  }
698
827
  return {
699
828
  maxTokens,
829
+ // TODO v5 remove default 0 for temperature
700
830
  temperature: temperature != null ? temperature : 0,
701
831
  topP,
702
832
  topK,
@@ -709,12 +839,7 @@ function prepareCallSettings({
709
839
 
710
840
  // util/retry-with-exponential-backoff.ts
711
841
  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
- }
842
+ import { delay, getErrorMessage, isAbortError } from "@ai-sdk/provider-utils";
718
843
 
719
844
  // util/retry-error.ts
720
845
  import { AISDKError as AISDKError5 } from "@ai-sdk/provider";
@@ -873,154 +998,10 @@ function prepareToolsAndToolChoice({
873
998
  }
874
999
 
875
1000
  // core/prompt/standardize-prompt.ts
876
- import { InvalidPromptError } from "@ai-sdk/provider";
1001
+ import { InvalidPromptError as InvalidPromptError2 } from "@ai-sdk/provider";
877
1002
  import { safeValidateTypes } from "@ai-sdk/provider-utils";
878
1003
  import { z as z7 } from "zod";
879
1004
 
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
1005
  // core/prompt/attachments-to-parts.ts
1025
1006
  function attachmentsToParts(attachments) {
1026
1007
  var _a9, _b, _c;
@@ -1121,11 +1102,13 @@ _a6 = symbol6;
1121
1102
 
1122
1103
  // core/prompt/convert-to-core-messages.ts
1123
1104
  function convertToCoreMessages(messages, options) {
1124
- var _a9;
1105
+ var _a9, _b;
1125
1106
  const tools = (_a9 = options == null ? void 0 : options.tools) != null ? _a9 : {};
1126
1107
  const coreMessages = [];
1127
- for (const message of messages) {
1128
- const { role, content, toolInvocations, experimental_attachments } = message;
1108
+ for (let i = 0; i < messages.length; i++) {
1109
+ const message = messages[i];
1110
+ const isLastMessage = i === messages.length - 1;
1111
+ const { role, content, experimental_attachments } = message;
1129
1112
  switch (role) {
1130
1113
  case "system": {
1131
1114
  coreMessages.push({
@@ -1135,59 +1118,204 @@ function convertToCoreMessages(messages, options) {
1135
1118
  break;
1136
1119
  }
1137
1120
  case "user": {
1138
- coreMessages.push({
1139
- role: "user",
1140
- content: experimental_attachments ? [
1141
- { type: "text", text: content },
1142
- ...attachmentsToParts(experimental_attachments)
1143
- ] : content
1144
- });
1121
+ if (message.parts == null) {
1122
+ coreMessages.push({
1123
+ role: "user",
1124
+ content: experimental_attachments ? [
1125
+ { type: "text", text: content },
1126
+ ...attachmentsToParts(experimental_attachments)
1127
+ ] : content
1128
+ });
1129
+ } else {
1130
+ const textParts = message.parts.filter((part) => part.type === "text").map((part) => ({
1131
+ type: "text",
1132
+ text: part.text
1133
+ }));
1134
+ coreMessages.push({
1135
+ role: "user",
1136
+ content: experimental_attachments ? [...textParts, ...attachmentsToParts(experimental_attachments)] : textParts
1137
+ });
1138
+ }
1145
1139
  break;
1146
1140
  }
1147
1141
  case "assistant": {
1148
- if (toolInvocations == null) {
1142
+ if (message.parts != null) {
1143
+ let processBlock2 = function() {
1144
+ const content2 = [];
1145
+ for (const part of block) {
1146
+ switch (part.type) {
1147
+ case "file":
1148
+ case "text": {
1149
+ content2.push(part);
1150
+ break;
1151
+ }
1152
+ case "reasoning": {
1153
+ for (const detail of part.details) {
1154
+ switch (detail.type) {
1155
+ case "text":
1156
+ content2.push({
1157
+ type: "reasoning",
1158
+ text: detail.text,
1159
+ signature: detail.signature
1160
+ });
1161
+ break;
1162
+ case "redacted":
1163
+ content2.push({
1164
+ type: "redacted-reasoning",
1165
+ data: detail.data
1166
+ });
1167
+ break;
1168
+ }
1169
+ }
1170
+ break;
1171
+ }
1172
+ case "tool-invocation":
1173
+ content2.push({
1174
+ type: "tool-call",
1175
+ toolCallId: part.toolInvocation.toolCallId,
1176
+ toolName: part.toolInvocation.toolName,
1177
+ args: part.toolInvocation.args
1178
+ });
1179
+ break;
1180
+ default: {
1181
+ const _exhaustiveCheck = part;
1182
+ throw new Error(`Unsupported part: ${_exhaustiveCheck}`);
1183
+ }
1184
+ }
1185
+ }
1186
+ coreMessages.push({
1187
+ role: "assistant",
1188
+ content: content2
1189
+ });
1190
+ const stepInvocations = block.filter(
1191
+ (part) => part.type === "tool-invocation"
1192
+ ).map((part) => part.toolInvocation);
1193
+ if (stepInvocations.length > 0) {
1194
+ coreMessages.push({
1195
+ role: "tool",
1196
+ content: stepInvocations.map(
1197
+ (toolInvocation) => {
1198
+ if (!("result" in toolInvocation)) {
1199
+ throw new MessageConversionError({
1200
+ originalMessage: message,
1201
+ message: "ToolInvocation must have a result: " + JSON.stringify(toolInvocation)
1202
+ });
1203
+ }
1204
+ const { toolCallId, toolName, result } = toolInvocation;
1205
+ const tool = tools[toolName];
1206
+ return (tool == null ? void 0 : tool.experimental_toToolResultContent) != null ? {
1207
+ type: "tool-result",
1208
+ toolCallId,
1209
+ toolName,
1210
+ result: tool.experimental_toToolResultContent(result),
1211
+ experimental_content: tool.experimental_toToolResultContent(result)
1212
+ } : {
1213
+ type: "tool-result",
1214
+ toolCallId,
1215
+ toolName,
1216
+ result
1217
+ };
1218
+ }
1219
+ )
1220
+ });
1221
+ }
1222
+ block = [];
1223
+ blockHasToolInvocations = false;
1224
+ currentStep++;
1225
+ };
1226
+ var processBlock = processBlock2;
1227
+ let currentStep = 0;
1228
+ let blockHasToolInvocations = false;
1229
+ let block = [];
1230
+ for (const part of message.parts) {
1231
+ switch (part.type) {
1232
+ case "text": {
1233
+ if (blockHasToolInvocations) {
1234
+ processBlock2();
1235
+ }
1236
+ block.push(part);
1237
+ break;
1238
+ }
1239
+ case "file":
1240
+ case "reasoning": {
1241
+ block.push(part);
1242
+ break;
1243
+ }
1244
+ case "tool-invocation": {
1245
+ if (((_b = part.toolInvocation.step) != null ? _b : 0) !== currentStep) {
1246
+ processBlock2();
1247
+ }
1248
+ block.push(part);
1249
+ blockHasToolInvocations = true;
1250
+ break;
1251
+ }
1252
+ }
1253
+ }
1254
+ processBlock2();
1255
+ break;
1256
+ }
1257
+ const toolInvocations = message.toolInvocations;
1258
+ if (toolInvocations == null || toolInvocations.length === 0) {
1149
1259
  coreMessages.push({ role: "assistant", content });
1150
1260
  break;
1151
1261
  }
1152
- coreMessages.push({
1153
- role: "assistant",
1154
- content: [
1155
- { type: "text", text: content },
1156
- ...toolInvocations.map(
1157
- ({ toolCallId, toolName, args }) => ({
1158
- type: "tool-call",
1262
+ const maxStep = toolInvocations.reduce((max, toolInvocation) => {
1263
+ var _a10;
1264
+ return Math.max(max, (_a10 = toolInvocation.step) != null ? _a10 : 0);
1265
+ }, 0);
1266
+ for (let i2 = 0; i2 <= maxStep; i2++) {
1267
+ const stepInvocations = toolInvocations.filter(
1268
+ (toolInvocation) => {
1269
+ var _a10;
1270
+ return ((_a10 = toolInvocation.step) != null ? _a10 : 0) === i2;
1271
+ }
1272
+ );
1273
+ if (stepInvocations.length === 0) {
1274
+ continue;
1275
+ }
1276
+ coreMessages.push({
1277
+ role: "assistant",
1278
+ content: [
1279
+ ...isLastMessage && content && i2 === 0 ? [{ type: "text", text: content }] : [],
1280
+ ...stepInvocations.map(
1281
+ ({ toolCallId, toolName, args }) => ({
1282
+ type: "tool-call",
1283
+ toolCallId,
1284
+ toolName,
1285
+ args
1286
+ })
1287
+ )
1288
+ ]
1289
+ });
1290
+ coreMessages.push({
1291
+ role: "tool",
1292
+ content: stepInvocations.map((toolInvocation) => {
1293
+ if (!("result" in toolInvocation)) {
1294
+ throw new MessageConversionError({
1295
+ originalMessage: message,
1296
+ message: "ToolInvocation must have a result: " + JSON.stringify(toolInvocation)
1297
+ });
1298
+ }
1299
+ const { toolCallId, toolName, result } = toolInvocation;
1300
+ const tool = tools[toolName];
1301
+ return (tool == null ? void 0 : tool.experimental_toToolResultContent) != null ? {
1302
+ type: "tool-result",
1159
1303
  toolCallId,
1160
1304
  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
- });
1305
+ result: tool.experimental_toToolResultContent(result),
1306
+ experimental_content: tool.experimental_toToolResultContent(result)
1307
+ } : {
1308
+ type: "tool-result",
1309
+ toolCallId,
1310
+ toolName,
1311
+ result
1312
+ };
1313
+ })
1314
+ });
1315
+ }
1316
+ if (content && !isLastMessage) {
1317
+ coreMessages.push({ role: "assistant", content });
1318
+ }
1191
1319
  break;
1192
1320
  }
1193
1321
  case "data": {
@@ -1205,32 +1333,225 @@ function convertToCoreMessages(messages, options) {
1205
1333
  return coreMessages;
1206
1334
  }
1207
1335
 
1336
+ // core/prompt/detect-prompt-type.ts
1337
+ import { InvalidPromptError } from "@ai-sdk/provider";
1338
+ function detectPromptType(prompt) {
1339
+ if (!Array.isArray(prompt)) {
1340
+ throw new InvalidPromptError({
1341
+ prompt,
1342
+ message: [
1343
+ "messages must be an array of CoreMessage or UIMessage",
1344
+ `Received non-array value: ${JSON.stringify(prompt)}`
1345
+ ].join("\n"),
1346
+ cause: prompt
1347
+ });
1348
+ }
1349
+ if (prompt.length === 0) {
1350
+ return "messages";
1351
+ }
1352
+ const characteristics = prompt.map(detectSingleMessageCharacteristics);
1353
+ if (characteristics.some((c) => c === "has-ui-specific-parts")) {
1354
+ return "ui-messages";
1355
+ }
1356
+ const nonMessageIndex = characteristics.findIndex(
1357
+ (c) => c !== "has-core-specific-parts" && c !== "message"
1358
+ );
1359
+ if (nonMessageIndex === -1) {
1360
+ return "messages";
1361
+ }
1362
+ throw new InvalidPromptError({
1363
+ prompt,
1364
+ message: [
1365
+ "messages must be an array of CoreMessage or UIMessage",
1366
+ `Received message of type: "${characteristics[nonMessageIndex]}" at index ${nonMessageIndex}`,
1367
+ `messages[${nonMessageIndex}]: ${JSON.stringify(prompt[nonMessageIndex])}`
1368
+ ].join("\n"),
1369
+ cause: prompt
1370
+ });
1371
+ }
1372
+ function detectSingleMessageCharacteristics(message) {
1373
+ if (typeof message === "object" && message !== null && (message.role === "function" || // UI-only role
1374
+ message.role === "data" || // UI-only role
1375
+ "toolInvocations" in message || // UI-specific field
1376
+ "parts" in message || // UI-specific field
1377
+ "experimental_attachments" in message)) {
1378
+ return "has-ui-specific-parts";
1379
+ } else if (typeof message === "object" && message !== null && "content" in message && (Array.isArray(message.content) || // Core messages can have array content
1380
+ "experimental_providerMetadata" in message || "providerOptions" in message)) {
1381
+ return "has-core-specific-parts";
1382
+ } else if (typeof message === "object" && message !== null && "role" in message && "content" in message && typeof message.content === "string" && ["system", "user", "assistant", "tool"].includes(message.role)) {
1383
+ return "message";
1384
+ } else {
1385
+ return "other";
1386
+ }
1387
+ }
1388
+
1389
+ // core/prompt/message.ts
1390
+ import { z as z6 } from "zod";
1391
+
1392
+ // core/types/provider-metadata.ts
1393
+ import { z as z3 } from "zod";
1394
+
1395
+ // core/types/json-value.ts
1396
+ import { z as z2 } from "zod";
1397
+ var jsonValueSchema = z2.lazy(
1398
+ () => z2.union([
1399
+ z2.null(),
1400
+ z2.string(),
1401
+ z2.number(),
1402
+ z2.boolean(),
1403
+ z2.record(z2.string(), jsonValueSchema),
1404
+ z2.array(jsonValueSchema)
1405
+ ])
1406
+ );
1407
+
1408
+ // core/types/provider-metadata.ts
1409
+ var providerMetadataSchema = z3.record(
1410
+ z3.string(),
1411
+ z3.record(z3.string(), jsonValueSchema)
1412
+ );
1413
+
1414
+ // core/prompt/content-part.ts
1415
+ import { z as z5 } from "zod";
1416
+
1417
+ // core/prompt/tool-result-content.ts
1418
+ import { z as z4 } from "zod";
1419
+ var toolResultContentSchema = z4.array(
1420
+ z4.union([
1421
+ z4.object({ type: z4.literal("text"), text: z4.string() }),
1422
+ z4.object({
1423
+ type: z4.literal("image"),
1424
+ data: z4.string(),
1425
+ mimeType: z4.string().optional()
1426
+ })
1427
+ ])
1428
+ );
1429
+
1430
+ // core/prompt/content-part.ts
1431
+ var textPartSchema = z5.object({
1432
+ type: z5.literal("text"),
1433
+ text: z5.string(),
1434
+ providerOptions: providerMetadataSchema.optional(),
1435
+ experimental_providerMetadata: providerMetadataSchema.optional()
1436
+ });
1437
+ var imagePartSchema = z5.object({
1438
+ type: z5.literal("image"),
1439
+ image: z5.union([dataContentSchema, z5.instanceof(URL)]),
1440
+ mimeType: z5.string().optional(),
1441
+ providerOptions: providerMetadataSchema.optional(),
1442
+ experimental_providerMetadata: providerMetadataSchema.optional()
1443
+ });
1444
+ var filePartSchema = z5.object({
1445
+ type: z5.literal("file"),
1446
+ data: z5.union([dataContentSchema, z5.instanceof(URL)]),
1447
+ filename: z5.string().optional(),
1448
+ mimeType: z5.string(),
1449
+ providerOptions: providerMetadataSchema.optional(),
1450
+ experimental_providerMetadata: providerMetadataSchema.optional()
1451
+ });
1452
+ var reasoningPartSchema = z5.object({
1453
+ type: z5.literal("reasoning"),
1454
+ text: z5.string(),
1455
+ providerOptions: providerMetadataSchema.optional(),
1456
+ experimental_providerMetadata: providerMetadataSchema.optional()
1457
+ });
1458
+ var redactedReasoningPartSchema = z5.object({
1459
+ type: z5.literal("redacted-reasoning"),
1460
+ data: z5.string(),
1461
+ providerOptions: providerMetadataSchema.optional(),
1462
+ experimental_providerMetadata: providerMetadataSchema.optional()
1463
+ });
1464
+ var toolCallPartSchema = z5.object({
1465
+ type: z5.literal("tool-call"),
1466
+ toolCallId: z5.string(),
1467
+ toolName: z5.string(),
1468
+ args: z5.unknown(),
1469
+ providerOptions: providerMetadataSchema.optional(),
1470
+ experimental_providerMetadata: providerMetadataSchema.optional()
1471
+ });
1472
+ var toolResultPartSchema = z5.object({
1473
+ type: z5.literal("tool-result"),
1474
+ toolCallId: z5.string(),
1475
+ toolName: z5.string(),
1476
+ result: z5.unknown(),
1477
+ content: toolResultContentSchema.optional(),
1478
+ isError: z5.boolean().optional(),
1479
+ providerOptions: providerMetadataSchema.optional(),
1480
+ experimental_providerMetadata: providerMetadataSchema.optional()
1481
+ });
1482
+
1483
+ // core/prompt/message.ts
1484
+ var coreSystemMessageSchema = z6.object({
1485
+ role: z6.literal("system"),
1486
+ content: z6.string(),
1487
+ providerOptions: providerMetadataSchema.optional(),
1488
+ experimental_providerMetadata: providerMetadataSchema.optional()
1489
+ });
1490
+ var coreUserMessageSchema = z6.object({
1491
+ role: z6.literal("user"),
1492
+ content: z6.union([
1493
+ z6.string(),
1494
+ z6.array(z6.union([textPartSchema, imagePartSchema, filePartSchema]))
1495
+ ]),
1496
+ providerOptions: providerMetadataSchema.optional(),
1497
+ experimental_providerMetadata: providerMetadataSchema.optional()
1498
+ });
1499
+ var coreAssistantMessageSchema = z6.object({
1500
+ role: z6.literal("assistant"),
1501
+ content: z6.union([
1502
+ z6.string(),
1503
+ z6.array(
1504
+ z6.union([
1505
+ textPartSchema,
1506
+ filePartSchema,
1507
+ reasoningPartSchema,
1508
+ redactedReasoningPartSchema,
1509
+ toolCallPartSchema
1510
+ ])
1511
+ )
1512
+ ]),
1513
+ providerOptions: providerMetadataSchema.optional(),
1514
+ experimental_providerMetadata: providerMetadataSchema.optional()
1515
+ });
1516
+ var coreToolMessageSchema = z6.object({
1517
+ role: z6.literal("tool"),
1518
+ content: z6.array(toolResultPartSchema),
1519
+ providerOptions: providerMetadataSchema.optional(),
1520
+ experimental_providerMetadata: providerMetadataSchema.optional()
1521
+ });
1522
+ var coreMessageSchema = z6.union([
1523
+ coreSystemMessageSchema,
1524
+ coreUserMessageSchema,
1525
+ coreAssistantMessageSchema,
1526
+ coreToolMessageSchema
1527
+ ]);
1528
+
1208
1529
  // core/prompt/standardize-prompt.ts
1209
1530
  function standardizePrompt({
1210
1531
  prompt,
1211
1532
  tools
1212
1533
  }) {
1213
1534
  if (prompt.prompt == null && prompt.messages == null) {
1214
- throw new InvalidPromptError({
1535
+ throw new InvalidPromptError2({
1215
1536
  prompt,
1216
1537
  message: "prompt or messages must be defined"
1217
1538
  });
1218
1539
  }
1219
1540
  if (prompt.prompt != null && prompt.messages != null) {
1220
- throw new InvalidPromptError({
1541
+ throw new InvalidPromptError2({
1221
1542
  prompt,
1222
1543
  message: "prompt and messages cannot be defined at the same time"
1223
1544
  });
1224
1545
  }
1225
1546
  if (prompt.system != null && typeof prompt.system !== "string") {
1226
- throw new InvalidPromptError({
1547
+ throw new InvalidPromptError2({
1227
1548
  prompt,
1228
1549
  message: "system must be a string"
1229
1550
  });
1230
1551
  }
1231
1552
  if (prompt.prompt != null) {
1232
1553
  if (typeof prompt.prompt !== "string") {
1233
- throw new InvalidPromptError({
1554
+ throw new InvalidPromptError2({
1234
1555
  prompt,
1235
1556
  message: "prompt must be a string"
1236
1557
  });
@@ -1248,23 +1569,26 @@ function standardizePrompt({
1248
1569
  }
1249
1570
  if (prompt.messages != null) {
1250
1571
  const promptType = detectPromptType(prompt.messages);
1251
- if (promptType === "other") {
1252
- throw new InvalidPromptError({
1253
- prompt,
1254
- message: "messages must be an array of CoreMessage or UIMessage"
1255
- });
1256
- }
1257
1572
  const messages = promptType === "ui-messages" ? convertToCoreMessages(prompt.messages, {
1258
1573
  tools
1259
1574
  }) : prompt.messages;
1575
+ if (messages.length === 0) {
1576
+ throw new InvalidPromptError2({
1577
+ prompt,
1578
+ message: "messages must not be empty"
1579
+ });
1580
+ }
1260
1581
  const validationResult = safeValidateTypes({
1261
1582
  value: messages,
1262
1583
  schema: z7.array(coreMessageSchema)
1263
1584
  });
1264
1585
  if (!validationResult.success) {
1265
- throw new InvalidPromptError({
1586
+ throw new InvalidPromptError2({
1266
1587
  prompt,
1267
- message: "messages must be an array of CoreMessage or UIMessage",
1588
+ message: [
1589
+ "messages must be an array of CoreMessage or UIMessage",
1590
+ `Validation error: ${validationResult.error.message}`
1591
+ ].join("\n"),
1268
1592
  cause: validationResult.error
1269
1593
  });
1270
1594
  }
@@ -1471,7 +1795,8 @@ async function streamUI({
1471
1795
  headers,
1472
1796
  initial,
1473
1797
  text,
1474
- experimental_providerMetadata: providerMetadata,
1798
+ experimental_providerMetadata,
1799
+ providerOptions = experimental_providerMetadata,
1475
1800
  onFinish,
1476
1801
  ...settings
1477
1802
  }) {
@@ -1543,26 +1868,30 @@ async function streamUI({
1543
1868
  // streamUI tools don't support multi-modal tool result conversion
1544
1869
  });
1545
1870
  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
- })
1871
+ async () => {
1872
+ var _a9;
1873
+ return model.doStream({
1874
+ mode: {
1875
+ type: "regular",
1876
+ ...prepareToolsAndToolChoice({
1877
+ tools,
1878
+ toolChoice,
1879
+ activeTools: void 0
1880
+ })
1881
+ },
1882
+ ...prepareCallSettings(settings),
1883
+ inputFormat: validatedPrompt.type,
1884
+ prompt: await convertToLanguageModelPrompt({
1885
+ prompt: validatedPrompt,
1886
+ modelSupportsImageUrls: model.supportsImageUrls,
1887
+ modelSupportsUrl: (_a9 = model.supportsUrl) == null ? void 0 : _a9.bind(model)
1888
+ // support 'this' context
1889
+ }),
1890
+ providerMetadata: providerOptions,
1891
+ abortSignal,
1892
+ headers
1893
+ });
1894
+ }
1566
1895
  );
1567
1896
  const [stream, forkedStream] = result.stream.tee();
1568
1897
  (async () => {