@mastra/ai-sdk 0.0.0-toolOptionTypes-20250917085558 → 0.0.0-trace-timeline-update-20251121114225

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