Skip to main content

Cookbook

This cookbook provides practical patterns and examples for common Stepflow use cases. Each pattern shows best practices and implementation approaches that have proven effective in real-world scenarios.

Iteration and Loops

Stepflow includes built-in iteration components -- iterate and map -- but for more complex iteration patterns it is often better to implement custom iteration components.

The key to building these components yourself is to use the ability to evaluate a sub-flow asynchronously. This allows your component to launch a sub-workflow for each iteration with the component focusing on the iteration control logic.

Custom Iteration Component
@server.component
async def iterate(input: IterateInput, context: StepflowContext) -> IterateOutput:
"""
Iteratively apply a workflow until it returns a result instead of next.
"""
current_input = input.initial_input
iterations = 0

while iterations < input.max_iterations:
# Execute the workflow blob for this iteration
result_value = await context.evaluate_flow_by_id(input.flow_id, current_input)
iterations += 1

# Check for termination condition
if isinstance(result_value, dict) and "result" in result_value:
return IterateOutput(
result=result_value["result"],
iterations=iterations,
terminated=False,
)

# Continue iteration with new input
elif isinstance(result_value, dict) and "next" in result_value:
current_input = result_value["next"]
continue

# Invalid response format
else:
raise ValueError(f"Workflow must return {{'result': ...}} or {{'next': ...}}, got {result_value}")

# Hit iteration limit
return IterateOutput(
result=current_input,
iterations=iterations,
terminated=True,
)