# Understanding Steps Steps are the building blocks of workflows. Each step is a self-contained unit that takes some input, processes it, and produces an output. ## What is a Step? A step has three main parts: 1. **Input Schema** - what data it expects to receive 2. **Output Schema** - what data it will produce 3. **Execute Function** - the logic that transforms input to output ## Step Structure Every step follows this pattern: ```typescript const myStep = createStep({ id: "unique-step-name", description: "What this step does", inputSchema: z.object({ // Define expected input structure }), outputSchema: z.object({ // Define output structure }), execute: async ({ inputData }) => { // Your logic here return { // Return data matching output schema }; }, }); ``` ## Why Use Schemas? Schemas provide several benefits: - **Type Safety**: TypeScript knows exactly what data flows between steps - **Runtime Validation**: Invalid data is caught immediately with helpful error messages - **Documentation**: Schemas serve as living documentation of your workflow - **Debugging**: Clear contracts make it easy to identify issues ## Key Benefits - **Reusable**: Steps can be used in multiple workflows - **Testable**: Each step can be tested in isolation - **Composable**: Steps can be combined in different ways - **Reliable**: Schemas catch data flow issues early - **Traceable**: Every step is traced so you can see the flow of data Next, you'll create your first step!