from typing import List
from agno.agent.agent import Agent
from agno.tools.duckduckgo import DuckDuckGoTools
from agno.tools.hackernews import HackerNewsTools
from agno.workflow.v2.router import Router
from agno.workflow.v2.step import Step
from agno.workflow.v2.types import StepInput
from agno.workflow.v2.workflow import Workflow
# Define the research agents
hackernews_agent = Agent(
name="HackerNews Researcher",
instructions="You are a researcher specializing in finding the latest tech news and discussions from Hacker News. Focus on startup trends, programming topics, and tech industry insights.",
tools=[HackerNewsTools()],
)
web_agent = Agent(
name="Web Researcher",
instructions="You are a comprehensive web researcher. Search across multiple sources including news sites, blogs, and official documentation to gather detailed information.",
tools=[DuckDuckGoTools()],
)
content_agent = Agent(
name="Content Publisher",
instructions="You are a content creator who takes research data and creates engaging, well-structured articles. Format the content with proper headings, bullet points, and clear conclusions.",
)
# Create the research steps
research_hackernews = Step(
name="research_hackernews",
agent=hackernews_agent,
description="Research latest tech trends from Hacker News",
)
research_web = Step(
name="research_web",
agent=web_agent,
description="Comprehensive web research on the topic",
)
publish_content = Step(
name="publish_content",
agent=content_agent,
description="Create and format final content for publication",
)
# Now returns Step(s) to execute
def research_router(step_input: StepInput) -> List[Step]:
"""
Decide which research method to use based on the input topic.
Returns a list containing the step(s) to execute.
"""
# Use the original workflow message if this is the first step
topic = step_input.previous_step_content or step_input.message or ""
topic = topic.lower()
# Check if the topic is tech/startup related - use HackerNews
tech_keywords = [
"startup",
"programming",
"ai",
"machine learning",
"software",
"developer",
"coding",
"tech",
"silicon valley",
"venture capital",
"cryptocurrency",
"blockchain",
"open source",
"github",
]
if any(keyword in topic for keyword in tech_keywords):
print(f"🔍 Tech topic detected: Using HackerNews research for '{topic}'")
return [research_hackernews]
else:
print(f"🌐 General topic detected: Using web research for '{topic}'")
return [research_web]
workflow = Workflow(
name="Intelligent Research Workflow",
description="Automatically selects the best research method based on topic, then publishes content",
steps=[
Router(
name="research_strategy_router",
selector=research_router,
choices=[research_hackernews, research_web],
description="Intelligently selects research method based on topic",
),
publish_content,
],
)
if __name__ == "__main__":
workflow.print_response(
"Latest developments in artificial intelligence and machine learning"
)