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