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