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