流式传输与异步

面向长时间任务的流式与异步机制

很多智能体操作是长时间运行、分多步执行,或者需要人工介入。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)、并做好密钥安全与轮换。