@mastra/ai-sdk 0.0.0-just-snapshot-20251014192224 → 0.0.0-main-test-20251105183450

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
@@ -3,6 +3,33 @@ import { createUIMessageStream, createUIMessageStreamResponse } from 'ai';
3
3
  import { DefaultGeneratedFile, DefaultGeneratedFileWithType } from '@mastra/core/stream';
4
4
 
5
5
  // src/chat-route.ts
6
+
7
+ // src/utils.ts
8
+ var isDataChunkType = (chunk) => {
9
+ return chunk && typeof chunk === "object" && "type" in chunk && chunk.type?.startsWith("data-");
10
+ };
11
+ function safeParseErrorObject(obj) {
12
+ if (typeof obj !== "object" || obj === null) {
13
+ return String(obj);
14
+ }
15
+ try {
16
+ const stringified = JSON.stringify(obj);
17
+ if (stringified === "{}") {
18
+ return String(obj);
19
+ }
20
+ return stringified;
21
+ } catch {
22
+ return String(obj);
23
+ }
24
+ }
25
+ var isAgentExecutionDataChunkType = (chunk) => {
26
+ return chunk && typeof chunk === "object" && "type" in chunk && chunk.type?.startsWith("agent-execution-event-") && "payload" in chunk && typeof chunk.payload === "object" && "type" in chunk.payload && chunk.payload.type?.startsWith("data-");
27
+ };
28
+ var isWorkflowExecutionDataChunkType = (chunk) => {
29
+ return chunk && typeof chunk === "object" && "type" in chunk && chunk.type?.startsWith("workflow-execution-event-") && "payload" in chunk && typeof chunk.payload === "object" && "type" in chunk.payload && chunk.payload.type?.startsWith("data-");
30
+ };
31
+
32
+ // src/helpers.ts
6
33
  function convertMastraChunkToAISDKv5({
7
34
  chunk,
8
35
  mode = "stream"
@@ -208,6 +235,9 @@ function convertMastraChunkToAISDKv5({
208
235
  ...chunk.payload || {}
209
236
  };
210
237
  }
238
+ if ("type" in chunk && chunk.type?.startsWith("data-")) {
239
+ return chunk;
240
+ }
211
241
  return;
212
242
  }
213
243
  }
@@ -221,7 +251,7 @@ function convertFullStreamChunkToUIMessageStream({
221
251
  sendFinish,
222
252
  responseMessageId
223
253
  }) {
224
- const partType = part.type;
254
+ const partType = part?.type;
225
255
  switch (partType) {
226
256
  case "text-start": {
227
257
  return {
@@ -378,8 +408,16 @@ function convertFullStreamChunkToUIMessageStream({
378
408
  return;
379
409
  }
380
410
  default: {
381
- const exhaustiveCheck = partType;
382
- throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);
411
+ if (isDataChunkType(part)) {
412
+ if (!("data" in part)) {
413
+ throw new Error(
414
+ `UI Messages require a data property when using data- prefixed chunks
415
+ ${JSON.stringify(part)}`
416
+ );
417
+ }
418
+ return part;
419
+ }
420
+ return;
383
421
  }
384
422
  }
385
423
  }
@@ -423,7 +461,7 @@ function AgentNetworkToAISDKTransformer() {
423
461
  }
424
462
  });
425
463
  }
426
- function AgentStreamToAISDKTransformer() {
464
+ function AgentStreamToAISDKTransformer(lastMessageId) {
427
465
  let bufferedSteps = /* @__PURE__ */ new Map();
428
466
  return new TransformStream({
429
467
  transform(chunk, controller) {
@@ -434,9 +472,9 @@ function AgentStreamToAISDKTransformer() {
434
472
  sendSources: false,
435
473
  sendStart: true,
436
474
  sendFinish: true,
437
- responseMessageId: chunk.runId,
438
- onError() {
439
- return "Error";
475
+ responseMessageId: lastMessageId,
476
+ onError(error) {
477
+ return safeParseErrorObject(error);
440
478
  }
441
479
  });
442
480
  if (transformedChunk) {
@@ -618,7 +656,9 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
618
656
  name: payload.payload.id,
619
657
  status: payload.payload.status,
620
658
  input: payload.payload.payload ?? null,
621
- output: null
659
+ output: null,
660
+ suspendPayload: null,
661
+ resumePayload: null
622
662
  };
623
663
  bufferedWorkflows.set(payload.runId, current);
624
664
  return {
@@ -651,6 +691,27 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
651
691
  }
652
692
  };
653
693
  }
694
+ case "workflow-step-suspended": {
695
+ const current = bufferedWorkflows.get(payload.runId);
696
+ if (!current) return null;
697
+ current.steps[payload.payload.id] = {
698
+ ...current.steps[payload.payload.id],
699
+ status: payload.payload.status,
700
+ suspendPayload: payload.payload.suspendPayload ?? null,
701
+ resumePayload: payload.payload.resumePayload ?? null,
702
+ output: null
703
+ };
704
+ return {
705
+ type: isNested ? "data-tool-workflow" : "data-workflow",
706
+ id: payload.runId,
707
+ data: {
708
+ name: current.name,
709
+ status: "suspended",
710
+ steps: current.steps,
711
+ output: null
712
+ }
713
+ };
714
+ }
654
715
  case "workflow-finish": {
655
716
  const current = bufferedWorkflows.get(payload.runId);
656
717
  if (!current) return null;
@@ -665,87 +726,117 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
665
726
  }
666
727
  };
667
728
  }
668
- default:
729
+ default: {
730
+ if (isDataChunkType(payload)) {
731
+ if (!("data" in payload)) {
732
+ throw new Error(
733
+ `UI Messages require a data property when using data- prefixed chunks
734
+ ${JSON.stringify(payload)}`
735
+ );
736
+ }
737
+ return payload;
738
+ }
669
739
  return null;
740
+ }
670
741
  }
671
742
  }
672
743
  function transformNetwork(payload, bufferedNetworks, isNested) {
673
744
  switch (payload.type) {
674
745
  case "routing-agent-start": {
675
- if (!bufferedNetworks.has(payload.payload.runId)) {
676
- bufferedNetworks.set(payload.payload.runId, {
746
+ if (!bufferedNetworks.has(payload.runId)) {
747
+ bufferedNetworks.set(payload.runId, {
677
748
  name: payload.payload.agentId,
678
- steps: []
749
+ steps: [],
750
+ usage: null,
751
+ output: null
679
752
  });
680
753
  }
681
754
  return {
682
755
  type: isNested ? "data-tool-network" : "data-network",
683
- id: payload.payload.runId,
756
+ id: payload.runId,
684
757
  data: {
685
- name: bufferedNetworks.get(payload.payload.runId).name,
758
+ name: bufferedNetworks.get(payload.runId).name,
686
759
  status: "running",
687
- steps: bufferedNetworks.get(payload.payload.runId).steps,
760
+ usage: null,
761
+ steps: bufferedNetworks.get(payload.runId).steps,
688
762
  output: null
689
763
  }
690
764
  };
691
765
  }
766
+ case "routing-agent-text-start": {
767
+ const current = bufferedNetworks.get(payload.runId);
768
+ if (!current) return null;
769
+ return {
770
+ type: "text-start",
771
+ id: payload.runId
772
+ };
773
+ }
774
+ case "routing-agent-text-delta": {
775
+ const current = bufferedNetworks.get(payload.runId);
776
+ if (!current) return null;
777
+ return {
778
+ type: "text-delta",
779
+ id: payload.runId,
780
+ delta: payload.payload.text
781
+ };
782
+ }
692
783
  case "agent-execution-start": {
693
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
784
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
694
785
  current.steps.push({
695
786
  name: payload.payload.agentId,
696
787
  status: "running",
697
788
  input: payload.payload.args || null,
698
- output: null
789
+ output: null,
790
+ suspendPayload: null,
791
+ resumePayload: null
699
792
  });
700
- bufferedNetworks.set(payload.payload.runId, current);
793
+ bufferedNetworks.set(payload.runId, current);
701
794
  return {
702
795
  type: isNested ? "data-tool-network" : "data-network",
703
- id: payload.payload.runId,
796
+ id: payload.runId,
704
797
  data: {
705
- name: current.name,
706
- status: "running",
707
- steps: current.steps,
708
- output: null
798
+ ...current,
799
+ status: "running"
709
800
  }
710
801
  };
711
802
  }
712
803
  case "workflow-execution-start": {
713
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
804
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
714
805
  current.steps.push({
715
806
  name: payload.payload.name,
716
807
  status: "running",
717
808
  input: payload.payload.args || null,
718
- output: null
809
+ output: null,
810
+ suspendPayload: null,
811
+ resumePayload: null
719
812
  });
720
- bufferedNetworks.set(payload.payload.runId, current);
813
+ bufferedNetworks.set(payload.runId, current);
721
814
  return {
722
815
  type: isNested ? "data-tool-network" : "data-network",
723
- id: payload.payload.runId,
816
+ id: payload.runId,
724
817
  data: {
725
- name: current.name,
726
- status: "running",
727
- steps: current.steps,
728
- output: null
818
+ ...current,
819
+ status: "running"
729
820
  }
730
821
  };
731
822
  }
732
823
  case "tool-execution-start": {
733
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
824
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
734
825
  current.steps.push({
735
826
  name: payload.payload.args?.toolName,
736
827
  status: "running",
737
828
  input: payload.payload.args?.args || null,
738
- output: null
829
+ output: null,
830
+ suspendPayload: null,
831
+ resumePayload: null
739
832
  });
740
- bufferedNetworks.set(payload.payload.runId, current);
833
+ bufferedNetworks.set(payload.runId, current);
741
834
  return {
742
835
  type: isNested ? "data-tool-network" : "data-network",
743
- id: payload.payload.runId,
836
+ id: payload.runId,
744
837
  data: {
745
- name: current.name,
746
- status: "running",
747
- steps: current.steps,
748
- output: null
838
+ ...current,
839
+ status: "running"
749
840
  }
750
841
  };
751
842
  }
@@ -756,16 +847,18 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
756
847
  name: payload.payload.agentId,
757
848
  status: "success",
758
849
  input: null,
759
- output: payload.payload.result
850
+ output: payload.payload.result,
851
+ suspendPayload: null,
852
+ resumePayload: null
760
853
  });
761
854
  return {
762
855
  type: isNested ? "data-tool-network" : "data-network",
763
856
  id: payload.runId,
764
857
  data: {
765
- name: current.name,
858
+ ...current,
859
+ usage: payload.payload?.usage ?? current.usage,
766
860
  status: "running",
767
- steps: current.steps,
768
- output: payload.payload.result ?? null
861
+ output: payload.payload.result ?? current.output
769
862
  }
770
863
  };
771
864
  }
@@ -776,16 +869,17 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
776
869
  name: payload.payload.toolName,
777
870
  status: "success",
778
871
  input: null,
779
- output: payload.payload.result
872
+ output: payload.payload.result,
873
+ suspendPayload: null,
874
+ resumePayload: null
780
875
  });
781
876
  return {
782
877
  type: isNested ? "data-tool-network" : "data-network",
783
878
  id: payload.runId,
784
879
  data: {
785
- name: current.name,
880
+ ...current,
786
881
  status: "running",
787
- steps: current.steps,
788
- output: payload.payload.result ?? null
882
+ output: payload.payload.result ?? current.output
789
883
  }
790
884
  };
791
885
  }
@@ -796,44 +890,45 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
796
890
  name: payload.payload.name,
797
891
  status: "success",
798
892
  input: null,
799
- output: payload.payload.result
893
+ output: payload.payload.result,
894
+ suspendPayload: null,
895
+ resumePayload: null
800
896
  });
801
897
  return {
802
898
  type: isNested ? "data-tool-network" : "data-network",
803
899
  id: payload.runId,
804
900
  data: {
805
- name: current.name,
901
+ ...current,
902
+ usage: payload.payload?.usage ?? current.usage,
806
903
  status: "running",
807
- steps: current.steps,
808
- output: payload.payload.result ?? null
904
+ output: payload.payload.result ?? current.output
809
905
  }
810
906
  };
811
907
  }
812
908
  case "routing-agent-end": {
813
- const current = bufferedNetworks.get(payload.payload.runId);
909
+ const current = bufferedNetworks.get(payload.runId);
814
910
  if (!current) return null;
815
911
  return {
816
912
  type: isNested ? "data-tool-network" : "data-network",
817
- id: payload.payload.runId,
913
+ id: payload.runId,
818
914
  data: {
819
- name: current.name,
915
+ ...current,
820
916
  status: "finished",
821
- steps: current.steps,
822
- output: payload.payload?.result ?? null
917
+ usage: payload.payload?.usage ?? current.usage,
918
+ output: payload.payload?.result ?? current.output
823
919
  }
824
920
  };
825
921
  }
826
922
  case "network-execution-event-step-finish": {
827
- const current = bufferedNetworks.get(payload.payload.runId);
923
+ const current = bufferedNetworks.get(payload.runId);
828
924
  if (!current) return null;
829
925
  return {
830
926
  type: isNested ? "data-tool-network" : "data-network",
831
- id: payload.payload.runId,
927
+ id: payload.runId,
832
928
  data: {
833
- name: current.name,
929
+ ...current,
834
930
  status: "finished",
835
- steps: current.steps,
836
- output: payload.payload?.result ?? null
931
+ output: payload.payload?.result ?? current.output
837
932
  }
838
933
  };
839
934
  }
@@ -844,20 +939,48 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
844
939
  type: isNested ? "data-tool-network" : "data-network",
845
940
  id: payload.runId,
846
941
  data: {
847
- name: current.name,
942
+ ...current,
943
+ usage: payload.payload?.usage ?? current.usage,
848
944
  status: "finished",
849
- steps: current.steps,
850
- output: payload.payload?.result ?? null
945
+ output: payload.payload?.result ?? current.output
851
946
  }
852
947
  };
853
948
  }
854
- default:
949
+ default: {
950
+ if (isDataChunkType(payload)) {
951
+ if (!("data" in payload)) {
952
+ throw new Error(
953
+ `UI Messages require a data property when using data- prefixed chunks
954
+ ${JSON.stringify(payload)}`
955
+ );
956
+ }
957
+ return payload;
958
+ }
959
+ if (isAgentExecutionDataChunkType(payload)) {
960
+ if (!("data" in payload.payload)) {
961
+ throw new Error(
962
+ `UI Messages require a data property when using data- prefixed chunks
963
+ ${JSON.stringify(payload)}`
964
+ );
965
+ }
966
+ return payload.payload;
967
+ }
968
+ if (isWorkflowExecutionDataChunkType(payload)) {
969
+ if (!("data" in payload.payload)) {
970
+ throw new Error(
971
+ `UI Messages require a data property when using data- prefixed chunks
972
+ ${JSON.stringify(payload)}`
973
+ );
974
+ }
975
+ return payload.payload;
976
+ }
855
977
  return null;
978
+ }
856
979
  }
857
980
  }
858
981
 
859
- // src/to-ai-sdk-format.ts
860
- function toAISdkFormat(stream, options = { from: "agent" }) {
982
+ // src/convert-streams.ts
983
+ function toAISdkV5Stream(stream, options = { from: "agent" }) {
861
984
  const from = options?.from;
862
985
  if (from === "workflow") {
863
986
  return stream.pipeThrough(WorkflowStreamToAISDKTransformer());
@@ -866,7 +989,7 @@ function toAISdkFormat(stream, options = { from: "agent" }) {
866
989
  return stream.pipeThrough(AgentNetworkToAISDKTransformer());
867
990
  }
868
991
  const agentReadable = "fullStream" in stream ? stream.fullStream : stream;
869
- return agentReadable.pipeThrough(AgentStreamToAISDKTransformer());
992
+ return agentReadable.pipeThrough(AgentStreamToAISDKTransformer(options?.lastMessageId));
870
993
  }
871
994
 
872
995
  // src/chat-route.ts
@@ -974,7 +1097,7 @@ function chatRoute({
974
1097
  handler: async (c) => {
975
1098
  const { messages, ...rest } = await c.req.json();
976
1099
  const mastra = c.get("mastra");
977
- const runtimeContext = c.get("runtimeContext");
1100
+ const requestContext = c.get("requestContext");
978
1101
  let agentToUse = agent;
979
1102
  if (!agent) {
980
1103
  const agentId = c.req.param("agentId");
@@ -985,8 +1108,8 @@ function chatRoute({
985
1108
  `Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
986
1109
  );
987
1110
  }
988
- if (runtimeContext && defaultOptions?.runtimeContext) {
989
- mastra.getLogger()?.warn(`"runtimeContext" set in the route options will be overridden by the request's "runtimeContext".`);
1111
+ if (requestContext && defaultOptions?.requestContext) {
1112
+ mastra.getLogger()?.warn(`"requestContext" set in the route options will be overridden by the request's "requestContext".`);
990
1113
  }
991
1114
  if (!agentToUse) {
992
1115
  throw new Error("Agent ID is required");
@@ -998,11 +1121,16 @@ function chatRoute({
998
1121
  const result = await agentObj.stream(messages, {
999
1122
  ...defaultOptions,
1000
1123
  ...rest,
1001
- runtimeContext: runtimeContext || defaultOptions?.runtimeContext
1124
+ requestContext: requestContext || defaultOptions?.requestContext
1002
1125
  });
1126
+ let lastMessageId;
1127
+ if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
1128
+ lastMessageId = messages[messages.length - 1].id;
1129
+ }
1003
1130
  const uiMessageStream = createUIMessageStream({
1131
+ originalMessages: messages,
1004
1132
  execute: async ({ writer }) => {
1005
- for await (const part of toAISdkFormat(result, { from: "agent" })) {
1133
+ for await (const part of toAISdkV5Stream(result, { from: "agent", lastMessageId })) {
1006
1134
  writer.write(part);
1007
1135
  }
1008
1136
  }
@@ -1043,7 +1171,7 @@ function workflowRoute({
1043
1171
  type: "object",
1044
1172
  properties: {
1045
1173
  inputData: { type: "object", additionalProperties: true },
1046
- runtimeContext: { type: "object", additionalProperties: true },
1174
+ requestContext: { type: "object", additionalProperties: true },
1047
1175
  tracingOptions: { type: "object", additionalProperties: true }
1048
1176
  }
1049
1177
  }
@@ -1062,7 +1190,7 @@ function workflowRoute({
1062
1190
  }
1063
1191
  },
1064
1192
  handler: async (c) => {
1065
- const { inputData, ...rest } = await c.req.json();
1193
+ const { inputData, resumeData, ...rest } = await c.req.json();
1066
1194
  const mastra = c.get("mastra");
1067
1195
  let workflowToUse = workflow;
1068
1196
  if (!workflow) {
@@ -1081,11 +1209,11 @@ function workflowRoute({
1081
1209
  if (!workflowObj) {
1082
1210
  throw new Error(`Workflow ${workflowToUse} not found`);
1083
1211
  }
1084
- const run = await workflowObj.createRunAsync();
1085
- const stream = run.streamVNext({ inputData, ...rest });
1212
+ const run = await workflowObj.createRun();
1213
+ const stream = resumeData ? run.resumeStream({ resumeData, ...rest }) : run.stream({ inputData, ...rest });
1086
1214
  const uiMessageStream = createUIMessageStream({
1087
1215
  execute: async ({ writer }) => {
1088
- for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
1216
+ for await (const part of toAISdkV5Stream(stream, { from: "workflow" })) {
1089
1217
  writer.write(part);
1090
1218
  }
1091
1219
  }
@@ -1125,13 +1253,12 @@ function networkRoute({
1125
1253
  type: "object",
1126
1254
  properties: {
1127
1255
  messages: { type: "array", items: { type: "object" } },
1128
- runtimeContext: { type: "object", additionalProperties: true },
1256
+ requestContext: { type: "object", additionalProperties: true },
1129
1257
  runId: { type: "string" },
1130
1258
  maxSteps: { type: "number" },
1131
1259
  threadId: { type: "string" },
1132
1260
  resourceId: { type: "string" },
1133
1261
  modelSettings: { type: "object", additionalProperties: true },
1134
- telemetry: { type: "object", additionalProperties: true },
1135
1262
  tools: { type: "array", items: { type: "object" } }
1136
1263
  },
1137
1264
  required: ["messages"]
@@ -1180,7 +1307,7 @@ function networkRoute({
1180
1307
  });
1181
1308
  const uiMessageStream = createUIMessageStream({
1182
1309
  execute: async ({ writer }) => {
1183
- for await (const part of toAISdkFormat(result, { from: "network" })) {
1310
+ for await (const part of toAISdkV5Stream(result, { from: "network" })) {
1184
1311
  writer.write(part);
1185
1312
  }
1186
1313
  }
@@ -1190,6 +1317,13 @@ function networkRoute({
1190
1317
  });
1191
1318
  }
1192
1319
 
1193
- export { chatRoute, networkRoute, toAISdkFormat, workflowRoute };
1320
+ // src/to-ai-sdk-format.ts
1321
+ function toAISdkFormat() {
1322
+ throw new Error(
1323
+ 'toAISdkFormat() has been deprecated. Please use toAISdkStream() instead.\n\nMigration:\n import { toAISdkFormat } from "@mastra/ai-sdk";\n // Change to:\n import { toAISdkStream } from "@mastra/ai-sdk";\n\nThe function signature remains the same.'
1324
+ );
1325
+ }
1326
+
1327
+ export { chatRoute, networkRoute, toAISdkFormat, toAISdkV5Stream as toAISdkStream, workflowRoute };
1194
1328
  //# sourceMappingURL=index.js.map
1195
1329
  //# sourceMappingURL=index.js.map