[Bug]: message/send hangs forever when the AgentExecutor returns without producing events
メンテナーはふだん 2 日以内に返信
@rohityan がすでに取り組んでいます。
2026年10月9日 から。
評価
この issue はまだ評価されていません。
説明
What happened?
message/send hangs indefinitely when an AgentExecutor returns normally without enqueueing any event. Both handlers are affected:
DefaultRequestHandlerV2: no response within 3s (tested; it never returns).DefaultRequestHandler(legacy): no response within 10s (tested; it never returns), even though it contains anif not result: raise InternalErrorguard atsrc/a2a/server/request_handlers/default_request_handler.py:456-457— empirically that line is never reached in this scenario.
Each hanging request pins a client connection plus the handler's internal producer/consumer tasks.
Root cause (V2)
default_request_handler_v2.py:437-439:
if result is None:
logger.debug('Missing result for task %s', request_context.task_id)
result = await active_task.get_task()
ActiveTask.get_task() (src/a2a/server/agent_execution/active_task.py:965-967) awaits self._task_created.wait() with no timeout. _task_created is only set when (a) the task already existed at start(), (b) the consumer processes a task event, or (c) the producer fails. A silent success (executor returns, zero events) sets none of them, so the wait never completes.
For the legacy handler, the equivalent raise InternalError guard exists but is unreachable in this scenario — the flow blocks earlier inside consume_and_break_on_interrupt.
Reproduction
Self-contained script (main @ 494a8ec, Python 3.10)
import asyncio
from a2a.auth.user import UnauthenticatedUser
from a2a.server.agent_execution import AgentExecutor
from a2a.server.context import ServerCallContext
from a2a.server.request_handlers import DefaultRequestHandlerV2
from a2a.server.tasks import InMemoryTaskStore
from a2a.types.a2a_pb2 import (
AgentCapabilities,
AgentCard,
Message,
Part,
Role,
SendMessageConfiguration,
SendMessageRequest,
)
class SilentExecutor(AgentExecutor):
# Returns normally without producing any event. The AgentExecutor
# contract only says it *should* enqueue events, so this is a legal
# (if buggy) implementation.
async def execute(self, context, event_queue):
return None
async def cancel(self, context, event_queue):
pass
async def main():
handler = DefaultRequestHandlerV2(
agent_executor=SilentExecutor(),
task_store=InMemoryTaskStore(),
agent_card=AgentCard(
name='t',
version='1.0',
capabilities=AgentCapabilities(streaming=True),
),
)
params = SendMessageRequest(
message=Message(
role=Role.ROLE_USER, message_id='m1', parts=[Part(text='Hi')]
),
configuration=SendMessageConfiguration(
accepted_output_modes=['text/plain']
),
)
try:
await asyncio.wait_for(
handler.on_message_send(
params, ServerCallContext(user=UnauthenticatedUser())
),
timeout=3,
)
print('returned (no hang)')
except asyncio.TimeoutError:
print('HANG CONFIRMED: on_message_send did not return within 3s')
asyncio.run(main())
Observed output:
HANG CONFIRMED: on_message_send did not return within 3s
Expected behavior
message/send should fail fast with an InternalError (as the legacy handler's raise InternalError guard intends) when the agent produces no result at all, instead of hanging forever and leaking the request, producer and consumer tasks.
Suggested fix
- In
DefaultRequestHandlerV2.on_message_send, whenresult is Noneand_task_createdis not set, raiseInternalErrorinstead of awaitingget_task()(aligning with the legacy guard's intent). Alternatively, add a timeout toActiveTask.get_task(). - Worth auditing why the legacy handler never reaches its
raise InternalErrorguard in this scenario.
Happy to submit a PR with tests.
Relevant log output
HANG CONFIRMED: on_message_send did not return within 3s
Code of Conduct
- I agree to follow this project's Code of Conduct
- 主要言語
- Python
- スター
- 2.2k
- フォーク
- 509
- 平均マージ
- 3日 11時間
- マージ済み PR(30日)
- 43
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
a2aproject/a2a-python のほかの issue
-
[Bug]: REST task/request id sanitization対応中かも @Linux2010 が 106 日前に担当しました。 オープンmaintainers-only
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
a2aproject/a2a-python#805 · コメント 1 件 ·
メンテナーはふだん 2 日以内に返信
-
[Bug]: Agent card signature verification raises raw binascii.Error on a malformed protected header instead of SignatureVerificationError対応中かも @rohityan が 3 日前に担当しました。 オープン
a2aproject/a2a-python#1332 · 担当者 2 名 ·
メンテナーはふだん 2 日以内に返信
-
[Bug]: Framework-written FAILED status drops status.timestamp, persisting last_updated as NULL対応中かも @rohityan が 3 日前に担当しました。 オープン
a2aproject/a2a-python#1331 · 担当者 2 名 ·
メンテナーはふだん 2 日以内に返信
-
Whole numbers in a data Part are returned as floats (e.g. 4326 becomes 4326.0)対応中かも @rohityan が 3 日前に担当しました。 オープン
a2aproject/a2a-python#1328 · 担当者 1 名 ·
メンテナーはふだん 2 日以内に返信
-
[Feat]: Cluster mode: detect and recover tasks abandoned by a crashed replica (heartbeat/lease)対応中かも @ishymko が 3 日前に担当しました。 オープンcomponent: server status: needs review
a2aproject/a2a-python#1324 · コメント 4 件 · 担当者 1 名 ·
メンテナーはふだん 2 日以内に返信
a2aproject/a2a-python の issue をすべて見る
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
huggingface/smolagents#2976 ·
メンテナーはふだん 1 日以内に返信
-
bug Triage-Needed
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
FuRongJun-1999/dsh-memory#170 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
pgvector/pgvector-python#163 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
521xueweihan/HelloGitHub#3940 ·