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

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