Sequential Pipeline
Steps execute in order, each receiving the previous step’s output.import asyncio
from definable.agent import Agent
from definable.agent.workflow import Workflow, Step
researcher = Agent(model="gpt-4o", instructions="Research the topic thoroughly.")
writer = Agent(model="gpt-4o", instructions="Write an article based on the research.")
workflow = Workflow(
name="research-pipeline",
steps=[
Step(name="research", agent=researcher),
Step(name="write", agent=writer),
],
)
async def main():
result = await workflow.arun("The future of AI agents")
print(result.content)
print(f"Duration: {result.duration_ms:.0f}ms")
asyncio.run(main())
Parallel Execution
Run multiple steps concurrently.from definable.agent.workflow import Workflow, Parallel, Step
workflow = Workflow(
name="multi-analysis",
steps=[
Parallel(name="analysis", steps=[
Step(name="technical", agent=tech_analyst),
Step(name="business", agent=biz_analyst),
Step(name="legal", agent=legal_analyst),
]),
Step(name="synthesizer", agent=synthesizer),
],
)
Conditional Branching
If/else branching based on step output.from definable.agent.workflow import Workflow, Step, Condition
workflow = Workflow(
name="review-pipeline",
steps=[
Step(name="draft", agent=drafter),
Step(name="review", agent=reviewer),
Condition(
name="quality-gate",
condition=lambda ctx: "APPROVED" in (ctx.get_last_step_content() or ""),
true_steps=Step(name="publish", agent=publisher),
false_steps=Step(name="rewrite", agent=writer),
),
],
)
Iterative Loop
Repeat until an end condition is met.from definable.agent.workflow import Workflow, Loop, Step
workflow = Workflow(
name="refinement",
steps=[
Loop(
name="improve",
steps=[
Step(name="generate", agent=generator),
Step(name="evaluate", agent=evaluator),
],
end_condition=lambda outputs: any("APPROVED" in (o.content or "") for o in outputs),
max_iterations=5,
),
],
)
Dynamic Router
Route to different steps based on input.from definable.agent.workflow import Workflow, Router, Step
workflow = Workflow(
name="support",
steps=[
Router(
name="classifier",
selector=lambda ctx: "technical" if "bug" in (ctx.input or "").lower() else "general",
routes={
"technical": Step(name="tech", agent=tech_agent),
"general": Step(name="general", agent=general_agent),
},
),
],
)
Custom Function Steps
Use callables instead of agents.async def process(step_input):
data = step_input.get_last_step_content()
return f"Processed: {data[:100]}"
workflow = Workflow(
name="mixed",
steps=[
Step(name="research", agent=researcher),
Step(name="process", executor=process),
Step(name="write", agent=writer),
],
)
Accessing Step Results
result = await workflow.arun("Research AI trends")
result.content # Final step's content
result.success # True if all steps succeeded
result.duration_ms # Total execution time
result.step_outputs # List of all step outputs
research = result.get_step_output("research")
print(research.content)
print(research.duration_ms)