Item 12: Put Message Content in TaskStatusUpdateEvent.status.message¶
A2A 流式响应的关键是:消息内容必须放在 TaskStatusUpdateEvent.status.message 中,而不是单独的消息对象。
问题¶
以为可以这样发消息:
# 错误:内容没有放在 status.message 里
yield TaskStatusUpdateEvent(
task_id=task_id,
state=TaskState.working,
message=Message(...) # 放在这里
)
客户端可能收不到消息内容。
正确做法¶
消息内容必须放在 status.message 中:
status_message = Message(
message_id=str(uuid.uuid4()),
role=Role.agent,
parts=[TextPart(kind="text", text=full_text)],
)
status_update = TaskStatusUpdateEvent(
task_id=task_id,
final=False,
status=TaskStatus(
state=TaskState.working,
message=status_message # 必须在这里
),
)
yield f"data: {json.dumps(...)}\n\n"
SSE 事件顺序¶
1. Task (state=working) → 建立任务,获取 task_id
2. TaskStatusUpdateEvent → 状态更新,消息在 status.message 中
3. TaskStatusUpdateEvent (final) → 最终状态 (state=completed)
Things to Remember¶
TaskStatusUpdateEvent.status.message是消息内容的容器- SSE 事件用 JSON-RPC 2.0 格式:
{"jsonrpc": "2.0", "id": ..., "result": {...}} AgentCard是 Agent 的元数据,用于发现和描述能力TaskState状态机:working → completed/failedA2AAgent客户端通过 agent_card 发现远程 Agent