Parallel Execution
Workflows often need to run multiple operations at the same time. These examples demonstrate how to use .parallel()
to execute steps or workflows concurrently and merge their results.
Parallel execution using steps
In this example, the workflow runs step1
and step2
using .parallel()
. Each step receives the same input and runs independently. Their outputs are namespaced by step id
and passed together to step3
, which combines the results and returns the final value.
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({
id: "step-1",
description: "passes value from input to output",
inputSchema: z.object({
value: z.number()
}),
outputSchema: z.object({
value: z.number()
}),
execute: async ({ inputData }) => {
const { value } = inputData;
return {
value
};
}
});
const step2 = createStep({
id: "step-2",
description: "passes value from input to output",
inputSchema: z.object({
value: z.number()
}),
outputSchema: z.object({
value: z.number()
}),
execute: async ({ inputData }) => {
const { value } = inputData;
return {
value
};
}
});
const step3 = createStep({
id: "step-3",
description: "sums values from step-1 and step-2",
inputSchema: z.object({
"step-1": z.object({ value: z.number() }),
"step-2": z.object({ value: z.number() })
}),
outputSchema: z.object({
value: z.number()
}),
execute: async ({ inputData }) => {
return {
value: inputData["step-1"].value + inputData["step-2"].value
};
}
});
export const parallelSteps = createWorkflow({
id: "parallel-workflow",
description: "A workflow that runs steps in parallel plus a final step",
inputSchema: z.object({
value: z.number()
}),
outputSchema: z.object({
value: z.number()
})
})
.parallel([step1, step2])
.then(step3)
.commit();
Parallel execution using workflows
In this example, the workflow uses .parallel()
to run two workflows—workflow1
and workflow2
at the same time. Each workflow contains a single step that returns the input value. Their outputs are namespaced by workflow id
and passed to step3
, which combines the results and returns the final value.
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({
id: "step-1",
description: "passes value from input to output",
inputSchema: z.object({
value: z.number()
}),
outputSchema: z.object({
value: z.number()
}),
execute: async ({ inputData }) => {
const { value } = inputData;
return {
value
};
}
});
const step2 = createStep({
id: "step-2",
description: "passes value from input to output",
inputSchema: z.object({
value: z.number()
}),
outputSchema: z.object({
value: z.number()
}),
execute: async ({ inputData }) => {
const { value } = inputData;
return {
value
};
}
});
const step3 = createStep({
id: "step-3",
description: "sums values from step-1 and step-2",
inputSchema: z.object({
"workflow-1": z.object({ value: z.number() }),
"workflow-2": z.object({ value: z.number() })
}),
outputSchema: z.object({
value: z.number()
}),
execute: async ({ inputData }) => {
return {
value: inputData["workflow-1"].value + inputData["workflow-2"].value
};
}
});
export const workflow1 = createWorkflow({
id: "workflow-1",
inputSchema: z.object({
value: z.number()
}),
outputSchema: z.object({
value: z.number()
})
})
.then(step1)
.commit();
export const workflow2 = createWorkflow({
id: "workflow-2",
inputSchema: z.object({
value: z.number()
}),
outputSchema: z.object({
value: z.number()
})
})
.then(step2)
.commit();
export const parallelWorkflows = createWorkflow({
id: "parallel-workflow",
inputSchema: z.object({
value: z.number()
}),
outputSchema: z.object({
value: z.number()
})
})
.parallel([workflow1, workflow2])
.then(step3)
.commit();
Workflows (Legacy)
The following links provide example documentation for legacy workflows: