流式传输与异步
面向长时间任务的流式与异步机制
很多智能体操作是长时间运行、分多步执行,或者需要人工介入。A2A 提供了让客户端持续获知进度与结果的机制——无论客户端是否保持长连接。
使用 Server-Sent Events (SSE) 进行流式传输
当客户端能够保持 HTTP 连接,并希望实时获得增量结果或状态更新时,SSE 是很自然的选择。
要点如下:
- 服务端声明能力:在 AgentCard 中设置
capabilities.streaming: true。 - 发起流式请求:客户端调用
message/stream。 - 典型事件类型(示例):
Task(当前任务状态快照)TaskStatusUpdateEvent(生命周期状态变化与中间消息)TaskArtifactUpdateEvent(工件分片,通过append/lastChunk组装)
- 结束条件:服务端通常会发送最终状态更新(常见带
final: true),然后关闭 SSE 连接。 - 断线重订阅:如果连接意外中断,客户端可用
tasks/resubscribe重新订阅仍在运行的任务流。
推送通知(断开连接场景)
当任务可能持续数分钟/数小时/数天,或客户端无法/不愿保持长连接时,A2A 支持推送通知到客户端提供的 webhook。
要点如下:
- 服务端声明能力:在 AgentCard 中设置
capabilities.pushNotifications: true。 - 配置方式:客户端提供
PushNotificationConfig(webhook URL、可选 token、可选认证信息),可以在初始请求里带上,也可以通过tasks/pushNotificationConfig/set之类的方法为已有任务设置。 - 客户端拉取详情:收到通知后,客户端通常再调用
tasks/get获取完整、最新的Task对象。
推送通知安全建议
推送通知属于服务端主动向外发起 HTTP 请求,因此两端都要做好安全防护:
- 服务端侧:校验 webhook URL(防 SSRF/DDoS 放大),引入域名白名单/所有权验证,并按约定对 webhook 进行认证。
- 客户端侧:验证来源(签名/JWT/HMAC/API key 等)、防重放(时间戳/nonce)、并做好密钥安全与轮换。