はじめに
七尾百合子さん、お誕生日 322日目 おめでとうございます! nikkieです。
ADK で A2A の理想と現実のお話です。
目次
- はじめに
- 目次
- ADK で A2A のサンプル
- A2A サーバの session service を Agent Engine にして、a2a_basic を動かす
- なぜ A2A サーバの session service に Agent Engine を使えないのか
- 終わりに
- P.S. プルリクエストを出しました
ADK で A2A のサンプル
Google の Agent Development Kit (ADK) の Python 版は、Agent2Agent Protocol を(実験的に)サポートしています。
adk-python のリポジトリには、A2A のサンプルがいくつかあります。
今回は一番基本のサンプルを動かします。
https://github.com/google/adk-python/tree/v1.23.0/contributing/samples/a2a_basic
3つのエージェントが登場します(コードは抜粋です)
root_agent = Agent(
instruction="""
1. If the user asks to roll a die, delegate to the roll_agent.
2. If the user asks to check primes, delegate to the prime_agent.
3. If the user asks to roll a die and then check if the result is prime, call roll_agent first, then pass the result to prime_agent.
""",
sub_agents=[roll_agent, prime_agent],
)
root_agent: ユーザーとやり取りする。roll_agentかprime_agentに処理を委譲できるroll_agent: サイコロを振るprime_agent: 数値が素数かどうかを判定する(A2A)
prime_agent = RemoteA2aAgent(
# 略
agent_card=(
f"http://localhost:8001/a2a/check_prime_agent{AGENT_CARD_WELL_KNOWN_PATH}"
),
)
A2A Protocol では、root_agentがクライアント、prime_agentがサーバです。
このとき、A2A サーバには session service に Agent Engine を指定できません(DB の指定では動作します)
A2A サーバの session service を Agent Engine にして、a2a_basic を動かす
adk-python を clone してきて、uv sync --extra a2aします。
私の環境は Python 3.13.8 です。
Vertex AI を使うよう、2箇所に.envを置きました。
- contributing/samples/a2a_basic/.env
- contributing/samples/a2a_basic/remote_a2a/check_prime_agent/.env
GOOGLE_GENAI_USE_VERTEXAI=true GOOGLE_CLOUD_PROJECT=adk-practice-480404 GOOGLE_CLOUD_LOCATION=global
(1) root_agentを起動します。
% uv run adk web contributing/samples/
ブラウザで http://127.0.0.1:8000 を開いて a2a_basic を選びます
(2) 別のターミナルでprime_agent(A2A サーバ)を起動します。
% uv run adk api_server --a2a --port 8001 contributing/samples/a2a_basic/remote_a2a --session_service_uri agentengine://projects/748276364070/locations/asia-northeast1/reasoningEngines/6740841907103989760
README にある「Is 7 a prime number?」をブラウザから送ります。
期待値は
root_agentがprime_agentに transferprime_agentが「7は素数」と回答
です。

transfer までは期待通りでしたが、prime_agentのレスポンスがエラーメッセージです。
google.genai.errors.ClientError: 400 INVALID_ARGUMENT. {'error': {'code': 400, 'message': 'Request contains an invalid argument.', 'status': 'INVALID_ARGUMENT'}}
なお A2A としては 200 を返しています。
INFO: 127.0.0.1:56661 - "POST /a2a/check_prime_agent HTTP/1.1" 200 OK
この件は2025年8月に issue を出しています。
issue を出した時点から前進していますが、執筆時最新の v1.23.0 でもまだ修正できていません。
なぜ A2A サーバの session service に Agent Engine を使えないのか
ログです
2026-01-31 18:37:39,940 - INFO - task_manager.py:179 - Task not found or task_id not set. Creating new task for event (task_id: 9b707452-c7de-4535-b648-5ddd77d98d09, context_id: 1c2f42bf-b659-4046-b6fd-5e44381204da).
2026-01-31 18:37:40,620 - ERROR - a2a_agent_executor.py:157 - Error handling A2A request: 400 INVALID_ARGUMENT. {'error': {'code': 400, 'message': 'Request contains an invalid argument.', 'status': 'INVALID_ARGUMENT'}}
「Error handling A2A request:」はawait self._handle_request(context, event_queue)での例外送出を意味します。
ref: https://github.com/google/adk-python/blob/v1.23.0/src/google/adk/a2a/executor/a2a_agent_executor.py#L155
例外送出箇所は_prepare_sessionのこちら:
https://github.com/google/adk-python/blob/v1.23.0/src/google/adk/a2a/executor/a2a_agent_executor.py#L291-L295
session = await runner.session_service.get_session(
app_name=runner.app_name,
user_id=user_id,
session_id=session_id,
)
https://github.com/google/adk-python/issues/2727#issuecomment-3670016282 に解説があります
This UUID is then used as session_id for VertexAI (request_converter.py:111), which VertexAI rejects.
return AgentRunRequest( # 略 session_id=request.context_id, # 上述のログで UUID になっています # 略 )
解説コメント時点と比べて、実験的なapi_client.agent_engines.sessions.events.list()を使うように変わっていました。
しかし、依然として Vertex AI に対して(数字並びの ID ではなく)UUID を session id として使ってしまう挙動が直っていないために例外送出されています。
Agent Engine には新しい session はできていません。
終わりに
ADK (Python) では、A2A サーバにするエージェントの session service に Agent Engine を(v1.23.0 でも)まだ使えません。
現在使えるのは DB のみです。
なお、DB を使って万事解決というわけでもなく、隔週のリリースサイクルの中で DB スキーマの変更がたびたび入る1(ときにはリリースノートに記載無く)のと向き合うことになります
P.S. プルリクエストを出しました
2026年を迎えても Google が対応完了しないので、gpt-5.2-codex に issue を見せて直してもらい、それをプルリクエストしました。
マージされるように、応援ください!
- 申し訳程度のツール提供はあります ↩