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,
)