[Bug]: Blocking continuation returns stale INPUT_REQUIRED when executor emits current task
I maintainer di solito rispondono entro 2 giorni
@rohityan ci sta già lavorando.
Dal 1/11/2026.
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
Problem
Reproduced with a2a-sdk==1.3.0 on Python 3.13. A blocking DefaultRequestHandler.on_message_send() continuation returns the old TASK_STATE_INPUT_REQUIRED snapshot when the executor enqueues context.current_task before emitting this turn's WORKING/artifact/COMPLETED events. The same task later reads as COMPLETED with its artifact. return_immediately is unset/false.
Both task_id and context_id are supplied, so this is separate from #1206. Related streaming/history behavior is tracked in #1285.
Reproduction
Install a2a-sdk==1.3.0, then run this self-contained script:
import asyncio
from uuid import uuid4
from a2a.server.agent_execution import AgentExecutor
from a2a.server.context import ServerCallContext
from a2a.server.request_handlers import DefaultRequestHandler
from a2a.server.tasks import InMemoryTaskStore, TaskUpdater
from a2a.types import AgentCard, AgentCapabilities, AgentInterface, AgentSkill, Message, Part, SendMessageRequest, Task, TaskState, TaskStatus, GetTaskRequest
class PausingAgent(AgentExecutor):
async def execute(self, context, queue):
await queue.enqueue_event(context.current_task or Task(id=context.task_id,
context_id=context.context_id, status=TaskStatus(state=TaskState.TASK_STATE_SUBMITTED),
history=[context.message]))
updater = TaskUpdater(queue, context.task_id, context.context_id)
if context.current_task is None:
await updater.requires_input(message=updater.new_agent_message([Part(text='Which region?')]))
return
await updater.start_work()
await asyncio.sleep(.05)
await updater.add_artifact([Part(text='EU result')], name='result', last_chunk=True)
await updater.complete()
async def cancel(self, context, queue):
await TaskUpdater(queue, context.task_id, context.context_id).cancel()
async def main():
card = AgentCard(name='Repro', description='Blocking continuation', version='1',
capabilities=AgentCapabilities(streaming=True),
default_input_modes=['text/plain'], default_output_modes=['text/plain'],
supported_interfaces=[AgentInterface(url='http://localhost/a2a', protocol_binding='JSONRPC', protocol_version='1.0')],
skills=[AgentSkill(id='repro', name='Repro', description='Pause and resume', tags=['repro'])])
handler = DefaultRequestHandler(agent_executor=PausingAgent(), task_store=InMemoryTaskStore(), agent_card=card)
context = ServerCallContext()
def request(text, **ids):
return SendMessageRequest(message=Message(message_id=str(uuid4()), role=1,
parts=[Part(text=text)], **ids))
try:
first = await handler.on_message_send(request('Analyze'), context)
print('first:', TaskState.Name(first.status.state))
second = await handler.on_message_send(request('EU', task_id=first.id, context_id=first.context_id), context)
print('blocking continuation:', TaskState.Name(second.status.state))
await asyncio.sleep(.15)
canonical = await handler.on_get_task(GetTaskRequest(id=first.id), context)
print('canonical after .15s:', TaskState.Name(canonical.status.state), 'artifacts:', len(canonical.artifacts))
assert second.status.state == TaskState.TASK_STATE_INPUT_REQUIRED
assert canonical.status.state == TaskState.TASK_STATE_COMPLETED
finally:
await handler.aclose()
asyncio.run(main())
Observed:
first: TASK_STATE_INPUT_REQUIRED
blocking continuation: TASK_STATE_INPUT_REQUIRED
canonical after .15s: TASK_STATE_COMPLETED artifacts: 1
Expected behavior
The blocking continuation should observe this execution through its terminal/interrupted state and return COMPLETED with the result, rather than satisfying the wait from a replay of the previous paused snapshot. Publishing the current task before status updates is useful for an initial stream snapshot; it should not make blocking mode return a stale answer.
Relevant code and workaround
In default_request_handler_v2.py:on_message_send, the first Task in a terminal/interrupted state immediately satisfies the blocking wait. The reproducer's initial current-task event is already INPUT_REQUIRED. Our application workaround drains super().on_message_send_stream() for the continuation and then reads the canonical task with history projection. A regression should cover INPUT_REQUIRED (and AUTH_REQUIRED where applicable), initial-current-task emission, blocking mode, and explicit task/context IDs.
I searched for the exact blocking behavior before filing; #1206 and #1285 cover related but distinct cases. This report claims reproduction on 1.3.0, not validation against unreleased main.
- Lingua principale
- Python
- Stelle
- 2.2k
- Fork
- 528
- Merge medio
- 3g 17h
- PR unite (30g)
- 43
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di a2aproject/a2a-python
-
[Bug]: `A2A-Version` validation ignores minor versions and the query parameterForse già presa @rohityan l’ha presa 69 giorni fa. Apertacomponent: server status:awaiting response
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
a2aproject/a2a-python#1204 · 3 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 2 giorni
-
[Bug]: REST task/request id sanitizationForse già presa @Linux2010 l’ha presa 128 giorni fa. Apertamaintainers-only
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
a2aproject/a2a-python#805 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
[Bug]: CancelTaskRequest.metadata never reaches AgentExecutor.cancelForse già presa @muscariello l’ha presa oggi. Apertamaintainers-only
a2aproject/a2a-python#1415 · 1 assegnatario ·
I maintainer di solito rispondono entro 2 giorni
-
[Feat]: Add a task-state-invariants agent skill for sibling-surface propagationForse già presa @Linux2010 l’ha presa oggi. Apertacomponent: tooling status:awaiting response
a2aproject/a2a-python#1413 · 3 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 2 giorni
-
[Bug]: taskId-only continuation still fails required contextId inference in SDK 1.3.0 (follow-up to #1206)Forse già presa @rohityan l’ha presa 1 giorno fa. Apertacomponent: server status:awaiting response
a2aproject/a2a-python#1411 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di a2aproject/a2a-python
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
521xueweihan/HelloGitHub#4237 ·
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
jejjohnson/gaussx#721 ·
I maintainer di solito rispondono entro 1 giorno
-
mock-core-configs/etc/mock/rocky-10-riscv64.cfg contains the wrong architecture in config_opts['root']Forse già presa @jasonmontleon l’ha presa 4 giorni fa. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 94/100
rpm-software-management/mock#1834 ·
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 75/100
elastic/elastic-otel-python#683 ·
I maintainer di solito rispondono entro 1 giorno
-
ci-rerun: collect.py fails a whole pr-babysit cycle on one transient GitHub 5xx and never retriesApertafollow-up
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
I maintainer di solito rispondono entro 1 giorno