はじめに
七尾百合子さん、お誕生日 116日目 おめでとうございます! nikkieです。
A2A で Hello World した私。
今回は気になった点を探求します。
※読者の皆さんは真似をせず a2a-sdk を使ってください!
目次
A2A Hello World Example
uv run .で起動したA2Aサーバ(Remote Agent)は、以下を実装していました1
GET /.well-known/agent.json- Agent Cardの公開
POST /- JSON RPCでRemote Agent呼び出し
% curl http://0.0.0.0:9999/.well-known/agent.json | jq .
% curl http://0.0.0.0:9999/ --json '{"id": 1, "jsonrpc": "2.0", "method": "message/send", "params": {"message": {"role": "user", "parts": [{"kind": "text", "text": "Hi"}], "messageId": "abc"}}}'
{"id":1,"jsonrpc":"2.0","result":{"kind":"message","messageId":"d741a61f-fd4f-498d-a7fa-5d3a382195a0","parts":[{"kind":"text","text":"Hello World"}],"role":"agent"}}
クライアントのプログラム test_client.py は POST / を2回呼び出しています。
- sendMessage
- sendMessageStream
FastAPIで再現するぞ
% uv run minimum_support.py
% curl http://0.0.0.0:9999/.well-known/agent.json | jq '.'
% curl http://0.0.0.0:9999/ --json '{"id": 1, "jsonrpc": "2.0", "method": "message/send", "params": {"message": {"role": "user", "parts": [{"kind": "text", "text": "Hi"}], "messageId": "abc"}}}'
{"id":1,"jsonrpc":"2.0","result":{"kind":"message","messageId":"33944fc407934b149c7d331e68e7ebe2","parts":[{"kind":"text","text":"Hi"}],"role":"agent"}}
% curl -N http://0.0.0.0:9999/ --json '{"id": 1, "jsonrpc": "2.0", "method": "message/stream", "params": {"message": {"role": "user", "parts": [{"kind": "text", "text": "Hello"}], "messageId": "abc"}}}'
data: {"id": 1, "jsonrpc": "2.0", "result": {"kind": "message", "messageId": "9c82558b3b7e48b49f3e8cf8b1d5e2a0", "parts": [{"kind": "text", "text": "Hello"}], "role": "agent"}}
今回のエージェントは、送られたメッセージをオウム返しするだけです2。
a2a-sdkの実装を覗きながら実装しました
Agent Card(GET /.well-known/agent.jsonが返すJSON)は
- Streamingは引き続きあり
- supportsAuthenticatedExtendedCardは
Falseに変更
としました。
POST / は、2つのメソッドに対応する実装としています
message/sendmessage/stream:Server-Sent Eventsで返す3
a2a-samplesのHello World Exampleのtest_client.pyも流れます!
% uv run test_client.py
INFO:httpx:HTTP Request: POST http://localhost:9999/ "HTTP/1.1 200 OK"
{'id': 'bf1e2233-0755-4772-97f7-e5cc29e68a7e', 'jsonrpc': '2.0', 'result': {'kind': 'message', 'messageId': 'aa580249634f4cce852184fa33cd0840', 'parts': [{'kind': 'text', 'text': 'how much is 10 USD in INR?'}], 'role': 'agent'}}
終わりに
FastAPIを使って、messageをオウム返しするA2Aサーバは実装できました。
まだまだ探究の余地はありますが、今回のFastAPIアプリでエージェントを実行すれば、A2AのRemote Agentの1つの実装となると考えています。
MCPのときと同様、プロトコルが掴めてくると「こんなところに使えるんじゃないか」とアイデアが浮かんできますね。
練習用リポジトリにも置きました: