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