@mastra/ai-sdk 0.3.1 → 0.3.2-alpha.0
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/CHANGELOG.md +94 -37
- package/dist/__tests__/__fixtures__/network.stream.d.ts +2329 -0
- package/dist/__tests__/__fixtures__/network.stream.d.ts.map +1 -0
- package/dist/helpers.d.ts +1 -2
- package/dist/helpers.d.ts.map +1 -1
- package/dist/index.cjs +211 -52
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +211 -52
- package/dist/index.js.map +1 -1
- package/dist/network-route.d.ts.map +1 -1
- package/dist/to-ai-sdk-format.d.ts +18 -1
- package/dist/to-ai-sdk-format.d.ts.map +1 -1
- package/dist/transformers.d.ts +130 -10
- package/dist/transformers.d.ts.map +1 -1
- package/dist/utils.d.ts +3 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/workflow-route.d.ts +3 -1
- package/dist/workflow-route.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.stream.d.ts","sourceRoot":"","sources":["../../../src/__tests__/__fixtures__/network.stream.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAu9FhC,CAAC"}
|
package/dist/helpers.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { ChunkType } from '@mastra/core';
|
|
2
|
-
import type { PartialSchemaOutput, OutputSchema, DataChunkType } from '@mastra/core/stream';
|
|
1
|
+
import type { ChunkType, PartialSchemaOutput, OutputSchema, DataChunkType } from '@mastra/core/stream';
|
|
3
2
|
import type { InferUIMessageChunk, ObjectStreamPart, TextStreamPart, ToolSet, UIMessage } from 'ai';
|
|
4
3
|
export type OutputChunkType<OUTPUT extends OutputSchema = undefined> = TextStreamPart<ToolSet> | ObjectStreamPart<PartialSchemaOutput<OUTPUT>> | DataChunkType | undefined;
|
|
5
4
|
export type ToolAgentChunkType = {
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEvG,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAGpG,MAAM,MAAM,eAAe,CAAC,MAAM,SAAS,YAAY,GAAG,SAAS,IAC/D,cAAc,CAAC,OAAO,CAAC,GACvB,gBAAgB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAC7C,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC;AAC1F,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC;AAChG,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC;AAE9F,wBAAgB,2BAA2B,CAAC,MAAM,SAAS,YAAY,GAAG,SAAS,EAAE,EACnF,KAAK,EACL,IAAe,GAChB,EAAE;IACD,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;CAC9B,GAAG,eAAe,CAAC,MAAM,CAAC,CAiP1B;AAED,wBAAgB,uCAAuC,CAAC,UAAU,SAAS,SAAS,EAAE,EACpF,IAAI,EACJ,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,OAAO,EACP,SAAS,EACT,UAAU,EACV,iBAAiB,GAClB,EAAE;IAED,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,aAAa,GAAG;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,CAAA;KAAE,CAAC;IACzG,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,mBAAmB,CAAC,UAAU,CAAC,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,SAAS,CAyOlH"}
|
package/dist/index.cjs
CHANGED
|
@@ -10,6 +10,45 @@ var stream = require('@mastra/core/stream');
|
|
|
10
10
|
var isDataChunkType = (chunk) => {
|
|
11
11
|
return chunk && typeof chunk === "object" && "type" in chunk && chunk.type?.startsWith("data-");
|
|
12
12
|
};
|
|
13
|
+
var isMastraTextStreamChunk = (chunk) => {
|
|
14
|
+
return chunk && typeof chunk === "object" && "type" in chunk && typeof chunk.type === "string" && [
|
|
15
|
+
"text-start",
|
|
16
|
+
"text-delta",
|
|
17
|
+
"text-end",
|
|
18
|
+
"reasoning-start",
|
|
19
|
+
"reasoning-delta",
|
|
20
|
+
"reasoning-end",
|
|
21
|
+
"file",
|
|
22
|
+
"source",
|
|
23
|
+
"tool-input-start",
|
|
24
|
+
"tool-input-delta",
|
|
25
|
+
"tool-call",
|
|
26
|
+
"tool-result",
|
|
27
|
+
"tool-error",
|
|
28
|
+
"error",
|
|
29
|
+
"start-step",
|
|
30
|
+
"finish-step",
|
|
31
|
+
"start",
|
|
32
|
+
"finish",
|
|
33
|
+
"abort",
|
|
34
|
+
"tool-input-end",
|
|
35
|
+
"raw"
|
|
36
|
+
].includes(chunk.type);
|
|
37
|
+
};
|
|
38
|
+
function safeParseErrorObject(obj) {
|
|
39
|
+
if (typeof obj !== "object" || obj === null) {
|
|
40
|
+
return String(obj);
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const stringified = JSON.stringify(obj);
|
|
44
|
+
if (stringified === "{}") {
|
|
45
|
+
return String(obj);
|
|
46
|
+
}
|
|
47
|
+
return stringified;
|
|
48
|
+
} catch {
|
|
49
|
+
return String(obj);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
13
52
|
var isAgentExecutionDataChunkType = (chunk) => {
|
|
14
53
|
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-");
|
|
15
54
|
};
|
|
@@ -477,7 +516,10 @@ function convertFullStreamChunkToUIMessageStream({
|
|
|
477
516
|
}
|
|
478
517
|
|
|
479
518
|
// src/transformers.ts
|
|
480
|
-
|
|
519
|
+
var PRIMITIVE_CACHE_SYMBOL = Symbol("primitive-cache");
|
|
520
|
+
function WorkflowStreamToAISDKTransformer({
|
|
521
|
+
includeTextStreamParts
|
|
522
|
+
} = {}) {
|
|
481
523
|
const bufferedWorkflows = /* @__PURE__ */ new Map();
|
|
482
524
|
return new TransformStream({
|
|
483
525
|
start(controller) {
|
|
@@ -491,7 +533,7 @@ function WorkflowStreamToAISDKTransformer() {
|
|
|
491
533
|
});
|
|
492
534
|
},
|
|
493
535
|
transform(chunk, controller) {
|
|
494
|
-
const transformed = transformWorkflow(chunk, bufferedWorkflows);
|
|
536
|
+
const transformed = transformWorkflow(chunk, bufferedWorkflows, false, includeTextStreamParts);
|
|
495
537
|
if (transformed) controller.enqueue(transformed);
|
|
496
538
|
}
|
|
497
539
|
});
|
|
@@ -520,7 +562,9 @@ function AgentStreamToAISDKTransformer({
|
|
|
520
562
|
sendStart,
|
|
521
563
|
sendFinish,
|
|
522
564
|
sendReasoning,
|
|
523
|
-
sendSources
|
|
565
|
+
sendSources,
|
|
566
|
+
messageMetadata,
|
|
567
|
+
onError
|
|
524
568
|
}) {
|
|
525
569
|
let bufferedSteps = /* @__PURE__ */ new Map();
|
|
526
570
|
let tripwireOccurred = false;
|
|
@@ -538,11 +582,12 @@ function AgentStreamToAISDKTransformer({
|
|
|
538
582
|
part,
|
|
539
583
|
sendReasoning,
|
|
540
584
|
sendSources,
|
|
585
|
+
messageMetadataValue: messageMetadata?.({ part }),
|
|
541
586
|
sendStart,
|
|
542
587
|
sendFinish,
|
|
543
588
|
responseMessageId: lastMessageId,
|
|
544
|
-
onError() {
|
|
545
|
-
return
|
|
589
|
+
onError(error) {
|
|
590
|
+
return onError ? onError(error) : safeParseErrorObject(error);
|
|
546
591
|
}
|
|
547
592
|
});
|
|
548
593
|
if (transformedChunk) {
|
|
@@ -709,7 +754,7 @@ function transformAgent(payload, bufferedSteps) {
|
|
|
709
754
|
}
|
|
710
755
|
return null;
|
|
711
756
|
}
|
|
712
|
-
function transformWorkflow(payload, bufferedWorkflows, isNested) {
|
|
757
|
+
function transformWorkflow(payload, bufferedWorkflows, isNested, includeTextStreamParts) {
|
|
713
758
|
switch (payload.type) {
|
|
714
759
|
case "workflow-start":
|
|
715
760
|
bufferedWorkflows.set(payload.runId, {
|
|
@@ -802,6 +847,29 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
|
|
|
802
847
|
}
|
|
803
848
|
};
|
|
804
849
|
}
|
|
850
|
+
case "workflow-step-output": {
|
|
851
|
+
const output = payload.payload.output;
|
|
852
|
+
if (includeTextStreamParts && output && isMastraTextStreamChunk(output)) {
|
|
853
|
+
const part = convertMastraChunkToAISDKv5({ chunk: output, mode: "stream" });
|
|
854
|
+
const transformedChunk = convertFullStreamChunkToUIMessageStream({
|
|
855
|
+
part,
|
|
856
|
+
onError(error) {
|
|
857
|
+
return safeParseErrorObject(error);
|
|
858
|
+
}
|
|
859
|
+
});
|
|
860
|
+
return transformedChunk;
|
|
861
|
+
}
|
|
862
|
+
if (output && isDataChunkType(output)) {
|
|
863
|
+
if (!("data" in output)) {
|
|
864
|
+
throw new Error(
|
|
865
|
+
`UI Messages require a data property when using data- prefixed chunks
|
|
866
|
+
${JSON.stringify(output)}`
|
|
867
|
+
);
|
|
868
|
+
}
|
|
869
|
+
return output;
|
|
870
|
+
}
|
|
871
|
+
return null;
|
|
872
|
+
}
|
|
805
873
|
default: {
|
|
806
874
|
if (isDataChunkType(payload)) {
|
|
807
875
|
if (!("data" in payload)) {
|
|
@@ -821,12 +889,29 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
821
889
|
case "routing-agent-start": {
|
|
822
890
|
if (!bufferedNetworks.has(payload.runId)) {
|
|
823
891
|
bufferedNetworks.set(payload.runId, {
|
|
824
|
-
name: payload.payload.
|
|
892
|
+
name: payload.payload.networkId,
|
|
825
893
|
steps: [],
|
|
826
894
|
usage: null,
|
|
827
895
|
output: null
|
|
828
896
|
});
|
|
829
897
|
}
|
|
898
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
899
|
+
current.steps.push({
|
|
900
|
+
id: payload.payload.runId,
|
|
901
|
+
name: payload.payload.agentId,
|
|
902
|
+
status: "running",
|
|
903
|
+
iteration: payload.payload.inputData.iteration,
|
|
904
|
+
input: {
|
|
905
|
+
task: payload.payload.inputData.task,
|
|
906
|
+
threadId: payload.payload.inputData.threadId,
|
|
907
|
+
threadResourceId: payload.payload.inputData.threadResourceId
|
|
908
|
+
},
|
|
909
|
+
output: "",
|
|
910
|
+
task: null,
|
|
911
|
+
suspendPayload: null,
|
|
912
|
+
resumePayload: null,
|
|
913
|
+
[PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
|
|
914
|
+
});
|
|
830
915
|
return {
|
|
831
916
|
type: isNested ? "data-tool-network" : "data-network",
|
|
832
917
|
id: payload.runId,
|
|
@@ -857,14 +942,19 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
857
942
|
};
|
|
858
943
|
}
|
|
859
944
|
case "agent-execution-start": {
|
|
860
|
-
const current = bufferedNetworks.get(payload.runId)
|
|
945
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
946
|
+
if (!current) return null;
|
|
861
947
|
current.steps.push({
|
|
948
|
+
id: payload.payload.runId,
|
|
862
949
|
name: payload.payload.agentId,
|
|
863
950
|
status: "running",
|
|
864
|
-
|
|
951
|
+
iteration: payload.payload.args?.iteration ?? 0,
|
|
952
|
+
input: { prompt: payload.payload.args?.prompt ?? "" },
|
|
865
953
|
output: null,
|
|
954
|
+
task: null,
|
|
866
955
|
suspendPayload: null,
|
|
867
|
-
resumePayload: null
|
|
956
|
+
resumePayload: null,
|
|
957
|
+
[PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
|
|
868
958
|
});
|
|
869
959
|
bufferedNetworks.set(payload.runId, current);
|
|
870
960
|
return {
|
|
@@ -877,14 +967,19 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
877
967
|
};
|
|
878
968
|
}
|
|
879
969
|
case "workflow-execution-start": {
|
|
880
|
-
const current = bufferedNetworks.get(payload.runId)
|
|
970
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
971
|
+
if (!current) return null;
|
|
881
972
|
current.steps.push({
|
|
882
|
-
|
|
973
|
+
id: payload.payload.runId,
|
|
974
|
+
name: payload.payload.workflowId,
|
|
883
975
|
status: "running",
|
|
884
|
-
|
|
976
|
+
iteration: payload.payload.args?.iteration ?? 0,
|
|
977
|
+
input: { prompt: payload.payload.args?.prompt ?? "" },
|
|
885
978
|
output: null,
|
|
979
|
+
task: null,
|
|
886
980
|
suspendPayload: null,
|
|
887
|
-
resumePayload: null
|
|
981
|
+
resumePayload: null,
|
|
982
|
+
[PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
|
|
888
983
|
});
|
|
889
984
|
bufferedNetworks.set(payload.runId, current);
|
|
890
985
|
return {
|
|
@@ -897,14 +992,21 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
897
992
|
};
|
|
898
993
|
}
|
|
899
994
|
case "tool-execution-start": {
|
|
900
|
-
const current = bufferedNetworks.get(payload.runId)
|
|
995
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
996
|
+
if (!current) return null;
|
|
901
997
|
current.steps.push({
|
|
998
|
+
id: payload.payload.args.toolCallId,
|
|
902
999
|
name: payload.payload.args?.toolName,
|
|
903
1000
|
status: "running",
|
|
1001
|
+
iteration: payload.payload.args?.iteration ? Number(payload.payload.args.iteration) : 0,
|
|
1002
|
+
task: {
|
|
1003
|
+
id: payload.payload.args?.toolName
|
|
1004
|
+
},
|
|
904
1005
|
input: payload.payload.args?.args || null,
|
|
905
1006
|
output: null,
|
|
906
1007
|
suspendPayload: null,
|
|
907
|
-
resumePayload: null
|
|
1008
|
+
resumePayload: null,
|
|
1009
|
+
[PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
|
|
908
1010
|
});
|
|
909
1011
|
bufferedNetworks.set(payload.runId, current);
|
|
910
1012
|
return {
|
|
@@ -919,14 +1021,13 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
919
1021
|
case "agent-execution-end": {
|
|
920
1022
|
const current = bufferedNetworks.get(payload.runId);
|
|
921
1023
|
if (!current) return null;
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
});
|
|
1024
|
+
const stepId = payload.payload.runId;
|
|
1025
|
+
const step = current.steps.find((step2) => step2.id === stepId);
|
|
1026
|
+
if (!step) {
|
|
1027
|
+
return null;
|
|
1028
|
+
}
|
|
1029
|
+
step.status = "success";
|
|
1030
|
+
step.output = payload.payload.result;
|
|
930
1031
|
return {
|
|
931
1032
|
type: isNested ? "data-tool-network" : "data-network",
|
|
932
1033
|
id: payload.runId,
|
|
@@ -941,14 +1042,13 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
941
1042
|
case "tool-execution-end": {
|
|
942
1043
|
const current = bufferedNetworks.get(payload.runId);
|
|
943
1044
|
if (!current) return null;
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
});
|
|
1045
|
+
const stepId = payload.payload.toolCallId;
|
|
1046
|
+
const step = current.steps.find((step2) => step2.id === stepId);
|
|
1047
|
+
if (!step) {
|
|
1048
|
+
return null;
|
|
1049
|
+
}
|
|
1050
|
+
step.status = "success";
|
|
1051
|
+
step.output = payload.payload.result;
|
|
952
1052
|
return {
|
|
953
1053
|
type: isNested ? "data-tool-network" : "data-network",
|
|
954
1054
|
id: payload.runId,
|
|
@@ -962,14 +1062,13 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
962
1062
|
case "workflow-execution-end": {
|
|
963
1063
|
const current = bufferedNetworks.get(payload.runId);
|
|
964
1064
|
if (!current) return null;
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
});
|
|
1065
|
+
const stepId = payload.payload.runId;
|
|
1066
|
+
const step = current.steps.find((step2) => step2.id === stepId);
|
|
1067
|
+
if (!step) {
|
|
1068
|
+
return null;
|
|
1069
|
+
}
|
|
1070
|
+
step.status = "success";
|
|
1071
|
+
step.output = payload.payload.result;
|
|
973
1072
|
return {
|
|
974
1073
|
type: isNested ? "data-tool-network" : "data-network",
|
|
975
1074
|
id: payload.runId,
|
|
@@ -984,12 +1083,24 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
984
1083
|
case "routing-agent-end": {
|
|
985
1084
|
const current = bufferedNetworks.get(payload.runId);
|
|
986
1085
|
if (!current) return null;
|
|
1086
|
+
const stepId = payload.payload.runId;
|
|
1087
|
+
const step = current.steps.find((step2) => step2.id === stepId);
|
|
1088
|
+
if (!step) {
|
|
1089
|
+
return null;
|
|
1090
|
+
}
|
|
1091
|
+
step.status = "success";
|
|
1092
|
+
step.task = {
|
|
1093
|
+
id: payload.payload.primitiveId,
|
|
1094
|
+
type: payload.payload.primitiveType,
|
|
1095
|
+
name: payload.payload.task,
|
|
1096
|
+
reason: payload.payload.selectionReason
|
|
1097
|
+
};
|
|
1098
|
+
step.output = payload.payload.result;
|
|
987
1099
|
return {
|
|
988
1100
|
type: isNested ? "data-tool-network" : "data-network",
|
|
989
1101
|
id: payload.runId,
|
|
990
1102
|
data: {
|
|
991
1103
|
...current,
|
|
992
|
-
status: "finished",
|
|
993
1104
|
usage: payload.payload?.usage ?? current.usage,
|
|
994
1105
|
output: payload.payload?.result ?? current.output
|
|
995
1106
|
}
|
|
@@ -1023,6 +1134,39 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
1023
1134
|
};
|
|
1024
1135
|
}
|
|
1025
1136
|
default: {
|
|
1137
|
+
if (payload.type.startsWith("agent-execution-event-")) {
|
|
1138
|
+
const stepId = payload.payload.runId;
|
|
1139
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
1140
|
+
if (!current) return null;
|
|
1141
|
+
const step = current.steps.find((step2) => step2.id === stepId);
|
|
1142
|
+
if (!step) {
|
|
1143
|
+
return null;
|
|
1144
|
+
}
|
|
1145
|
+
step[PRIMITIVE_CACHE_SYMBOL] = step[PRIMITIVE_CACHE_SYMBOL] || /* @__PURE__ */ new Map();
|
|
1146
|
+
const result = transformAgent(payload.payload, step[PRIMITIVE_CACHE_SYMBOL]);
|
|
1147
|
+
if (result) {
|
|
1148
|
+
const { request, response, ...data } = result.data;
|
|
1149
|
+
step.task = data;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
if (payload.type.startsWith("workflow-execution-event-")) {
|
|
1153
|
+
const stepId = payload.payload.runId;
|
|
1154
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
1155
|
+
if (!current) return null;
|
|
1156
|
+
const step = current.steps.find((step2) => step2.id === stepId);
|
|
1157
|
+
if (!step) {
|
|
1158
|
+
return null;
|
|
1159
|
+
}
|
|
1160
|
+
step[PRIMITIVE_CACHE_SYMBOL] = step[PRIMITIVE_CACHE_SYMBOL] || /* @__PURE__ */ new Map();
|
|
1161
|
+
const result = transformWorkflow(payload.payload, step[PRIMITIVE_CACHE_SYMBOL]);
|
|
1162
|
+
if (result && "data" in result) {
|
|
1163
|
+
const data = result.data;
|
|
1164
|
+
step.task = data;
|
|
1165
|
+
if (data.name && step.task) {
|
|
1166
|
+
step.task.id = data.name;
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1026
1170
|
if (isDataChunkType(payload)) {
|
|
1027
1171
|
if (!("data" in payload)) {
|
|
1028
1172
|
throw new Error(
|
|
@@ -1030,7 +1174,8 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
1030
1174
|
${JSON.stringify(payload)}`
|
|
1031
1175
|
);
|
|
1032
1176
|
}
|
|
1033
|
-
|
|
1177
|
+
const { type, data } = payload;
|
|
1178
|
+
return { type, data };
|
|
1034
1179
|
}
|
|
1035
1180
|
if (isAgentExecutionDataChunkType(payload)) {
|
|
1036
1181
|
if (!("data" in payload.payload)) {
|
|
@@ -1039,7 +1184,8 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
1039
1184
|
${JSON.stringify(payload)}`
|
|
1040
1185
|
);
|
|
1041
1186
|
}
|
|
1042
|
-
|
|
1187
|
+
const { type, data } = payload.payload;
|
|
1188
|
+
return { type, data };
|
|
1043
1189
|
}
|
|
1044
1190
|
if (isWorkflowExecutionDataChunkType(payload)) {
|
|
1045
1191
|
if (!("data" in payload.payload)) {
|
|
@@ -1048,7 +1194,8 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
1048
1194
|
${JSON.stringify(payload)}`
|
|
1049
1195
|
);
|
|
1050
1196
|
}
|
|
1051
|
-
|
|
1197
|
+
const { type, data } = payload.payload;
|
|
1198
|
+
return { type, data };
|
|
1052
1199
|
}
|
|
1053
1200
|
return null;
|
|
1054
1201
|
}
|
|
@@ -1063,7 +1210,10 @@ function toAISdkFormat(stream, options = {
|
|
|
1063
1210
|
}) {
|
|
1064
1211
|
const from = options?.from;
|
|
1065
1212
|
if (from === "workflow") {
|
|
1066
|
-
|
|
1213
|
+
const includeTextStreamParts = options?.includeTextStreamParts ?? false;
|
|
1214
|
+
return stream.pipeThrough(
|
|
1215
|
+
WorkflowStreamToAISDKTransformer({ includeTextStreamParts })
|
|
1216
|
+
);
|
|
1067
1217
|
}
|
|
1068
1218
|
if (from === "network") {
|
|
1069
1219
|
return stream.pipeThrough(AgentNetworkToAISDKTransformer());
|
|
@@ -1075,7 +1225,9 @@ function toAISdkFormat(stream, options = {
|
|
|
1075
1225
|
sendStart: options?.sendStart,
|
|
1076
1226
|
sendFinish: options?.sendFinish,
|
|
1077
1227
|
sendReasoning: options?.sendReasoning,
|
|
1078
|
-
sendSources: options?.sendSources
|
|
1228
|
+
sendSources: options?.sendSources,
|
|
1229
|
+
messageMetadata: options?.messageMetadata,
|
|
1230
|
+
onError: options?.onError
|
|
1079
1231
|
})
|
|
1080
1232
|
);
|
|
1081
1233
|
}
|
|
@@ -1206,7 +1358,7 @@ function chatRoute({
|
|
|
1206
1358
|
if (!agentToUse) {
|
|
1207
1359
|
throw new Error("Agent ID is required");
|
|
1208
1360
|
}
|
|
1209
|
-
const agentObj = mastra.
|
|
1361
|
+
const agentObj = mastra.getAgentById(agentToUse);
|
|
1210
1362
|
if (!agentObj) {
|
|
1211
1363
|
throw new Error(`Agent ${agentToUse} not found`);
|
|
1212
1364
|
}
|
|
@@ -1242,7 +1394,8 @@ function chatRoute({
|
|
|
1242
1394
|
}
|
|
1243
1395
|
function workflowRoute({
|
|
1244
1396
|
path = "/api/workflows/:workflowId/stream",
|
|
1245
|
-
workflow
|
|
1397
|
+
workflow,
|
|
1398
|
+
includeTextStreamParts = false
|
|
1246
1399
|
}) {
|
|
1247
1400
|
if (!workflow && !path.includes("/:workflowId")) {
|
|
1248
1401
|
throw new Error("Path must include :workflowId to route to the correct workflow or pass the workflow explicitly");
|
|
@@ -1295,6 +1448,7 @@ function workflowRoute({
|
|
|
1295
1448
|
handler: async (c) => {
|
|
1296
1449
|
const { runId, resourceId, inputData, resumeData, ...rest } = await c.req.json();
|
|
1297
1450
|
const mastra = c.get("mastra");
|
|
1451
|
+
const runtimeContext = c.get("runtimeContext");
|
|
1298
1452
|
let workflowToUse = workflow;
|
|
1299
1453
|
if (!workflow) {
|
|
1300
1454
|
const workflowId = c.req.param("workflowId");
|
|
@@ -1308,15 +1462,20 @@ function workflowRoute({
|
|
|
1308
1462
|
if (!workflowToUse) {
|
|
1309
1463
|
throw new Error("Workflow ID is required");
|
|
1310
1464
|
}
|
|
1311
|
-
const workflowObj = mastra.
|
|
1465
|
+
const workflowObj = mastra.getWorkflowById(workflowToUse);
|
|
1312
1466
|
if (!workflowObj) {
|
|
1313
1467
|
throw new Error(`Workflow ${workflowToUse} not found`);
|
|
1314
1468
|
}
|
|
1469
|
+
if (runtimeContext && rest.runtimeContext) {
|
|
1470
|
+
mastra.getLogger()?.warn(
|
|
1471
|
+
`"runtimeContext" from the request body will be ignored because "runtimeContext" is already set in the route options.`
|
|
1472
|
+
);
|
|
1473
|
+
}
|
|
1315
1474
|
const run = await workflowObj.createRunAsync({ runId, resourceId, ...rest });
|
|
1316
|
-
const stream = resumeData ? run.resumeStream({ resumeData, ...rest }) : run.stream({ inputData, ...rest });
|
|
1475
|
+
const stream = resumeData ? run.resumeStream({ resumeData, ...rest, runtimeContext: runtimeContext || rest.runtimeContext }) : run.stream({ inputData, ...rest, runtimeContext: runtimeContext || rest.runtimeContext });
|
|
1317
1476
|
const uiMessageStream = ai.createUIMessageStream({
|
|
1318
1477
|
execute: async ({ writer }) => {
|
|
1319
|
-
for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
|
|
1478
|
+
for await (const part of toAISdkFormat(stream, { from: "workflow", includeTextStreamParts })) {
|
|
1320
1479
|
writer.write(part);
|
|
1321
1480
|
}
|
|
1322
1481
|
}
|
|
@@ -1401,7 +1560,7 @@ function networkRoute({
|
|
|
1401
1560
|
if (!agentToUse) {
|
|
1402
1561
|
throw new Error("Agent ID is required");
|
|
1403
1562
|
}
|
|
1404
|
-
const agentObj = mastra.
|
|
1563
|
+
const agentObj = mastra.getAgentById(agentToUse);
|
|
1405
1564
|
if (!agentObj) {
|
|
1406
1565
|
throw new Error(`Agent ${agentToUse} not found`);
|
|
1407
1566
|
}
|