@mastra/ai-sdk 0.0.0-vector-extension-schema-20250922130418 → 0.0.0-vnext-20251104230439

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