@mastra/ai-sdk 0.0.0-fix-read-json-esm-20251009172143 → 0.0.0-fix-model-router-machine-cache-20251021232825
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 +112 -5
- package/README.md +65 -1
- package/dist/chat-route.d.ts.map +1 -1
- package/dist/helpers.d.ts +13 -3
- package/dist/helpers.d.ts.map +1 -1
- package/dist/index.cjs +532 -85
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +531 -85
- package/dist/index.js.map +1 -1
- package/dist/network-route.d.ts +14 -0
- package/dist/network-route.d.ts.map +1 -0
- package/dist/to-ai-sdk-format.d.ts +15 -31
- package/dist/to-ai-sdk-format.d.ts.map +1 -1
- package/dist/transformers.d.ts +126 -0
- package/dist/transformers.d.ts.map +1 -0
- package/dist/workflow-route.d.ts +10 -0
- package/dist/workflow-route.d.ts.map +1 -0
- package/package.json +6 -6
package/dist/index.cjs
CHANGED
|
@@ -210,6 +210,9 @@ function convertMastraChunkToAISDKv5({
|
|
|
210
210
|
...chunk.payload || {}
|
|
211
211
|
};
|
|
212
212
|
}
|
|
213
|
+
if ("type" in chunk && chunk.type?.startsWith("data-")) {
|
|
214
|
+
return chunk;
|
|
215
|
+
}
|
|
213
216
|
return;
|
|
214
217
|
}
|
|
215
218
|
}
|
|
@@ -223,7 +226,7 @@ function convertFullStreamChunkToUIMessageStream({
|
|
|
223
226
|
sendFinish,
|
|
224
227
|
responseMessageId
|
|
225
228
|
}) {
|
|
226
|
-
const partType = part
|
|
229
|
+
const partType = part?.type;
|
|
227
230
|
switch (partType) {
|
|
228
231
|
case "text-start": {
|
|
229
232
|
return {
|
|
@@ -317,6 +320,18 @@ function convertFullStreamChunkToUIMessageStream({
|
|
|
317
320
|
toolCallId: part.toolCallId,
|
|
318
321
|
payload: part.output
|
|
319
322
|
};
|
|
323
|
+
} else if (part.output.from === "WORKFLOW") {
|
|
324
|
+
return {
|
|
325
|
+
type: "tool-workflow",
|
|
326
|
+
toolCallId: part.toolCallId,
|
|
327
|
+
payload: part.output
|
|
328
|
+
};
|
|
329
|
+
} else if (part.output.from === "NETWORK") {
|
|
330
|
+
return {
|
|
331
|
+
type: "tool-network",
|
|
332
|
+
toolCallId: part.toolCallId,
|
|
333
|
+
payload: part.output
|
|
334
|
+
};
|
|
320
335
|
}
|
|
321
336
|
return;
|
|
322
337
|
}
|
|
@@ -368,102 +383,56 @@ function convertFullStreamChunkToUIMessageStream({
|
|
|
368
383
|
return;
|
|
369
384
|
}
|
|
370
385
|
default: {
|
|
371
|
-
|
|
372
|
-
|
|
386
|
+
if ("type" in part && part.type?.startsWith("data-")) {
|
|
387
|
+
if (!("data" in part)) {
|
|
388
|
+
throw new Error(
|
|
389
|
+
`UI Messages require a data property when using data- prefixed chunks
|
|
390
|
+
${JSON.stringify(part)}`
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
return part;
|
|
394
|
+
}
|
|
395
|
+
return;
|
|
373
396
|
}
|
|
374
397
|
}
|
|
375
398
|
}
|
|
376
399
|
|
|
377
|
-
// src/
|
|
400
|
+
// src/transformers.ts
|
|
378
401
|
function WorkflowStreamToAISDKTransformer() {
|
|
379
|
-
const
|
|
402
|
+
const bufferedWorkflows = /* @__PURE__ */ new Map();
|
|
380
403
|
return new TransformStream({
|
|
381
404
|
start(controller) {
|
|
382
405
|
controller.enqueue({
|
|
383
|
-
|
|
384
|
-
type: "start",
|
|
385
|
-
messageId: "1"
|
|
386
|
-
})
|
|
406
|
+
type: "start"
|
|
387
407
|
});
|
|
388
408
|
},
|
|
389
409
|
flush(controller) {
|
|
390
410
|
controller.enqueue({
|
|
391
|
-
|
|
392
|
-
type: "finish"
|
|
393
|
-
})
|
|
411
|
+
type: "finish"
|
|
394
412
|
});
|
|
413
|
+
},
|
|
414
|
+
transform(chunk, controller) {
|
|
415
|
+
const transformed = transformWorkflow(chunk, bufferedWorkflows);
|
|
416
|
+
if (transformed) controller.enqueue(transformed);
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
function AgentNetworkToAISDKTransformer() {
|
|
421
|
+
const bufferedNetworks = /* @__PURE__ */ new Map();
|
|
422
|
+
return new TransformStream({
|
|
423
|
+
start(controller) {
|
|
395
424
|
controller.enqueue({
|
|
396
|
-
|
|
425
|
+
type: "start"
|
|
426
|
+
});
|
|
427
|
+
},
|
|
428
|
+
flush(controller) {
|
|
429
|
+
controller.enqueue({
|
|
430
|
+
type: "finish"
|
|
397
431
|
});
|
|
398
432
|
},
|
|
399
433
|
transform(chunk, controller) {
|
|
400
|
-
|
|
401
|
-
if (
|
|
402
|
-
workflowName = chunk.payload.workflowId;
|
|
403
|
-
controller.enqueue({
|
|
404
|
-
data: JSON.stringify({
|
|
405
|
-
type: "data-workflow",
|
|
406
|
-
id: chunk.runId,
|
|
407
|
-
data: {
|
|
408
|
-
name: workflowName,
|
|
409
|
-
status: "running",
|
|
410
|
-
steps: {},
|
|
411
|
-
output: null
|
|
412
|
-
}
|
|
413
|
-
})
|
|
414
|
-
});
|
|
415
|
-
} else if (chunk.type === "workflow-step-start") {
|
|
416
|
-
steps[chunk.payload.id] = {
|
|
417
|
-
// TODO swap with name
|
|
418
|
-
name: chunk.payload.id,
|
|
419
|
-
status: chunk.payload.status,
|
|
420
|
-
input: chunk.payload.payload ?? null,
|
|
421
|
-
output: null
|
|
422
|
-
};
|
|
423
|
-
controller.enqueue({
|
|
424
|
-
data: JSON.stringify({
|
|
425
|
-
type: "data-workflow",
|
|
426
|
-
id: chunk.runId,
|
|
427
|
-
data: {
|
|
428
|
-
name: workflowName,
|
|
429
|
-
status: "running",
|
|
430
|
-
steps,
|
|
431
|
-
output: null
|
|
432
|
-
}
|
|
433
|
-
})
|
|
434
|
-
});
|
|
435
|
-
} else if (chunk.type === "workflow-step-result") {
|
|
436
|
-
steps[chunk.payload.id] = {
|
|
437
|
-
...steps[chunk.payload.id],
|
|
438
|
-
status: chunk.payload.status,
|
|
439
|
-
output: chunk.payload.output ?? null
|
|
440
|
-
};
|
|
441
|
-
controller.enqueue({
|
|
442
|
-
data: JSON.stringify({
|
|
443
|
-
type: "data-workflow",
|
|
444
|
-
id: chunk.runId,
|
|
445
|
-
data: {
|
|
446
|
-
name: workflowName,
|
|
447
|
-
status: "running",
|
|
448
|
-
steps,
|
|
449
|
-
output: null
|
|
450
|
-
}
|
|
451
|
-
})
|
|
452
|
-
});
|
|
453
|
-
} else if (chunk.type === "workflow-finish") {
|
|
454
|
-
controller.enqueue({
|
|
455
|
-
data: JSON.stringify({
|
|
456
|
-
type: "data-workflow",
|
|
457
|
-
id: chunk.runId,
|
|
458
|
-
data: {
|
|
459
|
-
name: workflowName,
|
|
460
|
-
steps,
|
|
461
|
-
output: chunk.payload.output ?? null,
|
|
462
|
-
status: chunk.payload.workflowStatus
|
|
463
|
-
}
|
|
464
|
-
})
|
|
465
|
-
});
|
|
466
|
-
}
|
|
434
|
+
const transformed = transformNetwork(chunk, bufferedNetworks);
|
|
435
|
+
if (transformed) controller.enqueue(transformed);
|
|
467
436
|
}
|
|
468
437
|
});
|
|
469
438
|
}
|
|
@@ -488,6 +457,14 @@ function AgentStreamToAISDKTransformer() {
|
|
|
488
457
|
const payload = transformedChunk.payload;
|
|
489
458
|
const agentTransformed = transformAgent(payload, bufferedSteps);
|
|
490
459
|
if (agentTransformed) controller.enqueue(agentTransformed);
|
|
460
|
+
} else if (transformedChunk.type === "tool-workflow") {
|
|
461
|
+
const payload = transformedChunk.payload;
|
|
462
|
+
const workflowChunk = transformWorkflow(payload, bufferedSteps, true);
|
|
463
|
+
if (workflowChunk) controller.enqueue(workflowChunk);
|
|
464
|
+
} else if (transformedChunk.type === "tool-network") {
|
|
465
|
+
const payload = transformedChunk.payload;
|
|
466
|
+
const networkChunk = transformNetwork(payload, bufferedSteps, true);
|
|
467
|
+
if (networkChunk) controller.enqueue(networkChunk);
|
|
491
468
|
} else {
|
|
492
469
|
controller.enqueue(transformedChunk);
|
|
493
470
|
}
|
|
@@ -631,8 +608,295 @@ function transformAgent(payload, bufferedSteps) {
|
|
|
631
608
|
}
|
|
632
609
|
return null;
|
|
633
610
|
}
|
|
634
|
-
function
|
|
635
|
-
|
|
611
|
+
function transformWorkflow(payload, bufferedWorkflows, isNested) {
|
|
612
|
+
switch (payload.type) {
|
|
613
|
+
case "workflow-start":
|
|
614
|
+
bufferedWorkflows.set(payload.runId, {
|
|
615
|
+
name: payload.payload.workflowId,
|
|
616
|
+
steps: {}
|
|
617
|
+
});
|
|
618
|
+
return {
|
|
619
|
+
type: isNested ? "data-tool-workflow" : "data-workflow",
|
|
620
|
+
id: payload.runId,
|
|
621
|
+
data: {
|
|
622
|
+
name: bufferedWorkflows.get(payload.runId).name,
|
|
623
|
+
status: "running",
|
|
624
|
+
steps: bufferedWorkflows.get(payload.runId).steps,
|
|
625
|
+
output: null
|
|
626
|
+
}
|
|
627
|
+
};
|
|
628
|
+
case "workflow-step-start": {
|
|
629
|
+
const current = bufferedWorkflows.get(payload.runId) || { name: "", steps: {} };
|
|
630
|
+
current.steps[payload.payload.id] = {
|
|
631
|
+
name: payload.payload.id,
|
|
632
|
+
status: payload.payload.status,
|
|
633
|
+
input: payload.payload.payload ?? null,
|
|
634
|
+
output: null
|
|
635
|
+
};
|
|
636
|
+
bufferedWorkflows.set(payload.runId, current);
|
|
637
|
+
return {
|
|
638
|
+
type: isNested ? "data-tool-workflow" : "data-workflow",
|
|
639
|
+
id: payload.runId,
|
|
640
|
+
data: {
|
|
641
|
+
name: current.name,
|
|
642
|
+
status: "running",
|
|
643
|
+
steps: current.steps,
|
|
644
|
+
output: null
|
|
645
|
+
}
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
case "workflow-step-result": {
|
|
649
|
+
const current = bufferedWorkflows.get(payload.runId);
|
|
650
|
+
if (!current) return null;
|
|
651
|
+
current.steps[payload.payload.id] = {
|
|
652
|
+
...current.steps[payload.payload.id],
|
|
653
|
+
status: payload.payload.status,
|
|
654
|
+
output: payload.payload.output ?? null
|
|
655
|
+
};
|
|
656
|
+
return {
|
|
657
|
+
type: isNested ? "data-tool-workflow" : "data-workflow",
|
|
658
|
+
id: payload.runId,
|
|
659
|
+
data: {
|
|
660
|
+
name: current.name,
|
|
661
|
+
status: "running",
|
|
662
|
+
steps: current.steps,
|
|
663
|
+
output: null
|
|
664
|
+
}
|
|
665
|
+
};
|
|
666
|
+
}
|
|
667
|
+
case "workflow-finish": {
|
|
668
|
+
const current = bufferedWorkflows.get(payload.runId);
|
|
669
|
+
if (!current) return null;
|
|
670
|
+
return {
|
|
671
|
+
type: isNested ? "data-tool-workflow" : "data-workflow",
|
|
672
|
+
id: payload.runId,
|
|
673
|
+
data: {
|
|
674
|
+
name: current.name,
|
|
675
|
+
steps: current.steps,
|
|
676
|
+
output: payload.payload.output ?? null,
|
|
677
|
+
status: payload.payload.workflowStatus
|
|
678
|
+
}
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
default:
|
|
682
|
+
return null;
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
686
|
+
switch (payload.type) {
|
|
687
|
+
case "routing-agent-start": {
|
|
688
|
+
if (!bufferedNetworks.has(payload.payload.runId)) {
|
|
689
|
+
bufferedNetworks.set(payload.payload.runId, {
|
|
690
|
+
name: payload.payload.agentId,
|
|
691
|
+
steps: []
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
return {
|
|
695
|
+
type: isNested ? "data-tool-network" : "data-network",
|
|
696
|
+
id: payload.payload.runId,
|
|
697
|
+
data: {
|
|
698
|
+
name: bufferedNetworks.get(payload.payload.runId).name,
|
|
699
|
+
status: "running",
|
|
700
|
+
steps: bufferedNetworks.get(payload.payload.runId).steps,
|
|
701
|
+
output: null
|
|
702
|
+
}
|
|
703
|
+
};
|
|
704
|
+
}
|
|
705
|
+
case "routing-agent-text-start": {
|
|
706
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
707
|
+
if (!current) return null;
|
|
708
|
+
return {
|
|
709
|
+
type: "text-start",
|
|
710
|
+
id: payload.runId
|
|
711
|
+
};
|
|
712
|
+
}
|
|
713
|
+
case "routing-agent-text-delta": {
|
|
714
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
715
|
+
if (!current) return null;
|
|
716
|
+
return {
|
|
717
|
+
type: "text-delta",
|
|
718
|
+
id: payload.runId,
|
|
719
|
+
delta: payload.payload.text
|
|
720
|
+
};
|
|
721
|
+
}
|
|
722
|
+
case "agent-execution-start": {
|
|
723
|
+
const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
|
|
724
|
+
current.steps.push({
|
|
725
|
+
name: payload.payload.agentId,
|
|
726
|
+
status: "running",
|
|
727
|
+
input: payload.payload.args || null,
|
|
728
|
+
output: null
|
|
729
|
+
});
|
|
730
|
+
bufferedNetworks.set(payload.payload.runId, current);
|
|
731
|
+
return {
|
|
732
|
+
type: isNested ? "data-tool-network" : "data-network",
|
|
733
|
+
id: payload.payload.runId,
|
|
734
|
+
data: {
|
|
735
|
+
name: current.name,
|
|
736
|
+
status: "running",
|
|
737
|
+
steps: current.steps,
|
|
738
|
+
output: null
|
|
739
|
+
}
|
|
740
|
+
};
|
|
741
|
+
}
|
|
742
|
+
case "workflow-execution-start": {
|
|
743
|
+
const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
|
|
744
|
+
current.steps.push({
|
|
745
|
+
name: payload.payload.name,
|
|
746
|
+
status: "running",
|
|
747
|
+
input: payload.payload.args || null,
|
|
748
|
+
output: null
|
|
749
|
+
});
|
|
750
|
+
bufferedNetworks.set(payload.payload.runId, current);
|
|
751
|
+
return {
|
|
752
|
+
type: isNested ? "data-tool-network" : "data-network",
|
|
753
|
+
id: payload.payload.runId,
|
|
754
|
+
data: {
|
|
755
|
+
name: current.name,
|
|
756
|
+
status: "running",
|
|
757
|
+
steps: current.steps,
|
|
758
|
+
output: null
|
|
759
|
+
}
|
|
760
|
+
};
|
|
761
|
+
}
|
|
762
|
+
case "tool-execution-start": {
|
|
763
|
+
const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
|
|
764
|
+
current.steps.push({
|
|
765
|
+
name: payload.payload.args?.toolName,
|
|
766
|
+
status: "running",
|
|
767
|
+
input: payload.payload.args?.args || null,
|
|
768
|
+
output: null
|
|
769
|
+
});
|
|
770
|
+
bufferedNetworks.set(payload.payload.runId, current);
|
|
771
|
+
return {
|
|
772
|
+
type: isNested ? "data-tool-network" : "data-network",
|
|
773
|
+
id: payload.payload.runId,
|
|
774
|
+
data: {
|
|
775
|
+
name: current.name,
|
|
776
|
+
status: "running",
|
|
777
|
+
steps: current.steps,
|
|
778
|
+
output: null
|
|
779
|
+
}
|
|
780
|
+
};
|
|
781
|
+
}
|
|
782
|
+
case "agent-execution-end": {
|
|
783
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
784
|
+
if (!current) return null;
|
|
785
|
+
current.steps.push({
|
|
786
|
+
name: payload.payload.agentId,
|
|
787
|
+
status: "success",
|
|
788
|
+
input: null,
|
|
789
|
+
output: payload.payload.result
|
|
790
|
+
});
|
|
791
|
+
return {
|
|
792
|
+
type: isNested ? "data-tool-network" : "data-network",
|
|
793
|
+
id: payload.runId,
|
|
794
|
+
data: {
|
|
795
|
+
name: current.name,
|
|
796
|
+
status: "running",
|
|
797
|
+
steps: current.steps,
|
|
798
|
+
output: payload.payload.result ?? null
|
|
799
|
+
}
|
|
800
|
+
};
|
|
801
|
+
}
|
|
802
|
+
case "tool-execution-end": {
|
|
803
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
804
|
+
if (!current) return null;
|
|
805
|
+
current.steps.push({
|
|
806
|
+
name: payload.payload.toolName,
|
|
807
|
+
status: "success",
|
|
808
|
+
input: null,
|
|
809
|
+
output: payload.payload.result
|
|
810
|
+
});
|
|
811
|
+
return {
|
|
812
|
+
type: isNested ? "data-tool-network" : "data-network",
|
|
813
|
+
id: payload.runId,
|
|
814
|
+
data: {
|
|
815
|
+
name: current.name,
|
|
816
|
+
status: "running",
|
|
817
|
+
steps: current.steps,
|
|
818
|
+
output: payload.payload.result ?? null
|
|
819
|
+
}
|
|
820
|
+
};
|
|
821
|
+
}
|
|
822
|
+
case "workflow-execution-end": {
|
|
823
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
824
|
+
if (!current) return null;
|
|
825
|
+
current.steps.push({
|
|
826
|
+
name: payload.payload.name,
|
|
827
|
+
status: "success",
|
|
828
|
+
input: null,
|
|
829
|
+
output: payload.payload.result
|
|
830
|
+
});
|
|
831
|
+
return {
|
|
832
|
+
type: isNested ? "data-tool-network" : "data-network",
|
|
833
|
+
id: payload.runId,
|
|
834
|
+
data: {
|
|
835
|
+
name: current.name,
|
|
836
|
+
status: "running",
|
|
837
|
+
steps: current.steps,
|
|
838
|
+
output: payload.payload.result ?? null
|
|
839
|
+
}
|
|
840
|
+
};
|
|
841
|
+
}
|
|
842
|
+
case "routing-agent-end": {
|
|
843
|
+
const current = bufferedNetworks.get(payload.payload.runId);
|
|
844
|
+
if (!current) return null;
|
|
845
|
+
return {
|
|
846
|
+
type: isNested ? "data-tool-network" : "data-network",
|
|
847
|
+
id: payload.payload.runId,
|
|
848
|
+
data: {
|
|
849
|
+
name: current.name,
|
|
850
|
+
status: "finished",
|
|
851
|
+
steps: current.steps,
|
|
852
|
+
output: payload.payload?.result ?? null
|
|
853
|
+
}
|
|
854
|
+
};
|
|
855
|
+
}
|
|
856
|
+
case "network-execution-event-step-finish": {
|
|
857
|
+
const current = bufferedNetworks.get(payload.payload.runId);
|
|
858
|
+
if (!current) return null;
|
|
859
|
+
return {
|
|
860
|
+
type: isNested ? "data-tool-network" : "data-network",
|
|
861
|
+
id: payload.payload.runId,
|
|
862
|
+
data: {
|
|
863
|
+
name: current.name,
|
|
864
|
+
status: "finished",
|
|
865
|
+
steps: current.steps,
|
|
866
|
+
output: payload.payload?.result ?? null
|
|
867
|
+
}
|
|
868
|
+
};
|
|
869
|
+
}
|
|
870
|
+
case "network-execution-event-finish": {
|
|
871
|
+
const current = bufferedNetworks.get(payload.runId);
|
|
872
|
+
if (!current) return null;
|
|
873
|
+
return {
|
|
874
|
+
type: isNested ? "data-tool-network" : "data-network",
|
|
875
|
+
id: payload.runId,
|
|
876
|
+
data: {
|
|
877
|
+
name: current.name,
|
|
878
|
+
status: "finished",
|
|
879
|
+
steps: current.steps,
|
|
880
|
+
output: payload.payload?.result ?? null
|
|
881
|
+
}
|
|
882
|
+
};
|
|
883
|
+
}
|
|
884
|
+
default:
|
|
885
|
+
return null;
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
// src/to-ai-sdk-format.ts
|
|
890
|
+
function toAISdkFormat(stream, options = { from: "agent" }) {
|
|
891
|
+
const from = options?.from;
|
|
892
|
+
if (from === "workflow") {
|
|
893
|
+
return stream.pipeThrough(WorkflowStreamToAISDKTransformer());
|
|
894
|
+
}
|
|
895
|
+
if (from === "network") {
|
|
896
|
+
return stream.pipeThrough(AgentNetworkToAISDKTransformer());
|
|
897
|
+
}
|
|
898
|
+
const agentReadable = "fullStream" in stream ? stream.fullStream : stream;
|
|
899
|
+
return agentReadable.pipeThrough(AgentStreamToAISDKTransformer());
|
|
636
900
|
}
|
|
637
901
|
|
|
638
902
|
// src/chat-route.ts
|
|
@@ -740,6 +1004,7 @@ function chatRoute({
|
|
|
740
1004
|
handler: async (c) => {
|
|
741
1005
|
const { messages, ...rest } = await c.req.json();
|
|
742
1006
|
const mastra = c.get("mastra");
|
|
1007
|
+
const runtimeContext = c.get("runtimeContext");
|
|
743
1008
|
let agentToUse = agent;
|
|
744
1009
|
if (!agent) {
|
|
745
1010
|
const agentId = c.req.param("agentId");
|
|
@@ -750,6 +1015,9 @@ function chatRoute({
|
|
|
750
1015
|
`Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
|
|
751
1016
|
);
|
|
752
1017
|
}
|
|
1018
|
+
if (runtimeContext && defaultOptions?.runtimeContext) {
|
|
1019
|
+
mastra.getLogger()?.warn(`"runtimeContext" set in the route options will be overridden by the request's "runtimeContext".`);
|
|
1020
|
+
}
|
|
753
1021
|
if (!agentToUse) {
|
|
754
1022
|
throw new Error("Agent ID is required");
|
|
755
1023
|
}
|
|
@@ -759,11 +1027,13 @@ function chatRoute({
|
|
|
759
1027
|
}
|
|
760
1028
|
const result = await agentObj.stream(messages, {
|
|
761
1029
|
...defaultOptions,
|
|
762
|
-
...rest
|
|
1030
|
+
...rest,
|
|
1031
|
+
runtimeContext: runtimeContext || defaultOptions?.runtimeContext
|
|
763
1032
|
});
|
|
764
1033
|
const uiMessageStream = ai.createUIMessageStream({
|
|
1034
|
+
originalMessages: messages,
|
|
765
1035
|
execute: async ({ writer }) => {
|
|
766
|
-
for await (const part of toAISdkFormat(result)) {
|
|
1036
|
+
for await (const part of toAISdkFormat(result, { from: "agent" })) {
|
|
767
1037
|
writer.write(part);
|
|
768
1038
|
}
|
|
769
1039
|
}
|
|
@@ -774,9 +1044,186 @@ function chatRoute({
|
|
|
774
1044
|
}
|
|
775
1045
|
});
|
|
776
1046
|
}
|
|
1047
|
+
function workflowRoute({
|
|
1048
|
+
path = "/api/workflows/:workflowId/stream",
|
|
1049
|
+
workflow
|
|
1050
|
+
}) {
|
|
1051
|
+
if (!workflow && !path.includes("/:workflowId")) {
|
|
1052
|
+
throw new Error("Path must include :workflowId to route to the correct workflow or pass the workflow explicitly");
|
|
1053
|
+
}
|
|
1054
|
+
return server.registerApiRoute(path, {
|
|
1055
|
+
method: "POST",
|
|
1056
|
+
openapi: {
|
|
1057
|
+
summary: "Stream a workflow in AI SDK format",
|
|
1058
|
+
description: "Starts a workflow run and streams events as AI SDK UIMessage chunks",
|
|
1059
|
+
tags: ["ai-sdk"],
|
|
1060
|
+
parameters: [
|
|
1061
|
+
{
|
|
1062
|
+
name: "workflowId",
|
|
1063
|
+
in: "path",
|
|
1064
|
+
required: true,
|
|
1065
|
+
description: "The ID of the workflow to stream",
|
|
1066
|
+
schema: { type: "string" }
|
|
1067
|
+
}
|
|
1068
|
+
],
|
|
1069
|
+
requestBody: {
|
|
1070
|
+
required: true,
|
|
1071
|
+
content: {
|
|
1072
|
+
"application/json": {
|
|
1073
|
+
schema: {
|
|
1074
|
+
type: "object",
|
|
1075
|
+
properties: {
|
|
1076
|
+
inputData: { type: "object", additionalProperties: true },
|
|
1077
|
+
runtimeContext: { type: "object", additionalProperties: true },
|
|
1078
|
+
tracingOptions: { type: "object", additionalProperties: true }
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
},
|
|
1084
|
+
responses: {
|
|
1085
|
+
"200": {
|
|
1086
|
+
description: "Workflow UIMessage event stream",
|
|
1087
|
+
content: {
|
|
1088
|
+
"text/plain": {
|
|
1089
|
+
schema: { type: "string", description: "SSE stream" }
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
},
|
|
1095
|
+
handler: async (c) => {
|
|
1096
|
+
const { inputData, ...rest } = await c.req.json();
|
|
1097
|
+
const mastra = c.get("mastra");
|
|
1098
|
+
let workflowToUse = workflow;
|
|
1099
|
+
if (!workflow) {
|
|
1100
|
+
const workflowId = c.req.param("workflowId");
|
|
1101
|
+
workflowToUse = workflowId;
|
|
1102
|
+
}
|
|
1103
|
+
if (c.req.param("workflowId") && workflow) {
|
|
1104
|
+
mastra.getLogger()?.warn(
|
|
1105
|
+
`Fixed workflow ID was set together with a workflowId path parameter. This can lead to unexpected behavior.`
|
|
1106
|
+
);
|
|
1107
|
+
}
|
|
1108
|
+
if (!workflowToUse) {
|
|
1109
|
+
throw new Error("Workflow ID is required");
|
|
1110
|
+
}
|
|
1111
|
+
const workflowObj = mastra.getWorkflow(workflowToUse);
|
|
1112
|
+
if (!workflowObj) {
|
|
1113
|
+
throw new Error(`Workflow ${workflowToUse} not found`);
|
|
1114
|
+
}
|
|
1115
|
+
const run = await workflowObj.createRunAsync();
|
|
1116
|
+
const stream = run.streamVNext({ inputData, ...rest });
|
|
1117
|
+
const uiMessageStream = ai.createUIMessageStream({
|
|
1118
|
+
execute: async ({ writer }) => {
|
|
1119
|
+
for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
|
|
1120
|
+
writer.write(part);
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
});
|
|
1124
|
+
return ai.createUIMessageStreamResponse({ stream: uiMessageStream });
|
|
1125
|
+
}
|
|
1126
|
+
});
|
|
1127
|
+
}
|
|
1128
|
+
function networkRoute({
|
|
1129
|
+
path = "/network/:agentId",
|
|
1130
|
+
agent,
|
|
1131
|
+
defaultOptions
|
|
1132
|
+
}) {
|
|
1133
|
+
if (!agent && !path.includes("/:agentId")) {
|
|
1134
|
+
throw new Error("Path must include :agentId to route to the correct agent or pass the agent explicitly");
|
|
1135
|
+
}
|
|
1136
|
+
return server.registerApiRoute(path, {
|
|
1137
|
+
method: "POST",
|
|
1138
|
+
openapi: {
|
|
1139
|
+
summary: "Execute an agent network and stream AI SDK events",
|
|
1140
|
+
description: "Routes a request to an agent network and streams UIMessage chunks in AI SDK format",
|
|
1141
|
+
tags: ["ai-sdk"],
|
|
1142
|
+
parameters: [
|
|
1143
|
+
{
|
|
1144
|
+
name: "agentId",
|
|
1145
|
+
in: "path",
|
|
1146
|
+
required: true,
|
|
1147
|
+
description: "The ID of the routing agent to execute as a network",
|
|
1148
|
+
schema: { type: "string" }
|
|
1149
|
+
}
|
|
1150
|
+
],
|
|
1151
|
+
requestBody: {
|
|
1152
|
+
required: true,
|
|
1153
|
+
content: {
|
|
1154
|
+
"application/json": {
|
|
1155
|
+
schema: {
|
|
1156
|
+
type: "object",
|
|
1157
|
+
properties: {
|
|
1158
|
+
messages: { type: "array", items: { type: "object" } },
|
|
1159
|
+
runtimeContext: { type: "object", additionalProperties: true },
|
|
1160
|
+
runId: { type: "string" },
|
|
1161
|
+
maxSteps: { type: "number" },
|
|
1162
|
+
threadId: { type: "string" },
|
|
1163
|
+
resourceId: { type: "string" },
|
|
1164
|
+
modelSettings: { type: "object", additionalProperties: true },
|
|
1165
|
+
telemetry: { type: "object", additionalProperties: true },
|
|
1166
|
+
tools: { type: "array", items: { type: "object" } }
|
|
1167
|
+
},
|
|
1168
|
+
required: ["messages"]
|
|
1169
|
+
}
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
},
|
|
1173
|
+
responses: {
|
|
1174
|
+
"200": {
|
|
1175
|
+
description: "Streaming AI SDK UIMessage event stream for the agent network",
|
|
1176
|
+
content: { "text/plain": { schema: { type: "string", description: "SSE stream" } } }
|
|
1177
|
+
},
|
|
1178
|
+
"404": {
|
|
1179
|
+
description: "Agent not found",
|
|
1180
|
+
content: {
|
|
1181
|
+
"application/json": {
|
|
1182
|
+
schema: { type: "object", properties: { error: { type: "string" } } }
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
},
|
|
1188
|
+
handler: async (c) => {
|
|
1189
|
+
const { messages, ...rest } = await c.req.json();
|
|
1190
|
+
const mastra = c.get("mastra");
|
|
1191
|
+
let agentToUse = agent;
|
|
1192
|
+
if (!agent) {
|
|
1193
|
+
const agentId = c.req.param("agentId");
|
|
1194
|
+
agentToUse = agentId;
|
|
1195
|
+
}
|
|
1196
|
+
if (c.req.param("agentId") && agent) {
|
|
1197
|
+
mastra.getLogger()?.warn(
|
|
1198
|
+
`Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
|
|
1199
|
+
);
|
|
1200
|
+
}
|
|
1201
|
+
if (!agentToUse) {
|
|
1202
|
+
throw new Error("Agent ID is required");
|
|
1203
|
+
}
|
|
1204
|
+
const agentObj = mastra.getAgent(agentToUse);
|
|
1205
|
+
if (!agentObj) {
|
|
1206
|
+
throw new Error(`Agent ${agentToUse} not found`);
|
|
1207
|
+
}
|
|
1208
|
+
const result = await agentObj.network(messages, {
|
|
1209
|
+
...defaultOptions,
|
|
1210
|
+
...rest
|
|
1211
|
+
});
|
|
1212
|
+
const uiMessageStream = ai.createUIMessageStream({
|
|
1213
|
+
execute: async ({ writer }) => {
|
|
1214
|
+
for await (const part of toAISdkFormat(result, { from: "network" })) {
|
|
1215
|
+
writer.write(part);
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
});
|
|
1219
|
+
return ai.createUIMessageStreamResponse({ stream: uiMessageStream });
|
|
1220
|
+
}
|
|
1221
|
+
});
|
|
1222
|
+
}
|
|
777
1223
|
|
|
778
|
-
exports.WorkflowStreamToAISDKTransformer = WorkflowStreamToAISDKTransformer;
|
|
779
1224
|
exports.chatRoute = chatRoute;
|
|
1225
|
+
exports.networkRoute = networkRoute;
|
|
780
1226
|
exports.toAISdkFormat = toAISdkFormat;
|
|
1227
|
+
exports.workflowRoute = workflowRoute;
|
|
781
1228
|
//# sourceMappingURL=index.cjs.map
|
|
782
1229
|
//# sourceMappingURL=index.cjs.map
|