流式传输与异步

A2A 从设计上就支持长时间运行任务。对于生产系统,关键不是“能不能返回结果”,而是“如何稳定地持续反馈任务进度”。

何时用流式,何时用推送

  • 需要低延迟交互时,优先流式传输。
  • 客户端无法长期在线时,优先推送通知。
  • 实际系统通常组合使用:先流式,断线后回退到推送与轮询。

流式模型(SSE)

在实时场景中,客户端通常调用 message/stream,或在已有任务上做订阅。

关键点:

  • 服务端需在 AgentCard 声明 capabilities.streaming: true
  • 流中常见事件包括:
    • Task
    • TaskStatusUpdateEvent
    • TaskArtifactUpdateEvent
  • 当任务进入终态或中断态(如 completedfailedcanceledrejectedinput_requiredauth_required)时,流会关闭。
  • v1.0 语义下,不应再依赖 final 字段判断结束,而应以任务状态和流关闭为准。

断线场景的推送通知

任务可能持续数分钟到数小时时,建议使用 webhook 通知。

关键点:

  • 服务端需声明 capabilities.pushNotifications: true
  • 在发起任务时传入推送配置,或通过推送配置相关操作后续设置。
  • 收到通知后,客户端再调用 tasks/get 拉取完整任务最新状态。
  • v1 导向实现中,建议使用明确的认证方案,不依赖临时拼接的静态秘密。

安全清单

  • 校验 webhook 目标,避免 SSRF 和滥用。
  • 使用强认证(OAuth、HMAC、mTLS、签名 JWT)。
  • 加入防重放机制(时间窗、nonce、事件 ID)。
  • 做好密钥轮换与签发方校验。

常见误区

  • 把流事件当成“可靠持久消息”。
  • 继续依赖 final: true 判断完成。
  • 对外发推送时不做目标信任校验。

相关链接