序言
大家好!今天我们来深入聊聊谷歌最近在Cloud Next大会上发布的那个热门话题------A2A协议。你可能听说了,它是关于"智能体之间无缝协作"的,但心里或许会犯嘀咕:"这听起来和我用过的LangChain、AutoGen框架里的多智能体协作差不多啊?有啥新鲜的?" 甚至会想,"这和之前Anthropic提出的MCP协议又是什么关系?" 这些疑问非常好,它们直指问题的核心。
想象一下,现在有很多"工人"(AI智能体),他们来自不同的"工坊"(比如用LangChain、AutoGen或者某个公司内部框架开发的),每个工人都身怀绝技(比如一个擅长搜集信息,一个擅长分析数据,一个擅长写报告,它们之间可以协作,比如AtuoGen的handoff机制)。但是,这些来自不同工厂之间,却难以对话和合作,因为他们"方言"不同(开发框架、数据格式、通信方式各异)。
那么它和MCP(模型-控制器-协议)是什么关系呢?可以这样理解:MCP帮助一个工人(大模型/智能体)标准化地使用各种工具,而A2A则帮助不同的工人之间标准化地协作。它们是互补的,一个负责对"物"(工具),一个负责对"人"(其他智能体)。
谷歌也提到,可以将A2A智能体本身发布成一个MCP资源,让其他人能通过MCP的机制找到并初步了解他,但他们之间真正深入的协作对话,还是要靠A2A这套"普通话"。
所以,A2A的"稀奇"之处不在于"多智能体协作"这个概念本身,而在于它是协议,旨在打破不同框架、不同厂商之间的壁垒,实现跨平台、跨生态的智能体互联互通,解耦了智能体本身与其开发框架,为构建真正庞大、动态、分布式的智能体协作网络奠定了基础。
一:A2A究竟解决了什么问题?
我们刚才用了一个比喻,现在让我们更深入地探讨一下。在你接触LangChain、AutoGen等框架时,你确实可以在框架内部构建多个智能体,让它们按照你设计的流程进行协作。比如,你可以定义一个"研究员Agent"负责上网搜索信息,一个"分析师Agent"负责处理数据,一个"作家Agent"负责撰写报告。在AutoGen中,你可能会用到handoff
这样的机制来传递任务和信息。
这很吊啊,因为它让你在一个封闭的系统内实现了一个多AGent智能体,完成自动化工作流。但问题来了:
- 生态壁垒:如果你想让你用AutoGen开发的"分析师Agent"去调用一个由第三方数据公司(比如彭博社)提供的、用他们自家技术开发的"实时金融数据Agent",怎么办?你需要单独为这两个Agent编写适配代码,处理数据格式转换、API调用方式等差异。如果这样的外部Agent有很多,你的适配工作量将是巨大的。
- 重复建设:也许另一个团队也用LangChain构建了一个非常优秀的"数据清洗Agent"。你想在你的AutoGen项目里复用它,同样面临集成难题。大家都在各自的"工坊"里重复造轮子。
- 动态协作困难:在复杂任务中,智能体之间的协作关系可能是动态的。比如,你的"分析师Agent"在分析过程中发现需要某个特定领域的专家意见,它希望能动态地找到并调用一个符合条件的"专家Agent"。在没有统一标准的情况下,这种动态发现和即时协作很难实现。
A2A协议正是为了解决这些痛点而生。它站出来说:"嘿,各位智能体的开发者们,我们不要再各说各话了。我们来定义一套标准的沟通方式吧!"
- 它提供"通用语言" :A2A定义了智能体之间如何描述自己的能力(稍后会讲到的
Agent Card
)、如何发起和管理任务(Task
)、如何交换信息(Message
,Part
,Artifact
)等。 - 它实现"解耦":遵循A2A的智能体,理论上可以和任何其他遵循A2A的智能体进行交互,而不需要关心对方是用什么框架(LangChain, AutoGen, CrewAI, Google ADK, 或是完全自研的)开发的。
- 它促进"互联互通":当越来越多的智能体(尤其是来自不同组织和平台的智能体)都支持A2A时,一个庞大的、可互操作的智能体网络就可能形成。你的本地智能体可以像调用本地函数一样,轻松地调用网络上某个远程智能体的专业能力。
所以,再次重申,A2A和LangChain/AutoGen等框架是不同层面的东西。你可以用LangChain或AutoGen来构建一个遵循A2A协议的智能体。
二:A2A如何让智能体之间对话?

想象两个智能体要通过A2A协议进行交流,我们称发起方为A2A Client (客户端,可以是一个普通应用,也可以是另一个智能体),被调用方为A2A Server(服务端,也就是提供能力的那个智能体)。
1、自我介绍:Agent Card (代理卡)
其实了解过Langchian的同学应该一眼就看出来了,这就是tools的描述。
每个A2A Server都需要提供一个公开的元数据文件,通常放在一个标准路径下(如/.well-known/agent.json
)。这就是它的"名片"或"能力说明书"。
Client在与Server交互前,会先去获取并阅读这张Agent Card。卡片里详细说明了该Server(智能体)具备哪些能力,比如"A智能体能够进行汇率转换"、"B可以分析用户评论"、"C能生成报告摘要"等。 同时,卡片还提供了调用这些能力的具体端点URL 以及可能需要的身份验证信息。
这就是A2A实现能力发现的关键。Client可以根据自己的需求,通过查找和解析Agent Card,动态地发现互联网上有哪些Server能帮它完成任务。
2、分配任务与追踪:Task (任务)
Task是A2A协作的核心工作单元 。当Client确定要让某个Server执行一项工作时,它会通过向Server发送一个初始消息来初始化一个Task 。每个Task都有一个唯一的ID,方便后续追踪。
一个Task会经历不同的状态,也就是Task的生命周期,比如:
submitted
:任务已提交给Server。working
:Server正在处理任务。input_required
:Server在处理过程中发现需要Client提供额外信息(比如,填写表单时缺少用户生日),任务暂停,等待Client补充输入。completed
:任务成功完成。failed
/canceled
:任务失败或被取消。
ask机制为复杂的、可能长时间运行的、甚至需要中途交互的智能体协作提供了清晰的状态管理和追踪框架。这覆盖了A2A的任务管理 (Task Management) 能力。
3、 沟通的载体:Message (消息), Part (内容单元), Artifact (工件)
Client和Server之间的所有交流都是通过Message 进行的。每条Message都明确了发送方的角色 (Role) ,通常是user
(代表最终用户或发起请求的Client)或agent
(代表执行任务的Server)。
一条Message可以包含多个Part。Part是信息的基本单元,可以是:
TextPart
:纯文本内容。FilePart
:文件内容,可以是内嵌的字节流,也可以是指向文件的URI。DataPart
:结构化的JSON数据,例如用于表单提交或返回表格数据。
当Server完成任务或者在任务过程中产生了重要的中间结果(如生成的文件、分析图表),它会创建Artifact。Artifact本质上也是由一个或多个Part组成的,代表了任务的产出物。
这套机制定义了智能体之间交换信息的标准格式 ,确保双方能准确理解对方传递的内容,无论是简单的文本指令,还是复杂的文件或结构化数据。这是实现有效协作 的基础。
4、通信方式:Streaming (流式传输) & Push Notification (推送通知)
- Streaming: 对于那些需要较长时间才能完成的任务,Server可以启用
streaming
功能。它会通过服务器发送事件 (Server-Sent Events, SSE) 的方式,持续地向Client推送任务的进度更新 (如TaskStatusUpdateEvent
)或中间产生的工件 (如TaskArtifactUpdateEvent
)。Client不需要傻等,可以实时了解任务进展。 - Push Notification: 如果Client不方便一直保持连接监听SSE,Server还可以支持
pushNotifications
。Client可以提供一个Webhook URL,Server在任务状态发生重要变化时,会主动向这个URL发送通知。
这两种方式提高了长时间任务或异步协作场景下的通信效率和用户体验。
5、协商最终呈现:User Experience Negotiation (用户体验协商)
虽然上面的机制主要关注数据和任务流程,A2A协议的设计也考虑到了最终呈现给用户的体验。例如,在任务完成后,Client和Server可以协商,是以精美的卡片形式展示结果,还是生成一份详细的PDF报告,或者只是返回纯文本。这确保了协作的最终成果能以最适合用户的方式呈现。
6、小结一下典型工作流
- 发现 :Client (谷歌提供了3个例子,最简单的就是CLI命令行直接当做客户端就行) 启动,首先去Server (比如本地运行的LangGraph Agent) 的
/.well-known/agent.json
地址获取Agent Card,了解到Server能做汇率转换。 - 启动 :Client发送一个包含初始请求("人民币兑美元汇率是多少?")和任务ID的
tasks/send
(或tasks/sendSubscribe
,如果是订阅模式)请求给Server。 - 处理 :Server收到任务,开始工作 (
working
状态)。它可能需要调用外部API(比如Frankfurter API,这可能是通过MCP机制实现的,也可能是直接调用)来获取实时汇率数据。 - 交互 (可选) :如果任务需要更多信息(比如需要指定日期),Server会将任务状态置为
input_required
,并通过Message告知Client。Client收到后,需再次发送Message(携带相同Task ID)提供所需信息。 - 完成 :Server获取到汇率数据(比如1 CNY = 0.137 USD),将任务标记为
completed
,并通过响应(或SSE/Push Notification)将包含结果的Message/Artifact返回给Client。Client收到并展示结果。
三:A2A与MCP:携手而非替代

谷歌官方确实明确表示,可以将A2A Agent以MCP资源的形式发布。
这听起来似乎让MCP也能处理智能体间的交互了,对吗?但这里的关键在于理解它们各自的设计侧重点以及这种"发布"的真正含义。
首先,为什么可以将A2A Agent发布为MCP资源?
其实,这是一种兼容和发现的策略,而不是替代。想象一下MCP像是一个"工具市场",里面陈列着各种工具(API、数据库等),大家可以用MCP协议来"购买"和使用这些工具。A2A Agent是一个"专业工人",他本身也需要使用工具箱(可能通过MCP调用API),同时他也能独立完成复杂任务,并且能与其他"工人"(其他A2A Agent)协作。将这个"工人"(A2A Agent)也放到"工具市场"(发布为MCP资源)里展示,有以下好处:
- 可发现性:那些习惯逛"工具市场"(主要使用MCP协议的系统或LLM)的用户,也能看到并了解到这位"工人"的存在和他的基本能力。
- 初步接入:对于一些简单的、类似工具调用的请求,用户或许可以直接通过MCP协议向这位"工人"发出指令,并得到响应。
但是,这并不意味着MCP协议本身就能完全支撑这位"工人"的所有复杂工作和与其他工人的协作。 所以接下来我会分析为什么A2A仍然是必要的。
- 首先是协作深度不同 :MCP的"工具调用"模式,不足以支撑智能体之间复杂的协作需求。比如:
- 动态任务分配:一个Agent可能需要根据情况,将任务的子部分分包给其他几个Agent,并协调它们的结果。MCP没有这样的任务管理和协调机制。
- 多轮协商:两个Agent可能需要来回讨论好几轮才能确定一个方案。MCP的请求-响应模式不适合这种对话式交互。
- 状态同步:协作过程中,一个Agent的状态变化可能需要通知其他关联Agent。A2A的Task状态管理和SSE/Push机制就是为此设计的。
- 能力发现的粒度:A2A的Agent Card提供了比MCP工具描述更丰富的智能体能力信息,更适合智能体之间的互相理解。
- 其次是协议设计的侧重 :A2A是专门为智能体间通信 设计的协议,其核心概念(Task, Message, Role, Streaming等)都是围绕协作展开的。而MCP的核心是工具接口标准化。用MCP强行模拟A2A的复杂协作,会非常笨拙且低效。
- 最后死生态构建的目标 :A2A的目标是构建一个智能体网络,让智能体可以像互联网上的服务一样互相调用、组合。这需要一套专门为网络化协作设计的协议,仅仅把Agent当作MCP工具发布是不够的。
你可以把一个"翻译服务公司"(A2A Agent)在"电话本"(MCPServe里)上登记为一个"服务提供商"(MCP Resource)。需要翻译的人可以通过查黄页找到它,并打个电话(MCP请求)问问价格或者做一个简单的文件翻译(简单的MCP交互)。
但是,如果是一个大型国际会议需要同声传译、多语种协调、现场设备支持等复杂服务,你就不能只靠黄页上的信息和打个电话了。你需要和这家公司进行深入沟通,签订详细合同,明确任务流程、人员安排、应急预案等(这就像A2A协议定义的复杂协作流程)。这家公司内部可能还需要协调其他翻译员、技术人员(调用其他A2A Agent)来共同完成任务。
所以将A2A Agent发布为MCP资源主要是为了提高其在现有MCP生态中的可见性和初步可访问性 。但这并不取代A2A协议本身在实现深度、复杂、动态的智能体间协作 方面的核心价值。两者是互补的,共同构成了更强大的AI基础设施:MCP负责打通智能体与工具的连接,A2A负责打通智能体与智能体的连接。
四:A2A代码库与汇率转换示例
谷歌开源了A2A协议的参考实现,代码仓库(GitHub)提供了Python和JavaScript版本。我们重点看Python示例:
-
代码结构:
common
:包含构建Agent和应用所需的基础类和函数。agents
:扮演A2A Server角色,提供了几种不同的智能体实现(比如基于Google ADK、LangGraph、CrewAI的)。host
:扮演A2A Client角色,也提供了不同形式的客户端(比如一个简单的命令行接口CLI)。
-
演示场景:汇率转换
- 启动Server :
- 选择一个Agent实现,比如基于
LangGraph
的。 - 配置必要的环境变量(如Google API Key,如果Agent内部需要调用Google服务)。
- 运行Server程序(例如
uvicorn samples.python.langgraph.main:app --port 10000
)。 - Server启动后,会监听在指定的端口(如10000),并准备好接收A2A请求。它会自动提供
/.well-known/agent.json
这个路径,供客户端查询其Agent Card
。
- 选择一个Agent实现,比如基于
- 启动Client :
- 运行
Host
目录下的CLI客户端程序,并指定要连接的Server地址(--agent http://127.0.0.1:10000
)。
- 运行
- 能力发现 (Discovery) :
- Client启动时,第一步就是向
http://127.0.0.1:10000/.well-known/agent.json
发送GET请求,获取Agent Card
。 - Client解析Agent Card,发现这个Server具备
skills
(技能),其中之一就是"汇率转换"。
- Client启动时,第一步就是向
- 任务发起 (Initiation) :
- Client在命令行接收用户输入,比如"人民币和美元之间的汇率是多少?"
- Client将这个请求包装成一个初始的
Message
(role: "user"
),并生成一个唯一的Task ID
。 - Client向Server的
tasks/send
(或者tasks/sendSubscribe
)端点发送POST请求,请求体中包含这个Message
和Task ID
。
- 任务处理 (Processing) :
- Server(LangGraph Agent)接收到请求,创建一个新的Task实例,状态变为
working
。 - 为了完成汇率转换,Server需要获取实时数据。它可能会调用一个外部的汇率API,比如
Frankfurter API
。(注意:这里Server调用外部API,可能就是通过MCP协议实现的,也可能是直接的HTTP调用。A2A协议本身不限制Server内部如何实现其能力)。 - Server拿到汇率数据(例如:1 CNY = 0.137 USD)。
- Server(LangGraph Agent)接收到请求,创建一个新的Task实例,状态变为
- 任务完成与结果返回 (Completion) :
- Server处理完成,将Task状态更新为
completed
。 - 它将结果(汇率信息)包装在一个
Message
(role: "agent"
)或Artifact
中。 - 由于Client使用的是
tasks/send
模式(同步等待),Server在HTTP响应中直接返回包含最终结果和Task状态的完整Task对象。 - (如果是
tasks/sendSubscribe
模式,或者任务需要流式输出,Server会通过SSE推送TaskStatusUpdateEvent
和包含结果的TaskArtifactUpdateEvent
)。
- Server处理完成,将Task状态更新为
- Client展示结果 :
- Client收到响应,解析出结果,并在命令行界面上显示:"汇率情况呢,是一人民币等于0.137美元。"
- 启动Server :
-
这个演示体现了A2A的关键机制:
- 通过
Agent Card
进行能力发现。 - 以
Task
为核心进行工作管理和状态追踪。 - 通过
Message
传递请求和结果。 - Client和Server遵循A2A定义的HTTP接口和数据格式进行交互。
- 展示了A2A如何与其他技术(如LangGraph框架、外部API调用)结合使用。
- 提到了不同的交互模式(
task-send
vssend-subscribe
)和可能的交互需求(input_required
状态)。
- 通过
五:A2A的愿景与未来 - 构建智能体协作网络
了解了A2A是什么、如何工作以及它与相关技术的关系后,我们最后来谈谈它的潜力和未来的发展方向。
谷歌推出A2A协议,其雄心显然不止于让几个智能体简单对话。它的长远目标是构建一个开放、庞大、充满活力的智能体协作网络,就像今天的互联网一样。
- 分布式智能的潜力:想象一下,未来可能没有一个无所不能的"超级AI"。取而代之的是一个由无数高度专业化的智能体组成的生态系统。需要完成一项复杂任务时(比如规划一次跨国旅行),你的个人助理Agent(本地Client)可以通过A2A协议,动态地发现并组合调用网络上的"机票预订Agent"、"酒店比价Agent"、"当地活动推荐Agent"、"签证办理Agent"等,它们协同工作,为你提供无缝的服务。
- Agent即服务 (Agent-as-a-Service):就像现在有SaaS(软件即服务)、PaaS(平台即服务)一样,未来可能会出现大量的"Agent即服务"。企业或开发者可以将自己擅长的能力封装成A2A Agent,对外提供服务。比如,一个金融公司可以提供专业的"投资分析Agent",一个设计公司可以提供"Logo生成Agent"。A2A协议为这些服务的标准化交互提供了基础。
- 生态系统的构建:谷歌在发布A2A时,强调了与首批50多家合作伙伴(如Atlassian, Salesforce, SAP, ServiceNow, 埃森哲, 毕马威等)的合作。这些合作伙伴大多是企业服务领域的巨头,它们将自己的服务或平台能力通过A2A Agent的形式开放出来,将极大地加速A2A生态的形成。这有点像当年Android联合手机厂商构建移动生态。
- 人类与AI协作的新范式:随着智能体网络的发展,未来人类的角色也可能发生变化。我们可能更多地扮演"指挥家"的角色,提出目标和需求,然后由AI(可能是作为组织者的AI Agent)去协调一个由多个专业Agent甚至包括人类专家组成的团队来共同完成任务。
当然,A2A的未来也面临挑战:
- 协议标准之争:A2A并非唯一的尝试。除了MCP,还有其他旨在促进智能体互操作性的协议或倡议在酝酿中。未来是A2A一统江湖,还是多种标准并存,尚不明朗。
- 生态冷启动:任何协议的成功都依赖于广泛的采纳。A2A需要吸引足够多的开发者和企业加入,才能形成真正的网络效应。
- 安全、隐私和治理:当大量智能体可以互相调用时,如何保证数据安全、用户隐私,如何管理和审计这些交互,将是巨大的挑战。
- 国内环境:正如视频中提到的,国内是否会基于A2A/MCP进行扩展,或者推出自主的智能体协作协议,也是一个值得关注的问题(比如阿里百炼平台对MCP的尝试)。
六、总结A2A知识图谱
经过我们这一番从宏观到微观,相比你也对A2A协议已经建立起了一个清晰的认识。我最后再给大家来梳理一下关键点,构建你的知识图谱:
- A2A是什么? 它是一个开放、标准化的协议 ,旨在实现不同来源、不同框架 的AI智能体之间的无缝协作与互操作。它是智能体世界的"普通话"。
- 它解决什么问题? 解决智能体生态碎片化、互操作性差、重复建设 的问题,解耦智能体与其开发背景。
- 核心机制? 通过
Agent Card
(能力发现)、Task
(任务管理与状态追踪)、Message/Part/Artifact
(信息交换)、Streaming/Push Notification
(高效通信)等机制实现协作。 - 与LangChain/AutoGen的关系? A2A是协议 ,LangChain/AutoGen是框架 。框架用于构建智能体,协议用于让不同框架构建的智能体能够对话。它们是不同层面、可结合使用的技术。
- 与MCP的关系? A2A与MCP是互补 的协议。MCP侧重智能体与工具/数据 的连接,A2A侧重智能体与智能体 的连接。A2A Agent可以发布为MCP资源以提高可见性 ,但这不取代A2A在深度协作中的核心作用。
- 未来愿景? 构建一个开放的、分布式的智能体协作网络,催生"Agent即服务"等新模式,改变人机协作范式。