想象一个没有统一规则的国际贸易港:联邦快递只懂美国的路况,顺丰只跑中国的街区,圆通在东南亚有自己的小圈子。你想从纽约寄一箱货到深圳,得分别联系好几家公司,自己跟踪、自己协调,中间还会因为单据格式不一样而卡壳。后来万国邮政联盟出现了——它规定了一套“通用交接规则”:每家快递公司都在门口挂出营业范围和服务价目,任何一家接到包裹,按统一格式的运单填好追踪号,就能把包裹交到下一家公司手里继续配送。Google 发布的 A2A(Agent2Agent)协议,正是 AI 智能体世界的“万国邮政联盟”。它让不同公司、不同框架开发的智能体,互相发现“你会干什么、地址在哪里”,再用统一格式交接任务、跟踪进度。本文就带你拆开这台“邮政机器”,看看它凭什么成为 Agent 生态的关键基础设施。
学习 A2A 协议,能让你在做多 Agent 系统时不被单一框架绑架,掌握跨厂商智能体互联的核心能力——这是 Agent 生态走向成熟期最抢手的架构技能之一。
目录
可视化演示
展示Google A2A协议:多Agent(A1-A5)Mesh网络互连,通过Disc(发现)→Neg(协商)→Task(任务分配)→Sec(安全)四层协议栈协作。
本节配有交互动效(进入视口后自动加载,约 3KB)。
A2A协议核心机制 多Agent(A1-A5)通过Mesh网络互连,A2A协议栈四层:Disc发现→Neg协商→Task任务→Sec安全,支持跨框架跨厂商 A2A vs MCP:A2A是Agent间通信标准,MCP是Agent与工具间接口,两者互补而非替代,共同构建Agent生态基础设施 A2A Stack: Discovery → Negotiation → Task Delegation → Security
诞生背景:AI 世界的“货运孤岛”
在没有万国邮政联盟的年代,纽约的邮局想把包裹寄到深圳,得先跟几十家船运公司、内陆车队挨个签合同,而每家的单据格式还不一样。今天的 AI Agent 世界正是这副景象:一个智能体能写代码,另一个擅长查数据库,第三个长于写报告——可让它们协作完成“先查数据、再写报告”的活儿,工程师得手工写大量胶水代码把各家拼在一起,接口一多就变成蜘蛛网。
Google 在 2025 年 4 月发布 A2A(Agent2Agent)协议,目的就是拆掉这些“货运孤岛”。A2A 是一套开放、厂商中立的通信标准,让不同框架(LangChain、AutoGen、CrewAI 等)开发的智能体能够互相发现、协商并协作完成复杂任务。它的设计出发点很朴素:就像万国邮政联盟让天下快递互联一样,让智能体说同一种“交接语言”。
从成本角度看,没有标准时,N 个智能体两两对接需要写 N(N-1)/2 套定制接口;有了 A2A,每个智能体只需实现一次协议,就能和所有支持它的智能体对话。生态扩张从“平方级痛苦”变成“线性接入”,这正是它能快速获得厂商支持的根本原因。
就像万国邮政联盟一纸协定让天下快递互联,A2A 让智能体第一次有了“通用交接单”,也第一次让“让天下智能体互联”从口号变成工程现实。
- N 的含义N 代表参与协作的智能体数量,每个智能体都相当于一家“快递公司”。
- 点对点集成成本两两之间都要定制接口,所以总接口数是组合数 C(N,2)。
- 协议归一成本接入统一标准后,每家只要写一次协议实现,成本降为线性。
设计理念:门口的“营业公示牌”
万国邮政联盟要求每家邮局在门口挂一块公示牌,写明自己开通哪些国际线路、什么时间营业、哪些物品禁寄。别家邮局送货过来,不用打电话反复确认,抬头一看便知能不能把包裹交给你。这种“信息公开”带来的信任与便利,是整个联盟运转的起点。
A2A 的核心设计正是这样一块公示牌,名字叫 Agent Card(智能体卡片)。每个支持 A2A 的智能体都要暴露一个“卡片端点”,返回一份标准 JSON 文档,自报家门:我是谁、能做什么、有哪些技能、任务请求应该发到哪个地址。其他智能体只要 HTTP 请求一下这个端点,就能拿到对方完整的能力画像。
这种“能力自我声明”天然是去中心化的——没有中心注册表,也不需要某个权威机构审核。任何智能体只要知道你的卡片地址,就能读取你的能力并决定是否协作。这相当于每家快递公司自定义营业范围,但用统一格式公示出来,既能百花齐放,又能彼此兼容。
有了这张卡片,两个素不相识的智能体“见面三秒”就能决定是否合作——这正是 A2A 打开生态的第一块基石,也是它区别于传统点对点接口设计的关键创新。
- 卡片主体AC 是 Agent Card 的简写,代表智能体对外公示的一张“营业信息牌”。
- 能力集合skills 是技能清单,比如“查天气”“写代码”,是其他智能体决定是否合作的关键依据。
- 通信入口endpoint 是接收任务消息的网络地址,相当于邮局的“收件窗口”。
通信机制:统一的“国际运单”
不同国家的快递单据五花八门,填法各异,货到了边境常常要重新录入。万国邮政联盟统一了运单格式:寄件人、收件人、重量、件数,各国邮政一看就懂。A2A 也做了同样的事——把智能体之间的消息格式统一为 JSON-RPC over HTTP(S)。
具体来说,每个请求都是一个标准 JSON 对象,包含协议版本、方法名、参数和请求 ID。方法包括发送任务消息、查询任务状态、取消任务等。响应也遵循同样结构,通过 ID 把应答和请求一一对应起来。
选 HTTP 作为传输层是个很聪明的决定:不引入特殊依赖、不需要长连接,任何能发 HTTP 请求的语言和框架都能接入。用行话说这叫“无状态请求”,服务器不用记住你是谁,每次请求自带完整信息——就像国际运单上写清楚所有字段,运到任何一站都能单独处理。
一张标准运单让任何两国的邮局都能交接,一条标准消息让任何两个框架的智能体都能对话——这就是“标准”二字的分量。
- 协议标记jsonrpc 字段固定为 "2.0",表示采用标准 JSON-RPC 协议版本,如同运单上印刷的标准编号。
- 业务意图method 指明这张“运单”要办什么业务,例如发送任务、查询状态。
- 请求关联id 是请求编号,响应中携带同一个 id,客户端就知道回复对应哪一笔业务,像运单号一样可追溯。
任务协作:可追踪的“包裹旅程”
你寄出一件国际包裹后会拿到运单号,在官网输入就能看到“已收件→运输中→派送中→已签收”。这种全程可见的体验让人安心。A2A 的任务生命周期,就是智能体世界的“包裹追踪系统”。
发起方(client)通过消息任务把“工作包裹”交给处理方(server),任务会经历一组标准状态:已提交(submitted)、处理中(working)、需要更多信息(input-required)、已完成(completed)、失败(failed)。处理方中途发现资料不够,可以回一条“需要更多信息”,发起方补交后再继续——这就是多轮交互。
这种任务导向的设计非常关键:A2A 不是让两个智能体像聊天机器人一样闲聊天,而是围绕一个明确的“待办事项”协作。每个状态都可查询、可恢复,发起方随时可以轮询任务进度,就像查快递物流一样简单。
从交件到签收全程可追踪,是让智能体协作“靠谱”的核心体验——也是企业愿意把真实业务交给多智能体系统的信任前提。
- 起始状态submitted 表示任务已提交到处理方,相当于包裹刚在柜台完成收件。
- 执行中状态working 表示处理方正在干活,可以附带进度更新,如运单显示“运输中”。
- 终态与旁路任务最终要么 completed 要么 failed;卡壳时可进入 input-required,等待发起方补充资料后继续。
安全信任:实名制与“授权委托书”
万国邮政要求寄件实名、跨国件要报关,贵重物品必须声明价值——信任是包裹能一路通行的保障。同样,A2A 如果只解决了“能连通”而不管“谁能连、能连到什么程度”,就永远进不了企业的大门。因此协议内置了安全层。
A2A 支持基于 OAuth 2.0 的认证与授权。智能体在协作前先验证对方身份,再按任务所需的最小权限范围(scope)放行,而不是把全部能力敞开。比如只让对方调用“查天气”技能,就没必要暴露“读数据库”的能力。
在企业落地时,管理员可以配置哪些外部智能体能访问哪些内部服务,配合审计日志追踪每一次跨 Agent 调用。这相当于给每个包裹贴了“仅限本人签收”的标签,还全程录像。安全设计让 A2A 有底气走进企业防火墙,而不是只停留在技术 demo 阶段。
信任不是一句口号,而是从实名认证到授权管控、再到审计留痕的每一步具体设计,这正是企业级协议与玩具 demo 的分水岭。
- 授权范围scope(auth) 表示身份验证通过后授予的操作范围,即对方能调用哪些技能。
- 能力全集skills(card) 是 Agent Card 上声明的全部技能,相当于营业公示牌上的完整服务列表。
- 子集约束⊆ 表示授予范围只能是全部能力的子集,不能越权——就像委托书只授权你签收,不授权你变卖。
与MCP互补:对内管工具,对外搞协作
万国邮政联盟管的是“国家与国家之间的包裹交接”,但包裹到了中国境内,用什么货车、进哪个分拣中心,由国内物流标准决定。两者压根不在一个层级,也从不冲突。A2A 与 MCP 的关系正是如此。
MCP(模型上下文协议)解决的是智能体“内部调用工具”的问题——让大模型连接数据库、API、文件系统,相当于智能体自己的“手和工具”;A2A 解决的是“智能体之间”的问题——让不同的智能体协作,相当于“同事与同事”。一个管内,一个管外,垂直正交。
实际操作中,一个智能体内部用 MCP 调用工具处理数据,同时通过 A2A 把结果“快递”给另一个智能体。两套协议在同一系统里各司其职:MCP 让单个智能体变强,A2A 让一群智能体变协同。理解这个分工,就不会再纠结“谁取代谁”了。
明白了这层分工,你就能在架构图上果断地画两条线:一条横线连同事,一条竖线连工具——清晰、自洽、可落地。
- 外部协作A1 通过 A2A 把任务交给 A2,这是跨智能体的横向协作,像邮局与邮局之间的交接。
- 内部调用A1 通过 MCP 调用自己的工具链,这是智能体内部的纵向调用,像邮局里分拣机在工作。
- 两轴正交前者管“同事分工”,后者管“使用工具”,同一系统内可同时存在、互不干扰。
生态与场景:联盟成立之后
万国邮政联盟成立后,全球信件从“几个月运气好能到”缩短到几天。A2A 发布后也迅速聚拢起一个联盟:Google 联合 50 多家生态伙伴(包括 Salesforce、Cisco、LangChain 等)共同支持,并提供了协议开源实现与 Agent Card 开发套件,让开发者半天就能把自家智能体“接入邮路”。
典型应用场景已经清晰成形:企业内混合智能体平台统一调度不同厂商的 Agent;供应链上采购智能体与物流智能体跨公司协作;客服智能体遇到搞不定的专业问题,直接通过 A2A 转派给理赔智能体。这些场景的共同点是“异构、跨域、多轮”,正是 A2A 的主场。
展望未来,A2A 正在迭代多点协作(群体智能)、离线任务和更细粒度安全机制。它不会解决所有问题,但补上了 Agent 互操作性的关键一环——就像联盟成立之后,剩下的就是每个国家把自家邮局装修好、把邮路跑顺了。
联盟的威力不在于单次交接,而在于“每多一家入会,所有人一起变强”的复利效应——这正是 A2A 作为生态基础设施的价值本质。
- 基础项自身能力是每个智能体独立解决特定问题的基础价值。
- 累加项对每个伙伴 j,其能力通过 A2A 变成“可外包”的服务,逐项累加。
- 复利效应每多一个伙伴入网,所有节点都能多获得一份能力,生态价值随节点数线性增长。
AI 应用场景
企业多厂商智能体统一调度平台
阶段:多 Agent 编排与协调
解决的问题:企业同时引入合同审核、风险合规、知识库问答等多个智能体,分别来自不同厂商与框架,传统做法是开发大量定制桥接代码,接口数量随智能体数量平方级膨胀。A2A 让每个智能体挂出 Agent Card,平台统一发现、按任务派发,集成成本降为线性。
具体案例:某企业内部署了用 LangChain 写的合同审核 Agent 和自研框架写的合规 Agent,通过 A2A 让前者把审查结果“快递”给后者复核,全程用标准任务状态跟踪,出了问题还能精准定位到是哪个 Agent 的哪一步。
供应链跨公司协同
阶段:跨组织能力复用
解决的问题:供应商的库存 Agent 与买方的采购 Agent 分属两家公司,此前只能靠人工传 Excel、发邮件。A2A 让双方互相发现能力、按任务协作,并通过授权范围控制数据可见性——只给查询权限,不给改数据权限。
具体案例:一家汽车制造商的采购 Agent 通过卡片发现供应商的库存 Agent,自动发任务查询零件可用量;供应商 Agent 处理完通过 A2A 回传结果,整个过程自动留痕、可审计,月底对账再也不用翻邮件。
智能客服跨系统转派
阶段:Agent 间任务交接
解决的问题:客服 Agent 遇到保险理赔等专业问题答不上来,传统做法是让用户跳转到另一个系统重新描述一遍,体验极差。A2A 让客服 Agent 直接创建理赔任务“派单”给理赔 Agent,并随包裹捎上对话上下文。
具体案例:某电商售后 Agent 识别到退货运费争议,通过 A2A 把任务转派给物流赔付 Agent;赔付 Agent 查单后回传结论,用户只觉得“客服变聪明了”,完全感知不到背后是两个不同厂商的智能体在接力。
Python 演示
"""A2A 协议核心机制模拟:Agent Card 发现 + 任务交接"""import jsonimport timefrom dataclasses import dataclass, field @dataclassclass AgentCard: """Agent 的"挂牌营业"信息:对方只需读这张卡即可对接""" name: str skills: list endpoint: str @dataclassclass TaskMessage: """一次任务交接的包裹:带任务号、内容、当前状态""" task_id: str payload: dict status: str = "submitted" class A2ANode: """模拟一个支持 A2A 协议的 Agent 节点""" def __init__(self, card): self.card = card self._task_map = {} def fetch_card(self): """供其他 Agent 发现本节点的能力""" return { "name": self.card.name, "skills": self.card.skills, "endpoint": self.card.endpoint, } def send_task(self, target, payload): """A 方把任务包裹交给 B 方""" msg = TaskMessage( task_id=f"{self.card.name}-{time.time():.0f}", payload=payload, ) target._task_map[msg.task_id] = msg return msg.task_id def poll_status(self, target, task_id): """轮询对方任务状态,模拟 submitted / working / completed 流转""" msg = target._task_map[task_id] if msg.status == "submitted": msg.status = "working" elif msg.status == "working": msg.status = "completed" msg.payload = {"result": f"{target.card.name} 已处理: {msg.payload['data']}"} return { "task_id": task_id, "status": msg.status, "result": msg.payload.get("result"), } if __name__ == "__main__": # 两个不同"厂商"的 Agent,只靠 A2A 约定就能协作 courier_a = A2ANode( AgentCard(name="快递A", skills=["揽收", "分拣"], endpoint="http://a.local") ) courier_b = A2ANode( AgentCard(name="快递B", skills=["派送", "签收"], endpoint="http://b.local") ) print("A 方发现 B 方能力:", json.dumps(courier_b.fetch_card(), ensure_ascii=False)) task_id = courier_a.send_task(courier_b, {"data": "一份合同"}) for _ in range(3): print("A 方询问:", json.dumps(courier_a.poll_status(courier_b, task_id), ensure_ascii=False)) time.sleep(0.3)
def fetch_card(self)模拟 A2A 的“营业公示牌”:返回该 Agent 的名称、技能和端点,供其他智能体发现。def send_task(self, target, payload)模拟发起方把“工作包裹”交给处理方,并生成唯一的任务号(类似运单号)。poll_status模拟发起方轮询任务状态,状态依次从 submitted 流转到 working、completed。@dataclass class AgentCard用数据类定义标准的卡片结构,保证不同“厂商”实现同一套字段。target._task_map[msg.task_id] = msg处理方把收到的任务登记在案,就像邮局给包裹建档。time.time()用时间戳生成任务编号,确保每次任务的 task_id 唯一可追踪。
常见误区
误区现在有了 A2A,MCP 是不是就没用了?以后只需要学一个协议就够了,MCP 早晚被淘汰。
正解A2A 和 MCP 根本不在一个层级。A2A 是“智能体与智能体”之间的横向协作协议,好比邮局与邮局交接包裹;MCP 是“智能体与工具”之间的纵向调用协议,好比邮局内部用分拣机。一个智能体完全可以一边用 MCP 查数据库,一边用 A2A 把结果发给同事。两者互补而非替代,实际项目里经常同时出现。
为何常见:因为两个协议都是 2024-2025 年热度飙升的“标准”,名字都是字母缩写,初学者容易把它们当成同一赛道上的竞争对手。
误区Agent Card 就是一份静态 JSON 文件,写好放在服务器上就完事了,能力变了再手动改文件。
正解Agent Card 是一个动态端点,每次被 HTTP 请求时实时返回 JSON。这意味着智能体可以根据当前状态动态调整对外宣称的能力——比如“高峰期暂停接单”,或者升级后自动新增技能。它更像营业厅门口实时更新的电子屏,而不是打印好就贴上去的纸质公告。
为何常见:因为大多数协议文档示例都展示了一段静态 JSON,容易让人误以为卡片是配置项;而忽略了“端点返回”这一动态机制正是灵活性的来源。
误区A2A 是 Google 提出的,那是不是只有 Google 的 AI 产品和框架才能用?用 LangChain 的团队是不是没法接?
正解A2A 是开放、厂商中立的协议,Google 只是发起者和主要推动者。协议规范公开,任何框架、任何语言都可以实现。事实上首批支持者就包括 LangChain、Salesforce、Cisco 等与 Google 没有从属关系的企业。它就像万国邮政联盟由某个国家牵头成立,但加盟的是全世界。
为何常见:人们习惯用“谁家的标准”来判断归属,尤其是大厂发布的协议很容易被贴上“绑定生态”的标签。
误区A2A 既然是 Agent 之间通信的,那它就是把两个聊天机器人接起来,让它们像人一样互相发消息聊天。
正解A2A 是任务导向(task-oriented)的结构化协议:每次交互围绕一个明确的任务,包含任务创建、状态流转、结果回传,而不是自由闲聊。消息里承载的是结构化任务数据,而非自然语言对话流。就像邮政系统运的是有单号的包裹,而不是让邮递员隔着窗户聊天。
为何常见:因为“通信”这个词太宽泛,加上 LLM Agent 常以对话框形态出现,很容易把 Agent 间通信误解为对话式消息传递。
误区A2A 协议已经内置了认证和授权,我把智能体接上 A2A 就等于安全了,不用再额外做防护。
正解A2A 定义了安全机制的支持方式(如 OAuth 2.0、scope 授权),但“支持”不等于“自动生效”。是否需要认证、授予哪些权限、如何审计,都需要开发者自己配置。就像万国邮政规定了实名制,但执行不执行、查得严不严,还得靠每个国家的邮局自己落实。协议只是给了安全框架,安全责任始终在实现方。
为何常见:协议文档里关于安全的部分常常被快速略过,加上“内置机制”这类表述,让人误以为安全是自动完成的。
面试题
Q1. A2A 协议要解决的核心问题是什么?
- A.让单个智能体内部调用工具更高效
- B.让不同厂商的智能体互相发现协作← 正确答案
- C.让大模型生成比原来更长的文本
- D.让 GPU 分布式训练的速度更快
答案:B。A2A 的核心是跨厂商、跨框架的智能体互操作——就像万国邮政联盟解决不同国家邮局的交接问题。选项 A 是 MCP 的职责,C 和 D 分别属于文本生成与训练加速领域,都与 Agent 间通信无关。
Q2. Agent Card 在 A2A 协议中的作用最类似于什么?
- A.快递包裹上贴着的运单号
- B.快递公司门口挂的营业公示牌← 正确答案
- C.快递员随身佩戴的工作证
- D.用来运输包裹的货车牌照
答案:B。Agent Card 是智能体对外声明“我是谁、会什么、任务发哪里”的公开信息,相当于营业公示牌——别人看一眼就知道能不能合作。运单号对应任务 ID,工作证对应身份令牌,货车牌照则与能力发现无关。
Q3. A2A 协议的底层消息格式是什么?
- A.JSON-RPC 消息经由 HTTP 传输← 正确答案
- B.WebSocket 二进制帧直接传输
- C.XML-RPC 消息经由 SMTP 传输
- D.Protobuf 消息经由 gRPC 传输
答案:A。A2A 规定消息采用标准 JSON-RPC 格式,传输层走 HTTP(S)。选 HTTP 是为了最大程度降低接入门槛——任何能发 HTTP 请求的语言都能实现。WebSocket 用于长连接场景、SMTP 走邮件、gRPC 依赖特殊框架,都不符合 A2A 的“广泛易接入”设计初衷。
Q4. 相比 N 个智能体两两自建接口,使用 A2A 后集成复杂度从约 N(N-1)/2 降为多少?
- A.N 的平方级别
- B.N 的对数级别
- C.线性级别 N← 正确答案
- D.常数级别 1
答案:C。统一协议后,每个智能体只需实现一次 A2A 接口即可与所有节点互通,总成本是 N 级别的线性增长。平方级对应无标准时的两两对接,对数级常用于二分搜索类复杂度,常数 1 只存在于只有一个节点的理想情况,均不准确。
Q5. 以下哪个状态不属于 A2A 任务生命周期的标准状态?
- A.submitted 已提交
- B.working 处理中
- C.completed 已完成
- D.paused 已暂停← 正确答案
答案:D。A2A 的标准状态是 submitted、working、input-required、completed、failed,没有 paused。任务处理中缺资料时进入的是 input-required(等待补充信息),而不是“暂停”。这就像包裹运输中只会显示“等待报关”,不会显示“快递公司睡着了”。
Q6. 关于 A2A 与 MCP 的关系,正确的说法是?
- A.两者等同,二选一即可
- B.A2A 是 MCP 的子集
- C.一个对外协作,一个对内工具← 正确答案
- D.MCP 是 A2A 的加密扩展
答案:C。MCP 解决智能体内部调用工具(Agent→Tool),A2A 解决智能体之间协作(Agent↔Agent),两者在不同层级且天然互补。A、B、D 都把两者混为一谈或强加包含关系,就像说“国际邮政协定是货车标准的一部分”一样逻辑混乱。
Q7. A2A 中授权范围(scope)的设计原则是什么?
- A.授权范围可以大于卡片声明能力
- B.授权范围必须等于卡片全部技能
- C.授权范围应限定为任务所需子集← 正确答案
- D.授权范围由接收方随意决定
答案:C。A2A 遵循最小权限原则:授权范围必须是卡片能力的子集,只给当前任务够用的权限。大于卡片能力属于越权,等于全部技能则过度暴露(比如只查天气却开放了删库权限),由接收方随意决定则完全失去安全掌控。
Q8. A2A 协议的核心设计目标包括哪些?
- A.跨框架的互操作能力← 正确答案
- B.能力的自我声明机制← 正确答案
- C.强制使用中心注册表
- D.以任务为导向的协作← 正确答案
答案:ABD。A2A 追求跨框架互操作、通过 Agent Card 自我声明能力、以任务状态机驱动协作,这些都是协议的核心特征。C 恰恰相反——A2A 是去中心化的,不依赖中心注册表,任何智能体只要知道卡片端点即可互联。
Q9. 以下哪些信息会出现在 A2A 的 Agent Card 中?
- A.智能体名称与功能描述← 正确答案
- B.支持处理的技能清单← 正确答案
- C.接受任务的服务端点← 正确答案
- D.训练语料的全部内容
答案:ABC。Agent Card 公示的是“对外协作所需”的信息:名称描述、技能清单、服务端点,用于让其他智能体判断是否合作、往哪里发任务。训练语料属于内部资产,既不需要也不可能暴露在卡片上——没有哪家快递公司会把货舱清单贴在门口。
Q10. 在实际多 Agent 系统中,A2A 与 MCP 可以如何联合使用?
- A.智能体间用 A2A 横向派单← 正确答案
- B.智能体内用 MCP 访问工具← 正确答案
- C.用 A2A 发现远程智能体能力← 正确答案
- D.用 MCP 替代全部外部协议
答案:ABC。典型的联合用法是:智能体之间用 A2A 派发任务和发现能力,每个智能体内部用 MCP 访问数据库和 API——一条横线连同事、一条竖线连工具。D 是错的,MCP 只管内部工具调用,无法替代负责跨智能体协作的 A2A,正如货车永远替代不了邮局间的国际交接。