多Agent协作起航:A2A协议如何让智能体“说同一种语言”(上)
在智能体(Agent)技术快速发展的当下,多Agent协作已成为解锁复杂任务的关键。此前我们学习了Semantic Kernel中的常见编排模式,对智能体的基础协作逻辑有了初步认知。而在Agent时代,除了已熟悉的MCP(模型上下文协议),另一个备受关注的通信协议——A2A(Agent-to-Agent,智能代理间协议),正逐渐成为多Agent系统的“通用语言”。今天,就让我们从零开始,揭开A2A协议的神秘面纱。
一、为什么需要A2A协议?多Agent协作的“沟通壁垒”
想象一个场景:你计划一次旅行,需要同时协调“机票查询”“酒店预订”“景点推荐”三个不同领域的专家。每个人都有自己的专长,但要完成“制定完整旅行方案”的目标,必须不断交换信息、明确分工——有人负责收集需求,有人提供候选方案,有人汇总结果。智能体时代也是如此:不同企业、团队开发的Agent(如旅游规划Agent、交通查询Agent、餐饮推荐Agent)各有所长,但它们可能基于不同的平台或框架,就像说着不同的“方言”,难以直接沟通。
A2A协议正是为解决这一痛点而生。它本质上是一套标准化、通用的沟通规则,让来自不同团队的Agent能够像使用“同一种语言”一样顺畅交流。通过这套规则,Agent可以明确表达自己的能力边界、传递任务需求、共享中间结果,最终协同完成复杂任务。例如,当用户提出“规划云南五日游”的需求时,旅游规划Agent、交通Agent、酒店Agent通过A2A协议交换信息:交通Agent提供航班选项,酒店Agent推荐目的地住宿,旅游规划Agent整合三方数据生成完整方案——每个Agent都清楚自己该做什么、如何与其他Agent配合,最终输出用户满意的结果。
二、A2A协议的核心:标准化组件与底层技术支撑
从技术角度看,A2A协议通过一系列标准化组件为Agent间的协作提供底层支持。其中,Agent Cards(智能体名片)是关键一环——它类似于智能体的“自我介绍”,包含该Agent能提供哪些能力(如“机票查询”“酒店推荐”)、支持的交互方式(如API调用格式)、权限要求(如用户认证信息)等元数据。通过Agent Cards,其他Agent可以快速发现并理解其功能,就像查看简历后知道谁能胜任某项工作。
在通信层面,A2A协议基于JSON-RPC、HTTP/SSE等成熟的网络传输协议,定义了更上层的协作语义,包括:
能力发现:通过Agent Cards和标准化能力描述,Agent可以主动寻找能协助自己的“伙伴”;
会话管理:跟踪多Agent之间的对话上下文,确保信息传递的连贯性;
任务生命周期管理:明确任务的启动、执行、暂停与终止流程;
消息与内容单元(Part):规范信息的结构化表达,确保不同Agent能正确解析对方传递的数据;
权限认证:保障数据交互的安全性,防止未经授权的访问;
流式与事件机制:支持实时反馈(如任务进度更新)和异步通信(如长时间任务的阶段性结果推送)。
这些组件的组合,让多智能体系统具备了“灵活拼接、异步协作”的能力,既能适应企业级应用的安全需求,也能扩展至跨平台、跨框架的复杂场景。
三、A2A与MCP:互补的“垂直+水平”通信方案
提到A2A,很多人会联想到另一个热门协议——MCP(模型上下文协议)。二者有何区别?简单来说,它们是互补关系,共同构成AI时代的完整通信方案:
MCP提供垂直集成能力,专注于将单个Agent连接到工具与资源(如数据库、API、本地文件系统)。它像是智能体的“工具箱🧰”,帮助Agent高效调用外部资源完成具体任务;
A2A则提供水平通信能力,专注于让Agent与其他Agent对话。它像是智能体的“社交网络”,让不同Agent能够发现彼此、协商任务、共享信息。
二者的结合,推动单一AI应用向分布式、模块化的智能生态演进:MCP让每个Agent“有能力做事”,A2A让多个Agent“能协同做事”。
四、Hello World:用.NET快速体验A2A通信
理论之后,让我们通过一个简单的实践案例建立直观认知。目前,A2A官方提供了NET SDK(支持ASP,NET Core应用),开发者可以轻松为Agent添加A2A支持
我们以经典的“Hello World”为例,实现两个基础组件:
EchoAgentServer(服务端):接收用户输入的信息,进行简单加工(如添加前缀/后缀)后返回;
A2A Client(客户端):将用户输入的信息传递给EchoAgentServer,获取处理结果并展示。
(后续文章将深入解析这两个组件的具体实现,包括核心对象的使用、消息格式的定义等,帮助开发者从感性认识进阶到实践能力。)
A2A协议通过标准化的语言和底层支撑,正在打破多Agent协作的“沟通壁垒”。下一篇,我们将继续探索A2A协议的核心对象(如三大角色与四大对象)、更复杂的协作场景,以及如何基于A2A构建实际的多Agent应用。智能体的“语言革命”,才刚刚开始。
理解A2A协议的三大角色(用户、客户端、远程Agent)与四大对象(尤其是Agent Card),是掌握多Agent协作的基础。角色定义了“谁发起需求”“谁传递需求”“谁执行需求”的分工逻辑,而对象(如Agent Card)则为这种协作提供了标准化的沟通语言。通过这种清晰的架构设计,不同智能体之间能够像“拼图”一样精准配合,最终实现复杂任务的自动化分解与协同执行。后续,我们将基于这些基础概念,进一步探索A2A协议的实际应用场景与开发技巧。
其实,它就和我们在做后端服务开发中的服务注册和发现的机制差不多,只不过这个注册的信息被标准化了,下面我们可以看看一个典型的Agent Card的JSON格式:
这个JSON数据简要描述了一个名为"Google Maps Agent"的Agent定义。这个Agent的主要功能是规划路线、记住地点和生成导航指示。这个应用由Google提供,版本号是1.0.0,采用OAuth2身份验证。它支持文本和HTML格式的输入和输出,具有流媒体功能,但不支持推送通知。它的一个核心技能是"route-planner",可以帮助用户规划两个地点之间的路线,并输出HTML和视频格式的内容。
在A2A .NET SDK中,AgentCard的定义如下:
publicclassAgentCard{publicstringName { get; set; } // 代理名称publicstringDeion { get; set; } // 代理描述publicstringUrl { get; set; } // 代理 URLpublicAgentProvider? Provider { get; set; } // 提供商信息publicstringVersion { get; set; } // 版本信息publicAgentCapabilities Capabilities { get; set; } // 代理能力publicList<AgentSkill> Skills { get; set; } // 代理技能publicList< string> DefaultInputModes { get; set; } // 默认输入模式publicList< string> DefaultOutputModes { get; set; } // 默认输出模式}
在上一篇的Demo中,我们在定义EchoAgent时,就实现了一个GetAgentCard方法,并将其注册到服务发现中最终被Client探索发现时就会以JSON格式输出给到Client:
publicclassEchoAgent{publicvoidAttach(ITaskManager taskManager){taskManager,OnMessageReceived = ProcessMessageAsync;taskManager,OnAgentCardQuery = GetAgentCardAsync;}dbczg.COmhtt;privateTask<Message> ProcessMessageAsync(MessageSendParams messageSendParams, CancellationToken cancellationToken){......}privateTask<AgentCard> GetAgentCardAsync(stringagentUrl, CancellationToken cancellationToken){returnTask,FromResult( newAgentCard {Name = "Echo Agent", dbczgf.COmhtt;; Deion = "Echoes messages back to the user", Url = agentUrl,Version = "1,0,0", DefaultInputModes = [ "text"], DefaultOutputModes = [ "text"], Capabilities = newAgentCapabilities { Streaming = true} });}}
与此同时,在Client中也可以主动进行服务发现,例如上一篇Demo中的Client示例代码:
// Discover agent and create clientvarcardResolver = newA2ACardResolver( newUri( )); varagentCard = awaitcardResolver. GetAgentCardAsync; varclient = newA2AClient( newUri(agentCard. Url));
第二个:Task(任务)
Task 是 Client 和 远程Agent 之间协作的一个概念,很好理解,一个Task代表一个需要完成的任务,每个Task都有一个唯一的ID号,它通常包含了任务状态、历史记录 和 执行结果 等信息。
Task的主要具体状态有:submitted, working, completed, canceled, failed 等,下图展示了Task的状态机转换流。
在A2A .NET SDK中,AgentTask的定义如下:
publicclassAgentTask: A2AResponse{publicstringId { get; set; } // 任务 IDpublicstring?ContextId { get; set; } // 上下文 IDpublicAgentTaskStatus Status { get; set; } // 任务状态publicList<Artifact>? Artifacts { get; set; }kbczgo.COmhtt;// 任务产出物publicList<Message>? History { get; set; } // 消息历史publicDictionary< string, JsonElement>? Metadata { get; set; } // 元数据}
第三个:Artifact(工件 或 成果)
Artifact 和我们在DevOps CI/CD流水线中的Artifact(即工件)的概念类似,它是 远程Agent执行完某个任务后生成输出的结果(即远程Agent返回的结果通过一个Artifact对象输出给Client),每个任务的结果可能都不一样。
一个Artifact可以包含多个部分(parts),每个部分(part)可以是:文本、文档、图像 等,涉及纯文本、文件 和 结构化数据。
第四个:Message(消息)
Message 也很好理解,它就是 Client 和 远程Agent 之间通信的 一个消息对象,它通常包含了 指令 和 状态更新 等内容。
同样的,一个Message对象也可以包含多个parts,用于传递如 文本、文件 或 结构化 等不同类型的内容。每个Message都有发送方设置的一个唯一的messageId,且通过一些关键词如"user"(代表Client发送的)或“agent”(代表服务端发送的)来区分角色。
在A2A .NET SDK中,Message的定义如下:
publicclassMessage: A2AResponse{publicMessageRole Role { get; set; } // 消息角色 (User/Agent)publicList<Part> Parts { get; set; } // 消息部分publicstring? MessageId { get; set; } // 消息 IDpublicstring? TaskId { get; set; }tqczrk.COmhtt;// 关联任务 IDpublicstring? ContextId { get; set; } // 上下文 IDpublicDictionary< string, JsonElement>? Metadata { get; set; } // 元数据}
A2A协议的工作流程
这里我们来通过一个简单的例子看看A2A协议的 请求-响应 工作流程是怎么样的。
例如,有这样一个场景“招聘XX岗位候选人搜寻”:
Step1,用户在统一界面下向Client(假设它也是一个Agent)发送一个请求消息“请帮我寻找一个XX岗位的候选人”。
Step2,Client将用户的请求消息进行封装,并根据岗位需求依次调用一些远程Agent如 简历检索Agent、技能筛选Agent 等等。
例如,下面的请求示例展示了Client在检索了5位候选人简历之后通过A2A协议向远端技能筛选Agent发送的任务请求:
Step3,各个远端Agent执行各自的任务,并返回给Client对应的Artifact对象结果(如候选人名单等),然后再由Client进行汇总和展示。
Step4,后续Client可以陆续调用其他远端Agent如 面试安排Agent、背景调查Agent等,完成端到端的自动化招聘流程。
那么,该场景的整个工作流程便如下图所示:
除此之外,实际应用案例中通常是A2A与MCP两个协议一起使用,形成更广的应用范围。
例如,下图展示了一个汽车维修店的场景,店长智能体 和 机械师智能体 通过A2A协议完成任务移交(hand-off),店长可以处理常见问题,但机械师可以解决技术难题。机械师智能体再通过MCP协议完成内部工具使用完成具体任务,还可以通过A2A协议和零件供应商Agent完成外部协作。
小结
本文介绍了A2A的三个主要角色(User、Client 和 Remote Agent)以及 四个核心对象(Agent Card、Task、Artifact 和 Message),并通过简单的例子介绍了A2A协议的典型工作流程,相信对于你加深了解A2A协议会有帮助。