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

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