摘要:之前我们学习了Semantic Kernel中的一些常见的编排模式,相信你已经了解了一些。在Agent时代,有两个协议目前非常火热,一个是MCP 模型上下文协议(之前我们已经学过了),另一个是A2A (Agent-to-Agent),今天我们就来开始了解下A2
大家好,我是Edison。
之前我们学习了Semantic Kernel中的一些常见的编排模式,相信你已经了解了一些。在Agent时代,有两个协议目前非常火热,一个是MCP 模型上下文协议(之前我们已经学过了),另一个是A2A (Agent-to-Agent),今天我们就来开始了解下A2A。
A2A协议简介
A2A 即 Agent-to-Agent,翻译过来就是“智能代理之间的协议”,我们可以理解为它就是一个大模型Agent们用来“聊天”的“通用语言”。
Agent 和 Agent 之间的交互,和人类之间的沟通有些类似:不同的人有不同的能力,每个人都擅长做自己最擅长的领域。为了一起完成一个任务,必须不断地交换信息 和 协同合作。在Agent时代也如此,Agent也需要分工明确和相互协作。但是,不同的企业不同的团队可能会开发出各种各样的Agent,而这些Agent可能都只会说自己的“方言”,如何让它们能够顺畅沟通,就是A2A协议产生的背景。简而言之,A2A定义了一套清晰、标准的沟通方式,让Agent们可以顺畅地交流,让不同平台和框架下的Agent都能够说“同一种话”,实现无障碍的信息交换和协作。例如,下面有三个Agent,它们分别用于不同的任务,通过A2A协议可以让它们之间可以顺畅地通信,最终一起为用户提供完整的方案。
可以看到,各个Agent按统一消息格式响应各自的信息,最终由旅游规划Agent将结果进行整合并生成最终结果输出给用户。
技术上来说,A2A 通过标准化的组件(如 Agent Cards)为 Agent 间的“相互发现与握手”提供了通用语言。它在 JSON-RPC、HTTP/SSE 等底层传输之上,定义了能力发现(通过 Agent 卡片以及标准化的能力定义)、会话管理、任务生命周期管理、消息与内容单元(Part)、权限认证、流式与事件等语义,使多智能体系统能够灵活拼接、异步协作,并具备企业级安全与可扩展性。
A2A和MCP的关系
A2A 和 MCP 看起来很相似,但其实它们是互补的关系,一起形成完整的AI时代的通信协议方案。
MCP提供了统一的上下文管理和工具调用接口,整合大模型驱动的概率计算与传统工具驱动的结构化计算。A2A则为多Agent协同注入了开放标准。二者的结合,将单一AI应用推向分布式、模块化的智能生态。
总结一下:
MCP:提供垂直集成,将Agent连接到工具和资源。
A2A:提供水平通信,将Agent连接到其他Agent。
Hello A2A这里我们来实现一个A2A的Hello World示例,当然是用我们最熟悉的.NET啦。A2A .NET SDK 是一个实现 A2A 协议 v0.2.1 的 .NET 库,用于在 .NET 应用程序中启用代理之间的通信。该 SDK 设计用于与 Asp.NET Core 应用程序配合使用,提供了一种简单的方式为 Agent 添加 A2A 支持。GitHub: https://github.com/a2aproject/a2a-dotnet这里我们先不管A2A的一些核心对象,直接来写一个Hello World来有个感性认识即可。根据官网示例,我们写一个A2A Agent Server和一个A2A Client。(1)EchoAgentServer:负责将用户输入的信息进行加工返回;(2)A2A Client:负责将用户输入的信息传递给EchoAgentServer处理,返回EchoAgentServer的处理结果;
首先,我们创建一个ASP.NET Web (Empty) 项目取名为EchoAgentServer,然后安装以下包:
A2A.AspNetCore 0.1.0-preview.2然后,创建一个EchoAgent类用于定义该Agent的实现:
public class EchoAgent{ public void Attach(ITaskManager taskManager) { taskManager.OnMessageReceived = ProcessMessageAsync; taskManager.OnAgentCardQuery = GetAgentCardAsync; } private Task ProcessMessageAsync(MessageSendParams messageSendParams, CancellationToken cancellationToken) { var text = messageSendParams.Message.Parts.OfType return Task.FromResult(new Message { Role = MessageRole.Agent, MessageId = Guid.NewGuid.ToString, ContextId = messageSendParams.Message.ContextId, Parts = [new TextPart { Text = $"Echo: {text}" }] }); } private Task GetAgentCardAsync(string agentUrl, CancellationToken cancellationToken) { return Task.FromResult(new AgentCard { Name = "Echo Agent", Description = "Echoes messages back to the user", Url = agentUrl, Version = "1.0.0", DefaultInputModes = ["text"], DefaultOutputModes = ["text"], Capabilities = new AgentCapabilities { Streaming = true } }); }}最后,在Program.cs中注册该Agent并使用A2A AspNetCore SDK进行端点的映射,主要就是使用MapA2A这个扩展方法来实现:
var builder = WebApplication.CreateBuilder(args);var app = builder.Build;// Create and register your agentvar taskManager = new TaskManager;var agent = new EchoAgent;agent.Attach(taskManager);app.MapA2A(taskManager, "/echo");app.Run;好啦,Server有了,现在我们创建一个控制台项目作为A2A Client来调用Server。
同样,你需要安装一下A2A Package(这里就不再是A2A.AspNetCore了哈):
A2A 0.1.0-preview.2然后,通过下面的示例代码一步步完成Agent的服务发现、卡片解析 以及 发送消息通信。
// Discover agent and create clientvar cardResolver = new A2ACardResolver(new Uri("https://localhost:7243/"));var agentCard = await cardResolver.GetAgentCardAsync;var client = new A2AClient(new Uri(agentCard.Url));// Send messagevar userMessage = new Message{ Role = MessageRole.User, Parts = [new TextPart { Text = "Hello!" }]};Console.WriteLine($"User Message: {((TextPart)userMessage.Parts[0]).Text}");var agentResponse = (Message)await client.SendMessageAsync(new MessageSendParams{ Message = userMessage});Console.WriteLine($"Agent Response: {((TextPart)agentResponse.Parts[0]).Text}");Console.ReadKey;这里我们将Server 和 Client 都启动起来,查看控制台输出结果:
Github:
黄佳,《MCP&A2A前沿实战》in 极客时间
圣杰:《.NET+AI | Semantic Kernel入门到精通》in 极客时间
来源:opendotnet