One of our favorite features is using Agents to generate structured data (i.e. a pydantic model). Use this feature to extract features, classify data, produce fake data etc. The best part is that they work with function calls, knowledge bases and all other features.
Let’s create an Movie Agent to write a MovieScript for us.
movie_agent.py
Copy
Ask AI
from typing import Listfrom rich.pretty import pprintfrom pydantic import BaseModel, Fieldfrom agno.agent import Agent, RunResponsefrom agno.models.openai import OpenAIChatclass MovieScript(BaseModel): setting: str = Field(..., description="Provide a nice setting for a blockbuster movie.") ending: str = Field(..., description="Ending of the movie. If not available, provide a happy ending.") genre: str = Field( ..., description="Genre of the movie. If not available, select action, thriller or romantic comedy." ) name: str = Field(..., description="Give a name to this movie") characters: List[str] = Field(..., description="Name of characters for this movie.") storyline: str = Field(..., description="3 sentence storyline for the movie. Make it exciting!")# Agent that uses JSON modejson_mode_agent = Agent( model=OpenAIChat(id="gpt-4o"), description="You write movie scripts.", response_model=MovieScript, use_json_mode=True,)json_mode_agent.print_response("New York")# Agent that uses structured outputsstructured_output_agent = Agent( model=OpenAIChat(id="gpt-4o"), description="You write movie scripts.", response_model=MovieScript,)structured_output_agent.print_response("New York")
Run the script to see the output.
Copy
Ask AI
pip install -U agno openaipython movie_agent.py
The output is an object of the MovieScript class, here’s how it looks:
Copy
Ask AI
# Using JSON modeMovieScript(│ setting='The bustling streets of New York City, filled with skyscrapers, secret alleyways, and hidden underground passages.',│ ending='The protagonist manages to thwart an international conspiracy, clearing his name and winning the love of his life back.',│ genre='Thriller',│ name='Shadows in the City',│ characters=['Alex Monroe', 'Eva Parker', 'Detective Rodriguez', 'Mysterious Mr. Black'],│ storyline="When Alex Monroe, an ex-CIA operative, is framed for a crime he didn't commit, he must navigate the dangerous streets of New York to clear his name. As he uncovers a labyrinth of deceit involving the city's most notorious crime syndicate, he enlists the help of an old flame, Eva Parker. Together, they race against time to expose the true villain before it's too late.")# Use the structured outputMovieScript(│ setting='In the bustling streets and iconic skyline of New York City.',│ ending='Isabella and Alex, having narrowly escaped the clutches of the Syndicate, find themselves standing at the top of the Empire State Building. As the glow of the setting sun bathes the city, they share a victorious kiss. Newly emboldened and as an unstoppable duo, they vow to keep NYC safe from any future threats.',│ genre='Action Thriller',│ name='The NYC Chronicles',│ characters=['Isabella Grant', 'Alex Chen', 'Marcus Kane', 'Detective Ellie Monroe', 'Victor Sinclair'],│ storyline='Isabella Grant, a fearless investigative journalist, uncovers a massive conspiracy involving a powerful syndicate plotting to control New York City. Teaming up with renegade cop Alex Chen, they must race against time to expose the culprits before the city descends into chaos. Dodging danger at every turn, they fight to protect the city they love from imminent destruction.')
You can use an additional model to parse and structure the output from your primary model. This approach is particularly effective when the primary model is optimized for reasoning tasks, as such models may not consistently produce detailed structured responses.
Copy
Ask AI
agent = Agent( model=Claude(id="claude-sonnet-4-20250514"), description="You write movie scripts.", response_model=MovieScript, parser_model=OpenAIChat(id="gpt-4o"),)
You can also provide a custom parser_model_prompt to your Parser Model.
Streaming can be used in combination with response_model. This returns the structured output as a single event in the stream of events.
streaming_agent.py
Copy
Ask AI
import asynciofrom typing import Dict, Listfrom agno.agent import Agentfrom agno.models.openai.chat import OpenAIChatfrom pydantic import BaseModel, Fieldclass MovieScript(BaseModel): setting: str = Field( ..., description="Provide a nice setting for a blockbuster movie." ) ending: str = Field( ..., description="Ending of the movie. If not available, provide a happy ending.", ) genre: str = Field( ..., description="Genre of the movie. If not available, select action, thriller or romantic comedy.", ) name: str = Field(..., description="Give a name to this movie") characters: List[str] = Field(..., description="Name of characters for this movie.") storyline: str = Field( ..., description="3 sentence storyline for the movie. Make it exciting!" ) rating: Dict[str, int] = Field( ..., description="Your own rating of the movie. 1-10. Return a dictionary with the keys 'story' and 'acting'.", )# Agent that uses structured outputs with streamingstructured_output_agent = Agent( model=OpenAIChat(id="gpt-4o"), description="You write movie scripts.", response_model=MovieScript,)structured_output_agent.print_response( "New York", stream=True, stream_intermediate_steps=True)