Skip to Content
ExamplesWorkflowsParallel Steps

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.

src/mastra/workflows/example-parallel-steps.ts
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.

src/mastra/workflows/example-parallel-workflows.ts
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: