第二篇:Agent2Agent (A2A) 协议——A2A 架构、组件和通信动态
上一篇我们探讨了 Agent2Agent (A2A) 协议的诞生背景和核心理念,理解了它如何弥合 AI 代理间的互操作性鸿沟,以及它与模型上下文协议(MCP)的互补关系。现在,让我们深入 A2A 的内部,剖析其架构、关键组件和通信动态,揭示其如何构建协作式 AI 的结构化语言。
1. 代理卡(Agent Card):AI 的数字名片,用于发现
代理卡是 A2A 中的一个基本概念,充当 AI 代理的数字“名片”。它描述了代理向其他代理宣传其能力和技能的方式。当两个 AI 系统需要交互时,它们首先交换这些代理卡以了解彼此可用的服务。
代理卡是一个标准化的 JSON 元数据文件,通过一个众所周知的 HTTP GET 端点访问,通常是代理基本 URL 下的 /.well-known/agent.json
。这提供了一个一致的位置来存储网络中的能力信息,类似于网站的 robots.txt
文件。代理卡包含代理身份、能力、支持的数据格式和身份验证需求的机器可读表示。关键字段包括代理的 name
和 description
;代理 A2A 服务的 url
;代理的 version
;capabilities
标志(例如 streaming
、pushNotifications
、stateTransitionHistory
);authentication
要求和方案(例如 apiKey
、OAuth 2.0
);defaultInputModes
和 defaultOutputModes
(例如 text
);以及详细说明所提供特定功能的 skills
数组,包括 id
、name
、description
、inputModes
、outputModes
和 examples
。
这种元数据实现了动态发现,允许协调器或客户端代理查询代理卡以了解其功能和通信方法,从而减少了硬编码集成的需求。代理卡不仅仅用于发现;它明确包含了“身份验证要求和安全方案”。这意味着安全性本身就内置于发现机制中。攻击者发布“伪造的 /.well-known/agent.json
”或“配置错误的终结点”可能导致“任务劫持、数据泄露和代理冒充”。这凸显了代理卡在 A2A 生态系统中作为关键信任锚点的作用。其完整性和正确配置对于防止“代理卡欺骗”等安全漏洞至关重要。因此,采用 A2A 的组织必须围绕代理注册、验证和持续监控代理卡完整性实施强大的治理,以防止恶意代理渗透其多代理系统。这使得部分安全负担从运行时检查转移到发现和注册阶段。
2. 任务、消息和部分(Part):协作的结构化语言
A2A 协议定义了通信的结构化层次,确保了跨不同代理交互的清晰性和互操作性。
任务:工作的基本单元。 在 A2A 中,“任务”是一个结构化对象,代表了由客户端向代理发布的工作原子单元或请求。任务具有明确定义的生命周期状态:submitted
(已提交)、working
(工作中)、input-required
(需要输入)、completed
(已完成)、failed
(失败)或 canceled
(已取消)。还存在一个 Unknown
(未知)状态。每个任务都包含:一个唯一 ID(通常是 UUID)、一个可选的 sessionID
用于分组相关任务、一个包含当前状态和时间戳的 Status
对象、可选的 artifacts
(生成的输出)、可选的对话 history
以及可选的 metadata
。在此框架内,代理既可以充当客户端(发起任务),也可以充当服务器(处理任务)。
任务的明确定义及其“明确定义的生命周期”和唯一 ID 是与无状态 API 调用的显著区别。这种设计选择本质上支持**“长时间运行的任务”,并允许在单个可跟踪的上下文中进行“多轮对话”**。任务对象中包含 history
和 artifacts
进一步表明 A2A 旨在实现可审计性和复杂工作流管理,而不仅仅是简单的请求-响应。这种以任务为中心的方法意味着 A2A 不仅仅是一个通信层,更是一个工作流编排的促成者。它允许构建更具弹性且可追溯的多代理系统,这对于企业应用程序至关重要,因为在这些应用程序中,问责制和调试复杂分布式流程的能力是首要任务。这种设计有助于实现“智能工作流编排”和“统一治理”。
消息:对话中的一轮。 “消息”代表任务中的单轮通信。它包含一个 Role
(“user”表示客户端代理,“agent”表示远程代理)和 Parts
(实际内容),并带有可选的元数据。消息用于客户端和远程代理之间的对话式交换。
部分:基本内容单元。 “部分”是消息或工件中自包含的数据块,代表内容的基本单元。这个概念是 A2A 支持多模态通信的基础。协议定义了三种基本部分类型:TextPart
(包含纯文本内容);FilePart
(通过 file
对象表示二进制数据,可以是 base64 编码的字节或 URI);以及 DataPart
(包含结构化 JSON 信息,适用于表单和结构化结果)。
3. 工件:在多模态世界中交付成果
“工件”(Artifacts)是远程代理在任务执行过程中生成的不可变结果或输出。它们代表了代理工作的最终或中间可交付成果。
与消息类似,工件由一个或多个 Part
对象组成,允许输出是多模态的。这意味着代理不仅可以返回纯文本,还可以返回文件(例如,PDF 徽章、确认电子邮件、账户凭证)、图像、结构化数据(例如,JSON 摘要),甚至视频。工件可以包含可选的 name
和 description
字段、指定格式的内容 parts
数组、用于排序的 index
值,以及用于流式传输场景的 append
和 lastChunk
标志。工件的示例包括生成的文档、结构化数据摘要、图像、报告、数据集、代码或设计文件。
A2A 协议强调“不可变结果”以及能够包含“多种不同类型内容的部分”,这表明 A2A 的设计不仅仅是为了基于文本的聊天。这种设计使得代理能够交付复杂的、丰富的输出,这些输出可以直接被其他代理或人工用户消费或进一步处理。例如,将“图表作为原始数据或图像”返回展示了这种灵活性。这直接支持了**“模态无关设计”**原则。因此,健壮的工件机制对于实现实际的、现实世界中的 AI 应用程序至关重要,因为在这些应用程序中,输出通常是多模态的,并且需要由各种下游系统或人工用户消费。它促进了代理之间更完整、更有用的交互,超越了简单的对话回合,实现了切实的、可操作的交付成果。
4. 通信流:从发现到完成(HTTP、JSON-RPC、SSE、Webhooks)
A2A 协议通过明确定义的通信流来协调代理交互,利用标准网络技术实现灵活性和可扩展性。
底层协议。 A2A 建立在标准网络协议之上:HTTP/HTTPS 作为主要的传输层,提供熟悉的请求-响应模型用于消息交换。生产系统必须使用 HTTPS 和现代 TLS 密码以确保安全。JSON-RPC 2.0 用于请求/响应消息,实现标准化方法调用。
典型交互生命周期:
- 能力发现: 客户端代理从其众所周知的端点 (
/.well-known/agent.json
) 获取远程代理的代理卡,以了解其能力、支持的格式和身份验证需求。
- 任务启动: 客户端代理生成唯一的任务 ID,并将初始消息(用户查询/指令)作为负载的一部分发送到远程代理的 A2A 端点,以启动任务执行。
- 任务处理和生命周期: 远程代理处理任务。它可以:
- 通过工件立即响应结果。
- 发送中间消息。
- 请求更多信息(将状态设置为
input-required
),从而实现多轮对话。
- 任务通过状态(
submitted
、working
、completed
、failed
、canceled
)进行推进。
- 完成: 任务最终达到终止状态。客户端可以使用
tasks/get
获取所有工件。
任务管理通信方法:
tasks/send
: 启动或继续任务,期望单个响应(同步请求/响应)。适用于快速任务。
tasks/sendSubscribe
: 启动任务并提供流式更新。这建立了用于实时更新的持久连接。
- Server-Sent Events (SSE): A2A 利用 SSE 进行流式连接,允许服务器通过开放的 HTTP 连接向客户端发送实时更新(例如进度、部分输出、文件)。
- Webhooks(推送通知): 对于不适合保持开放连接的长时间运行任务,客户端可以通过
tasks/pushNotification/set
注册 webhook URL 以接收异步更新。远程代理在更新发生时向注册的 webhook URL 发送 HTTP POST 请求。
tasks/get
: 检索特定任务的当前状态。
tasks/cancel
: 请求取消正在进行的任务。
A2A 对同步 (tasks/send
) 和异步/流式 (tasks/sendSubscribe
、SSE、webhooks) 通信模式的支持是一项关键的设计选择。这种灵活性使得协议能够处理各种人工智能工作负载,从快速、即时查询(例如,获取天气更新)到需要持续更新或推送通知的复杂、长时间运行的流程(例如,生成报告、协调招聘流程)。这种适应性对于存在多样化操作需求的企业采用至关重要。这种混合方法确保 A2A 不是“一刀切”的解决方案,而是“因地制宜”的协议。它允许开发人员根据任务的性质优化延迟、资源利用和用户体验,使 A2A 成为在现实世界场景中协调各种 AI 代理行为的高度实用和多功能的解决方案。
组件 | 描述 | 关键属性/内容 | 在通信中的作用 |
代理卡 (Agent Card) | AI 代理的数字“名片”,宣传其能力和技能。 |
| 用于代理发现和理解如何与另一个代理交互。 |
任务 (Task) | 工作或请求的基本、有状态单元,由客户端发送给代理。 |
| 封装整个交互过程,支持长时间运行任务和多轮对话,实现可追溯的工作流管理。 |
消息 (Message) | 任务中的单轮通信。 |
| 用于客户端和远程代理之间的对话式交换。 |
部分 (Part) | 消息或工件中的基本内容单元,自包含。 |
| 支持多模态通信,允许交换文本、文件和结构化数据。 |
工件 (Artifact) | 远程代理在任务执行期间生成的不可变结果或输出。 |
| 交付任务的最终或中间成果,支持多模态输出。 |
该表格清晰地定义了 A2A 协议中的关键术语和结构化对象,这些对象与传统 API 概念不同。它为开发人员提供了快速参考,以掌握 A2A 通信的构建块,并理解这些组件如何协同工作以形成整体通信流,从而强化了“协作的结构化语言”。