@mastra/ai-sdk 1.4.1-alpha.0 → 1.4.1-alpha.1
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 +11 -0
- package/dist/index.cjs +109 -61
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +109 -61
- package/dist/index.js.map +1 -1
- package/dist/transformers.d.ts +20 -42
- package/dist/transformers.d.ts.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @mastra/ai-sdk
|
|
2
2
|
|
|
3
|
+
## 1.4.1-alpha.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fixed workflow streaming in @mastra/ai-sdk so intermediate `data-workflow` parts stop repeating every completed step output. Added `data-workflow-step` parts with the full payload for the step that just changed, which reduces stream size for long-running workflows while preserving final workflow outputs. ([#15218](https://github.com/mastra-ai/mastra/pull/15218))
|
|
8
|
+
|
|
9
|
+
If your UI reads live step outputs during workflow execution, it should now consume `data-workflow-step` parts in addition to `data-workflow`. Final workflow snapshots still include the full step outputs.
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [[`3d83d06`](https://github.com/mastra-ai/mastra/commit/3d83d06f776f00fb5f4163dddd32a030c5c20844), [`7e0e63e`](https://github.com/mastra-ai/mastra/commit/7e0e63e2e485e84442351f4c7a79a424c83539dc), [`9467ea8`](https://github.com/mastra-ai/mastra/commit/9467ea87695749a53dfc041576410ebf9ee7bb67), [`7338d94`](https://github.com/mastra-ai/mastra/commit/7338d949380cf68b095342e8e42610dc51d557c1)]:
|
|
12
|
+
- @mastra/core@1.26.0-alpha.2
|
|
13
|
+
|
|
3
14
|
## 1.4.1-alpha.0
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
package/dist/index.cjs
CHANGED
|
@@ -12219,6 +12219,45 @@ function convertFullStreamChunkToUIMessageStream({
|
|
|
12219
12219
|
|
|
12220
12220
|
// src/transformers.ts
|
|
12221
12221
|
var PRIMITIVE_CACHE_SYMBOL = /* @__PURE__ */ Symbol("primitive-cache");
|
|
12222
|
+
function cloneWorkflowStep(step, includeOutput) {
|
|
12223
|
+
return {
|
|
12224
|
+
name: step.name,
|
|
12225
|
+
status: step.status,
|
|
12226
|
+
input: step.input,
|
|
12227
|
+
output: includeOutput ? step.output : null,
|
|
12228
|
+
suspendPayload: step.suspendPayload,
|
|
12229
|
+
resumePayload: step.resumePayload
|
|
12230
|
+
};
|
|
12231
|
+
}
|
|
12232
|
+
function serializeWorkflowSteps(steps, { includeOutputs }) {
|
|
12233
|
+
return Object.fromEntries(Object.entries(steps).map(([id, step]) => [id, cloneWorkflowStep(step, includeOutputs)]));
|
|
12234
|
+
}
|
|
12235
|
+
function createWorkflowDataPart(args) {
|
|
12236
|
+
const { current, isNested, runId, status, includeOutputs = false, output = null } = args;
|
|
12237
|
+
return {
|
|
12238
|
+
type: isNested ? "data-tool-workflow" : "data-workflow",
|
|
12239
|
+
id: runId,
|
|
12240
|
+
data: {
|
|
12241
|
+
name: current.name,
|
|
12242
|
+
status,
|
|
12243
|
+
steps: serializeWorkflowSteps(current.steps, { includeOutputs }),
|
|
12244
|
+
output
|
|
12245
|
+
}
|
|
12246
|
+
};
|
|
12247
|
+
}
|
|
12248
|
+
function createWorkflowStepDataPart(args) {
|
|
12249
|
+
const { current, isNested, runId, status, stepId } = args;
|
|
12250
|
+
return {
|
|
12251
|
+
type: isNested ? "data-tool-workflow-step" : "data-workflow-step",
|
|
12252
|
+
id: `${runId}:${stepId}`,
|
|
12253
|
+
data: {
|
|
12254
|
+
name: current.name,
|
|
12255
|
+
status,
|
|
12256
|
+
stepId,
|
|
12257
|
+
step: cloneWorkflowStep(current.steps[stepId], true)
|
|
12258
|
+
}
|
|
12259
|
+
};
|
|
12260
|
+
}
|
|
12222
12261
|
function createWorkflowStreamToAISDKTransformer(convertMastraChunkToAISDK, {
|
|
12223
12262
|
includeTextStreamParts,
|
|
12224
12263
|
sendReasoning,
|
|
@@ -12248,12 +12287,14 @@ function createWorkflowStreamToAISDKTransformer(convertMastraChunkToAISDK, {
|
|
|
12248
12287
|
},
|
|
12249
12288
|
convertMastraChunkToAISDK
|
|
12250
12289
|
);
|
|
12251
|
-
if (
|
|
12252
|
-
|
|
12253
|
-
|
|
12290
|
+
if (transformed) {
|
|
12291
|
+
if (Array.isArray(transformed)) {
|
|
12292
|
+
for (const item of transformed) {
|
|
12293
|
+
controller.enqueue(item);
|
|
12294
|
+
}
|
|
12295
|
+
} else {
|
|
12296
|
+
controller.enqueue(transformed);
|
|
12254
12297
|
}
|
|
12255
|
-
} else if (transformed) {
|
|
12256
|
-
controller.enqueue(transformed);
|
|
12257
12298
|
}
|
|
12258
12299
|
}
|
|
12259
12300
|
});
|
|
@@ -12370,12 +12411,14 @@ function createAgentStreamToAISDKTransformer(convertMastraChunkToAISDK, {
|
|
|
12370
12411
|
void 0,
|
|
12371
12412
|
convertMastraChunkToAISDK
|
|
12372
12413
|
);
|
|
12373
|
-
if (
|
|
12374
|
-
|
|
12375
|
-
|
|
12414
|
+
if (workflowChunk) {
|
|
12415
|
+
if (Array.isArray(workflowChunk)) {
|
|
12416
|
+
for (const item of workflowChunk) {
|
|
12417
|
+
controller.enqueue(item);
|
|
12418
|
+
}
|
|
12419
|
+
} else {
|
|
12420
|
+
controller.enqueue(workflowChunk);
|
|
12376
12421
|
}
|
|
12377
|
-
} else if (workflowChunk) {
|
|
12378
|
-
controller.enqueue(workflowChunk);
|
|
12379
12422
|
}
|
|
12380
12423
|
} else if (transformedChunk.type === "tool-network") {
|
|
12381
12424
|
const payload = transformedChunk.payload;
|
|
@@ -12650,16 +12693,12 @@ function transformWorkflow(payload, bufferedWorkflows, isNested, includeTextStre
|
|
|
12650
12693
|
name: payload.payload.workflowId,
|
|
12651
12694
|
steps: {}
|
|
12652
12695
|
});
|
|
12653
|
-
return {
|
|
12654
|
-
|
|
12655
|
-
|
|
12656
|
-
|
|
12657
|
-
|
|
12658
|
-
|
|
12659
|
-
steps: bufferedWorkflows.get(payload.runId).steps,
|
|
12660
|
-
output: null
|
|
12661
|
-
}
|
|
12662
|
-
};
|
|
12696
|
+
return createWorkflowDataPart({
|
|
12697
|
+
current: bufferedWorkflows.get(payload.runId),
|
|
12698
|
+
isNested,
|
|
12699
|
+
runId: payload.runId,
|
|
12700
|
+
status: "running"
|
|
12701
|
+
});
|
|
12663
12702
|
case "workflow-step-start": {
|
|
12664
12703
|
const current = bufferedWorkflows.get(payload.runId) || { name: "", steps: {} };
|
|
12665
12704
|
current.steps[payload.payload.id] = {
|
|
@@ -12671,16 +12710,12 @@ function transformWorkflow(payload, bufferedWorkflows, isNested, includeTextStre
|
|
|
12671
12710
|
resumePayload: null
|
|
12672
12711
|
};
|
|
12673
12712
|
bufferedWorkflows.set(payload.runId, current);
|
|
12674
|
-
return {
|
|
12675
|
-
|
|
12676
|
-
|
|
12677
|
-
|
|
12678
|
-
|
|
12679
|
-
|
|
12680
|
-
steps: current.steps,
|
|
12681
|
-
output: null
|
|
12682
|
-
}
|
|
12683
|
-
};
|
|
12713
|
+
return createWorkflowDataPart({
|
|
12714
|
+
current,
|
|
12715
|
+
isNested,
|
|
12716
|
+
runId: payload.runId,
|
|
12717
|
+
status: "running"
|
|
12718
|
+
});
|
|
12684
12719
|
}
|
|
12685
12720
|
case "workflow-step-result": {
|
|
12686
12721
|
const current = bufferedWorkflows.get(payload.runId);
|
|
@@ -12690,16 +12725,21 @@ function transformWorkflow(payload, bufferedWorkflows, isNested, includeTextStre
|
|
|
12690
12725
|
status: payload.payload.status,
|
|
12691
12726
|
output: payload.payload.output ?? null
|
|
12692
12727
|
};
|
|
12693
|
-
return
|
|
12694
|
-
|
|
12695
|
-
|
|
12696
|
-
|
|
12697
|
-
|
|
12728
|
+
return [
|
|
12729
|
+
createWorkflowDataPart({
|
|
12730
|
+
current,
|
|
12731
|
+
isNested,
|
|
12732
|
+
runId: payload.runId,
|
|
12733
|
+
status: "running"
|
|
12734
|
+
}),
|
|
12735
|
+
createWorkflowStepDataPart({
|
|
12736
|
+
current,
|
|
12737
|
+
isNested,
|
|
12738
|
+
runId: payload.runId,
|
|
12698
12739
|
status: "running",
|
|
12699
|
-
|
|
12700
|
-
|
|
12701
|
-
|
|
12702
|
-
};
|
|
12740
|
+
stepId: payload.payload.id
|
|
12741
|
+
})
|
|
12742
|
+
];
|
|
12703
12743
|
}
|
|
12704
12744
|
case "workflow-step-suspended": {
|
|
12705
12745
|
const current = bufferedWorkflows.get(payload.runId);
|
|
@@ -12711,30 +12751,33 @@ function transformWorkflow(payload, bufferedWorkflows, isNested, includeTextStre
|
|
|
12711
12751
|
resumePayload: payload.payload.resumePayload ?? null,
|
|
12712
12752
|
output: null
|
|
12713
12753
|
};
|
|
12714
|
-
return
|
|
12715
|
-
|
|
12716
|
-
|
|
12717
|
-
|
|
12718
|
-
|
|
12754
|
+
return [
|
|
12755
|
+
createWorkflowDataPart({
|
|
12756
|
+
current,
|
|
12757
|
+
isNested,
|
|
12758
|
+
runId: payload.runId,
|
|
12759
|
+
status: "suspended"
|
|
12760
|
+
}),
|
|
12761
|
+
createWorkflowStepDataPart({
|
|
12762
|
+
current,
|
|
12763
|
+
isNested,
|
|
12764
|
+
runId: payload.runId,
|
|
12719
12765
|
status: "suspended",
|
|
12720
|
-
|
|
12721
|
-
|
|
12722
|
-
|
|
12723
|
-
};
|
|
12766
|
+
stepId: payload.payload.id
|
|
12767
|
+
})
|
|
12768
|
+
];
|
|
12724
12769
|
}
|
|
12725
12770
|
case "workflow-finish": {
|
|
12726
12771
|
const current = bufferedWorkflows.get(payload.runId);
|
|
12727
12772
|
if (!current) return null;
|
|
12728
|
-
return {
|
|
12729
|
-
|
|
12730
|
-
|
|
12731
|
-
|
|
12732
|
-
|
|
12733
|
-
|
|
12734
|
-
|
|
12735
|
-
|
|
12736
|
-
}
|
|
12737
|
-
};
|
|
12773
|
+
return createWorkflowDataPart({
|
|
12774
|
+
current,
|
|
12775
|
+
isNested,
|
|
12776
|
+
runId: payload.runId,
|
|
12777
|
+
status: payload.payload.workflowStatus,
|
|
12778
|
+
includeOutputs: true,
|
|
12779
|
+
output: payload.payload.output ?? null
|
|
12780
|
+
});
|
|
12738
12781
|
}
|
|
12739
12782
|
case "workflow-step-output": {
|
|
12740
12783
|
const output = payload.payload.output;
|
|
@@ -13119,15 +13162,16 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
13119
13162
|
}
|
|
13120
13163
|
step[PRIMITIVE_CACHE_SYMBOL] = step[PRIMITIVE_CACHE_SYMBOL] || /* @__PURE__ */ new Map();
|
|
13121
13164
|
const result = transformWorkflow(payload.payload, step[PRIMITIVE_CACHE_SYMBOL]);
|
|
13122
|
-
|
|
13123
|
-
|
|
13165
|
+
const workflowResult = Array.isArray(result) ? result.find((item) => item?.type === "data-workflow" || item?.type === "data-tool-workflow") : result;
|
|
13166
|
+
if (workflowResult && "data" in workflowResult) {
|
|
13167
|
+
const data = workflowResult.data;
|
|
13124
13168
|
step.task = data;
|
|
13125
13169
|
if (data.name && step.task) {
|
|
13126
13170
|
step.task.id = data.name;
|
|
13127
13171
|
}
|
|
13128
13172
|
}
|
|
13129
13173
|
bufferedNetworks.set(payload.runId, current);
|
|
13130
|
-
|
|
13174
|
+
const networkChunk = {
|
|
13131
13175
|
type: isNested ? "data-tool-network" : "data-network",
|
|
13132
13176
|
id: payload.runId,
|
|
13133
13177
|
data: {
|
|
@@ -13135,6 +13179,10 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
|
|
|
13135
13179
|
status: "running"
|
|
13136
13180
|
}
|
|
13137
13181
|
};
|
|
13182
|
+
if (Array.isArray(result)) {
|
|
13183
|
+
return [networkChunk, ...result.filter((r) => r != null)];
|
|
13184
|
+
}
|
|
13185
|
+
return networkChunk;
|
|
13138
13186
|
}
|
|
13139
13187
|
if (isDataChunkType(payload)) {
|
|
13140
13188
|
if (!("data" in payload)) {
|