Documentation Index
Fetch the complete documentation index at: https://docs-v1.agno.com/llms.txt
Use this file to discover all available pages before exploring further.
This example demonstrates Workflows 2.0 to repeatedly execute steps until specific conditions are met,
ensuring adequate research depth before proceeding to content creation.
When to use: When you need iterative refinement, quality assurance, or when the
required output quality can’t be guaranteed in a single execution. Ideal for research
gathering, data collection, or any process where “good enough” is determined by content
analysis rather than a fixed number of iterations.
from typing import List
from agno.agent import Agent
from agno.tools.duckduckgo import DuckDuckGoTools
from agno.tools.hackernews import HackerNewsTools
from agno.workflow.v2 import Loop, Step, Workflow
from agno.workflow.v2.types import StepOutput
# Create agents for research
research_agent = Agent(
name="Research Agent",
role="Research specialist",
tools=[HackerNewsTools(), DuckDuckGoTools()],
instructions="You are a research specialist. Research the given topic thoroughly.",
markdown=True,
)
content_agent = Agent(
name="Content Agent",
role="Content creator",
instructions="You are a content creator. Create engaging content based on research.",
markdown=True,
)
# Create research steps
research_hackernews_step = Step(
name="Research HackerNews",
agent=research_agent,
description="Research trending topics on HackerNews",
)
research_web_step = Step(
name="Research Web",
agent=research_agent,
description="Research additional information from web sources",
)
content_step = Step(
name="Create Content",
agent=content_agent,
description="Create content based on research findings",
)
# End condition function
def research_evaluator(outputs: List[StepOutput]) -> bool:
"""
Evaluate if research results are sufficient
Returns True to break the loop, False to continue
"""
# Check if any outputs are present
if not outputs:
return False
# Check if any output contains substantial content
for output in outputs:
if output.content and len(output.content) > 200:
print(
f"✅ Research evaluation passed - found substantial content ({len(output.content)} chars)"
)
return True
print("❌ Research evaluation failed - need more substantial research")
return False
# Create workflow with loop
workflow = Workflow(
name="Research and Content Workflow",
description="Research topics in a loop until conditions are met, then create content",
steps=[
Loop(
name="Research Loop",
steps=[research_hackernews_step, research_web_step],
end_condition=research_evaluator,
max_iterations=3, # Maximum 3 iterations
),
content_step,
],
)
if __name__ == "__main__":
# Test the workflow
workflow.print_response(
message="Research the latest trends in AI and machine learning, then create a summary",
)
This was a synchronous non-streaming example of this pattern. To checkout async and streaming versions, see the cookbooks-