Agent2Agent (A2A)协议专为处理可能不会立即完成的任务而设计。许多AI驱动的操作可能是长时间运行的、涉及多个步骤的、产生增量结果的或需要人工干预的。A2A提供了强大的机制来管理此类异步交互,确保客户端无论保持持续连接还是以更断开的方式操作,都能有效地接收更新。
对于产生增量结果(如生成长文档或流媒体)或提供持续状态更新的任务,A2A支持使用服务器发送事件(SSE)进行实时通信。这适用于客户端可以与A2A服务器保持活动HTTP连接的情况。
关键特性:
tasks/sendSubscribe
RPC方法发送初始消息(如提示或命令),同时订阅该任务的更新。capabilities.streaming: true
来表明其对流式传输的支持。200 OK
状态和Content-Type: text/event-stream
。此HTTP连接保持打开状态以便服务器推送事件。data
字段包含一个JSON-RPC 2.0响应对象,特别是SendTaskStreamingResponse
。此JSON-RPC响应中的id
与客户端原始tasks/sendSubscribe
请求中的id
匹配。SendTaskStreamingResponse.result
中):
TaskStatusUpdateEvent
: 传达任务生命周期状态的变化(如从working
变为input-required
或completed
)。它还可以提供来自代理的中间消息(如"我正在分析数据...")。TaskArtifactUpdateEvent
: 传递任务生成的新或更新的Artifacts。这用于以块的形式流式传输大文件或数据结构。Artifact
对象本身包含index
、append
和lastChunk
等字段,以帮助客户端重新组装完整的工件。TaskStatusUpdateEvent
中设置final: true
来发出特定交互周期(即当前tasks/sendSubscribe
请求)更新结束的信号。这通常发生在任务达到终端状态(completed
、failed
、canceled
)或input-required
状态(服务器期望从客户端获得进一步输入)时。发送final: true
事件后,服务器通常会关闭该特定请求的SSE连接。final: true
事件),客户端可以尝试使用tasks/resubscribe
RPC方法重新连接到流。关于断开连接期间错过事件的行为(如是否回填或仅发送新更新)取决于具体实现。何时使用流式传输:
参考协议规范了解详细结构:
对于非常长时间运行的任务(如持续几分钟、几小时甚至几天)或当客户端不能或不愿保持持久连接时(如移动客户端或无服务器函数),A2A支持通过推送通知进行异步更新。此机制允许A2A服务器在发生重大任务更新时主动通知客户端提供的webhook。
关键特性:
capabilities.pushNotifications: true
来表明其对推送通知的支持。PushNotificationConfig
。此配置可以通过以下方式提供:
tasks/send
或tasks/sendSubscribe
请求中(通过TaskSendParams
中的可选pushNotification
参数)tasks/pushNotification/set
RPC方法为现有任务设置
PushNotificationConfig
包括:url
: A2A服务器应发送(POST)任务更新通知的绝对HTTPS webhook URLtoken
(可选): 客户端生成的不透明字符串(如密钥或任务特定标识符)。服务器应将此令牌包含在通知请求中(如在自定义头X-A2A-Notification-Token
中)以供客户端的webhook接收器验证authentication
(可选): 一个AuthenticationInfo
对象,指定A2A服务器应如何向客户端的webhook URL进行身份验证。客户端(webhook的接收方)定义这些身份验证要求completed
、failed
、canceled
)或input-required
状态,特别是在其关联消息和工件完全生成并稳定后taskId
并理解更新的性质(如新的TaskState
)。服务器可能发送最小负载(仅taskId
和新状态)或更全面的负载(如摘要或完整的Task
对象)taskId
的tasks/get
RPC方法来检索完整的更新后的Task
对象,包括任何新工件或详细消息推送通知服务(客户端Webhook基础设施):
PushNotificationConfig.url
中指定的目标url
指向一个推送通知服务。此服务是客户端侧的一个组件(或客户端订阅的服务),负责接收来自A2A服务器的HTTP POST通知token
)由于推送通知的异步和服务器发起的出站性质,安全性至关重要。发送通知的A2A服务器和客户端的webhook接收器都有责任。
Webhook URL验证:
PushNotificationConfig
中提供的任何url
。恶意客户端可能提供指向内部服务或无关第三方系统的URL以造成危害(服务器端请求伪造-SSRF攻击)或充当分布式拒绝服务(DDoS)放大器validationToken
(作为查询参数或头)的HTTP GET
或OPTIONS
请求。webhook服务必须适当响应(如回显令牌或确认准备就绪)以证明所有权和可达性。A2A Python示例演示了一个简单的验证令牌检查机制向客户端Webhook进行身份验证:
PushNotificationConfig.authentication
中指定的方案向客户端的webhook URL进行身份验证Authorization: Bearer <token>
头中X-Api-Key
)X-Hub-Signature
)。webhook接收器然后验证此签名验证A2A服务器:
iss
(签发者)、aud
(受众-应标识您的webhook)、iat
(签发时间)和exp
(过期时间)PushNotificationConfig.token
: 如果客户端在为其任务设置通知时在PushNotificationConfig
中提供了不透明的token
,webhook应检查传入通知是否包含此确切令牌(如在自定义头X-A2A-Notification-Token
中)。这有助于确保通知是针对此特定客户端上下文和任务的,增加了一层授权防止重放攻击:
iat
-签发时间声明,或自定义时间戳头)。webhook应拒绝太旧的通知(如早于几分钟)以防止攻击者重放捕获的旧通知。时间戳应是签名负载的一部分(如果使用签名)以确保其完整性jti
(JWT ID)声明可服务于这一目的安全密钥管理和轮换:
PushNotificationConfig
,指定authentication.schemes: ["Bearer"]
以及可能的JWT的预期issuer
或audience
iss
(签发者)、aud
(受众-webhook)、iat
(签发时间)、exp
(过期)、jti
(JWT ID)和taskId
alg
和kid
)指示签名算法和密钥IDAuthorization
头提取JWTkid
iss
、aud
、iat
、exp
、jti
)PushNotificationConfig.token
(如果提供)这种全面、分层的推送通知安全方法确保了消息的真实性、完整性和及时性,同时保护了发送方A2A服务器和接收方客户端webhook基础设施。