stream=True and stream_events=True, then iterate over the asynchronous event stream.
Install dependencies:
uv pip install agno openai sqlalchemy ddgs
Code
async_events_streaming.py
import asyncio
from textwrap import dedent
from typing import AsyncIterator
from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.models.openai import OpenAIResponses
from agno.run.workflow import WorkflowRunOutputEvent, WorkflowRunEvent
from agno.team import Team
from agno.tools.hackernews import HackerNewsTools
from agno.tools.websearch import WebSearchTools
from agno.workflow.types import StepInput, StepOutput
from agno.workflow.workflow import Workflow
# Define agents
hackernews_agent = Agent(
name="HackerNews Agent",
model=OpenAIResponses(id="gpt-5.2"),
tools=[HackerNewsTools()],
role="Extract key insights and content from HackerNews posts",
)
web_agent = Agent(
name="Web Agent",
model=OpenAIResponses(id="gpt-5.2"),
tools=[WebSearchTools()],
role="Search the web for current news and trends",
)
writer_agent = Agent(
name="Writer Agent",
model=OpenAIResponses(id="gpt-5.2"),
instructions="Write a blog post on the topic",
)
async def prepare_input_for_web_search(
step_input: StepInput,
) -> AsyncIterator[StepOutput]:
"""Generator function that yields StepOutput"""
topic = step_input.input
# Create proper StepOutput content
content = dedent(f"""\
I'm writing a blog post on the topic
<topic>
{topic}
</topic>
Search the web for at least 10 articles\
""")
# Yield a StepOutput as the final result
yield StepOutput(content=content)
async def prepare_input_for_writer(step_input: StepInput) -> AsyncIterator[StepOutput]:
"""Generator function that yields StepOutput"""
topic = step_input.input
research_team_output = step_input.previous_step_content
# Create proper StepOutput content
content = dedent(f"""\
I'm writing a blog post on the topic:
<topic>
{topic}
</topic>
Here is information from the web:
<research_results>
{research_team_output}
</research_results>\
""")
# Yield a StepOutput as the final result
yield StepOutput(content=content)
# Define research team for complex analysis
research_team = Team(
name="Research Team",
members=[hackernews_agent, web_agent],
instructions="Research tech topics from HackerNews and the web",
)
async def main():
content_creation_workflow = Workflow(
name="Blog Post Workflow",
description="Automated blog post creation from HackerNews and the web",
steps=[
prepare_input_for_web_search,
research_team,
prepare_input_for_writer,
writer_agent,
],
db=SqliteDb(
session_table="workflow_session",
db_file="tmp/workflow.db",
),
)
resp: AsyncIterator[WorkflowRunOutputEvent] = content_creation_workflow.arun(
input="AI trends in 2024",
stream=True,
stream_events=True,
)
async for event in resp:
if event.event == WorkflowRunEvent.workflow_started.value:
print(event)
print()
elif event.event == WorkflowRunEvent.step_started.value:
print(event)
print()
elif event.event == WorkflowRunEvent.step_completed.value:
print(event)
print()
elif event.event == WorkflowRunEvent.workflow_completed.value:
print(event)
print()
if __name__ == "__main__":
asyncio.run(main())
Set OpenAI Key
Set yourOPENAI_API_KEY as an environment variable. You can get one from OpenAI.
export OPENAI_API_KEY=sk-***
setx OPENAI_API_KEY sk-***
Run
python async_events_streaming.py