@mastra/ai-sdk 0.0.0-just-snapshot-20251014192224 → 0.0.0-main-test-05-11-2025-2-20251105214713

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