Closed16

マルチモーダルエージェントを構築するための軽量フレームワーク「Agno」を試す

kun432kun432

GitHubレポジトリ

https://github.com/agno-agi/agno

o4-mini-highによる翻訳

Agnoとは?

Agno は、メモリ、知識、推論を備えたマルチエージェントシステムを構築するためのフルスタックフレームワークです。

次の5つのエージェンシックシステムのレベルを構築するために Agno を使用してください:

  • レベル1: ツールと命令を持つエージェント。
  • レベル2: 知識とストレージを持つエージェント。
  • レベル3: メモリと推論を持つエージェント。
  • レベル4: 推論と協働が可能なエージェントチーム。
  • レベル5: 状態と決定論を備えたエージェンシックワークフロー。

例: YFinance APIを使用して質問に回答するレベル1推論エージェント:

from agno.agent import Agent
from agno.models.anthropic import Claude
from agno.tools.reasoning import ReasoningTools
from agno.tools.yfinance import YFinanceTools

reasoning_agent = Agent(
   model=Claude(id="claude-sonnet-4-20250514"),
   tools=[
       ReasoningTools(add_instructions=True),
       YFinanceTools(stock_price=True, analyst_recommendations=True, company_info=True, company_news=True),
   ],
   instructions="Use tables to display data.",
   markdown=True,
)

はじめに

Agno を初めて使用する場合は、ドキュメントを読んで最初のエージェントを構築し、Playgroundで対話し、agno.comで監視してください。

その後、Examples Galleryを確認し、Agno で実際のアプリケーションを構築しましょう。

Agno を選ぶ理由

Agno は最高クラスの高性能エージェンシックシステム構築を支援し、調査やボイラープレート作成の時間を節約します。Agno の他と異なる主な機能は以下の通りです:

  • モデル非依存: 23以上のモデルプロバイダーへの統一インターフェースを提供し、ロックインを回避。
  • 高性能: エージェントのインスタンス化は平均 約3μs、メモリ使用量は平均 約6.5KiB
  • 推論を第一級市民としてサポート: 推論は信頼性を高め、複雑な自律エージェントに必須。Agno は3つの推論アプローチをサポート:Reasoning Models、ReasoningTools、独自の chain-of-thought アプローチ。
  • ネイティブマルチモーダル: テキスト、画像、音声、ビデオを入力として受け取り、同様に出力可能。
  • 高度なマルチエージェントアーキテクチャ: 推論、メモリ、共有コンテキストを備えた業界最先端のエージェントチーム(Agent Teams)を提供。
  • 組み込みのエージェンシックサーチ: 実行時に20以上のベクターデータベースで情報検索。Agno は最先端のエージェンシックRAGをフル非同期かつ高性能で提供。
  • 組み込みのメモリ&セッションストレージ: 組み込みの StorageMemory ドライバーで、エージェントに長期メモリとセッションストレージを付与。
  • 構造化出力: モデル提供の構造化出力や json_mode を使用し、完全に型付けされた応答を返却可能。
  • 事前構築された FastAPI ルート: エージェントを構築した後、事前構築の FastAPI ルートでサーブ。数分で本番環境へ。
  • 監視: agno.com でエージェントセッションとパフォーマンスをリアルタイム監視。

パフォーマンス

Agno ではパフォーマンスに強くこだわっています。理由は、単純な AI ワークフローでも数千ものエージェントが生成される可能性があるからです。ユーザー数が適度に増えると、パフォーマンスがボトルネックになります。Agno は高性能なエージェンシックシステム構築のために設計されています:

  • エージェントのインスタンス化:平均約3μs
  • メモリ使用量:平均約6.5KiB

Apple M4 MacBook Pro 上でテスト。

エージェントの実行時間は推論に依存しますが、実行時間の最小化、メモリ使用量の削減、ツール呼び出しの並列化を徹底する必要があります。これらの数値は一見些細に思えますが、適度な規模でも累積効果があることが経験で示されています。

インスタンス化時間

1つのツールを持つエージェントが起動するまでの時間を測定し、1000回評価してベースラインを取得します。ご自身のマシンで評価を実行してください。結果を鵜呑みにしないようご注意ください。

# 仮想環境のセットアップ
./scripts/perf_setup.sh
source .venvs/perfenv/bin/activate
# または手動で依存関係をインストール
# pip install openai agno langgraph langchain_openai

# Agno
python evals/performance/instantiation_with_tool.py

# LangGraph
python evals/performance/other/langgraph_instantiation.py

LangGraph は右側、まず LangGraph を開始してヘッドスタートを与えましょう

Agno は左側で、LangGraph が実行時間測定の半分にも到達していないうちに完了し、メモリ測定すら開始していません。これほど高速です。

メモリ使用量

メモリ使用量の測定には tracemalloc ライブラリを使用します。空の関数を実行してベースラインメモリ使用量を算出し、その後エージェントを1000回実行して差分を計算します。この方法でエージェントのメモリ使用量を(比較的)孤立して測定できます。

ご自身のマシンで評価を実行し、仕組みを確認してください。誤りがあればお知らせください。

結論

Agno のエージェントはパフォーマンスを重視して設計されており、他のフレームワークとのベンチマークも共有しますが、速度よりも正確性と信頼性を重視しています。

各フレームワークは異なるため、Agno のようにチューニングできないことを考慮し、今後のベンチマークでは自社内のみを比較対象とします。

完全なドキュメントインデックス

LLM や AI アシスタントが Agno の完全なドキュメントを理解・参照しやすいよう、LLMs.txt または LLMs-Full.txt を提供しています。

Cursor セットアップ

Agno エージェントを構築する際、Agno ドキュメントを Cursor のソースとして使用すると開発が高速化されます。

  1. Cursor の「Cursor Settings」メニューを開く。
  2. 「Indexing & Docs」セクションを見つける。
  3. https://docs.agno.com/llms-full.txt をドキュメント URL のリストに追加。
  4. 変更を保存。

これで Cursor が Agno ドキュメントにアクセスできるようになります。

ドキュメント、コミュニティ & その他の例

テレメトリ

Agno はエージェントが使用したモデルの情報をログに記録し、人気プロバイダーの優先的アップデートを行います。環境変数 AGNO_TELEMETRY=false を設定すると無効化できます。

以前はPhidataという名前だったのがリブランドしたみたい。

https://github.com/agno-agi/phidata

🚨 Phidata は Agno に生まれ変わりました!🚨
移転しました!新しいホームページ Agno AGI をご覧ください。

ライセンスはMPL-2.0ライセンス

kun432kun432

公式ドキュメントはこちら

https://docs.agno.com/introduction

GitHubのREADMEにもあるけど、サンプルとしてレベル1〜5のエージェント実装を試すのがQuickstartって感じになっている。

レベル1〜3: ツール・ナレッジ・メモリ/Reasoningを使ったエージェント
https://docs.agno.com/introduction/agents

レベル4〜5: マルチエージェント
https://docs.agno.com/introduction/multi-agent-systems

上から順にやってみる。Colaboratoryで。

kun432kun432

インストール

パッケージインストール。サンプルでは全般的にAnthropicを使用しているようだが、自分はOpenAIで。

!pip install -U agno openai
!pip freeze | grep -i "agno"
出力
agno==1.7.2

OpenAI APIキーをセットしておく

from google.colab import userdata
import os

os.environ["OPENAI_API_KEY"] = userdata.get('OPENAI_API_KEY')

その他のパッケージは都度必要な時に追加することとする。

kun432kun432

Level 1: Agents with tools and instructions

レベル1は、エージェントにツールと指示を持たせて、タスクを処理する。今回ツールはyfinanceというYahoo! Finance's APIにアクセスして株価情報などを取得するパッケージを使う。

パッケージを追加

!pip install  -U yfinance

エージェントを定義して、指示とツールを与える。シンプルで直感的に書ける。

from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.yfinance import YFinanceTools

agent = Agent(
    model=OpenAIChat(id="gpt-4.1"),
    tools=[YFinanceTools(stock_price=True)],
    instructions="データを表示するには表を使用してください。その他のテキストは含めないでください。",
    markdown=True,
)
agent.print_response("アップルの株価は?", stream=True)

なるほど、出力がこんな感じで出せるのね。色々試しているときはこういうのだと良いね。

出力
▰▰▰▰▱▱▱ Thinking...
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ アップルの株価は?                                                                                               ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Tool Calls ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ • get_current_stock_price(symbol=AAPL)                                                                          ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Response (2.6s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃                                                                                                                 ┃
┃                                                                                                                 ┃
┃   銘柄              株価 (USD)                                                                                  ┃
┃  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                                                                 ┃
┃   アップル (AAPL)   211.16                                                                                      ┃
┃                                                                                                                 ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

ちなみに、エージェントそのものはステートレスっぽい。ここは次のレベルで。

agent.print_response("さっき聞いた株価はなんだっけ?", stream=True)
出力
▰▰▰▰▱▱▱ Thinking...
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ さっき聞いた株価はなんだっけ?                                                                                   ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Response (0.9s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃                                                                                                                 ┃
┃                                                                                                                 ┃
┃   内容   詳細                                                                                                   ┃
┃  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                                          ┃
┃   情報   直前に取得・表示した株価データはありません。                                                           ┃
┃                                                                                                                 ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
kun432kun432

Level 2: Agents with knowledge and storage

レベル2は 会話履歴を保持したRAGエージェント。

  • エージェントの会話履歴はStorageを使う
    • モデルAPIはステートレス、つまり会話履歴などを持たない。
      • 上でもやったけどエージェントインスタンスもそのままだとステートレスっぽい
    • Storageを使うと会話履歴が記録され、セッションを跨いでも会話履歴が保持される。
    • いくつかのモジュールがあるようだが、今回はSQLiteを使ったSqliteStorageを使う
  • RAGのドキュメント検索などの「ナレッジ」にはKnowledgeを使う
    • ベクトルDBとEmbeddingモデルを紐づけて使う。今回はベクトルDBにLanceDB、EmbeddingモデルにOpenAI text-embedding-3-smallを使う。
    • ナレッジの取得方法に応じておそらくいろいろモジュールがある様子。今回使用する UrlKnowledge はおそらくURLからドキュメントを追加するものっぽい。

ということで必要なパッケージを追加する。tantivyってのはどうやらRust製の全文検索ライブラリみたい。

!pip install -U lancedb tantivy sqlalchemy

エージェントにナレッジとストレージを与えて実行

from agno.agent import Agent
from agno.embedder.openai import OpenAIEmbedder
from agno.knowledge.url import UrlKnowledge
from agno.models.openai import OpenAIChat
from agno.storage.sqlite import SqliteStorage
from agno.vectordb.lancedb import LanceDb, SearchType

# RAGで使用するナレッジの定義
# 今回は Agno のナレッジベースにあるドキュメントを使う
# また、Agnoは LLMS.txt(`https://docs.agno.com/llms-full.txt`)を提供しているので
# それを使っても良い
knowledge = UrlKnowledge(
    urls=["https://docs.agno.com/introduction.md"],
    vector_db=LanceDb(
        uri="tmp/lancedb",
        table_name="agno_docs",
        search_type=SearchType.hybrid,
        # OpenAI Embeddingを使う
        embedder=OpenAIEmbedder(id="text-embedding-3-small", dimensions=1536),
    ),
)

# 会話履歴ストレージの定義
storage = SqliteStorage(table_name="agent_sessions", db_file="tmp/agent.db")

# エージェントに、指示・ナレッジ・ストレージを与えて定義
agent = Agent(
    name="Agno Assist",
    model=OpenAIChat(id="gpt-4.1"),
    instructions=[
        "質問に答える前に、自分の知識を検索してください。",
        "出力のみを回答に含めてください。その他のテキストは含めないでください。",
    ],
    knowledge=knowledge,
    storage=storage,
    add_datetime_to_instructions=True,
    # メッセージ会話履歴を追加する
    add_history_to_messages=True,
    # 実行時の履歴数
    num_history_runs=3,
    markdown=True,
)

agent.knowledge.load(recreate=False)
agent.print_response("Agnoとはどういうものですか?", stream=True)

実行はされるもののエラー・・・

出力
INFO Creating table: agno_docs                                                                                     
INFO Loading knowledge base                                                                                        
INFO Added 2 documents to knowledge base                                                                           
▰▰▰▰▱▱▱ Thinking...
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ Agnoとはどういうものですか?                                                                                    ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Tool Calls ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ • search_knowledge_base(query=Agno とは)                                                                        ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Response (2.3s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ 「Agno」という言葉について、私の知識ベースには情報がありませんでした。文脈や分野(例:地名、製品名、用語など)  ┃
┃ を教えていただけますと、さらに詳しく調べることができます。                                                      ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
ERROR    Error searching for documents: The lance library is required to use this function. Please install with    
         `pip install pylance`.

pylanceが足りないらしい。んー、と思ったけど型チェックで使うPylanceではなく、どうもLanceDBのパッケージみたい。これを追加する。

!pip install -U pylance

再度実行してみると今度はうまくいった。

出力
INFO Loading knowledge base                                                                                        
INFO Skipped 2 existing/duplicate documents.                                                                       
INFO Added 0 documents to knowledge base                                                                           
▰▰▰▰▱▱▱ Thinking...
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ Agnoとはどういうものですか?                                                                                    ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Tool Calls ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ • search_knowledge_base(query=Agno とは)                                                                        ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Response (15.3s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃                                                                                                                 ┃
┃                                                   Agnoとは?                                                    ┃
┃                                                                                                                 ┃
┃ Agnoは、Pythonで動作するマルチエージェントシステム構築のためのフレームワークです。エンジニアや研究者が複数の知  ┃
┃ 識や推論機能を持ったエージェントを簡単に設計・構築できるよう設計されています。                                  ┃
┃                                                                                                                 ┃
┃                                                    主な特徴                                                     ┃
┃                                                                                                                 ┃
┃  • マルチエージェント設計:共有メモリ・ナレッジ・推論能力を持ったエージェントやチームが作れる                   ┃
┃  • モデル非依存:23種類以上のモデルプロバイダーに対応し、ロックインなし                                         ┃
┃  • 高パフォーマンス:エージェントの起動やメモリ消費が非常に効率的                                               ┃
┃  • 推論能力重視:推論(reasoning)モデル・ツールチェーンを標準でサポート                                        ┃
┃  • マルチモーダル対応:テキスト、画像、音声、動画を入力・出力として扱える                                       ┃
┃  • 知識ベース検索&RAG:20種類以上のベクトルDBと統合可能なリアルタイム検索機能                                  ┃
┃  • メモリとストレージ:エージェントの長期記憶・セッション管理に対応                                             ┃
┃  • 構造化出力:型付きレスポンスやJSONモード対応                                                                 ┃
┃                                                                                                                 ┃
┃                                                 できることの例                                                  ┃
┃                                                                                                                 ┃
┃  • ツール・指示書付きのエージェント作成                                                                         ┃
┃  • メモリや知識を持つエージェント設計                                                                           ┃
┃  • エージェント同士のチーム化と協働                                                                             ┃
┃  • 決定論的・状態管理型ワークフローの実装                                                                       ┃
┃                                                                                                                 ┃
┃                                                    使い始め                                                     ┃
┃                                                                                                                 ┃
┃  • ドキュメント                                                                                                 ┃
┃  • 公式サイト                                                                                                   ┃
┃                                                                                                                 ┃
┃ Agnoは研究開発だけでなく、実用的アプリケーション構築にも適した最新のエージェント・フレームワークです。          ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
INFO Found 3 documents
kun432kun432

Level 3: Agents with memory and reasoning

レベル3では、エージェントにメモリとReasoningを追加する。

  • エージェントに「考えて」「解析させる」ような「深い推論」の場合にはreasoningを使う
    • 今回はReasoningToolsを使う。このあたりを見る限り、どうやらツール実行結果を一度LLMに解析させるような推論ステップが追加されるようなイメージ
  • 上で会話履歴の話をしたけども、memoryは会話履歴とは別で、ユーザの好みやパーソナライズに関するものを、会話履歴からLLMに抽出させるといったものみたい。
from agno.agent import Agent
from agno.memory.v2.db.sqlite import SqliteMemoryDb
from agno.memory.v2.memory import Memory
from agno.models.openai import OpenAIChat
from agno.tools.reasoning import ReasoningTools
from agno.tools.yfinance import YFinanceTools

# メモリの定義
memory = Memory(
    # メモリを作成・管理するモデルを指定
    model=OpenAIChat(),
    # SQLiteにメモリを保存
    db=SqliteMemoryDb(table_name="user_memories", db_file="tmp/agent.db"),
    # メモリの削除を有効化。なお、デフォルトは無効になっている
    delete_memories=True,
    clear_memories=True,
)

# エージェントの定義
agent = Agent(
    model=OpenAIChat(),
    tools=[
        # 推論ツールを使用
        ReasoningTools(add_instructions=True),
        YFinanceTools(stock_price=True, analyst_recommendations=True, company_info=True, company_news=True),
    ],
    # メモリを保持するためのユーザIDを指定、指定がなければ`default`がデフォルト
    user_id="ava",
    instructions=[
        "データを表で表示してください。",
        "回答には出典を記載してください。",
        "回答にはレポートのみを含めてください。その他のテキストは含めないでください。",
    ],
    memory=memory,
    # エージェントにメモリを管理させる
    enable_agentic_memory=True,
    markdown=True,
)

# ユーザID"ava"のお気に入りの株はNVIDAとTESLAというメモリが作成される
agent.print_response(
    "私のお気に入りの株は NVIDIA と TSLA です。",
    stream=True,
    show_full_reasoning=True,
    stream_intermediate_steps=True,
)

# メモリを使って質問に答える
agent.print_response(
    "私のお気に入りの株を比較して。",
    stream=True,
    show_full_reasoning=True,
    stream_intermediate_steps=True,
)

結果

出力
▰▰▰▱▱▱▱ Thinking...
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ 私のお気に入りの株は NVIDIA と TSLA です。                                                                      ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Tool Calls ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ • update_user_memory(task=ユーザーのお気に入りの株をNVIDIAとTSLAとして記録する。)                               ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Response (5.5s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ 記録しました。NVIDIAとTSLAがあなたのお気に入りの株ですね。何かお手伝いできることがあれば教えてください。        ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
▰▰▰▰▰▱▱ Thinking...
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ 私のお気に入りの株を比較して。                                                                                  ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Tool Calls ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ • get_current_stock_price(symbol=NVDA)                                                                          ┃
┃ • get_current_stock_price(symbol=TSLA)                                                                          ┃
┃ • get_company_info(symbol=NVDA)                                                                                 ┃
┃ • get_company_info(symbol=TSLA)                                                                                 ┃
┃ • get_analyst_recommendations(symbol=NVDA)                                                                      ┃
┃ • get_analyst_recommendations(symbol=TSLA)                                                                      ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Response (15.6s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                                                 ┃
┃ 以下は、NVIDIAとTeslaの株の比較です。                                                                           ┃
┃                                                                                                                 ┃
┃                                                                                                                 ┃
┃   指標                     NVIDIA (NVDA)                             Tesla (TSLA)                               ┃
┃  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ┃
┃   株価                     $164.92 USD                               $313.51 USD                                ┃
┃   時価総額                 $4,022,003,040,256 USD                    $1,009,803,198,464 USD                     ┃
┃   セクター                 テクノロジー                              一般消費財                                 ┃
┃   業種                     半導体                                    自動車メーカー                             ┃
┃   本社所在地               サンタクララ, カリフォルニア州, 米国      オースティン, テキサス州, 米国             ┃
┃   EPS(1株あたりの利益)   3.1                                       1.76                                       ┃
┃   PER(株価収益率)        53.2                                      178.13                                     ┃
┃   52週の最安値と最高値     $86.62 - $167.89                          $182.00 - $488.54                          ┃
┃   アナリスト推薦           強く買い                                  保持                                       ┃
┃   推薦詳細(0ヶ月前)      強く買い: 12, 買い: 46, 保持: 7, 売り:    強く買い: 7, 買い: 14, 保持: 16, 売り:     ┃
┃                            1, 強く売り: 0                            7, 強く売り: 3                             ┃
┃   従業員数                 36,000                                    125,665                                    ┃
┃   総現金                   $53,690,998,784 USD                       $36,996,001,792 USD                        ┃
┃   フリーキャッシュフロー   $55,443,001,344 USD                       $3,360,000,000 USD                         ┃
┃   営業キャッシュフロー     $76,158,001,152 USD                       $16,837,001,192 USD                        ┃
┃   EBITDA                   $88,247,001,088 USD                       $12,549,999,616 USD                        ┃
┃   売上成長率               69.2%                                     -9.2%                                      ┃
┃   総利益率                 70.107%                                   17.662%                                    ┃
┃   EBITDAマージン           59.419996%                                13.111%                                    ┃
┃                                                                                                                 ┃
┃                                                                                                                 ┃
┃ 出典: 各企業の最新情報、アナリストのレコメンデーション                                                          ┃
┃                                                                                                                 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
kun432kun432

Level 4: Agent Teams that can reason and collaborate

ここからがマルチエージェント。一般的に、タスクが複雑な場合やツールが多い場合はこれを分解して、個々のエージェントにある程度スコープを狭くしたタスクを与えて、お互いに協調させつつ、結果を集約するといった形にするほうがパフォーマンスが上がるらしい。

レベル4では、半導体市場を分析する2つのエージェントで構成されたチームにタスクを与えて解決させる。今回はAnthropicとOpenAIの両方を使ってみる。

パッケージを追加。なお、ドキュメントのサンプルではDuckDuckGoを使用しているようだが、どうもDuckDuckGoのライブラリ側でアップデートがあったようで、やまほどWarningが出てうまく行っているのかどうかが判断しにくかったので、Tavilyに変更した。

pip install -U anthropic tavily-python

AnthropicとTavilyのAPIキーもセット

from google.colab import userdata
import os

os.environ["ANTHROPIC_API_KEY"] = userdata.get('ANTHROPIC_API_KEY')
os.environ["TAVILY_API_KEY"] = userdata.get('TAVILY_API_KEY')

では推論

from agno.agent import Agent
from agno.models.anthropic import Claude
from agno.models.openai import OpenAIChat
from agno.team.team import Team
from agno.tools.tavily import TavilyTools
from agno.tools.reasoning import ReasoningTools
from agno.tools.yfinance import YFinanceTools

# 検索エージェントの定義
web_agent = Agent(
    name="Web検索エージェント",
    role="Web検索の依頼や一般的な調査に対応する",
    model=OpenAIChat(id="gpt-4.1"),
    tools=[TavilyTools()],  # Tavily検索ツールを与える
    instructions="出典を必ず記載してください",
    add_datetime_to_instructions=True,
)

# 財務エージェントの定義
finance_agent = Agent(
    name="財務エージェント",
    role="財務データのリクエストや市場分析を処理する",
    model=OpenAIChat(id="gpt-4.1"),
    tools=[
        YFinanceTools(
            stock_price=True,
            stock_fundamentals=True,
            analyst_recommendations=True,
            company_info=True
        )
    ],
    instructions=[
        "表を使用して、株価、ファンダメンタル分析(P/E、時価総額)、および推奨事項を表示してください。"
        "会社名とティッカーシンボルを明確に記載してください。",
        "実用的な財務情報に焦点を当ててください。",
    ],
    add_datetime_to_instructions=True,
)

# チームを構成
reasoning_finance_team = Team(
    name="財務分析チーム",
    mode="coordinate",
    model=Claude(id="claude-sonnet-4-20250514"),
    members=[web_agent, finance_agent],
    tools=[ReasoningTools(add_instructions=True)],
    instructions=[
        
        "包括的な財務および投資に関する洞察を提供するために協力してください",
        "ファンダメンタル分析と市場センチメントの両方を考慮してください。",
        "データを明確かつ専門的に表示するために、表やグラフを使用してください。",
        "調査結果を構造化された、わかりやすい形式で提示してください",
        "個々のエージェントの回答ではなく、最終的に統合された分析のみを出力してください",         
    ],
    markdown=True,
    show_members_responses=True,
    enable_agentic_context=True,
    add_datetime_to_instructions=True,
    success_criteria=(
        "チームは、データ・視覚化・リスク評価・定量分析・市場調査に裏打ちされた"
        "実行可能な投資推奨事項を含む、包括的な財務分析を提供した。"
    )
)

# チームにタスクを与える
reasoning_finance_team.print_response("""\
    テクノロジー業界の巨人(AAPL、GOOGL、MSFT)の業績を比較してください:
    1. 3社の財務データを取得してください
    2. テクノロジー業界に影響を与える最近のニュースを分析してください
    3. 比較指標と相関関係を計算してください
    4. ポートフォリオの配分比率を推奨してください""",
    stream=True,
    show_full_reasoning=True,
    stream_intermediate_steps=True,
)

3〜4分ほどかけて結果が生成された。長くてZennでは収まらないので、Gistに貼った。

結果
kun432kun432

Level 5: Agentic Workflows with state and determinism

レベル5は「ワークフロー」。「ワークフロー」は、商用アプリケーションのために作られた、決定論的でステートフルなマルチエージェントプログラム。ポイントとしては、

  • 細かい制御(ループ・条件分岐・エラー処理とか)をピュアPythonで全部書ける。
  • 状態(ステート)を持ち、途中で一旦停止・そこから再開なども可能。
  • WorkflowのロジックはピュアPythonなので、AIコードエディタなどの恩恵も受けれる。

という感じなのかな。

サンプルで上がっているのは、実行結果をキャッシュするワークフローの例

from typing import Iterator
from agno.agent import Agent, RunResponse
from agno.models.openai import OpenAIChat
from agno.utils.log import logger
from agno.utils.pprint import pprint_run_response
from agno.workflow import Workflow


class CacheWorkflow(Workflow):
    # エージェントやチームをワークフローの属性として追加
    agent = Agent(model=OpenAIChat(id="gpt-4o-mini"))

    # `run()`メソッドにロジックを書く
    def run(self, message: str) -> Iterator[RunResponse]:
        logger.info(f"キャッシュをチェック: '{message}'")
        # 出力がすでにキャッシュされているかをチェック
        if self.session_state.get(message):
            logger.info(f"キャッシュヒット: '{message}'")
            yield RunResponse(
                run_id=self.run_id,
                content=self.session_state.get(message)
            )
            return

        logger.info(f"キャッシュミス: '{message}'")
        # エージェントを実行してレスポンスをyieldする
        yield from self.agent.run(message, stream=True)

        # レスポンスがyieldされたら出力をキャッシュ
        self.session_state[message] = self.agent.run_response.content


# CacheWorkflowクラスのインスタンスを作成してワークフローを定義
workflow = CacheWorkflow()

# ワークフローを実行(〜1秒程度かかる)
response: Iterator[RunResponse] = workflow.run(message="なにか面白いジョークを言って.")
# 結果を出力
pprint_run_response(response, markdown=True, show_time=True)
# サイドワークフローを実行(キャッシュされているためすぐに完了する)
response: Iterator[RunResponse] = workflow.run(message="なにか面白いジョークを言って.")
# 結果を出力
pprint_run_response(response, markdown=True, show_time=True)

ただWorkflowにはどうやら不具合があるようで、以下で修正されている。自分がインストールしたバージョンのパッケージではまだ対応できていない様子なので、そのうち治ると思われる。

https://github.com/agno-agi/agno/issues/3787

とりあえず実行するとこんな感じ

出力
INFO キャッシュをチェック: 'なにか面白いジョークを言って.'                                                         
INFO キャッシュミス: 'なにか面白いジョークを言って.'                                                               
╭──────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Response │ もちろん!では、こんなジョークはいかがでしょう?                                                     │
│ (1.3s)   │                                                                                                      │
│          │ なぜ海は青いの?                                                                                     │
│          │                                                                                                      │
│          │ 魚があまりにも多く泳いでいるから、みんなが「ブルー」になっちゃうんだ!                               │
╰──────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────╯
INFO キャッシュをチェック: 'なにか面白いジョークを言って.'                                                         
INFO キャッシュヒット: 'なにか面白いジョークを言って.'                                                             
WARNING  Workflow.run() should only yield RunResponseEvent objects, got: <class 'agno.run.response.RunResponse'>   

キャッシュされた出力は表示されていないけども、キャッシュされていることはわかる。

kun432kun432

ここまでのまとめ

エージェントフレームワークとしての書きっぷりみたいなものは過去色々見てきたものとそんなに違いはないと思うので、まあだいたいどれもこんな感じの設計になるよね、という感。

ただ、後発だけあって、かなりスッキリ書けて、あとツール実行とか裏で何やっているか?がちゃんときれいに出力されていたりしてわかりやすいのは良さそう。コンポーネント設計もスッキリしてるような気がした。

あと、Xで言及されているのをいろいろ見る限り、なんとなくMastraと並んで書かれることが多い印象がある。Mastraの評判が非常に良さそうので、そこと並んで書かれると、なんとなく期待できそう、みたいに思ってしまう。根拠ゼロなんだけど。

kun432kun432

エージェントフレームワークも多数あって、ここしばらく色々お試ししていたのだけども、自分の中ではこんな感じのグループ分けになった。

  • プロプライエタリベンダー起点
    • OpenAI Agents SDK
    • Google Agent Development Kit
  • サードパーティ・オープンソースプロジェクト起点
    • 第一次(結構以前からあるもの)
      • LangChain/LangGraph
      • LlamaIndex
      • AutoGen
      • CrewAI
    • 第二次(比較的新しめ)
      • Pydantic AI
      • SmolAgents
      • Mastra
      • Agno

他にもたくさんあって、まあなんていうか、多すぎると逆に選べない、みたいな様相。結局どれも触ってみないとわからないし、ユースケースとかに合う合わないもまああるよね。

kun432kun432

Agnoについては他の機能についてももう少し色々見てみる。

kun432kun432

Playground

https://docs.agno.com/introduction/playground

Agnoにはテストややりとりを行うためのインタフェースとしてPlaygroundが標準で用意されていて、以下のような特徴がある。

  • ストリーミングサポート: リアルタイムの応答ストリーミングと中間状態をユーザーに返します。
  • セッション履歴: プレイグラウンド内で会話履歴を可視化できます。
  • ユーザーメモリ: 会話全体にわたるユーザーの詳細と設定を可視化できます。
  • 設定: エージェントパラメーター、モデル設定、ツール設定を確認できる包括的な設定インターフェースを提供します。
  • 推論サポート:: プレイグラウンドインターフェースに詳細な推論トレースを表示する組み込みサポート。
  • Human in Loopサポート: 専門の監視と承認によるエージェントワークフローへの手動介入を可能にします。
  • マルチモーダルサポート: テキスト、画像、音声、その他のメディアタイプの処理と生成をサポートします。
  • マルチエージェントシステム: マルチエージェントチームとワークフローをサポートします。

ただざっと見た感じ、どうやらAgnoのクラウドサービスの利用が必要になるように読める。Agnoの公式サイトの料金のところを見ると・・・

https://www.agno.com/

どうやらまだ有料プランは始まっていないみたいだが、Agent playgroundは無料プランの中にあるので使えそう。

とりあえずアカウントを作成して、ログインするとこんな画面。

認証の設定についてはあとでやることとする。

では今回はローカルにAgnoをインストールして試す。uv で Python仮想環境を作成。

uv init -p 3.12 agno-work && cd $_

パッケージインストール。

uv add openai duckduckgo-search yfinance sqlalchemy 'fastapi[standard]' agno
出力
 + agno==1.7.5

サンプルコードはこんな感じ。なるほど、Playground にエージェントを渡してサーバを起動する、といった感じになるっぽい。

playground.py
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.playground import Playground
from agno.storage.sqlite import SqliteStorage
from agno.tools.duckduckgo import DuckDuckGoTools
from agno.tools.yfinance import YFinanceTools

agent_storage: str = "tmp/agents.db"

web_agent = Agent(
    name="Web Agent",
    model=OpenAIChat(id="gpt-4o"),
    tools=[DuckDuckGoTools()],
    instructions=["常に情報源を含めてください。"],
    # エージェントのセッションをSQLiteデータベースに保存
    storage=SqliteStorage(table_name="web_agent", db_file=agent_storage),
    # 指示に現在の日時を追加
    add_datetime_to_instructions=True,
    # メッセージに会話履歴を追加
    add_history_to_messages=True,
    # メッセージに追加する会話履歴の数
    num_history_responses=5,
    # メッセージにMarkdown形式でフォーマットを追加
    markdown=True,
)

finance_agent = Agent(
    name="Finance Agent",
    model=OpenAIChat(id="gpt-4o"),
    tools=[
        YFinanceTools(
            stock_price=True,
            analyst_recommendations=True,
            company_info=True,
            company_news=True,
        )
    ],
    instructions=["データの表示は常に表で行ってください。"],
    storage=SqliteStorage(table_name="finance_agent", db_file=agent_storage),
    add_datetime_to_instructions=True,
    add_history_to_messages=True,
    num_history_responses=5,
    markdown=True,
)

playground_app = Playground(agents=[web_agent, finance_agent])
app = playground_app.get_app()

if __name__ == "__main__":
    playground_app.serve("playground:app", reload=True)

OpenAI APIキーをセット

export OPENAI_API_KEY=XXXXXX

そしてAgnoの認証。認証については以下にドキュメントがある。

https://docs.agno.com/how-to/authentication

認証には2つの方法がある。

  1. AgnoのCLIコマンドで認証
  2. Agno.comでAPIキーを作成して環境変数にセット

今回は前者でやってみる。AgnoのパッケージをインストーするとCLIもインストールされている。

uv run ag --help
出力
 Usage: ag  [COMMAND] [OPTIONS]


 Agno is a model-agnostic framework for building AI Agents.

 Usage:
 1. Run `ag ws create` to create a new workspace
 2. Run `ag ws up` to start the workspace
 3. Run `ag ws down` to stop the workspace


╭─ Options ───────────────────────────────────────────────────────────────────────────╮
│ --help          Show this message and exit.                                         │
╰─────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ──────────────────────────────────────────────────────────────────────────╮
│ setup     Setup your account                                                        │
│ init      Initialize Agno, use -r to reset                                          │
│ reset     Reset Agno installation                                                   │
│ ping      Ping Agno servers                                                         │
│ config    Print Agno config                                                         │
│ set       Set current directory as active workspace                                 │
│ start     Start resources defined in a resources.py file                            │
│ stop      Stop resources defined in a resources.py file                             │
│ patch     Update resources defined in a resources.py file                           │
│ restart   Restart resources defined in a resources.py file                          │
│ ws        Manage workspaces                                                         │
╰─────────────────────────────────────────────────────────────────────────────────────╯

以下を実行すると認証およびワークスペースの設定がされるらしい。

uv run ag setup
出力
Welcome to Agno!

Authenticating with agno.com

Your browser will be opened to visit:
https://app.agno.com/cli-auth?source=cli&action=signin&redirection_supported=true&redir
ecturi=http%3A%2F%2Flocalhost%3A9191%2Fauth

Waiting for a response from the browser...

自動的にブラウザが起動して認証画面が表示される。認証すると以下のように表示されて完了。

出力
Welcome XXXXXXX

なお、APIキーを使う場合は、Agnoの管理画面の "Settings" から鍵アイコンをクリックすると取得できるので、これを環境変数にセットすれば良い。

では実行する。

uv run playground.py

以下のようにPlaygroundのURLが表示されるので、ブラウザでアクセス。なお、ローカルの方は7777番ポートで起動しているみたい。

出力

INFO Starting playground on http://localhost:7777
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Agent Playground ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                ┃
┃                                                                                ┃
┃  Playground URL: https://app.agno.com/playground?endpoint=localhost%3A7777/v1  ┃
┃                                                                                ┃
┃                                                                                ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
INFO:     Will watch for changes in these directories: ['/Users/kun432/work/agno-work']
INFO:     Uvicorn running on http://localhost:7777 (Press CTRL+C to quit)
INFO:     Started reloader process [63063] using WatchFiles
INFO:     Started server process [63067]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

ブラウザでアクセスとAgno.comのPlayground画面が表示される。サラッと使えるのかなと思いきや、ローカルのエンドポイントを登録する必要がある。右の"ENDPOINT" で "Add endpoint" を選択

エンドポイントURL(http://localhost:7777/v1)と適当な名前を登録。

登録したエンドポイントを選択。表示されていなければ再読み込みアイコンをクリックすると表示されると思う。

ローカルで設定したエージェント名などが見えればOKっぽい。適当にチャットしてみる。

アップルの今日の株価を知りたい。

ツールの実行がうまくいかなかったが、Webエージェントを選択していたためで、かつ、どうもDuckDuckGoのライブラリが色々変わってしまったためだと思われる。

ローカルではこんなWarningが出ている。そういえば上でやったサンプルでもDuckDuckGoではうまく動かなくてTavilyにしていたのだった。

/Users/kun432/work/agno-work/.venv/lib/python3.12/site-packages/agno/tools/duckduckgo.py:71: RuntimeWarning: This package (`duckduckgo_search`) has been renamed to `ddgs`! Use `pip install ddgs` instead.
  ddgs = DDGS(
/Users/kun432/.local/share/uv/python/cpython-3.12.10-macos-aarch64-none/lib/python3.12/json/encoder.py:414: ResourceWarning: unclosed resource <TCPTransport closed=False reading=False 0x129505df0>
  def _iterencode(o, _current_indent_level):
/Users/kun432/.local/share/uv/python/cpython-3.12.10-macos-aarch64-none/lib/python3.12/json/encoder.py:356: ResourceWarning: unclosed resource <TCPTransport closed=False reading=False 0x1294c97e0>
  items = dct.items()

なお、Financeエージェントの方ではちゃんと取得できた。

マルチエージェントで試す場合にはチームとか作って試すのだろうと思われる。

kun432kun432

モニタリングとデバッグ

https://docs.agno.com/introduction/monitoring

モニタリング

エージェントのモニタリングも Agno.com で行える。

1つ前の環境をそのまま使う。Agnoの認証はすでにできているという前提。

monitoring.py
from agno.agent import Agent

agent = Agent(
    markdown=True,
    # エージェント単位でモニタリングを有効にできる
    # なお、環境変数 `AGNO_MONITOR=true`をセットすると、
    # 全てのエージェントがモニタリング対象となる
    monitoring=True
)
agent.print_response("2文のホラーストーリーを作って。")

実行

uv run monitoring.py
出力
INFO Setting default model to OpenAI Chat
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                     ┃
┃ 2文のホラーストーリーを作って。                                                     ┃
┃                                                                                     ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Response (3.4s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                     ┃
┃ 子供が毎晩、クローゼットの中に誰かがいると言い張るので、私は彼の不安を和らげるため  ┃
┃ に一緒に部屋を調べることにした。クローゼットのドアを開けた瞬間、私の顔をした「誰か  ┃
┃ 」と目が合った。                                                                    ┃
┃                                                                                     ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Agno.com の "SESSIONS" に記録されているのがわかる。先ほどのPlaygroundのものもあるね。

デバッグ

エージェントのデバッグモードを有効にする。

debug_logs.py
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.yfinance import YFinanceTools

agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    tools=[YFinanceTools(stock_price=True)],
    instructions="データの表示は常に表で行ってください。",
    markdown=True,
    debug_mode=True,  # デバッグモードを有効化
)
agent.print_response("Appleの株価を教えて。", stream=True)

実行

uv run debug_logs.py
出力
DEBUG ********** Agent ID: fdcd0573-22fb-46e8-99fd-c4f6bbf805c1 *********
DEBUG ********* Session ID: ce7d323b-f637-4398-920a-7f0b9158c648 ********
DEBUG Processing tools for model
DEBUG Added tool get_current_stock_price from yfinance_tools
DEBUG ****** Agent Run Start: 2542807c-e3fc-4fb0-8051-438ddf11e3df ******
DEBUG ------------------- OpenAI Response Stream Start ------------------
DEBUG -------------------------- Model: gpt-4o --------------------------
DEBUG ============================== system =============================
DEBUG <instructions>
      データの表示は常に表で行ってください。
      </instructions>

      <additional_information>
      - Use markdown to format your answers.
      </additional_information>
DEBUG =============================== user ==============================
DEBUG Appleの株価を教えて。
DEBUG ============================ assistant ============================
DEBUG Tool Calls:
        - ID: 'call_MSdyAvg3pJOuUwphUjo7UDtu'
          Name: 'get_current_stock_price'
          Arguments: 'symbol: AAPL'
DEBUG ****************************  METRICS  ****************************
DEBUG * Tokens:                      input=104, output=17, total=121
DEBUG * Prompt tokens details:       {'audio_tokens': 0, 'cached_tokens': 0}
DEBUG * Completion tokens details:   {'accepted_prediction_tokens': 0, 'audio_tokens':
      0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}
DEBUG * Time:                        1.0302s
DEBUG * Tokens per second:           16.5022 tokens/s
DEBUG * Time to first token:         0.9508s
DEBUG ****************************  METRICS  ****************************
DEBUG Running: get_current_stock_price(symbol=AAPL)
DEBUG Fetching current price for AAPL
DEBUG =============================== tool ==============================
DEBUG Tool call Id: call_MSdyAvg3pJOuUwphUjo7UDtu
DEBUG 211.1800
DEBUG **************************  TOOL METRICS  *************************
DEBUG * Time:                        0.6875s
DEBUG **************************  TOOL METRICS  *************************
DEBUG ============================ assistant ============================
DEBUG 以下はAppleの現在の株価を表示している表です。

      | 銘柄コード | 株価 (USD) |
      |------------|------------|
      | AAPL       | 211.18     |
DEBUG ****************************  METRICS  ****************************
DEBUG * Tokens:                      input=135, output=46, total=181
DEBUG * Prompt tokens details:       {'audio_tokens': 0, 'cached_tokens': 0}
DEBUG * Completion tokens details:   {'accepted_prediction_tokens': 0, 'audio_tokens':
      0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}
DEBUG * Time:                        1.2554s
DEBUG * Tokens per second:           36.6423 tokens/s
DEBUG * Time to first token:         0.5330s
DEBUG ****************************  METRICS  ****************************
DEBUG -------------------- OpenAI Response Stream End -------------------
DEBUG Added RunResponse to Memory
DEBUG ******* Agent Run End: 2542807c-e3fc-4fb0-8051-438ddf11e3df *******
┏━ Message ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                     ┃
┃ Appleの株価を教えて。                                                               ┃
┃                                                                                     ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Tool Calls ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                     ┃
┃ • get_current_stock_price(symbol=AAPL)                                              ┃
┃                                                                                     ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Response (3.0s) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                                     ┃
┃ 以下はAppleの現在の株価を表示している表です。                                       ┃
┃                                                                                     ┃
┃                                                                                     ┃
┃   銘柄コード   株価 (USD)                                                           ┃
┃  ━━━━━━━━━━━━━━━━━━━━━━━━━                                                          ┃
┃   AAPL         211.18                                                               ┃
┃                                                                                     ┃
┃                                                                                     ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

標準でもAgnoの実行時の出力は色々出力されてわかりすいと思うのだけど、デバッグモードを有効にするとさらに詳細に把握できる。

なお、実際にはもっとカラフルに表示される。

kun432kun432

あとは各コンポーネントごとに見たり、サンプルを試したりという感じで。

長くなりそうので別記事にまとめる。

kun432kun432

ちなみに、GitHubのREADMEにもあるけど、

完全なドキュメントインデックス

LLM や AI アシスタントが Agno の完全なドキュメントを理解・参照しやすいよう、LLMs.txt または LLMs-Full.txt を提供しています。

とかがあるので、AI IDEを使う場合にはこれを利用するのが良さそう。

あと、公式ドキュメントでAIにチャットで質問できる機能は結構色んなところで見かけるけども、Agnoのものは知りたいことをかなり詳しく説明してくれて、かなり優秀ではなかろうか、と感じる。

ただ、めちゃめちゃ生成量が多くて、かつ、途中で止まらないので、ちょっとだけ使いにくい。生成量が増えるとブラウザが重くなる気もする・・・

このスクラップは1ヶ月前にクローズされました