大家好,我是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<Message> ProcessMessageAsync(MessageSendParams messageSendParams, CancellationToken cancellationToken){var text = messageSendParams.Message.Parts.OfType<TextPart>().First().Text;return Task.FromResult(new Message{Role = MessageRole.Agent,MessageId = Guid.NewGuid().ToString(),ContextId = messageSendParams.Message.ContextId,Parts = [new TextPart { Text = $"Echo: {text}" }]});}private Task<AgentCard> 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 agent var 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 client var cardResolver = new A2ACardResolver(new Uri("https://localhost:7243/")); var agentCard = await cardResolver.GetAgentCardAsync(); var client = new A2AClient(new Uri(agentCard.Url)); // Send message var 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 都启动起来,查看控制台输出结果:
可以看到,Agent Response是从Agent Server处理后返回的结果,正确!
小结
本文介绍了A2A的基本概念以及和MCP的关系,然后通过一个Hello World案例介绍了如何快速开始一个A2A Demo,相信我们可以有一个快速的感性认识。
下一篇,我们将学习对A2A的核心对象如Agent Card, Task, Artifact, Message等,典型工作流程,以及在A2A .NET SDK中集成大模型实现一个稍微复杂点的案例。
参考资料
黄佳:《MCP & A2A前沿实战》
圣杰:《.NET+AI | Semantic Kernel入门到精通》
作者:爱迪生
出处:https://edisontalk.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。