@mastra/ai-sdk 0.0.0-ai-sdk-network-text-delta-20251017172601 → 0.0.0-allow-to-pass-a-mastra-url-instance-20251105224938

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,26 +728,39 @@ 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
  };
@@ -709,62 +783,62 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
709
783
  };
710
784
  }
711
785
  case "agent-execution-start": {
712
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
786
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
713
787
  current.steps.push({
714
788
  name: payload.payload.agentId,
715
789
  status: "running",
716
790
  input: payload.payload.args || null,
717
- output: null
791
+ output: null,
792
+ suspendPayload: null,
793
+ resumePayload: null
718
794
  });
719
- bufferedNetworks.set(payload.payload.runId, current);
795
+ bufferedNetworks.set(payload.runId, current);
720
796
  return {
721
797
  type: isNested ? "data-tool-network" : "data-network",
722
- id: payload.payload.runId,
798
+ id: payload.runId,
723
799
  data: {
724
- name: current.name,
725
- status: "running",
726
- steps: current.steps,
727
- output: null
800
+ ...current,
801
+ status: "running"
728
802
  }
729
803
  };
730
804
  }
731
805
  case "workflow-execution-start": {
732
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
806
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
733
807
  current.steps.push({
734
808
  name: payload.payload.name,
735
809
  status: "running",
736
810
  input: payload.payload.args || null,
737
- output: null
811
+ output: null,
812
+ suspendPayload: null,
813
+ resumePayload: null
738
814
  });
739
- bufferedNetworks.set(payload.payload.runId, current);
815
+ bufferedNetworks.set(payload.runId, current);
740
816
  return {
741
817
  type: isNested ? "data-tool-network" : "data-network",
742
- id: payload.payload.runId,
818
+ id: payload.runId,
743
819
  data: {
744
- name: current.name,
745
- status: "running",
746
- steps: current.steps,
747
- output: null
820
+ ...current,
821
+ status: "running"
748
822
  }
749
823
  };
750
824
  }
751
825
  case "tool-execution-start": {
752
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
826
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
753
827
  current.steps.push({
754
828
  name: payload.payload.args?.toolName,
755
829
  status: "running",
756
830
  input: payload.payload.args?.args || null,
757
- output: null
831
+ output: null,
832
+ suspendPayload: null,
833
+ resumePayload: null
758
834
  });
759
- bufferedNetworks.set(payload.payload.runId, current);
835
+ bufferedNetworks.set(payload.runId, current);
760
836
  return {
761
837
  type: isNested ? "data-tool-network" : "data-network",
762
- id: payload.payload.runId,
838
+ id: payload.runId,
763
839
  data: {
764
- name: current.name,
765
- status: "running",
766
- steps: current.steps,
767
- output: null
840
+ ...current,
841
+ status: "running"
768
842
  }
769
843
  };
770
844
  }
@@ -775,16 +849,18 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
775
849
  name: payload.payload.agentId,
776
850
  status: "success",
777
851
  input: null,
778
- output: payload.payload.result
852
+ output: payload.payload.result,
853
+ suspendPayload: null,
854
+ resumePayload: null
779
855
  });
780
856
  return {
781
857
  type: isNested ? "data-tool-network" : "data-network",
782
858
  id: payload.runId,
783
859
  data: {
784
- name: current.name,
860
+ ...current,
861
+ usage: payload.payload?.usage ?? current.usage,
785
862
  status: "running",
786
- steps: current.steps,
787
- output: payload.payload.result ?? null
863
+ output: payload.payload.result ?? current.output
788
864
  }
789
865
  };
790
866
  }
@@ -795,16 +871,17 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
795
871
  name: payload.payload.toolName,
796
872
  status: "success",
797
873
  input: null,
798
- output: payload.payload.result
874
+ output: payload.payload.result,
875
+ suspendPayload: null,
876
+ resumePayload: null
799
877
  });
800
878
  return {
801
879
  type: isNested ? "data-tool-network" : "data-network",
802
880
  id: payload.runId,
803
881
  data: {
804
- name: current.name,
882
+ ...current,
805
883
  status: "running",
806
- steps: current.steps,
807
- output: payload.payload.result ?? null
884
+ output: payload.payload.result ?? current.output
808
885
  }
809
886
  };
810
887
  }
@@ -815,44 +892,45 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
815
892
  name: payload.payload.name,
816
893
  status: "success",
817
894
  input: null,
818
- output: payload.payload.result
895
+ output: payload.payload.result,
896
+ suspendPayload: null,
897
+ resumePayload: null
819
898
  });
820
899
  return {
821
900
  type: isNested ? "data-tool-network" : "data-network",
822
901
  id: payload.runId,
823
902
  data: {
824
- name: current.name,
903
+ ...current,
904
+ usage: payload.payload?.usage ?? current.usage,
825
905
  status: "running",
826
- steps: current.steps,
827
- output: payload.payload.result ?? null
906
+ output: payload.payload.result ?? current.output
828
907
  }
829
908
  };
830
909
  }
831
910
  case "routing-agent-end": {
832
- const current = bufferedNetworks.get(payload.payload.runId);
911
+ const current = bufferedNetworks.get(payload.runId);
833
912
  if (!current) return null;
834
913
  return {
835
914
  type: isNested ? "data-tool-network" : "data-network",
836
- id: payload.payload.runId,
915
+ id: payload.runId,
837
916
  data: {
838
- name: current.name,
917
+ ...current,
839
918
  status: "finished",
840
- steps: current.steps,
841
- output: payload.payload?.result ?? null
919
+ usage: payload.payload?.usage ?? current.usage,
920
+ output: payload.payload?.result ?? current.output
842
921
  }
843
922
  };
844
923
  }
845
924
  case "network-execution-event-step-finish": {
846
- const current = bufferedNetworks.get(payload.payload.runId);
925
+ const current = bufferedNetworks.get(payload.runId);
847
926
  if (!current) return null;
848
927
  return {
849
928
  type: isNested ? "data-tool-network" : "data-network",
850
- id: payload.payload.runId,
929
+ id: payload.runId,
851
930
  data: {
852
- name: current.name,
931
+ ...current,
853
932
  status: "finished",
854
- steps: current.steps,
855
- output: payload.payload?.result ?? null
933
+ output: payload.payload?.result ?? current.output
856
934
  }
857
935
  };
858
936
  }
@@ -863,20 +941,48 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
863
941
  type: isNested ? "data-tool-network" : "data-network",
864
942
  id: payload.runId,
865
943
  data: {
866
- name: current.name,
944
+ ...current,
945
+ usage: payload.payload?.usage ?? current.usage,
867
946
  status: "finished",
868
- steps: current.steps,
869
- output: payload.payload?.result ?? null
947
+ output: payload.payload?.result ?? current.output
870
948
  }
871
949
  };
872
950
  }
873
- 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
+ }
874
979
  return null;
980
+ }
875
981
  }
876
982
  }
877
983
 
878
- // src/to-ai-sdk-format.ts
879
- function toAISdkFormat(stream, options = { from: "agent" }) {
984
+ // src/convert-streams.ts
985
+ function toAISdkV5Stream(stream, options = { from: "agent" }) {
880
986
  const from = options?.from;
881
987
  if (from === "workflow") {
882
988
  return stream.pipeThrough(WorkflowStreamToAISDKTransformer());
@@ -885,7 +991,7 @@ function toAISdkFormat(stream, options = { from: "agent" }) {
885
991
  return stream.pipeThrough(AgentNetworkToAISDKTransformer());
886
992
  }
887
993
  const agentReadable = "fullStream" in stream ? stream.fullStream : stream;
888
- return agentReadable.pipeThrough(AgentStreamToAISDKTransformer());
994
+ return agentReadable.pipeThrough(AgentStreamToAISDKTransformer(options?.lastMessageId));
889
995
  }
890
996
 
891
997
  // src/chat-route.ts
@@ -993,7 +1099,7 @@ function chatRoute({
993
1099
  handler: async (c) => {
994
1100
  const { messages, ...rest } = await c.req.json();
995
1101
  const mastra = c.get("mastra");
996
- const runtimeContext = c.get("runtimeContext");
1102
+ const requestContext = c.get("requestContext");
997
1103
  let agentToUse = agent;
998
1104
  if (!agent) {
999
1105
  const agentId = c.req.param("agentId");
@@ -1004,8 +1110,8 @@ function chatRoute({
1004
1110
  `Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
1005
1111
  );
1006
1112
  }
1007
- if (runtimeContext && defaultOptions?.runtimeContext) {
1008
- 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".`);
1009
1115
  }
1010
1116
  if (!agentToUse) {
1011
1117
  throw new Error("Agent ID is required");
@@ -1017,12 +1123,16 @@ function chatRoute({
1017
1123
  const result = await agentObj.stream(messages, {
1018
1124
  ...defaultOptions,
1019
1125
  ...rest,
1020
- runtimeContext: runtimeContext || defaultOptions?.runtimeContext
1126
+ requestContext: requestContext || defaultOptions?.requestContext
1021
1127
  });
1128
+ let lastMessageId;
1129
+ if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
1130
+ lastMessageId = messages[messages.length - 1].id;
1131
+ }
1022
1132
  const uiMessageStream = ai.createUIMessageStream({
1023
1133
  originalMessages: messages,
1024
1134
  execute: async ({ writer }) => {
1025
- for await (const part of toAISdkFormat(result, { from: "agent" })) {
1135
+ for await (const part of toAISdkV5Stream(result, { from: "agent", lastMessageId })) {
1026
1136
  writer.write(part);
1027
1137
  }
1028
1138
  }
@@ -1063,7 +1173,7 @@ function workflowRoute({
1063
1173
  type: "object",
1064
1174
  properties: {
1065
1175
  inputData: { type: "object", additionalProperties: true },
1066
- runtimeContext: { type: "object", additionalProperties: true },
1176
+ requestContext: { type: "object", additionalProperties: true },
1067
1177
  tracingOptions: { type: "object", additionalProperties: true }
1068
1178
  }
1069
1179
  }
@@ -1082,7 +1192,7 @@ function workflowRoute({
1082
1192
  }
1083
1193
  },
1084
1194
  handler: async (c) => {
1085
- const { inputData, ...rest } = await c.req.json();
1195
+ const { inputData, resumeData, ...rest } = await c.req.json();
1086
1196
  const mastra = c.get("mastra");
1087
1197
  let workflowToUse = workflow;
1088
1198
  if (!workflow) {
@@ -1101,11 +1211,11 @@ function workflowRoute({
1101
1211
  if (!workflowObj) {
1102
1212
  throw new Error(`Workflow ${workflowToUse} not found`);
1103
1213
  }
1104
- const run = await workflowObj.createRunAsync();
1105
- const stream = run.streamVNext({ inputData, ...rest });
1214
+ const run = await workflowObj.createRun();
1215
+ const stream = resumeData ? run.resumeStream({ resumeData, ...rest }) : run.stream({ inputData, ...rest });
1106
1216
  const uiMessageStream = ai.createUIMessageStream({
1107
1217
  execute: async ({ writer }) => {
1108
- for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
1218
+ for await (const part of toAISdkV5Stream(stream, { from: "workflow" })) {
1109
1219
  writer.write(part);
1110
1220
  }
1111
1221
  }
@@ -1145,13 +1255,12 @@ function networkRoute({
1145
1255
  type: "object",
1146
1256
  properties: {
1147
1257
  messages: { type: "array", items: { type: "object" } },
1148
- runtimeContext: { type: "object", additionalProperties: true },
1258
+ requestContext: { type: "object", additionalProperties: true },
1149
1259
  runId: { type: "string" },
1150
1260
  maxSteps: { type: "number" },
1151
1261
  threadId: { type: "string" },
1152
1262
  resourceId: { type: "string" },
1153
1263
  modelSettings: { type: "object", additionalProperties: true },
1154
- telemetry: { type: "object", additionalProperties: true },
1155
1264
  tools: { type: "array", items: { type: "object" } }
1156
1265
  },
1157
1266
  required: ["messages"]
@@ -1200,7 +1309,7 @@ function networkRoute({
1200
1309
  });
1201
1310
  const uiMessageStream = ai.createUIMessageStream({
1202
1311
  execute: async ({ writer }) => {
1203
- for await (const part of toAISdkFormat(result, { from: "network" })) {
1312
+ for await (const part of toAISdkV5Stream(result, { from: "network" })) {
1204
1313
  writer.write(part);
1205
1314
  }
1206
1315
  }
@@ -1210,9 +1319,17 @@ function networkRoute({
1210
1319
  });
1211
1320
  }
1212
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
+
1213
1329
  exports.chatRoute = chatRoute;
1214
1330
  exports.networkRoute = networkRoute;
1215
1331
  exports.toAISdkFormat = toAISdkFormat;
1332
+ exports.toAISdkStream = toAISdkV5Stream;
1216
1333
  exports.workflowRoute = workflowRoute;
1217
1334
  //# sourceMappingURL=index.cjs.map
1218
1335
  //# sourceMappingURL=index.cjs.map