@mastra/ai-sdk 0.0.0-pgvector-index-fix-20250905222058 → 0.0.0-playground-studio-cloud-20251031080052

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