@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 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 (Array.isArray(transformed)) {
12252
- for (const c of transformed) {
12253
- if (c) controller.enqueue(c);
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 (Array.isArray(workflowChunk)) {
12374
- for (const c of workflowChunk) {
12375
- if (c) controller.enqueue(c);
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
- type: isNested ? "data-tool-workflow" : "data-workflow",
12655
- id: payload.runId,
12656
- data: {
12657
- name: bufferedWorkflows.get(payload.runId).name,
12658
- status: "running",
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
- type: isNested ? "data-tool-workflow" : "data-workflow",
12676
- id: payload.runId,
12677
- data: {
12678
- name: current.name,
12679
- status: "running",
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
- type: isNested ? "data-tool-workflow" : "data-workflow",
12695
- id: payload.runId,
12696
- data: {
12697
- name: current.name,
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
- steps: current.steps,
12700
- output: null
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
- type: isNested ? "data-tool-workflow" : "data-workflow",
12716
- id: payload.runId,
12717
- data: {
12718
- name: current.name,
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
- steps: current.steps,
12721
- output: null
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
- type: isNested ? "data-tool-workflow" : "data-workflow",
12730
- id: payload.runId,
12731
- data: {
12732
- name: current.name,
12733
- steps: current.steps,
12734
- output: payload.payload.output ?? null,
12735
- status: payload.payload.workflowStatus
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
- if (result && "data" in result) {
13123
- const data = result.data;
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
- return {
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)) {