对于生成增量结果(如生成长文档或流式媒体)或提供持续状态更新的任务,A2A 使用 Server-Sent Events(SSE)支持实时通信。客户端使用 message/stream RPC 方法发送初始消息并同时订阅该任务的更新。服务端在 Agent Card 中通过设置 capabilities.streaming: true 声明其支持流式能力。服务端通过 SSE 流推送的事件类型包括:Task(任务状态)、TaskStatusUpdateEvent(任务状态变更通知)、TaskArtifactUpdateEvent(新产出物或更新产出物通知)。流终止通过 TaskStatusUpdateEvent 中设置 final: true 来发出信号。
对于运行时间极长(数分钟、数小时甚至数天)的任务,或客户端无法维持持久连接的场景,A2A 支持通过推送通知进行异步更新。该机制允许 A2A 服务端在发生重要任务更新时,主动向客户端提供的 webhook 端点发送通知。推送通知配置可以通过初始 message/send 或 message/stream 请求中的 PushNotificationConfig 参数提供,也可以通过调用 CreateTaskPushNotificationConfig 方法单独设置。同一任务可以关联多个 PushNotificationConfig 对象,以支持向多个端点发送通知。
对于不支持流式传输或推送通知的场景,客户端可以周期性调用 tasks/get 方法来轮询任务状态,直到任务达到终态(如 completed、failed)。该方式适合简单的客户端实现,但会引入轮询延迟,且增加了服务端的请求负载。
如果客户端的 SSE 连接在任务仍然活动时过早断开(且服务端尚未为该阶段发送 final: true 事件),客户端可以尝试使用 tasks/resubscribe RPC 方法重新连接到流。服务端在断开连接期间丢失事件的行为(例如是否回填或仅发送新更新)取决于具体实现。
SendMessageConfiguration 中的 blocking 字段控制 SendMessage 是否等待任务完成:blocking: true 时操作等待任务达到终态后再返回;blocking: false 时操作立即返回任务进行中的状态。需要注意的是,blocking 字段对流式操作(始终实时返回更新)或推送通知配置(独立运行)没有影响。