A2Aを触ってみよう
A2Aをなんとなくで理解してましたが、いよいよ決済などもエージェントで始まる勢い[AP2]なので、改めて理解していこうと思います
A2A(Agent2Agent)とは
Googleのブログには下記のように書いてあります。
AIエージェントが世の中に色々と立ち上がった状態で、各AIエージェント同士がコミュニケーションをとりながら、ユーザからの依頼などのタスクをこなしていくためのプロトコルということです
A2A プロトコルにより、AI エージェント同士がコミュニケーションを取り、安全に情報交換し、様々>な企業プラットフォーム上やアプリケーション上でアクションを調整できるようになります。
https://cloud.google.com/blog/ja/products/ai-machine-learning/a2a-a-new-era-of-agent-interoperability
A2Aの仕組み
下図のように「クライアント」エージェントと「リモート」エージェントにわかれます。
- クライアントエージェントはタスクの作成と伝達を担当
- リモートエージェントはそのタスクを実行して正確な情報の提供や、適切な行動を担当
リモートエージェントの機能
リモートエージェントには以下の主たる機能があるらしいです。
(気になるので見ていきたいですが、本記事ではまずは動かして感覚をつかむことを目的として、
下記機能は次回以降に見ていけたらと思います)
機能のディスカバリ: エージェントは JSON 形式の「Agent Card」を使用して自身の機能を公開することで、クライアント エージェントがタスクを実行できる最適なエージェントを特定し、A2A を活用してリモート エージェントと通信することができます。
クライアントエージェントにどんなリモートエージェントがいるかを教えるために「Agent Card」というのを定義してるってことですね
タスク管理: クライアントとリモートエージェント間のやり取りは、エージェントはエンドユーザーの要求を満たし、タスクを完了させることに重点を置いています。この「タスク」オブジェクトはプロトコルによって定義されており、ライフサイクルがあります。タスクはすぐに完了する場合もありますが、長時間実行されるタスクの場合には、各エージェントが互いにコミュニケーションをとりながらタスクの進捗状況を共有します。タスクの成果物は「アーティファクト」と呼ばれます。
クライアントエージェントからリモートエージェントがタスク受け付けた後、即時に完了しないこともあるので、タスクのステータスを共有しあって、完了したかどうかを確認していくんですね。
最終アウトプットが「アーティファクト」という名で出力されそう
コラボレーション: エージェント同士はメッセージを送信し合い、コンテキスト、返信、アーティファクト、またはユーザー指示を伝えることができます。
これはエージェント同時の通信と、必要に応じてユーザに指示することもあるってことを指しているっぽい
ユーザー体験の調整: 各メッセージには「パーツ」と呼ばれる要素が含まれています。これは生成された画像などの完成したコンテンツの一部です。各パーツには特定のコンテンツタイプが指定されており、クライアント エージェントとリモート エージェントが適切な形式について調整したり、iframe、動画、ウェブフォームなどの UI 機能について明示的に交渉することができます。
これはテキストや画像、URLなど、どんな情報をUIに表示しないといけないかなどの情報をパーツと呼んでいて、それらのパーツをUIの種別ごとにどう構成するといい感じに表示できるかってことかな
A2Aのサンプルで確認してみる
とりあえず、動かしてみる!
前提
- Python 3.12 or higher
- UV
- Agent servers speaking A2A (次でクローンするサンプル)
- Authentication credentials (API Key)
Agent2Agent (A2A) Samples
下記のようなマルチエージェント構成で試せるサンプルがあるので、そちらで確認します
では、実際に動かしていきます
gitクローン
https://github.com/a2aproject/a2a-samples.git
demo uiのディレクトリに移動
cd demo/ui
動作させるためにGEMINIのAPIキーを用意
APIキーを環境変数のファイルに設定
echo "GOOGLE_API_KEY=your_api_key_here" >> .env
UIでの動作確認
クライアントエージェントを実行しておきます
uv run main.py
上記を実行するとアクセスすべきURLが表示されるので、アクセスするとこんな感じ
※この時点ではリモートエージェントは動いてない
試しに"What remote agents do you have access to?"と聞いてみると
"I do not have access to any remote agents."と返ってくる
リモートエージェントを登録してないので、何にもアクセスできないってことですね
リモートエージェントを動かして連携させてみる
では、リモートエージェントを動かしてみましょう
のREADMEに従い、下記を実施しますcd ../../samples/python/agents/adk_expense_reimbursement/
cp ../../../../demo/ui/.env ./
README通りにすると、動きません。。
理由は簡単で、先ほどは.envファイルに
echo "GOOGLE_API_KEY=your_api_key_here" >> .env
と書き込みましたが、実際のソースはGEMINI_API_KEYを読みに行ってるので、
下記で設定するとよさそう(2025/9/22時点)
"GEMINI_API_KEY=your_api_key_here"
とコピーしたenvファイルを書き換えてください
uv run .
上記を実行することで、リモートエージェントのアドレスが発行されます
http://localhost:10002
これを先ほどのdemo uiのエージェントの画面で設定します
設定後、会話の画面に戻って、先ほどと同じく
"What remote agents do you have access to?"と聞いてみると
"I have access to the Reimbursement Agent, which handles the reimbursement process for employees given the amount and purpose of the reimbursement."と返ってきました
無事リモートエージェントと連携できたようです
リモートエージェントの概要については、おそらくリモートエージェントの__main__.pyに記載の下記のagent_cardのdescriptionをもとに返してるのではないかと思いますが、また今度詳細はみてみようと思います
agent_card = AgentCard(
name='Reimbursement Agent',
description='This agent handles the reimbursement process for the employees given the amount and purpose of the reimbursement.',
url=f'http://{host}:{port}/',
version='1.0.0',
default_input_modes=ReimbursementAgent.SUPPORTED_CONTENT_TYPES,
default_output_modes=ReimbursementAgent.SUPPORTED_CONTENT_TYPES,
capabilities=capabilities,
skills=[skill],
)
ここまででA2Aのサンプルを動かしてみることができました。
このような感じで、httpでアクセスできるリモートエージェントを用意し、
クライアントエージェントにリモートエージェントを登録すれば、
連携できるエージェントを増やせそうですね
Discussion