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