Save Conditional Workflow Steps
Save a workflow whose Condition evaluator is a plain function, then reload it from Postgres by registering that function in a Registry.
Demonstrates creating a workflow with conditional steps, saving it to the database, and loading it back with a Registry.
Apply the setup adjustment below before saving: the current source omits an explicit model on the research agents, so their tools are not serialized. Reloading executable tools also requires their toolkits in a Registry.
"""
Save Conditional Workflow Steps
===============================
Demonstrates creating a workflow with conditional steps, saving it to the
database, and loading it back with a Registry.
"""
from agno.agent import Agent
from agno.db.postgres import PostgresDb
from agno.registry import Registry
from agno.tools.hackernews import HackerNewsTools
from agno.tools.websearch import WebSearchTools
from agno.workflow.condition import Condition
from agno.workflow.step import Step
from agno.workflow.types import StepInput
from agno.workflow.workflow import Workflow, get_workflow_by_id
# ---------------------------------------------------------------------------
# Setup
# ---------------------------------------------------------------------------
# Database
db_url = "postgresql+psycopg://ai:ai@localhost:5532/ai"
db = PostgresDb(db_url=db_url)
# ---------------------------------------------------------------------------
# Create Agents
# ---------------------------------------------------------------------------
# Agents
hackernews_agent = Agent(
name="HackerNews Researcher",
instructions="Research tech news and trends from Hacker News",
tools=[HackerNewsTools()],
)
web_agent = Agent(
name="Web Researcher",
instructions="Research general information from the web",
tools=[WebSearchTools()],
)
content_agent = Agent(
name="Content Creator",
instructions="Create well-structured content from research data",
)
# ---------------------------------------------------------------------------
# Create Registry Components
# ---------------------------------------------------------------------------
# Evaluator function (will be serialized by name and restored via registry)
def is_tech_topic(step_input: StepInput) -> bool:
"""Returns True to execute the conditional steps, False to skip."""
topic = step_input.input or step_input.previous_step_content or ""
tech_keywords = [
"ai",
"machine learning",
"programming",
"software",
"tech",
"startup",
"coding",
]
is_tech = any(keyword in topic.lower() for keyword in tech_keywords)
print(f"Condition: Topic is {'tech' if is_tech else 'not tech'}")
return is_tech
# Registry (required to restore the evaluator function when loading)
registry = Registry(
name="Condition Workflow Registry",
functions=[is_tech_topic],
)
# ---------------------------------------------------------------------------
# Create Workflow Steps
# ---------------------------------------------------------------------------
# Steps
research_hackernews_step = Step(
name="ResearchHackerNews",
description="Research tech news from Hacker News",
agent=hackernews_agent,
)
research_web_step = Step(
name="ResearchWeb",
description="Research general information from web",
agent=web_agent,
)
write_step = Step(
name="WriteContent",
description="Write the final content based on research",
agent=content_agent,
)
# ---------------------------------------------------------------------------
# Create Workflow
# ---------------------------------------------------------------------------
# Workflow
workflow = Workflow(
name="Conditional Research Workflow",
description="Conditionally research from HackerNews for tech topics",
steps=[
Condition(
name="TechTopicCondition",
description="Check if topic is tech-related for HackerNews research",
evaluator=is_tech_topic,
steps=[research_hackernews_step],
),
research_web_step,
write_step,
],
db=db,
)
# ---------------------------------------------------------------------------
# Run Workflow Example
# ---------------------------------------------------------------------------
if __name__ == "__main__":
# Save
print("Saving workflow...")
version = workflow.save(db=db)
print(f"Saved workflow as version {version}")
# Load
print("\nLoading workflow...")
loaded_workflow = get_workflow_by_id(
db=db,
id="conditional-research-workflow",
registry=registry,
)
if loaded_workflow:
print("Workflow loaded successfully!")
print(f" Name: {loaded_workflow.name}")
print(f" Steps: {len(loaded_workflow.steps) if loaded_workflow.steps else 0}")
# Uncomment to run the loaded workflow
# loaded_workflow.print_response(input="Latest AI developments in machine learning", stream=True)
else:
print("Workflow not found")Run the Example
Set up your virtual environment
uv venv --python 3.12
source .venv/bin/activateInstall dependencies
uv pip install -U agno "psycopg[binary]" ddgs fastapi openai sqlalchemyExport your OpenAI API key
export OPENAI_API_KEY="your_openai_api_key_here"Run PgVector
docker run -d \
-e POSTGRES_DB=ai \
-e POSTGRES_USER=ai \
-e POSTGRES_PASSWORD=ai \
-e PGDATA=/var/lib/postgresql \
-v pgvolume:/var/lib/postgresql \
-p 5532:5432 \
--name pgvector \
agnohq/pgvector:18Preserve research tools across save and load
Add from agno.models.openai import OpenAIResponses to the imports. After constructing the agents and before workflow.save(...), set their models:
hackernews_agent.model = OpenAIResponses(id="gpt-5.6-luna")
web_agent.model = OpenAIResponses(id="gpt-5.6-luna")Add tools=[HackerNewsTools(), WebSearchTools()] to the existing Registry(...), retaining its functions list. Add strict=True to get_workflow_by_id(...), which already receives registry=registry.
Save again after these changes; loading an older config cannot recover tools it never stored. The script saves and reloads the configuration. Uncomment its final loaded_workflow.print_response(...) call to run the research workflow with real model and search requests.
Run the example
Save the code above as save_conditional_steps.py, then run:
python save_conditional_steps.pyFull source: cookbook/93_components/workflows/save_conditional_steps.py