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