ai 5.0.0-alpha.6 → 5.0.0-alpha.7

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.js CHANGED
@@ -53,10 +53,8 @@ __export(src_exports, {
53
53
  ToolExecutionError: () => ToolExecutionError,
54
54
  TypeValidationError: () => import_provider16.TypeValidationError,
55
55
  UnsupportedFunctionalityError: () => import_provider16.UnsupportedFunctionalityError,
56
- appendClientMessage: () => appendClientMessage,
57
56
  asSchema: () => import_provider_utils26.asSchema,
58
57
  assistantModelMessageSchema: () => assistantModelMessageSchema,
59
- callChatApi: () => callChatApi,
60
58
  callCompletionApi: () => callCompletionApi,
61
59
  convertFileListToFileUIParts: () => convertFileListToFileUIParts,
62
60
  convertToCoreMessages: () => convertToCoreMessages,
@@ -83,7 +81,6 @@ __export(src_exports, {
83
81
  experimental_generateImage: () => generateImage,
84
82
  experimental_generateSpeech: () => generateSpeech,
85
83
  experimental_transcribe: () => transcribe,
86
- extractMaxToolInvocationStep: () => extractMaxToolInvocationStep,
87
84
  extractReasoningMiddleware: () => extractReasoningMiddleware,
88
85
  generateId: () => import_provider_utils26.generateId,
89
86
  generateObject: () => generateObject,
@@ -91,14 +88,12 @@ __export(src_exports, {
91
88
  getTextFromDataUrl: () => getTextFromDataUrl,
92
89
  getToolInvocations: () => getToolInvocations,
93
90
  hasToolCall: () => hasToolCall,
94
- isAssistantMessageWithCompletedToolCalls: () => isAssistantMessageWithCompletedToolCalls,
95
91
  isDeepEqualData: () => isDeepEqualData,
96
92
  jsonSchema: () => import_provider_utils26.jsonSchema,
97
93
  modelMessageSchema: () => modelMessageSchema,
98
94
  parsePartialJson: () => parsePartialJson,
99
95
  pipeTextStreamToResponse: () => pipeTextStreamToResponse,
100
96
  pipeUIMessageStreamToResponse: () => pipeUIMessageStreamToResponse,
101
- shouldResubmitMessages: () => shouldResubmitMessages,
102
97
  simulateReadableStream: () => simulateReadableStream,
103
98
  simulateStreamingMiddleware: () => simulateStreamingMiddleware,
104
99
  smoothStream: () => smoothStream,
@@ -108,7 +103,6 @@ __export(src_exports, {
108
103
  systemModelMessageSchema: () => systemModelMessageSchema,
109
104
  tool: () => tool,
110
105
  toolModelMessageSchema: () => toolModelMessageSchema,
111
- updateToolCallResult: () => updateToolCallResult,
112
106
  userModelMessageSchema: () => userModelMessageSchema,
113
107
  wrapLanguageModel: () => wrapLanguageModel
114
108
  });
@@ -540,19 +534,8 @@ function pipeTextStreamToResponse({
540
534
  });
541
535
  }
542
536
 
543
- // src/ui/append-client-message.ts
544
- function appendClientMessage({
545
- messages,
546
- message
547
- }) {
548
- return [
549
- ...messages.length > 0 && messages[messages.length - 1].id === message.id ? messages.slice(0, -1) : messages,
550
- message
551
- ];
552
- }
553
-
554
- // src/ui/call-chat-api.ts
555
- var import_provider_utils3 = require("@ai-sdk/provider-utils");
537
+ // src/ui/call-completion-api.ts
538
+ var import_provider_utils = require("@ai-sdk/provider-utils");
556
539
 
557
540
  // src/ui-message-stream/ui-message-stream-parts.ts
558
541
  var import_zod = require("zod");
@@ -658,8 +641,138 @@ async function consumeStream({
658
641
  }
659
642
  }
660
643
 
644
+ // src/ui/process-text-stream.ts
645
+ async function processTextStream({
646
+ stream,
647
+ onTextPart
648
+ }) {
649
+ const reader = stream.pipeThrough(new TextDecoderStream()).getReader();
650
+ while (true) {
651
+ const { done, value } = await reader.read();
652
+ if (done) {
653
+ break;
654
+ }
655
+ await onTextPart(value);
656
+ }
657
+ }
658
+
659
+ // src/ui/call-completion-api.ts
660
+ var getOriginalFetch = () => fetch;
661
+ async function callCompletionApi({
662
+ api,
663
+ prompt,
664
+ credentials,
665
+ headers,
666
+ body,
667
+ streamProtocol = "data",
668
+ setCompletion,
669
+ setLoading,
670
+ setError,
671
+ setAbortController,
672
+ onFinish,
673
+ onError,
674
+ fetch: fetch2 = getOriginalFetch()
675
+ }) {
676
+ var _a17;
677
+ try {
678
+ setLoading(true);
679
+ setError(void 0);
680
+ const abortController = new AbortController();
681
+ setAbortController(abortController);
682
+ setCompletion("");
683
+ const response = await fetch2(api, {
684
+ method: "POST",
685
+ body: JSON.stringify({
686
+ prompt,
687
+ ...body
688
+ }),
689
+ credentials,
690
+ headers: {
691
+ "Content-Type": "application/json",
692
+ ...headers
693
+ },
694
+ signal: abortController.signal
695
+ }).catch((err) => {
696
+ throw err;
697
+ });
698
+ if (!response.ok) {
699
+ throw new Error(
700
+ (_a17 = await response.text()) != null ? _a17 : "Failed to fetch the chat response."
701
+ );
702
+ }
703
+ if (!response.body) {
704
+ throw new Error("The response body is empty.");
705
+ }
706
+ let result = "";
707
+ switch (streamProtocol) {
708
+ case "text": {
709
+ await processTextStream({
710
+ stream: response.body,
711
+ onTextPart: (chunk) => {
712
+ result += chunk;
713
+ setCompletion(result);
714
+ }
715
+ });
716
+ break;
717
+ }
718
+ case "data": {
719
+ await consumeStream({
720
+ stream: (0, import_provider_utils.parseJsonEventStream)({
721
+ stream: response.body,
722
+ schema: uiMessageStreamPartSchema
723
+ }).pipeThrough(
724
+ new TransformStream({
725
+ async transform(part) {
726
+ if (!part.success) {
727
+ throw part.error;
728
+ }
729
+ const streamPart = part.value;
730
+ if (streamPart.type === "text") {
731
+ result += streamPart.text;
732
+ setCompletion(result);
733
+ } else if (streamPart.type === "error") {
734
+ throw new Error(streamPart.errorText);
735
+ }
736
+ }
737
+ })
738
+ ),
739
+ onError: (error) => {
740
+ throw error;
741
+ }
742
+ });
743
+ break;
744
+ }
745
+ default: {
746
+ const exhaustiveCheck = streamProtocol;
747
+ throw new Error(`Unknown stream protocol: ${exhaustiveCheck}`);
748
+ }
749
+ }
750
+ if (onFinish) {
751
+ onFinish(prompt, result);
752
+ }
753
+ setAbortController(null);
754
+ return result;
755
+ } catch (err) {
756
+ if (err.name === "AbortError") {
757
+ setAbortController(null);
758
+ return null;
759
+ }
760
+ if (err instanceof Error) {
761
+ if (onError) {
762
+ onError(err);
763
+ }
764
+ }
765
+ setError(err);
766
+ } finally {
767
+ setLoading(false);
768
+ }
769
+ }
770
+
771
+ // src/ui/chat-store.ts
772
+ var import_provider_utils4 = require("@ai-sdk/provider-utils");
773
+
661
774
  // src/ui/process-ui-message-stream.ts
662
- var import_provider_utils2 = require("@ai-sdk/provider-utils");
775
+ var import_provider_utils3 = require("@ai-sdk/provider-utils");
663
776
 
664
777
  // src/util/merge-objects.ts
665
778
  function mergeObjects(base, overrides) {
@@ -695,7 +808,7 @@ function mergeObjects(base, overrides) {
695
808
  }
696
809
 
697
810
  // src/util/parse-partial-json.ts
698
- var import_provider_utils = require("@ai-sdk/provider-utils");
811
+ var import_provider_utils2 = require("@ai-sdk/provider-utils");
699
812
 
700
813
  // src/util/fix-json.ts
701
814
  function fixJson(input) {
@@ -1020,25 +1133,17 @@ async function parsePartialJson(jsonText) {
1020
1133
  if (jsonText === void 0) {
1021
1134
  return { value: void 0, state: "undefined-input" };
1022
1135
  }
1023
- let result = await (0, import_provider_utils.safeParseJSON)({ text: jsonText });
1136
+ let result = await (0, import_provider_utils2.safeParseJSON)({ text: jsonText });
1024
1137
  if (result.success) {
1025
1138
  return { value: result.value, state: "successful-parse" };
1026
1139
  }
1027
- result = await (0, import_provider_utils.safeParseJSON)({ text: fixJson(jsonText) });
1140
+ result = await (0, import_provider_utils2.safeParseJSON)({ text: fixJson(jsonText) });
1028
1141
  if (result.success) {
1029
1142
  return { value: result.value, state: "repaired-parse" };
1030
1143
  }
1031
1144
  return { value: void 0, state: "failed-parse" };
1032
1145
  }
1033
1146
 
1034
- // src/ui/extract-max-tool-invocation-step.ts
1035
- function extractMaxToolInvocationStep(toolInvocations) {
1036
- return toolInvocations == null ? void 0 : toolInvocations.reduce((max, toolInvocation) => {
1037
- var _a17;
1038
- return Math.max(max, (_a17 = toolInvocation.step) != null ? _a17 : 0);
1039
- }, 0);
1040
- }
1041
-
1042
1147
  // src/ui/get-tool-invocations.ts
1043
1148
  function getToolInvocations(message) {
1044
1149
  return message.parts.filter(
@@ -1051,9 +1156,7 @@ function createStreamingUIMessageState({
1051
1156
  lastMessage,
1052
1157
  newMessageId = ""
1053
1158
  } = {}) {
1054
- var _a17;
1055
1159
  const isContinuation = (lastMessage == null ? void 0 : lastMessage.role) === "assistant";
1056
- const step = isContinuation ? 1 + ((_a17 = extractMaxToolInvocationStep(getToolInvocations(lastMessage))) != null ? _a17 : 0) : 0;
1057
1160
  const message = isContinuation ? lastMessage : {
1058
1161
  id: newMessageId,
1059
1162
  metadata: {},
@@ -1064,8 +1167,7 @@ function createStreamingUIMessageState({
1064
1167
  message,
1065
1168
  activeTextPart: void 0,
1066
1169
  activeReasoningPart: void 0,
1067
- partialToolCalls: {},
1068
- step
1170
+ partialToolCalls: {}
1069
1171
  };
1070
1172
  }
1071
1173
  function processUIMessageStream({
@@ -1096,7 +1198,7 @@ function processUIMessageStream({
1096
1198
  if (metadata != null) {
1097
1199
  const mergedMetadata = state.message.metadata != null ? mergeObjects(state.message.metadata, metadata) : metadata;
1098
1200
  if (messageMetadataSchema != null) {
1099
- await (0, import_provider_utils2.validateTypes)({
1201
+ await (0, import_provider_utils3.validateTypes)({
1100
1202
  value: mergedMetadata,
1101
1203
  schema: messageMetadataSchema
1102
1204
  });
@@ -1163,13 +1265,11 @@ function processUIMessageStream({
1163
1265
  const toolInvocations = getToolInvocations(state.message);
1164
1266
  state.partialToolCalls[part.toolCallId] = {
1165
1267
  text: "",
1166
- step: state.step,
1167
1268
  toolName: part.toolName,
1168
1269
  index: toolInvocations.length
1169
1270
  };
1170
1271
  updateToolInvocationPart(part.toolCallId, {
1171
1272
  state: "partial-call",
1172
- step: state.step,
1173
1273
  toolCallId: part.toolCallId,
1174
1274
  toolName: part.toolName,
1175
1275
  args: void 0
@@ -1185,7 +1285,6 @@ function processUIMessageStream({
1185
1285
  );
1186
1286
  updateToolInvocationPart(part.toolCallId, {
1187
1287
  state: "partial-call",
1188
- step: partialToolCall.step,
1189
1288
  toolCallId: part.toolCallId,
1190
1289
  toolName: partialToolCall.toolName,
1191
1290
  args: partialArgs
@@ -1196,7 +1295,6 @@ function processUIMessageStream({
1196
1295
  case "tool-call": {
1197
1296
  updateToolInvocationPart(part.toolCallId, {
1198
1297
  state: "call",
1199
- step: state.step,
1200
1298
  toolCallId: part.toolCallId,
1201
1299
  toolName: part.toolName,
1202
1300
  args: part.args
@@ -1209,7 +1307,6 @@ function processUIMessageStream({
1209
1307
  if (result != null) {
1210
1308
  updateToolInvocationPart(part.toolCallId, {
1211
1309
  state: "result",
1212
- step: state.step,
1213
1310
  toolCallId: part.toolCallId,
1214
1311
  toolName: part.toolName,
1215
1312
  args: part.args,
@@ -1248,7 +1345,6 @@ function processUIMessageStream({
1248
1345
  break;
1249
1346
  }
1250
1347
  case "finish-step": {
1251
- state.step += 1;
1252
1348
  state.activeTextPart = void 0;
1253
1349
  state.activeReasoningPart = void 0;
1254
1350
  await updateMessageMetadata(part.metadata);
@@ -1311,406 +1407,64 @@ function isObject(value) {
1311
1407
  return typeof value === "object" && value !== null;
1312
1408
  }
1313
1409
 
1314
- // src/ui/transform-text-to-ui-message-stream.ts
1315
- function transformTextToUiMessageStream({
1316
- stream
1410
+ // src/ui/should-resubmit-messages.ts
1411
+ function shouldResubmitMessages({
1412
+ originalMaxToolInvocationStep,
1413
+ originalMessageCount,
1414
+ maxSteps,
1415
+ messages
1317
1416
  }) {
1318
- return stream.pipeThrough(
1319
- new TransformStream({
1320
- start(controller) {
1321
- controller.enqueue({ type: "start" });
1322
- controller.enqueue({ type: "start-step" });
1323
- },
1324
- async transform(part, controller) {
1325
- controller.enqueue({ type: "text", text: part });
1326
- },
1327
- async flush(controller) {
1328
- controller.enqueue({ type: "finish-step" });
1329
- controller.enqueue({ type: "finish" });
1330
- }
1331
- })
1417
+ const lastMessage = messages[messages.length - 1];
1418
+ const lastMessageStepStartCount = lastMessage.parts.filter(
1419
+ (part) => part.type === "step-start"
1420
+ ).length;
1421
+ return (
1422
+ // check if the feature is enabled:
1423
+ maxSteps > 1 && // ensure there is a last message:
1424
+ lastMessage != null && // ensure we actually have new steps (to prevent infinite loops in case of errors):
1425
+ (messages.length > originalMessageCount || lastMessageStepStartCount !== originalMaxToolInvocationStep) && // check that next step is possible:
1426
+ isAssistantMessageWithCompletedToolCalls(lastMessage) && // limit the number of automatic steps:
1427
+ lastMessageStepStartCount < maxSteps
1332
1428
  );
1333
1429
  }
1430
+ function isAssistantMessageWithCompletedToolCalls(message) {
1431
+ if (message.role !== "assistant") {
1432
+ return false;
1433
+ }
1434
+ const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {
1435
+ return part.type === "step-start" ? index : lastIndex;
1436
+ }, -1);
1437
+ const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter((part) => part.type === "tool-invocation");
1438
+ return lastStepToolInvocations.length > 0 && lastStepToolInvocations.every((part) => "result" in part.toolInvocation);
1439
+ }
1334
1440
 
1335
- // src/ui/call-chat-api.ts
1336
- var getOriginalFetch = () => fetch;
1337
- async function fetchUIMessageStream({
1338
- api,
1339
- body,
1340
- credentials,
1341
- headers,
1342
- abortController,
1343
- fetch: fetch2 = getOriginalFetch(),
1344
- requestType = "generate"
1345
- }) {
1346
- var _a17, _b, _c;
1347
- const response = requestType === "resume" ? await fetch2(`${api}?chatId=${body.chatId}`, {
1348
- method: "GET",
1349
- headers: {
1350
- "Content-Type": "application/json",
1351
- ...headers
1352
- },
1353
- signal: (_a17 = abortController == null ? void 0 : abortController()) == null ? void 0 : _a17.signal,
1354
- credentials
1355
- }) : await fetch2(api, {
1356
- method: "POST",
1357
- body: JSON.stringify(body),
1358
- headers: {
1359
- "Content-Type": "application/json",
1360
- ...headers
1361
- },
1362
- signal: (_b = abortController == null ? void 0 : abortController()) == null ? void 0 : _b.signal,
1363
- credentials
1364
- });
1365
- if (!response.ok) {
1366
- throw new Error(
1367
- (_c = await response.text()) != null ? _c : "Failed to fetch the chat response."
1441
+ // src/ui/chat-store.ts
1442
+ var ChatStore = class {
1443
+ constructor({
1444
+ chats = {},
1445
+ generateId: generateId3,
1446
+ transport,
1447
+ maxSteps = 1,
1448
+ messageMetadataSchema,
1449
+ dataPartSchemas,
1450
+ createChat
1451
+ }) {
1452
+ this.createChat = createChat;
1453
+ this.chats = new Map(
1454
+ Object.entries(chats).map(([id, chat]) => [
1455
+ id,
1456
+ this.createChat({ messages: chat.messages })
1457
+ ])
1368
1458
  );
1459
+ this.maxSteps = maxSteps;
1460
+ this.transport = transport;
1461
+ this.subscribers = /* @__PURE__ */ new Set();
1462
+ this.generateId = generateId3 != null ? generateId3 : import_provider_utils4.generateId;
1463
+ this.messageMetadataSchema = messageMetadataSchema;
1464
+ this.dataPartSchemas = dataPartSchemas;
1369
1465
  }
1370
- if (!response.body) {
1371
- throw new Error("The response body is empty.");
1372
- }
1373
- return (0, import_provider_utils3.parseJsonEventStream)({
1374
- stream: response.body,
1375
- schema: uiMessageStreamPartSchema
1376
- }).pipeThrough(
1377
- new TransformStream({
1378
- async transform(part, controller) {
1379
- if (!part.success) {
1380
- throw part.error;
1381
- }
1382
- controller.enqueue(part.value);
1383
- }
1384
- })
1385
- );
1386
- }
1387
- async function fetchTextStream({
1388
- api,
1389
- body,
1390
- credentials,
1391
- headers,
1392
- abortController,
1393
- fetch: fetch2 = getOriginalFetch(),
1394
- requestType = "generate"
1395
- }) {
1396
- var _a17, _b, _c;
1397
- const response = requestType === "resume" ? await fetch2(`${api}?chatId=${body.chatId}`, {
1398
- method: "GET",
1399
- headers: {
1400
- "Content-Type": "application/json",
1401
- ...headers
1402
- },
1403
- signal: (_a17 = abortController == null ? void 0 : abortController()) == null ? void 0 : _a17.signal,
1404
- credentials
1405
- }) : await fetch2(api, {
1406
- method: "POST",
1407
- body: JSON.stringify(body),
1408
- headers: {
1409
- "Content-Type": "application/json",
1410
- ...headers
1411
- },
1412
- signal: (_b = abortController == null ? void 0 : abortController()) == null ? void 0 : _b.signal,
1413
- credentials
1414
- });
1415
- if (!response.ok) {
1416
- throw new Error(
1417
- (_c = await response.text()) != null ? _c : "Failed to fetch the chat response."
1418
- );
1419
- }
1420
- if (!response.body) {
1421
- throw new Error("The response body is empty.");
1422
- }
1423
- return transformTextToUiMessageStream({
1424
- stream: response.body.pipeThrough(new TextDecoderStream())
1425
- });
1426
- }
1427
- async function consumeUIMessageStream({
1428
- stream,
1429
- onUpdate,
1430
- onFinish,
1431
- onToolCall,
1432
- generateId: generateId3,
1433
- lastMessage,
1434
- messageMetadataSchema
1435
- }) {
1436
- const state = createStreamingUIMessageState({
1437
- lastMessage: lastMessage ? structuredClone(lastMessage) : void 0,
1438
- newMessageId: generateId3()
1439
- });
1440
- const runUpdateMessageJob = async (job) => {
1441
- await job({
1442
- state,
1443
- write: () => {
1444
- onUpdate({ message: state.message });
1445
- }
1446
- });
1447
- };
1448
- await consumeStream({
1449
- stream: processUIMessageStream({
1450
- stream,
1451
- onToolCall,
1452
- messageMetadataSchema,
1453
- runUpdateMessageJob
1454
- }),
1455
- onError: (error) => {
1456
- throw error;
1457
- }
1458
- });
1459
- onFinish == null ? void 0 : onFinish({ message: state.message });
1460
- }
1461
- async function callChatApi({
1462
- api,
1463
- body,
1464
- streamProtocol = "ui-message",
1465
- credentials,
1466
- headers,
1467
- abortController,
1468
- onUpdate,
1469
- onFinish,
1470
- onToolCall,
1471
- generateId: generateId3,
1472
- fetch: fetch2 = getOriginalFetch(),
1473
- lastMessage,
1474
- requestType = "generate",
1475
- messageMetadataSchema
1476
- }) {
1477
- const stream = streamProtocol === "text" ? await fetchTextStream({
1478
- api,
1479
- body,
1480
- credentials,
1481
- headers,
1482
- abortController,
1483
- fetch: fetch2,
1484
- requestType
1485
- }) : await fetchUIMessageStream({
1486
- api,
1487
- body,
1488
- credentials,
1489
- headers,
1490
- abortController,
1491
- fetch: fetch2,
1492
- requestType
1493
- });
1494
- await consumeUIMessageStream({
1495
- stream,
1496
- onUpdate,
1497
- onFinish,
1498
- onToolCall,
1499
- generateId: generateId3,
1500
- lastMessage,
1501
- messageMetadataSchema
1502
- });
1503
- }
1504
-
1505
- // src/ui/call-completion-api.ts
1506
- var import_provider_utils4 = require("@ai-sdk/provider-utils");
1507
-
1508
- // src/ui/process-text-stream.ts
1509
- async function processTextStream({
1510
- stream,
1511
- onTextPart
1512
- }) {
1513
- const reader = stream.pipeThrough(new TextDecoderStream()).getReader();
1514
- while (true) {
1515
- const { done, value } = await reader.read();
1516
- if (done) {
1517
- break;
1518
- }
1519
- await onTextPart(value);
1520
- }
1521
- }
1522
-
1523
- // src/ui/call-completion-api.ts
1524
- var getOriginalFetch2 = () => fetch;
1525
- async function callCompletionApi({
1526
- api,
1527
- prompt,
1528
- credentials,
1529
- headers,
1530
- body,
1531
- streamProtocol = "data",
1532
- setCompletion,
1533
- setLoading,
1534
- setError,
1535
- setAbortController,
1536
- onFinish,
1537
- onError,
1538
- fetch: fetch2 = getOriginalFetch2()
1539
- }) {
1540
- var _a17;
1541
- try {
1542
- setLoading(true);
1543
- setError(void 0);
1544
- const abortController = new AbortController();
1545
- setAbortController(abortController);
1546
- setCompletion("");
1547
- const response = await fetch2(api, {
1548
- method: "POST",
1549
- body: JSON.stringify({
1550
- prompt,
1551
- ...body
1552
- }),
1553
- credentials,
1554
- headers: {
1555
- "Content-Type": "application/json",
1556
- ...headers
1557
- },
1558
- signal: abortController.signal
1559
- }).catch((err) => {
1560
- throw err;
1561
- });
1562
- if (!response.ok) {
1563
- throw new Error(
1564
- (_a17 = await response.text()) != null ? _a17 : "Failed to fetch the chat response."
1565
- );
1566
- }
1567
- if (!response.body) {
1568
- throw new Error("The response body is empty.");
1569
- }
1570
- let result = "";
1571
- switch (streamProtocol) {
1572
- case "text": {
1573
- await processTextStream({
1574
- stream: response.body,
1575
- onTextPart: (chunk) => {
1576
- result += chunk;
1577
- setCompletion(result);
1578
- }
1579
- });
1580
- break;
1581
- }
1582
- case "data": {
1583
- await consumeStream({
1584
- stream: (0, import_provider_utils4.parseJsonEventStream)({
1585
- stream: response.body,
1586
- schema: uiMessageStreamPartSchema
1587
- }).pipeThrough(
1588
- new TransformStream({
1589
- async transform(part) {
1590
- if (!part.success) {
1591
- throw part.error;
1592
- }
1593
- const streamPart = part.value;
1594
- if (streamPart.type === "text") {
1595
- result += streamPart.text;
1596
- setCompletion(result);
1597
- } else if (streamPart.type === "error") {
1598
- throw new Error(streamPart.errorText);
1599
- }
1600
- }
1601
- })
1602
- ),
1603
- onError: (error) => {
1604
- throw error;
1605
- }
1606
- });
1607
- break;
1608
- }
1609
- default: {
1610
- const exhaustiveCheck = streamProtocol;
1611
- throw new Error(`Unknown stream protocol: ${exhaustiveCheck}`);
1612
- }
1613
- }
1614
- if (onFinish) {
1615
- onFinish(prompt, result);
1616
- }
1617
- setAbortController(null);
1618
- return result;
1619
- } catch (err) {
1620
- if (err.name === "AbortError") {
1621
- setAbortController(null);
1622
- return null;
1623
- }
1624
- if (err instanceof Error) {
1625
- if (onError) {
1626
- onError(err);
1627
- }
1628
- }
1629
- setError(err);
1630
- } finally {
1631
- setLoading(false);
1632
- }
1633
- }
1634
-
1635
- // src/ui/chat-store.ts
1636
- var import_provider_utils5 = require("@ai-sdk/provider-utils");
1637
-
1638
- // src/ui/should-resubmit-messages.ts
1639
- function shouldResubmitMessages({
1640
- originalMaxToolInvocationStep,
1641
- originalMessageCount,
1642
- maxSteps,
1643
- messages
1644
- }) {
1645
- var _a17;
1646
- const lastMessage = messages[messages.length - 1];
1647
- return (
1648
- // check if the feature is enabled:
1649
- maxSteps > 1 && // ensure there is a last message:
1650
- lastMessage != null && // ensure we actually have new steps (to prevent infinite loops in case of errors):
1651
- (messages.length > originalMessageCount || extractMaxToolInvocationStep(getToolInvocations(lastMessage)) !== originalMaxToolInvocationStep) && // check that next step is possible:
1652
- isAssistantMessageWithCompletedToolCalls(lastMessage) && // limit the number of automatic steps:
1653
- ((_a17 = extractMaxToolInvocationStep(getToolInvocations(lastMessage))) != null ? _a17 : 0) < maxSteps
1654
- );
1655
- }
1656
- function isAssistantMessageWithCompletedToolCalls(message) {
1657
- if (message.role !== "assistant") {
1658
- return false;
1659
- }
1660
- const lastStepStartIndex = message.parts.reduce((lastIndex, part, index) => {
1661
- return part.type === "step-start" ? index : lastIndex;
1662
- }, -1);
1663
- const lastStepToolInvocations = message.parts.slice(lastStepStartIndex + 1).filter((part) => part.type === "tool-invocation");
1664
- return lastStepToolInvocations.length > 0 && lastStepToolInvocations.every((part) => "result" in part.toolInvocation);
1665
- }
1666
-
1667
- // src/ui/update-tool-call-result.ts
1668
- function updateToolCallResult({
1669
- messages,
1670
- toolCallId,
1671
- toolResult: result
1672
- }) {
1673
- const lastMessage = messages[messages.length - 1];
1674
- const invocationPart = lastMessage.parts.find(
1675
- (part) => part.type === "tool-invocation" && part.toolInvocation.toolCallId === toolCallId
1676
- );
1677
- if (invocationPart == null) {
1678
- return;
1679
- }
1680
- invocationPart.toolInvocation = {
1681
- ...invocationPart.toolInvocation,
1682
- state: "result",
1683
- result
1684
- };
1685
- }
1686
-
1687
- // src/ui/chat-store.ts
1688
- var ChatStore = class {
1689
- constructor({
1690
- chats = {},
1691
- generateId: generateId3,
1692
- transport,
1693
- maxSteps = 1,
1694
- messageMetadataSchema,
1695
- dataPartSchemas,
1696
- createChat
1697
- }) {
1698
- this.createChat = createChat;
1699
- this.chats = new Map(
1700
- Object.entries(chats).map(([id, chat]) => [
1701
- id,
1702
- this.createChat({ messages: chat.messages })
1703
- ])
1704
- );
1705
- this.maxSteps = maxSteps;
1706
- this.transport = transport;
1707
- this.subscribers = /* @__PURE__ */ new Set();
1708
- this.generateId = generateId3 != null ? generateId3 : import_provider_utils5.generateId;
1709
- this.messageMetadataSchema = messageMetadataSchema;
1710
- this.dataPartSchemas = dataPartSchemas;
1711
- }
1712
- hasChat(id) {
1713
- return this.chats.has(id);
1466
+ hasChat(id) {
1467
+ return this.chats.has(id);
1714
1468
  }
1715
1469
  addChat(id, messages) {
1716
1470
  this.chats.set(id, this.createChat({ messages }));
@@ -1903,14 +1657,15 @@ var ChatStore = class {
1903
1657
  const chat = this.getChatState(chatId);
1904
1658
  this.setStatus({ id: chatId, status: "submitted", error: void 0 });
1905
1659
  const messageCount = chat.messages.length;
1906
- const maxStep = extractMaxToolInvocationStep(
1907
- getToolInvocations(chat.messages[chat.messages.length - 1])
1908
- );
1660
+ const lastMessage = chat.messages[chat.messages.length - 1];
1661
+ const maxStep = lastMessage.parts.filter(
1662
+ (part) => part.type === "step-start"
1663
+ ).length;
1909
1664
  try {
1910
- const lastMessage = chat.messages[chat.messages.length - 1];
1665
+ const lastMessage2 = chat.messages[chat.messages.length - 1];
1911
1666
  const activeResponse = {
1912
1667
  state: createStreamingUIMessageState({
1913
- lastMessage: chat.snapshot ? chat.snapshot(lastMessage) : lastMessage,
1668
+ lastMessage: chat.snapshot ? chat.snapshot(lastMessage2) : lastMessage2,
1914
1669
  newMessageId: this.generateId()
1915
1670
  }),
1916
1671
  abortController: new AbortController()
@@ -1976,122 +1731,40 @@ var ChatStore = class {
1976
1731
  }
1977
1732
  if (shouldResubmitMessages({
1978
1733
  originalMaxToolInvocationStep: maxStep,
1979
- originalMessageCount: messageCount,
1980
- maxSteps: this.maxSteps,
1981
- messages: chat.messages
1982
- })) {
1983
- await this.triggerRequest({
1984
- chatId,
1985
- requestType,
1986
- onError,
1987
- onToolCall,
1988
- onFinish,
1989
- headers,
1990
- body
1991
- });
1992
- }
1993
- }
1994
- };
1995
-
1996
- // src/ui/chat-transport.ts
1997
- var DefaultChatTransport = class {
1998
- constructor({
1999
- api,
2000
- credentials,
2001
- headers,
2002
- body,
2003
- fetch: fetch2,
2004
- prepareRequestBody
2005
- }) {
2006
- this.api = api;
2007
- this.credentials = credentials;
2008
- this.headers = headers;
2009
- this.body = body;
2010
- this.fetch = fetch2;
2011
- this.prepareRequestBody = prepareRequestBody;
2012
- }
2013
- submitMessages({
2014
- chatId,
2015
- messages,
2016
- abortController,
2017
- body,
2018
- headers,
2019
- requestType
2020
- }) {
2021
- var _a17, _b;
2022
- return fetchUIMessageStream({
2023
- api: this.api,
2024
- headers: {
2025
- ...this.headers,
2026
- ...headers
2027
- },
2028
- body: (_b = (_a17 = this.prepareRequestBody) == null ? void 0 : _a17.call(this, {
2029
- chatId,
2030
- messages,
2031
- ...this.body,
2032
- ...body
2033
- })) != null ? _b : {
2034
- chatId,
2035
- messages,
2036
- ...this.body,
2037
- ...body
2038
- },
2039
- credentials: this.credentials,
2040
- abortController: () => abortController,
2041
- fetch: this.fetch,
2042
- requestType
2043
- });
2044
- }
2045
- };
2046
- var TextStreamChatTransport = class {
2047
- constructor({
2048
- api,
2049
- credentials,
2050
- headers,
2051
- body,
2052
- fetch: fetch2,
2053
- prepareRequestBody
2054
- }) {
2055
- this.api = api;
2056
- this.credentials = credentials;
2057
- this.headers = headers;
2058
- this.body = body;
2059
- this.fetch = fetch2;
2060
- this.prepareRequestBody = prepareRequestBody;
2061
- }
2062
- submitMessages({
2063
- chatId,
2064
- messages,
2065
- abortController,
2066
- body,
2067
- headers,
2068
- requestType
2069
- }) {
2070
- var _a17, _b;
2071
- return fetchTextStream({
2072
- api: this.api,
2073
- headers: {
2074
- ...this.headers,
2075
- ...headers
2076
- },
2077
- body: (_b = (_a17 = this.prepareRequestBody) == null ? void 0 : _a17.call(this, {
2078
- chatId,
2079
- messages,
2080
- ...this.body,
2081
- ...body
2082
- })) != null ? _b : {
2083
- chatId,
2084
- messages,
2085
- ...this.body,
2086
- ...body
2087
- },
2088
- credentials: this.credentials,
2089
- abortController: () => abortController,
2090
- fetch: this.fetch,
2091
- requestType
2092
- });
1734
+ originalMessageCount: messageCount,
1735
+ maxSteps: this.maxSteps,
1736
+ messages: chat.messages
1737
+ })) {
1738
+ await this.triggerRequest({
1739
+ chatId,
1740
+ requestType,
1741
+ onError,
1742
+ onToolCall,
1743
+ onFinish,
1744
+ headers,
1745
+ body
1746
+ });
1747
+ }
2093
1748
  }
2094
1749
  };
1750
+ function updateToolCallResult({
1751
+ messages,
1752
+ toolCallId,
1753
+ toolResult: result
1754
+ }) {
1755
+ const lastMessage = messages[messages.length - 1];
1756
+ const invocationPart = lastMessage.parts.find(
1757
+ (part) => part.type === "tool-invocation" && part.toolInvocation.toolCallId === toolCallId
1758
+ );
1759
+ if (invocationPart == null) {
1760
+ return;
1761
+ }
1762
+ invocationPart.toolInvocation = {
1763
+ ...invocationPart.toolInvocation,
1764
+ state: "result",
1765
+ result
1766
+ };
1767
+ }
2095
1768
 
2096
1769
  // src/ui/convert-file-list-to-file-ui-parts.ts
2097
1770
  async function convertFileListToFileUIParts(files) {
@@ -2125,7 +1798,7 @@ async function convertFileListToFileUIParts(files) {
2125
1798
 
2126
1799
  // src/ui/convert-to-model-messages.ts
2127
1800
  function convertToModelMessages(messages, options) {
2128
- var _a17, _b;
1801
+ var _a17;
2129
1802
  const tools = (_a17 = options == null ? void 0 : options.tools) != null ? _a17 : {};
2130
1803
  const modelMessages = [];
2131
1804
  for (const message of messages) {
@@ -2156,6 +1829,9 @@ function convertToModelMessages(messages, options) {
2156
1829
  case "assistant": {
2157
1830
  if (message.parts != null) {
2158
1831
  let processBlock2 = function() {
1832
+ if (block.length === 0) {
1833
+ return;
1834
+ }
2159
1835
  const content = [];
2160
1836
  for (const part of block) {
2161
1837
  switch (part.type) {
@@ -2230,33 +1906,20 @@ function convertToModelMessages(messages, options) {
2230
1906
  });
2231
1907
  }
2232
1908
  block = [];
2233
- blockHasToolInvocations = false;
2234
- currentStep++;
2235
1909
  };
2236
1910
  var processBlock = processBlock2;
2237
- let currentStep = 0;
2238
- let blockHasToolInvocations = false;
2239
1911
  let block = [];
2240
1912
  for (const part of message.parts) {
2241
1913
  switch (part.type) {
2242
- case "text": {
2243
- if (blockHasToolInvocations) {
2244
- processBlock2();
2245
- }
2246
- block.push(part);
2247
- break;
2248
- }
1914
+ case "text":
1915
+ case "reasoning":
2249
1916
  case "file":
2250
- case "reasoning": {
1917
+ case "tool-invocation": {
2251
1918
  block.push(part);
2252
1919
  break;
2253
1920
  }
2254
- case "tool-invocation": {
2255
- if (((_b = part.toolInvocation.step) != null ? _b : 0) !== currentStep) {
2256
- processBlock2();
2257
- }
2258
- block.push(part);
2259
- blockHasToolInvocations = true;
1921
+ case "step-start": {
1922
+ processBlock2();
2260
1923
  break;
2261
1924
  }
2262
1925
  }
@@ -2281,6 +1944,111 @@ var convertToCoreMessages = convertToModelMessages;
2281
1944
 
2282
1945
  // src/ui/default-chat-store-options.ts
2283
1946
  var import_provider_utils6 = require("@ai-sdk/provider-utils");
1947
+
1948
+ // src/ui/default-chat-transport.ts
1949
+ var import_provider_utils5 = require("@ai-sdk/provider-utils");
1950
+ var getOriginalFetch2 = () => fetch;
1951
+ async function fetchUIMessageStream({
1952
+ api,
1953
+ body,
1954
+ credentials,
1955
+ headers,
1956
+ abortController,
1957
+ fetch: fetch2 = getOriginalFetch2(),
1958
+ requestType = "generate"
1959
+ }) {
1960
+ var _a17, _b, _c;
1961
+ const response = requestType === "resume" ? await fetch2(`${api}?chatId=${body.chatId}`, {
1962
+ method: "GET",
1963
+ headers: {
1964
+ "Content-Type": "application/json",
1965
+ ...headers
1966
+ },
1967
+ signal: (_a17 = abortController == null ? void 0 : abortController()) == null ? void 0 : _a17.signal,
1968
+ credentials
1969
+ }) : await fetch2(api, {
1970
+ method: "POST",
1971
+ body: JSON.stringify(body),
1972
+ headers: {
1973
+ "Content-Type": "application/json",
1974
+ ...headers
1975
+ },
1976
+ signal: (_b = abortController == null ? void 0 : abortController()) == null ? void 0 : _b.signal,
1977
+ credentials
1978
+ });
1979
+ if (!response.ok) {
1980
+ throw new Error(
1981
+ (_c = await response.text()) != null ? _c : "Failed to fetch the chat response."
1982
+ );
1983
+ }
1984
+ if (!response.body) {
1985
+ throw new Error("The response body is empty.");
1986
+ }
1987
+ return (0, import_provider_utils5.parseJsonEventStream)({
1988
+ stream: response.body,
1989
+ schema: uiMessageStreamPartSchema
1990
+ }).pipeThrough(
1991
+ new TransformStream({
1992
+ async transform(part, controller) {
1993
+ if (!part.success) {
1994
+ throw part.error;
1995
+ }
1996
+ controller.enqueue(part.value);
1997
+ }
1998
+ })
1999
+ );
2000
+ }
2001
+ var DefaultChatTransport = class {
2002
+ constructor({
2003
+ api,
2004
+ credentials,
2005
+ headers,
2006
+ body,
2007
+ fetch: fetch2,
2008
+ prepareRequestBody
2009
+ }) {
2010
+ this.api = api;
2011
+ this.credentials = credentials;
2012
+ this.headers = headers;
2013
+ this.body = body;
2014
+ this.fetch = fetch2;
2015
+ this.prepareRequestBody = prepareRequestBody;
2016
+ }
2017
+ submitMessages({
2018
+ chatId,
2019
+ messages,
2020
+ abortController,
2021
+ body,
2022
+ headers,
2023
+ requestType
2024
+ }) {
2025
+ var _a17, _b;
2026
+ return fetchUIMessageStream({
2027
+ api: this.api,
2028
+ headers: {
2029
+ ...this.headers,
2030
+ ...headers
2031
+ },
2032
+ body: (_b = (_a17 = this.prepareRequestBody) == null ? void 0 : _a17.call(this, {
2033
+ chatId,
2034
+ messages,
2035
+ ...this.body,
2036
+ ...body
2037
+ })) != null ? _b : {
2038
+ chatId,
2039
+ messages,
2040
+ ...this.body,
2041
+ ...body
2042
+ },
2043
+ credentials: this.credentials,
2044
+ abortController: () => abortController,
2045
+ fetch: this.fetch,
2046
+ requestType
2047
+ });
2048
+ }
2049
+ };
2050
+
2051
+ // src/ui/default-chat-store-options.ts
2284
2052
  function defaultChatStoreOptions({
2285
2053
  api = "/api/chat",
2286
2054
  fetch: fetch2,
@@ -2311,6 +2079,119 @@ function defaultChatStoreOptions({
2311
2079
  });
2312
2080
  }
2313
2081
 
2082
+ // src/ui/transform-text-to-ui-message-stream.ts
2083
+ function transformTextToUiMessageStream({
2084
+ stream
2085
+ }) {
2086
+ return stream.pipeThrough(
2087
+ new TransformStream({
2088
+ start(controller) {
2089
+ controller.enqueue({ type: "start" });
2090
+ controller.enqueue({ type: "start-step" });
2091
+ },
2092
+ async transform(part, controller) {
2093
+ controller.enqueue({ type: "text", text: part });
2094
+ },
2095
+ async flush(controller) {
2096
+ controller.enqueue({ type: "finish-step" });
2097
+ controller.enqueue({ type: "finish" });
2098
+ }
2099
+ })
2100
+ );
2101
+ }
2102
+
2103
+ // src/ui/text-stream-chat-transport.ts
2104
+ var getOriginalFetch3 = () => fetch;
2105
+ async function fetchTextStream({
2106
+ api,
2107
+ body,
2108
+ credentials,
2109
+ headers,
2110
+ abortController,
2111
+ fetch: fetch2 = getOriginalFetch3(),
2112
+ requestType = "generate"
2113
+ }) {
2114
+ var _a17, _b, _c;
2115
+ const response = requestType === "resume" ? await fetch2(`${api}?chatId=${body.chatId}`, {
2116
+ method: "GET",
2117
+ headers: {
2118
+ "Content-Type": "application/json",
2119
+ ...headers
2120
+ },
2121
+ signal: (_a17 = abortController == null ? void 0 : abortController()) == null ? void 0 : _a17.signal,
2122
+ credentials
2123
+ }) : await fetch2(api, {
2124
+ method: "POST",
2125
+ body: JSON.stringify(body),
2126
+ headers: {
2127
+ "Content-Type": "application/json",
2128
+ ...headers
2129
+ },
2130
+ signal: (_b = abortController == null ? void 0 : abortController()) == null ? void 0 : _b.signal,
2131
+ credentials
2132
+ });
2133
+ if (!response.ok) {
2134
+ throw new Error(
2135
+ (_c = await response.text()) != null ? _c : "Failed to fetch the chat response."
2136
+ );
2137
+ }
2138
+ if (!response.body) {
2139
+ throw new Error("The response body is empty.");
2140
+ }
2141
+ return transformTextToUiMessageStream({
2142
+ stream: response.body.pipeThrough(new TextDecoderStream())
2143
+ });
2144
+ }
2145
+ var TextStreamChatTransport = class {
2146
+ constructor({
2147
+ api,
2148
+ credentials,
2149
+ headers,
2150
+ body,
2151
+ fetch: fetch2,
2152
+ prepareRequestBody
2153
+ }) {
2154
+ this.api = api;
2155
+ this.credentials = credentials;
2156
+ this.headers = headers;
2157
+ this.body = body;
2158
+ this.fetch = fetch2;
2159
+ this.prepareRequestBody = prepareRequestBody;
2160
+ }
2161
+ submitMessages({
2162
+ chatId,
2163
+ messages,
2164
+ abortController,
2165
+ body,
2166
+ headers,
2167
+ requestType
2168
+ }) {
2169
+ var _a17, _b;
2170
+ return fetchTextStream({
2171
+ api: this.api,
2172
+ headers: {
2173
+ ...this.headers,
2174
+ ...headers
2175
+ },
2176
+ body: (_b = (_a17 = this.prepareRequestBody) == null ? void 0 : _a17.call(this, {
2177
+ chatId,
2178
+ messages,
2179
+ ...this.body,
2180
+ ...body
2181
+ })) != null ? _b : {
2182
+ chatId,
2183
+ messages,
2184
+ ...this.body,
2185
+ ...body
2186
+ },
2187
+ credentials: this.credentials,
2188
+ abortController: () => abortController,
2189
+ fetch: this.fetch,
2190
+ requestType
2191
+ });
2192
+ }
2193
+ };
2194
+
2314
2195
  // src/ui-message-stream/handle-ui-message-stream-finish.ts
2315
2196
  function handleUIMessageStreamFinish({
2316
2197
  newMessageId,
@@ -7452,7 +7333,7 @@ var DefaultStreamTextResult = class {
7452
7333
  } = {}) {
7453
7334
  const lastMessage = originalMessages[originalMessages.length - 1];
7454
7335
  const isContinuation = (lastMessage == null ? void 0 : lastMessage.role) === "assistant";
7455
- const messageId = isContinuation ? lastMessage.id : newMessageId != null ? newMessageId : this.generateId();
7336
+ const messageId = isContinuation ? lastMessage.id : newMessageId;
7456
7337
  const baseStream = this.fullStream.pipeThrough(
7457
7338
  new TransformStream({
7458
7339
  transform: async (part, controller) => {
@@ -7588,7 +7469,7 @@ var DefaultStreamTextResult = class {
7588
7469
  );
7589
7470
  return handleUIMessageStreamFinish({
7590
7471
  stream: baseStream,
7591
- newMessageId: messageId,
7472
+ newMessageId: messageId != null ? messageId : this.generateId(),
7592
7473
  originalMessages,
7593
7474
  onFinish
7594
7475
  });
@@ -8703,10 +8584,8 @@ var DefaultTranscriptionResult = class {
8703
8584
  ToolExecutionError,
8704
8585
  TypeValidationError,
8705
8586
  UnsupportedFunctionalityError,
8706
- appendClientMessage,
8707
8587
  asSchema,
8708
8588
  assistantModelMessageSchema,
8709
- callChatApi,
8710
8589
  callCompletionApi,
8711
8590
  convertFileListToFileUIParts,
8712
8591
  convertToCoreMessages,
@@ -8733,7 +8612,6 @@ var DefaultTranscriptionResult = class {
8733
8612
  experimental_generateImage,
8734
8613
  experimental_generateSpeech,
8735
8614
  experimental_transcribe,
8736
- extractMaxToolInvocationStep,
8737
8615
  extractReasoningMiddleware,
8738
8616
  generateId,
8739
8617
  generateObject,
@@ -8741,14 +8619,12 @@ var DefaultTranscriptionResult = class {
8741
8619
  getTextFromDataUrl,
8742
8620
  getToolInvocations,
8743
8621
  hasToolCall,
8744
- isAssistantMessageWithCompletedToolCalls,
8745
8622
  isDeepEqualData,
8746
8623
  jsonSchema,
8747
8624
  modelMessageSchema,
8748
8625
  parsePartialJson,
8749
8626
  pipeTextStreamToResponse,
8750
8627
  pipeUIMessageStreamToResponse,
8751
- shouldResubmitMessages,
8752
8628
  simulateReadableStream,
8753
8629
  simulateStreamingMiddleware,
8754
8630
  smoothStream,
@@ -8758,7 +8634,6 @@ var DefaultTranscriptionResult = class {
8758
8634
  systemModelMessageSchema,
8759
8635
  tool,
8760
8636
  toolModelMessageSchema,
8761
- updateToolCallResult,
8762
8637
  userModelMessageSchema,
8763
8638
  wrapLanguageModel
8764
8639
  });