流式传输与异步
A2A 从设计上就支持长时间运行任务。对于生产系统,关键不是“能不能返回结果”,而是“如何稳定地持续反馈任务进度”。
何时用流式,何时用推送
- 需要低延迟交互时,优先流式传输。
- 客户端无法长期在线时,优先推送通知。
- 实际系统通常组合使用:先流式,断线后回退到推送与轮询。
流式模型(SSE)
在实时场景中,客户端通常调用 message/stream,或在已有任务上做订阅。
关键点:
- 服务端需在 AgentCard 声明
capabilities.streaming: true。 - 流中常见事件包括:
TaskTaskStatusUpdateEventTaskArtifactUpdateEvent
- 当任务进入终态或中断态(如
completed、failed、canceled、rejected、input_required、auth_required)时,流会关闭。 - v1.0 语义下,不应再依赖
final字段判断结束,而应以任务状态和流关闭为准。
断线场景的推送通知
任务可能持续数分钟到数小时时,建议使用 webhook 通知。
关键点:
- 服务端需声明
capabilities.pushNotifications: true。 - 在发起任务时传入推送配置,或通过推送配置相关操作后续设置。
- 收到通知后,客户端再调用
tasks/get拉取完整任务最新状态。 - v1 导向实现中,建议使用明确的认证方案,不依赖临时拼接的静态秘密。
安全清单
- 校验 webhook 目标,避免 SSRF 和滥用。
- 使用强认证(OAuth、HMAC、mTLS、签名 JWT)。
- 加入防重放机制(时间窗、nonce、事件 ID)。
- 做好密钥轮换与签发方校验。
常见误区
- 把流事件当成“可靠持久消息”。
- 继续依赖
final: true判断完成。 - 对外发推送时不做目标信任校验。