エージェントを使用して構造化データ (i.e. pydantic モデル) を生成することは好ましい機能の一つです。この機能を使用して、特徴を抽出したり、データを分類したり、フェイクデータを生成することができます。最も良い点は、関数呼び出し、知識ベース、その他すべての機能と連携できることです。
Agno : ユーザガイド : コンセプト : エージェント – 構造化出力
作成 : クラスキャット・セールスインフォメーション
作成日時 : 07/19/2025
バージョン : Agno 1.7.4
* 本記事は docs.agno.com の以下のページを独自に翻訳した上で、補足説明を加えてまとめ直しています :
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
Agno ユーザガイド : コンセプト : エージェント – 構造化出力
好ましい機能の一つは、エージェントを使用して構造化データ (i.e. pydantic モデル) を生成することです。この機能を使用して、特徴を抽出したり、データを分類したり、フェイクデータを生成することができます。最も良い点は、関数呼び出し、知識ベース、その他すべての機能と連携できることです。
例
Movie エージェントを作成して MovieScript を作成しましょう。
movie_agent.py
from typing import List
from rich.pretty import pprint
from pydantic import BaseModel, Field
from agno.agent import Agent, RunResponse
from agno.models.openai import OpenAIChat
class 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 mode
json_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 outputs
structured_output_agent = Agent(
model=OpenAIChat(id="gpt-4o"),
description="You write movie scripts.",
response_model=MovieScript,
)
structured_output_agent.print_response("New York")
スクリプトを実行して出力を確認します。
pip install -U agno openai
python movie_agent.py
出力は MovieScript クラスのオブジェクトで、それがどのようなものかを以下にします :
# Using JSON mode
MovieScript(
│ 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 output
MovieScript(
│ 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.'
)
パーサーモデルの使用
追加モデルを使用して、プライマリモデルからの出力をパースして構造化することができます。このアプローチは、プライマリモデルが推論タスクに最適化されている場合に特に効果的です、そのようなモデルは詳細な構造化レスポンスを一貫して生成しない場合があるからです。
agent = Agent(
model=Claude(id="claude-sonnet-4-20250514"),
description="You write movie scripts.",
response_model=MovieScript,
parser_model=OpenAIChat(id="gpt-4o"),
)
パーサーモデルにカスタム parser_model_prompt を提供することもできます。
構造化出力のストリーミング
ストリーミングは response_model との組み合わせで使用できます。これは構造化出力をイベントストリームの単一イベントとして返します。
streaming_agent.py
import asyncio
from typing import Dict, List
from agno.agent import Agent
from agno.models.openai.chat import OpenAIChat
from pydantic import BaseModel, Field
class 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 streaming
structured_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
)
以上