@mastra/ai-sdk 0.0.0-ai-telementry-ui-20250908102126 → 0.0.0-ai-sdk-network-text-delta-20251017172601

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,8 +1,894 @@
1
1
  'use strict';
2
2
 
3
3
  var server = require('@mastra/core/server');
4
+ var ai = require('ai');
5
+ var stream = require('@mastra/core/stream');
4
6
 
5
- // src/index.ts
7
+ // src/chat-route.ts
8
+ function convertMastraChunkToAISDKv5({
9
+ chunk,
10
+ mode = "stream"
11
+ }) {
12
+ switch (chunk.type) {
13
+ case "start":
14
+ return {
15
+ type: "start"
16
+ };
17
+ case "step-start":
18
+ const { messageId: _messageId, ...rest } = chunk.payload;
19
+ return {
20
+ type: "start-step",
21
+ request: rest.request,
22
+ warnings: rest.warnings || []
23
+ };
24
+ case "raw":
25
+ return {
26
+ type: "raw",
27
+ rawValue: chunk.payload
28
+ };
29
+ case "finish": {
30
+ return {
31
+ type: "finish",
32
+ finishReason: chunk.payload.stepResult.reason,
33
+ totalUsage: chunk.payload.output.usage
34
+ };
35
+ }
36
+ case "reasoning-start":
37
+ return {
38
+ type: "reasoning-start",
39
+ id: chunk.payload.id,
40
+ providerMetadata: chunk.payload.providerMetadata
41
+ };
42
+ case "reasoning-delta":
43
+ return {
44
+ type: "reasoning-delta",
45
+ id: chunk.payload.id,
46
+ text: chunk.payload.text,
47
+ providerMetadata: chunk.payload.providerMetadata
48
+ };
49
+ case "reasoning-signature":
50
+ throw new Error('AISDKv5 chunk type "reasoning-signature" not supported');
51
+ // return {
52
+ // type: 'reasoning-signature' as const,
53
+ // id: chunk.payload.id,
54
+ // signature: chunk.payload.signature,
55
+ // };
56
+ case "redacted-reasoning":
57
+ throw new Error('AISDKv5 chunk type "redacted-reasoning" not supported');
58
+ // return {
59
+ // type: 'redacted-reasoning',
60
+ // id: chunk.payload.id,
61
+ // data: chunk.payload.data,
62
+ // };
63
+ case "reasoning-end":
64
+ return {
65
+ type: "reasoning-end",
66
+ id: chunk.payload.id,
67
+ providerMetadata: chunk.payload.providerMetadata
68
+ };
69
+ case "source":
70
+ if (chunk.payload.sourceType === "url") {
71
+ return {
72
+ type: "source",
73
+ sourceType: "url",
74
+ id: chunk.payload.id,
75
+ url: chunk.payload.url,
76
+ title: chunk.payload.title,
77
+ providerMetadata: chunk.payload.providerMetadata
78
+ };
79
+ } else {
80
+ return {
81
+ type: "source",
82
+ sourceType: "document",
83
+ id: chunk.payload.id,
84
+ mediaType: chunk.payload.mimeType,
85
+ title: chunk.payload.title,
86
+ filename: chunk.payload.filename,
87
+ providerMetadata: chunk.payload.providerMetadata
88
+ };
89
+ }
90
+ case "file":
91
+ if (mode === "generate") {
92
+ return {
93
+ type: "file",
94
+ file: new stream.DefaultGeneratedFile({
95
+ data: chunk.payload.data,
96
+ mediaType: chunk.payload.mimeType
97
+ })
98
+ };
99
+ }
100
+ return {
101
+ type: "file",
102
+ file: new stream.DefaultGeneratedFileWithType({
103
+ data: chunk.payload.data,
104
+ mediaType: chunk.payload.mimeType
105
+ })
106
+ };
107
+ case "tool-call":
108
+ return {
109
+ type: "tool-call",
110
+ toolCallId: chunk.payload.toolCallId,
111
+ providerMetadata: chunk.payload.providerMetadata,
112
+ providerExecuted: chunk.payload.providerExecuted,
113
+ toolName: chunk.payload.toolName,
114
+ input: chunk.payload.args
115
+ };
116
+ case "tool-call-input-streaming-start":
117
+ return {
118
+ type: "tool-input-start",
119
+ id: chunk.payload.toolCallId,
120
+ toolName: chunk.payload.toolName,
121
+ dynamic: !!chunk.payload.dynamic,
122
+ providerMetadata: chunk.payload.providerMetadata,
123
+ providerExecuted: chunk.payload.providerExecuted
124
+ };
125
+ case "tool-call-input-streaming-end":
126
+ return {
127
+ type: "tool-input-end",
128
+ id: chunk.payload.toolCallId,
129
+ providerMetadata: chunk.payload.providerMetadata
130
+ };
131
+ case "tool-call-delta":
132
+ return {
133
+ type: "tool-input-delta",
134
+ id: chunk.payload.toolCallId,
135
+ delta: chunk.payload.argsTextDelta,
136
+ providerMetadata: chunk.payload.providerMetadata
137
+ };
138
+ case "step-finish": {
139
+ const { request: _request, providerMetadata, ...rest2 } = chunk.payload.metadata;
140
+ return {
141
+ type: "finish-step",
142
+ response: {
143
+ id: chunk.payload.id || "",
144
+ timestamp: /* @__PURE__ */ new Date(),
145
+ modelId: rest2.modelId || "",
146
+ ...rest2
147
+ },
148
+ usage: chunk.payload.output.usage,
149
+ finishReason: chunk.payload.stepResult.reason,
150
+ providerMetadata
151
+ };
152
+ }
153
+ case "text-delta":
154
+ return {
155
+ type: "text-delta",
156
+ id: chunk.payload.id,
157
+ text: chunk.payload.text,
158
+ providerMetadata: chunk.payload.providerMetadata
159
+ };
160
+ case "text-end":
161
+ return {
162
+ type: "text-end",
163
+ id: chunk.payload.id,
164
+ providerMetadata: chunk.payload.providerMetadata
165
+ };
166
+ case "text-start":
167
+ return {
168
+ type: "text-start",
169
+ id: chunk.payload.id,
170
+ providerMetadata: chunk.payload.providerMetadata
171
+ };
172
+ case "tool-result":
173
+ return {
174
+ type: "tool-result",
175
+ input: chunk.payload.args,
176
+ toolCallId: chunk.payload.toolCallId,
177
+ providerExecuted: chunk.payload.providerExecuted,
178
+ toolName: chunk.payload.toolName,
179
+ output: chunk.payload.result
180
+ // providerMetadata: chunk.payload.providerMetadata, // AI v5 types don't show this?
181
+ };
182
+ case "tool-error":
183
+ return {
184
+ type: "tool-error",
185
+ error: chunk.payload.error,
186
+ input: chunk.payload.args,
187
+ toolCallId: chunk.payload.toolCallId,
188
+ providerExecuted: chunk.payload.providerExecuted,
189
+ toolName: chunk.payload.toolName
190
+ // providerMetadata: chunk.payload.providerMetadata, // AI v5 types don't show this?
191
+ };
192
+ case "abort":
193
+ return {
194
+ type: "abort"
195
+ };
196
+ case "error":
197
+ return {
198
+ type: "error",
199
+ error: chunk.payload.error
200
+ };
201
+ case "object":
202
+ return {
203
+ type: "object",
204
+ object: chunk.object
205
+ };
206
+ default:
207
+ if (chunk.type && "payload" in chunk && chunk.payload) {
208
+ return {
209
+ type: chunk.type,
210
+ ...chunk.payload || {}
211
+ };
212
+ }
213
+ return;
214
+ }
215
+ }
216
+ function convertFullStreamChunkToUIMessageStream({
217
+ part,
218
+ messageMetadataValue,
219
+ sendReasoning,
220
+ sendSources,
221
+ onError,
222
+ sendStart,
223
+ sendFinish,
224
+ responseMessageId
225
+ }) {
226
+ const partType = part.type;
227
+ switch (partType) {
228
+ case "text-start": {
229
+ return {
230
+ type: "text-start",
231
+ id: part.id,
232
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
233
+ };
234
+ }
235
+ case "text-delta": {
236
+ return {
237
+ type: "text-delta",
238
+ id: part.id,
239
+ delta: part.text,
240
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
241
+ };
242
+ }
243
+ case "text-end": {
244
+ return {
245
+ type: "text-end",
246
+ id: part.id,
247
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
248
+ };
249
+ }
250
+ case "reasoning-start": {
251
+ return {
252
+ type: "reasoning-start",
253
+ id: part.id,
254
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
255
+ };
256
+ }
257
+ case "reasoning-delta": {
258
+ return;
259
+ }
260
+ case "reasoning-end": {
261
+ return {
262
+ type: "reasoning-end",
263
+ id: part.id,
264
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
265
+ };
266
+ }
267
+ case "file": {
268
+ return {
269
+ type: "file",
270
+ mediaType: part.file.mediaType,
271
+ url: `data:${part.file.mediaType};base64,${part.file.base64}`
272
+ };
273
+ }
274
+ case "source": {
275
+ return;
276
+ }
277
+ case "tool-input-start": {
278
+ return {
279
+ type: "tool-input-start",
280
+ toolCallId: part.id,
281
+ toolName: part.toolName,
282
+ ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},
283
+ ...part.dynamic != null ? { dynamic: part.dynamic } : {}
284
+ };
285
+ }
286
+ case "tool-input-delta": {
287
+ return {
288
+ type: "tool-input-delta",
289
+ toolCallId: part.id,
290
+ inputTextDelta: part.delta
291
+ };
292
+ }
293
+ case "tool-call": {
294
+ return {
295
+ type: "tool-input-available",
296
+ toolCallId: part.toolCallId,
297
+ toolName: part.toolName,
298
+ input: part.input,
299
+ ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},
300
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {},
301
+ ...part.dynamic != null ? { dynamic: part.dynamic } : {}
302
+ };
303
+ }
304
+ case "tool-result": {
305
+ return {
306
+ type: "tool-output-available",
307
+ toolCallId: part.toolCallId,
308
+ output: part.output,
309
+ ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},
310
+ ...part.dynamic != null ? { dynamic: part.dynamic } : {}
311
+ };
312
+ }
313
+ case "tool-output": {
314
+ if (part.output.from === "AGENT") {
315
+ return {
316
+ type: "tool-agent",
317
+ toolCallId: part.toolCallId,
318
+ payload: part.output
319
+ };
320
+ } else if (part.output.from === "WORKFLOW") {
321
+ return {
322
+ type: "tool-workflow",
323
+ toolCallId: part.toolCallId,
324
+ payload: part.output
325
+ };
326
+ } else if (part.output.from === "NETWORK") {
327
+ return {
328
+ type: "tool-network",
329
+ toolCallId: part.toolCallId,
330
+ payload: part.output
331
+ };
332
+ }
333
+ return;
334
+ }
335
+ case "tool-error": {
336
+ return {
337
+ type: "tool-output-error",
338
+ toolCallId: part.toolCallId,
339
+ errorText: onError(part.error),
340
+ ...part.providerExecuted != null ? { providerExecuted: part.providerExecuted } : {},
341
+ ...part.dynamic != null ? { dynamic: part.dynamic } : {}
342
+ };
343
+ }
344
+ case "error": {
345
+ return {
346
+ type: "error",
347
+ errorText: onError(part.error)
348
+ };
349
+ }
350
+ case "start-step": {
351
+ return { type: "start-step" };
352
+ }
353
+ case "finish-step": {
354
+ return { type: "finish-step" };
355
+ }
356
+ case "start": {
357
+ {
358
+ return {
359
+ type: "start",
360
+ ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {},
361
+ ...responseMessageId != null ? { messageId: responseMessageId } : {}
362
+ };
363
+ }
364
+ }
365
+ case "finish": {
366
+ {
367
+ return {
368
+ type: "finish",
369
+ ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {}
370
+ };
371
+ }
372
+ }
373
+ case "abort": {
374
+ return part;
375
+ }
376
+ case "tool-input-end": {
377
+ return;
378
+ }
379
+ case "raw": {
380
+ return;
381
+ }
382
+ default: {
383
+ const exhaustiveCheck = partType;
384
+ throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);
385
+ }
386
+ }
387
+ }
388
+
389
+ // src/transformers.ts
390
+ function WorkflowStreamToAISDKTransformer() {
391
+ const bufferedWorkflows = /* @__PURE__ */ new Map();
392
+ return new TransformStream({
393
+ start(controller) {
394
+ controller.enqueue({
395
+ type: "start"
396
+ });
397
+ },
398
+ flush(controller) {
399
+ controller.enqueue({
400
+ type: "finish"
401
+ });
402
+ },
403
+ transform(chunk, controller) {
404
+ const transformed = transformWorkflow(chunk, bufferedWorkflows);
405
+ if (transformed) controller.enqueue(transformed);
406
+ }
407
+ });
408
+ }
409
+ function AgentNetworkToAISDKTransformer() {
410
+ const bufferedNetworks = /* @__PURE__ */ new Map();
411
+ return new TransformStream({
412
+ start(controller) {
413
+ controller.enqueue({
414
+ type: "start"
415
+ });
416
+ },
417
+ flush(controller) {
418
+ controller.enqueue({
419
+ type: "finish"
420
+ });
421
+ },
422
+ transform(chunk, controller) {
423
+ const transformed = transformNetwork(chunk, bufferedNetworks);
424
+ if (transformed) controller.enqueue(transformed);
425
+ }
426
+ });
427
+ }
428
+ function AgentStreamToAISDKTransformer() {
429
+ let bufferedSteps = /* @__PURE__ */ new Map();
430
+ return new TransformStream({
431
+ transform(chunk, controller) {
432
+ const part = convertMastraChunkToAISDKv5({ chunk, mode: "stream" });
433
+ const transformedChunk = convertFullStreamChunkToUIMessageStream({
434
+ part,
435
+ sendReasoning: false,
436
+ sendSources: false,
437
+ sendStart: true,
438
+ sendFinish: true,
439
+ responseMessageId: chunk.runId,
440
+ onError() {
441
+ return "Error";
442
+ }
443
+ });
444
+ if (transformedChunk) {
445
+ if (transformedChunk.type === "tool-agent") {
446
+ const payload = transformedChunk.payload;
447
+ const agentTransformed = transformAgent(payload, bufferedSteps);
448
+ if (agentTransformed) controller.enqueue(agentTransformed);
449
+ } else if (transformedChunk.type === "tool-workflow") {
450
+ const payload = transformedChunk.payload;
451
+ const workflowChunk = transformWorkflow(payload, bufferedSteps, true);
452
+ if (workflowChunk) controller.enqueue(workflowChunk);
453
+ } else if (transformedChunk.type === "tool-network") {
454
+ const payload = transformedChunk.payload;
455
+ const networkChunk = transformNetwork(payload, bufferedSteps, true);
456
+ if (networkChunk) controller.enqueue(networkChunk);
457
+ } else {
458
+ controller.enqueue(transformedChunk);
459
+ }
460
+ }
461
+ }
462
+ });
463
+ }
464
+ function transformAgent(payload, bufferedSteps) {
465
+ let hasChanged = false;
466
+ switch (payload.type) {
467
+ case "start":
468
+ bufferedSteps.set(payload.runId, {
469
+ id: payload.payload.id,
470
+ object: null,
471
+ finishReason: null,
472
+ usage: null,
473
+ warnings: [],
474
+ text: "",
475
+ reasoning: [],
476
+ sources: [],
477
+ files: [],
478
+ toolCalls: [],
479
+ toolResults: [],
480
+ request: {},
481
+ response: {
482
+ id: "",
483
+ timestamp: /* @__PURE__ */ new Date(),
484
+ modelId: "",
485
+ messages: []
486
+ },
487
+ providerMetadata: void 0,
488
+ steps: [],
489
+ status: "running"
490
+ });
491
+ hasChanged = true;
492
+ break;
493
+ case "finish":
494
+ bufferedSteps.set(payload.runId, {
495
+ ...bufferedSteps.get(payload.runId),
496
+ finishReason: payload.payload.stepResult.reason,
497
+ usage: payload.payload?.output?.usage,
498
+ warnings: payload.payload?.stepResult?.warnings,
499
+ steps: bufferedSteps.get(payload.runId).steps,
500
+ status: "finished"
501
+ });
502
+ hasChanged = true;
503
+ break;
504
+ case "text-delta":
505
+ const prevData = bufferedSteps.get(payload.runId);
506
+ bufferedSteps.set(payload.runId, {
507
+ ...prevData,
508
+ text: `${prevData.text}${payload.payload.text}`
509
+ });
510
+ hasChanged = true;
511
+ break;
512
+ case "reasoning-delta":
513
+ bufferedSteps.set(payload.runId, {
514
+ ...bufferedSteps.get(payload.runId),
515
+ reasoning: [...bufferedSteps.get(payload.runId).reasoning, payload.payload.text]
516
+ });
517
+ hasChanged = true;
518
+ break;
519
+ case "source":
520
+ bufferedSteps.set(payload.runId, {
521
+ ...bufferedSteps.get(payload.runId),
522
+ sources: [...bufferedSteps.get(payload.runId).sources, payload.payload]
523
+ });
524
+ hasChanged = true;
525
+ break;
526
+ case "file":
527
+ bufferedSteps.set(payload.runId, {
528
+ ...bufferedSteps.get(payload.runId),
529
+ files: [...bufferedSteps.get(payload.runId).files, payload.payload]
530
+ });
531
+ hasChanged = true;
532
+ break;
533
+ case "tool-call":
534
+ bufferedSteps.set(payload.runId, {
535
+ ...bufferedSteps.get(payload.runId),
536
+ toolCalls: [...bufferedSteps.get(payload.runId).toolCalls, payload.payload]
537
+ });
538
+ hasChanged = true;
539
+ break;
540
+ case "tool-result":
541
+ bufferedSteps.set(payload.runId, {
542
+ ...bufferedSteps.get(payload.runId),
543
+ toolResults: [...bufferedSteps.get(payload.runId).toolResults, payload.payload]
544
+ });
545
+ hasChanged = true;
546
+ break;
547
+ case "object-result":
548
+ bufferedSteps.set(payload.runId, {
549
+ ...bufferedSteps.get(payload.runId),
550
+ object: payload.object
551
+ });
552
+ hasChanged = true;
553
+ break;
554
+ case "object":
555
+ bufferedSteps.set(payload.runId, {
556
+ ...bufferedSteps.get(payload.runId),
557
+ object: payload.object
558
+ });
559
+ hasChanged = true;
560
+ break;
561
+ case "step-finish":
562
+ const currentRun = bufferedSteps.get(payload.runId);
563
+ const stepResult = {
564
+ ...bufferedSteps.get(payload.runId),
565
+ stepType: currentRun.steps.length === 0 ? "initial" : "tool-result",
566
+ reasoningText: bufferedSteps.get(payload.runId).reasoning.join(""),
567
+ staticToolCalls: bufferedSteps.get(payload.runId).toolCalls.filter((part) => part.type === "tool-call" && part.payload?.dynamic === false),
568
+ dynamicToolCalls: bufferedSteps.get(payload.runId).toolCalls.filter((part) => part.type === "tool-call" && part.payload?.dynamic === true),
569
+ staticToolResults: bufferedSteps.get(payload.runId).toolResults.filter((part) => part.type === "tool-result" && part.payload?.dynamic === false),
570
+ dynamicToolResults: bufferedSteps.get(payload.runId).toolResults.filter((part) => part.type === "tool-result" && part.payload?.dynamic === true),
571
+ finishReason: payload.payload.stepResult.reason,
572
+ usage: payload.payload.output.usage,
573
+ warnings: payload.payload.stepResult.warnings || [],
574
+ response: {
575
+ id: payload.payload.id || "",
576
+ timestamp: payload.payload.metadata?.timestamp || /* @__PURE__ */ new Date(),
577
+ modelId: payload.payload.metadata?.modelId || payload.payload.metadata?.model || "",
578
+ ...bufferedSteps.get(payload.runId).response,
579
+ messages: bufferedSteps.get(payload.runId).response.messages || []
580
+ }
581
+ };
582
+ bufferedSteps.set(payload.runId, {
583
+ ...bufferedSteps.get(payload.runId),
584
+ usage: payload.payload.output.usage,
585
+ warnings: payload.payload.stepResult.warnings || [],
586
+ steps: [...bufferedSteps.get(payload.runId).steps, stepResult]
587
+ });
588
+ hasChanged = true;
589
+ break;
590
+ }
591
+ if (hasChanged) {
592
+ return {
593
+ type: "data-tool-agent",
594
+ id: payload.runId,
595
+ data: bufferedSteps.get(payload.runId)
596
+ };
597
+ }
598
+ return null;
599
+ }
600
+ function transformWorkflow(payload, bufferedWorkflows, isNested) {
601
+ switch (payload.type) {
602
+ case "workflow-start":
603
+ bufferedWorkflows.set(payload.runId, {
604
+ name: payload.payload.workflowId,
605
+ steps: {}
606
+ });
607
+ return {
608
+ type: isNested ? "data-tool-workflow" : "data-workflow",
609
+ id: payload.runId,
610
+ data: {
611
+ name: bufferedWorkflows.get(payload.runId).name,
612
+ status: "running",
613
+ steps: bufferedWorkflows.get(payload.runId).steps,
614
+ output: null
615
+ }
616
+ };
617
+ case "workflow-step-start": {
618
+ const current = bufferedWorkflows.get(payload.runId) || { name: "", steps: {} };
619
+ current.steps[payload.payload.id] = {
620
+ name: payload.payload.id,
621
+ status: payload.payload.status,
622
+ input: payload.payload.payload ?? null,
623
+ output: null
624
+ };
625
+ bufferedWorkflows.set(payload.runId, current);
626
+ return {
627
+ type: isNested ? "data-tool-workflow" : "data-workflow",
628
+ id: payload.runId,
629
+ data: {
630
+ name: current.name,
631
+ status: "running",
632
+ steps: current.steps,
633
+ output: null
634
+ }
635
+ };
636
+ }
637
+ case "workflow-step-result": {
638
+ const current = bufferedWorkflows.get(payload.runId);
639
+ if (!current) return null;
640
+ current.steps[payload.payload.id] = {
641
+ ...current.steps[payload.payload.id],
642
+ status: payload.payload.status,
643
+ output: payload.payload.output ?? null
644
+ };
645
+ return {
646
+ type: isNested ? "data-tool-workflow" : "data-workflow",
647
+ id: payload.runId,
648
+ data: {
649
+ name: current.name,
650
+ status: "running",
651
+ steps: current.steps,
652
+ output: null
653
+ }
654
+ };
655
+ }
656
+ case "workflow-finish": {
657
+ const current = bufferedWorkflows.get(payload.runId);
658
+ if (!current) return null;
659
+ return {
660
+ type: isNested ? "data-tool-workflow" : "data-workflow",
661
+ id: payload.runId,
662
+ data: {
663
+ name: current.name,
664
+ steps: current.steps,
665
+ output: payload.payload.output ?? null,
666
+ status: payload.payload.workflowStatus
667
+ }
668
+ };
669
+ }
670
+ default:
671
+ return null;
672
+ }
673
+ }
674
+ function transformNetwork(payload, bufferedNetworks, isNested) {
675
+ switch (payload.type) {
676
+ case "routing-agent-start": {
677
+ if (!bufferedNetworks.has(payload.payload.runId)) {
678
+ bufferedNetworks.set(payload.payload.runId, {
679
+ name: payload.payload.agentId,
680
+ steps: []
681
+ });
682
+ }
683
+ return {
684
+ type: isNested ? "data-tool-network" : "data-network",
685
+ id: payload.payload.runId,
686
+ data: {
687
+ name: bufferedNetworks.get(payload.payload.runId).name,
688
+ status: "running",
689
+ steps: bufferedNetworks.get(payload.payload.runId).steps,
690
+ output: null
691
+ }
692
+ };
693
+ }
694
+ case "routing-agent-text-start": {
695
+ const current = bufferedNetworks.get(payload.runId);
696
+ if (!current) return null;
697
+ return {
698
+ type: "text-start",
699
+ id: payload.runId
700
+ };
701
+ }
702
+ case "routing-agent-text-delta": {
703
+ const current = bufferedNetworks.get(payload.runId);
704
+ if (!current) return null;
705
+ return {
706
+ type: "text-delta",
707
+ id: payload.runId,
708
+ delta: payload.payload.text
709
+ };
710
+ }
711
+ case "agent-execution-start": {
712
+ const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
713
+ current.steps.push({
714
+ name: payload.payload.agentId,
715
+ status: "running",
716
+ input: payload.payload.args || null,
717
+ output: null
718
+ });
719
+ bufferedNetworks.set(payload.payload.runId, current);
720
+ return {
721
+ type: isNested ? "data-tool-network" : "data-network",
722
+ id: payload.payload.runId,
723
+ data: {
724
+ name: current.name,
725
+ status: "running",
726
+ steps: current.steps,
727
+ output: null
728
+ }
729
+ };
730
+ }
731
+ case "workflow-execution-start": {
732
+ const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
733
+ current.steps.push({
734
+ name: payload.payload.name,
735
+ status: "running",
736
+ input: payload.payload.args || null,
737
+ output: null
738
+ });
739
+ bufferedNetworks.set(payload.payload.runId, current);
740
+ return {
741
+ type: isNested ? "data-tool-network" : "data-network",
742
+ id: payload.payload.runId,
743
+ data: {
744
+ name: current.name,
745
+ status: "running",
746
+ steps: current.steps,
747
+ output: null
748
+ }
749
+ };
750
+ }
751
+ case "tool-execution-start": {
752
+ const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
753
+ current.steps.push({
754
+ name: payload.payload.args?.toolName,
755
+ status: "running",
756
+ input: payload.payload.args?.args || null,
757
+ output: null
758
+ });
759
+ bufferedNetworks.set(payload.payload.runId, current);
760
+ return {
761
+ type: isNested ? "data-tool-network" : "data-network",
762
+ id: payload.payload.runId,
763
+ data: {
764
+ name: current.name,
765
+ status: "running",
766
+ steps: current.steps,
767
+ output: null
768
+ }
769
+ };
770
+ }
771
+ case "agent-execution-end": {
772
+ const current = bufferedNetworks.get(payload.runId);
773
+ if (!current) return null;
774
+ current.steps.push({
775
+ name: payload.payload.agentId,
776
+ status: "success",
777
+ input: null,
778
+ output: payload.payload.result
779
+ });
780
+ return {
781
+ type: isNested ? "data-tool-network" : "data-network",
782
+ id: payload.runId,
783
+ data: {
784
+ name: current.name,
785
+ status: "running",
786
+ steps: current.steps,
787
+ output: payload.payload.result ?? null
788
+ }
789
+ };
790
+ }
791
+ case "tool-execution-end": {
792
+ const current = bufferedNetworks.get(payload.runId);
793
+ if (!current) return null;
794
+ current.steps.push({
795
+ name: payload.payload.toolName,
796
+ status: "success",
797
+ input: null,
798
+ output: payload.payload.result
799
+ });
800
+ return {
801
+ type: isNested ? "data-tool-network" : "data-network",
802
+ id: payload.runId,
803
+ data: {
804
+ name: current.name,
805
+ status: "running",
806
+ steps: current.steps,
807
+ output: payload.payload.result ?? null
808
+ }
809
+ };
810
+ }
811
+ case "workflow-execution-end": {
812
+ const current = bufferedNetworks.get(payload.runId);
813
+ if (!current) return null;
814
+ current.steps.push({
815
+ name: payload.payload.name,
816
+ status: "success",
817
+ input: null,
818
+ output: payload.payload.result
819
+ });
820
+ return {
821
+ type: isNested ? "data-tool-network" : "data-network",
822
+ id: payload.runId,
823
+ data: {
824
+ name: current.name,
825
+ status: "running",
826
+ steps: current.steps,
827
+ output: payload.payload.result ?? null
828
+ }
829
+ };
830
+ }
831
+ case "routing-agent-end": {
832
+ const current = bufferedNetworks.get(payload.payload.runId);
833
+ if (!current) return null;
834
+ return {
835
+ type: isNested ? "data-tool-network" : "data-network",
836
+ id: payload.payload.runId,
837
+ data: {
838
+ name: current.name,
839
+ status: "finished",
840
+ steps: current.steps,
841
+ output: payload.payload?.result ?? null
842
+ }
843
+ };
844
+ }
845
+ case "network-execution-event-step-finish": {
846
+ const current = bufferedNetworks.get(payload.payload.runId);
847
+ if (!current) return null;
848
+ return {
849
+ type: isNested ? "data-tool-network" : "data-network",
850
+ id: payload.payload.runId,
851
+ data: {
852
+ name: current.name,
853
+ status: "finished",
854
+ steps: current.steps,
855
+ output: payload.payload?.result ?? null
856
+ }
857
+ };
858
+ }
859
+ case "network-execution-event-finish": {
860
+ const current = bufferedNetworks.get(payload.runId);
861
+ if (!current) return null;
862
+ return {
863
+ type: isNested ? "data-tool-network" : "data-network",
864
+ id: payload.runId,
865
+ data: {
866
+ name: current.name,
867
+ status: "finished",
868
+ steps: current.steps,
869
+ output: payload.payload?.result ?? null
870
+ }
871
+ };
872
+ }
873
+ default:
874
+ return null;
875
+ }
876
+ }
877
+
878
+ // src/to-ai-sdk-format.ts
879
+ function toAISdkFormat(stream, options = { from: "agent" }) {
880
+ const from = options?.from;
881
+ if (from === "workflow") {
882
+ return stream.pipeThrough(WorkflowStreamToAISDKTransformer());
883
+ }
884
+ if (from === "network") {
885
+ return stream.pipeThrough(AgentNetworkToAISDKTransformer());
886
+ }
887
+ const agentReadable = "fullStream" in stream ? stream.fullStream : stream;
888
+ return agentReadable.pipeThrough(AgentStreamToAISDKTransformer());
889
+ }
890
+
891
+ // src/chat-route.ts
6
892
  function chatRoute({
7
893
  path = "/chat/:agentId",
8
894
  agent,
@@ -107,6 +993,7 @@ function chatRoute({
107
993
  handler: async (c) => {
108
994
  const { messages, ...rest } = await c.req.json();
109
995
  const mastra = c.get("mastra");
996
+ const runtimeContext = c.get("runtimeContext");
110
997
  let agentToUse = agent;
111
998
  if (!agent) {
112
999
  const agentId = c.req.param("agentId");
@@ -117,6 +1004,9 @@ function chatRoute({
117
1004
  `Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
118
1005
  );
119
1006
  }
1007
+ if (runtimeContext && defaultOptions?.runtimeContext) {
1008
+ mastra.getLogger()?.warn(`"runtimeContext" set in the route options will be overridden by the request's "runtimeContext".`);
1009
+ }
120
1010
  if (!agentToUse) {
121
1011
  throw new Error("Agent ID is required");
122
1012
  }
@@ -124,16 +1014,205 @@ function chatRoute({
124
1014
  if (!agentObj) {
125
1015
  throw new Error(`Agent ${agentToUse} not found`);
126
1016
  }
127
- const result = await agentObj.streamVNext(messages, {
1017
+ const result = await agentObj.stream(messages, {
128
1018
  ...defaultOptions,
129
1019
  ...rest,
130
- format: "aisdk"
1020
+ runtimeContext: runtimeContext || defaultOptions?.runtimeContext
1021
+ });
1022
+ const uiMessageStream = ai.createUIMessageStream({
1023
+ originalMessages: messages,
1024
+ execute: async ({ writer }) => {
1025
+ for await (const part of toAISdkFormat(result, { from: "agent" })) {
1026
+ writer.write(part);
1027
+ }
1028
+ }
1029
+ });
1030
+ return ai.createUIMessageStreamResponse({
1031
+ stream: uiMessageStream
1032
+ });
1033
+ }
1034
+ });
1035
+ }
1036
+ function workflowRoute({
1037
+ path = "/api/workflows/:workflowId/stream",
1038
+ workflow
1039
+ }) {
1040
+ if (!workflow && !path.includes("/:workflowId")) {
1041
+ throw new Error("Path must include :workflowId to route to the correct workflow or pass the workflow explicitly");
1042
+ }
1043
+ return server.registerApiRoute(path, {
1044
+ method: "POST",
1045
+ openapi: {
1046
+ summary: "Stream a workflow in AI SDK format",
1047
+ description: "Starts a workflow run and streams events as AI SDK UIMessage chunks",
1048
+ tags: ["ai-sdk"],
1049
+ parameters: [
1050
+ {
1051
+ name: "workflowId",
1052
+ in: "path",
1053
+ required: true,
1054
+ description: "The ID of the workflow to stream",
1055
+ schema: { type: "string" }
1056
+ }
1057
+ ],
1058
+ requestBody: {
1059
+ required: true,
1060
+ content: {
1061
+ "application/json": {
1062
+ schema: {
1063
+ type: "object",
1064
+ properties: {
1065
+ inputData: { type: "object", additionalProperties: true },
1066
+ runtimeContext: { type: "object", additionalProperties: true },
1067
+ tracingOptions: { type: "object", additionalProperties: true }
1068
+ }
1069
+ }
1070
+ }
1071
+ }
1072
+ },
1073
+ responses: {
1074
+ "200": {
1075
+ description: "Workflow UIMessage event stream",
1076
+ content: {
1077
+ "text/plain": {
1078
+ schema: { type: "string", description: "SSE stream" }
1079
+ }
1080
+ }
1081
+ }
1082
+ }
1083
+ },
1084
+ handler: async (c) => {
1085
+ const { inputData, ...rest } = await c.req.json();
1086
+ const mastra = c.get("mastra");
1087
+ let workflowToUse = workflow;
1088
+ if (!workflow) {
1089
+ const workflowId = c.req.param("workflowId");
1090
+ workflowToUse = workflowId;
1091
+ }
1092
+ if (c.req.param("workflowId") && workflow) {
1093
+ mastra.getLogger()?.warn(
1094
+ `Fixed workflow ID was set together with a workflowId path parameter. This can lead to unexpected behavior.`
1095
+ );
1096
+ }
1097
+ if (!workflowToUse) {
1098
+ throw new Error("Workflow ID is required");
1099
+ }
1100
+ const workflowObj = mastra.getWorkflow(workflowToUse);
1101
+ if (!workflowObj) {
1102
+ throw new Error(`Workflow ${workflowToUse} not found`);
1103
+ }
1104
+ const run = await workflowObj.createRunAsync();
1105
+ const stream = run.streamVNext({ inputData, ...rest });
1106
+ const uiMessageStream = ai.createUIMessageStream({
1107
+ execute: async ({ writer }) => {
1108
+ for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
1109
+ writer.write(part);
1110
+ }
1111
+ }
1112
+ });
1113
+ return ai.createUIMessageStreamResponse({ stream: uiMessageStream });
1114
+ }
1115
+ });
1116
+ }
1117
+ function networkRoute({
1118
+ path = "/network/:agentId",
1119
+ agent,
1120
+ defaultOptions
1121
+ }) {
1122
+ if (!agent && !path.includes("/:agentId")) {
1123
+ throw new Error("Path must include :agentId to route to the correct agent or pass the agent explicitly");
1124
+ }
1125
+ return server.registerApiRoute(path, {
1126
+ method: "POST",
1127
+ openapi: {
1128
+ summary: "Execute an agent network and stream AI SDK events",
1129
+ description: "Routes a request to an agent network and streams UIMessage chunks in AI SDK format",
1130
+ tags: ["ai-sdk"],
1131
+ parameters: [
1132
+ {
1133
+ name: "agentId",
1134
+ in: "path",
1135
+ required: true,
1136
+ description: "The ID of the routing agent to execute as a network",
1137
+ schema: { type: "string" }
1138
+ }
1139
+ ],
1140
+ requestBody: {
1141
+ required: true,
1142
+ content: {
1143
+ "application/json": {
1144
+ schema: {
1145
+ type: "object",
1146
+ properties: {
1147
+ messages: { type: "array", items: { type: "object" } },
1148
+ runtimeContext: { type: "object", additionalProperties: true },
1149
+ runId: { type: "string" },
1150
+ maxSteps: { type: "number" },
1151
+ threadId: { type: "string" },
1152
+ resourceId: { type: "string" },
1153
+ modelSettings: { type: "object", additionalProperties: true },
1154
+ telemetry: { type: "object", additionalProperties: true },
1155
+ tools: { type: "array", items: { type: "object" } }
1156
+ },
1157
+ required: ["messages"]
1158
+ }
1159
+ }
1160
+ }
1161
+ },
1162
+ responses: {
1163
+ "200": {
1164
+ description: "Streaming AI SDK UIMessage event stream for the agent network",
1165
+ content: { "text/plain": { schema: { type: "string", description: "SSE stream" } } }
1166
+ },
1167
+ "404": {
1168
+ description: "Agent not found",
1169
+ content: {
1170
+ "application/json": {
1171
+ schema: { type: "object", properties: { error: { type: "string" } } }
1172
+ }
1173
+ }
1174
+ }
1175
+ }
1176
+ },
1177
+ handler: async (c) => {
1178
+ const { messages, ...rest } = await c.req.json();
1179
+ const mastra = c.get("mastra");
1180
+ let agentToUse = agent;
1181
+ if (!agent) {
1182
+ const agentId = c.req.param("agentId");
1183
+ agentToUse = agentId;
1184
+ }
1185
+ if (c.req.param("agentId") && agent) {
1186
+ mastra.getLogger()?.warn(
1187
+ `Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
1188
+ );
1189
+ }
1190
+ if (!agentToUse) {
1191
+ throw new Error("Agent ID is required");
1192
+ }
1193
+ const agentObj = mastra.getAgent(agentToUse);
1194
+ if (!agentObj) {
1195
+ throw new Error(`Agent ${agentToUse} not found`);
1196
+ }
1197
+ const result = await agentObj.network(messages, {
1198
+ ...defaultOptions,
1199
+ ...rest
1200
+ });
1201
+ const uiMessageStream = ai.createUIMessageStream({
1202
+ execute: async ({ writer }) => {
1203
+ for await (const part of toAISdkFormat(result, { from: "network" })) {
1204
+ writer.write(part);
1205
+ }
1206
+ }
131
1207
  });
132
- return result.toUIMessageStreamResponse();
1208
+ return ai.createUIMessageStreamResponse({ stream: uiMessageStream });
133
1209
  }
134
1210
  });
135
1211
  }
136
1212
 
137
1213
  exports.chatRoute = chatRoute;
1214
+ exports.networkRoute = networkRoute;
1215
+ exports.toAISdkFormat = toAISdkFormat;
1216
+ exports.workflowRoute = workflowRoute;
138
1217
  //# sourceMappingURL=index.cjs.map
139
1218
  //# sourceMappingURL=index.cjs.map