@mastra/ai-sdk 0.0.0-pgvector-index-fix-20250905222058 → 0.0.0-playground-studio-again-20251114100107

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