A2Aプロトコルのサンプルコードを試してみる【AIエージェント】
はじめに
GoogleがAgent2Agent プロトコル(A2A)を発表しました。
この記事ではそのサンプルコードを試してみます。
A2Aは、ざっくりいうと異なる企業やフレームワークによって作られたAIエージェントたちが共通のプロトコルを介して、互いに呼び出せる仕組みです。
さらにざっくりいうと、**サンプルコード内では、Google ADK製のAIエージェントが、Langgraph製のAIエージェントを呼び出して、まるで子エージェントかのようにタスク依頼をします。**その結果を受け取ってユーザーに返します。
将来的にA2Aが普及すれば、さまざまなサービスにAIエージェントが搭載され、それらが必要に応じて連携して動けるようになります。
↓発表
↓ドキュメント ↓githubサンプルコードの全体像
今回はHostAgentの加えて以下の3つを起動します。
LangGraph
概要: ツールを使用して通貨を変換するエージェント。
特徴: マルチターンの対話、ツールの使用、ストリーミング更新を実現。
CrewAI
概要: 画像を生成するエージェント。
特徴: マルチターンの対話と、A2A を通じた画像送信を実現。
Google ADK
概要: 経費報告書を模擬的に記入するエージェント。
特徴: マルチターンの対話と、A2A を通じたウェブフォームの返信・送信を実現。
コードのダウンロード
任意の場所に落としてください。
uvのインストール
デモを実行する際にuvが必要
uvはPythonの高速かつ高機能なパッケージマネージャー
一つでpipとvenvの両方の機能が使えます。
uv をインストール
公式インストーラー
curl -LsSf https://astral.sh/uv/install.sh | sh
もしくはbrewでも入る
brew install uv
インストールできたら、pathを通します。
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
GeminiのAPIキーの取得
デモコードにおいてHost AgentやA2A Server側のAgentたちはGeminiで動かす想定で書かれているので、GeminiのAPIキーが必要です。
GeminiのAPIキーはここから取得します。
私は課金していないのでfree planですが、問題なく動きました。
プロジェクト直下に.envファイルを作成して記載しておく。
GOOGLE_API_KEY=hogefuga
私は試していないですが、Host AgentはGoogle ADK製なので、LiteLLM経由でOpenAIのAPIキーなども使えるはず。
言わずもがなA2A Server側のLangGraph AgentやCrew AI AgentはOpenAIなどのAPIキーが使えます。
なので社内規定などで特定のLLMしか使えない場合もなんとかなるはず。
A2A Server側のAgentを順番に起動する
Langgraph
localhost:10000で立ち上がる
cd samples/python/agents/langgraph
uv run .
CrewAI
localhost:10001で立ち上がる
cd samples/python/agents/CrewAI
uv python pin 3.12
uv venv
source .venv/bin/activate
uv run .
Google ADK
localhost:10002で立ち上がる
cd samples/python/agents/google_adk
uv run .
Webアプリを起動する
http://localhost:12000で起動します
cd demo/ui
uv run main.py
A2A Server側のAgentを登録する
Remote AgentsのところからA2A Server側のAgentを追加する。
画像はすでに追加済み。
以下をそれぞれ入力して追加する。
localhost:10000
localhost:10001
localhost:10002
実際に聞いてみる
確かに3つのエージェントが認識されている。
Langgraphはシンプルなのでうまく動く。
他2つは実際にやってみるとかなり挙動が不安定で、かなりの割合でレスポンスが返ってこない。
Langgraph(通貨変換)
CrewAI(画像生成)
Google ADK(経費精算)
新しいAIエージェントを作ってみる
(執筆中)
ひとまずClineを使って既存コードを元にLanggraphのエージェントをもう一つ作ってみた。
なんとなくA2A経由の呼び出し自体は上手くできているが、最後に結果をうまく表示できていない。
いずれにせよドキュメントを見て最小構成がなんなのか実装を理解する必要がある。
参考
Discussion