找回密码
 立即注册
首页 业界区 安全 多Agent协作入门:基于A2A协议的Agent通信

多Agent协作入门:基于A2A协议的Agent通信

呼延冰枫 3 天前
大家好,我是Edison。
之前我们学习了Semantic Kernel中的一些常见的编排模式,相信你已经了解了一些。在Agent时代,有两个协议目前非常火热,一个是MCP 模型上下文协议(之前我们已经学过了),另一个是A2A (Agent-to-Agent),今天我们就来开始了解下A2A。
A2A协议简介

A2A 即 Agent-to-Agent,翻译过来就是“智能代理之间的协议”,我们可以理解为它就是一个大模型Agent们用来“聊天”的“通用语言”。
1.png

Agent 和 Agent 之间的交互,和人类之间的沟通有些类似:不同的人有不同的能力,每个人都擅长做自己最擅长的领域。为了一起完成一个任务,必须不断地交换信息 和 协同合作。在Agent时代也如此,Agent也需要分工明确和相互协作。但是,不同的企业不同的团队可能会开发出各种各样的Agent,而这些Agent可能都只会说自己的“方言”,如何让它们能够顺畅沟通,就是A2A协议产生的背景。
简而言之,A2A定义了一套清晰、标准的沟通方式,让Agent们可以顺畅地交流,让不同平台和框架下的Agent都能够说“同一种话”,实现无障碍的信息交换和协作。
例如,下面有三个Agent,它们分别用于不同的任务,通过A2A协议可以让它们之间可以顺畅地通信,最终一起为用户提供完整的方案。
2.png

可以看到,各个Agent按统一消息格式响应各自的信息,最终由旅游规划Agent将结果进行整合并生成最终结果输出给用户。
技术上来说,A2A 通过标准化的组件(如 Agent Cards)为 Agent 间的“相互发现与握手”提供了通用语言。它在 JSON-RPC、HTTP/SSE 等底层传输之上,定义了能力发现(通过 Agent 卡片以及标准化的能力定义)、会话管理、任务生命周期管理、消息与内容单元(Part)、权限认证、流式与事件等语义,使多智能体系统能够灵活拼接、异步协作,并具备企业级安全与可扩展性。
A2A和MCP的关系

A2A 和 MCP 看起来很相似,但其实它们是互补的关系,一起形成完整的AI时代的通信协议方案。
3.png

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,然后安装以下包:
  1. A2A.AspNetCore 0.1.0-preview.2
复制代码
然后,创建一个EchoAgent类用于定义该Agent的实现:
  1. public class EchoAgent
  2. {
  3.     public void Attach(ITaskManager taskManager)
  4.     {
  5.         taskManager.OnMessageReceived = ProcessMessageAsync;
  6.         taskManager.OnAgentCardQuery = GetAgentCardAsync;
  7.     }
  8.     private Task<Message> ProcessMessageAsync(MessageSendParams messageSendParams, CancellationToken cancellationToken)
  9.     {
  10.         var text = messageSendParams.Message.Parts.OfType<TextPart>().First().Text;
  11.         return Task.FromResult(new Message
  12.         {
  13.             Role = MessageRole.Agent,
  14.             MessageId = Guid.NewGuid().ToString(),
  15.             ContextId = messageSendParams.Message.ContextId,
  16.             Parts = [new TextPart { Text = $"Echo: {text}" }]
  17.         });
  18.     }
  19.     private Task GetAgentCardAsync(string agentUrl, CancellationToken cancellationToken)
  20.     {
  21.         return Task.FromResult(new AgentCard
  22.         {
  23.             Name = "Echo Agent",
  24.             Description = "Echoes messages back to the user",
  25.             Url = agentUrl,
  26.             Version = "1.0.0",
  27.             DefaultInputModes = ["text"],
  28.             DefaultOutputModes = ["text"],
  29.             Capabilities = new AgentCapabilities { Streaming = true }
  30.         });
  31.     }
  32. }
复制代码
最后,在Program.cs中注册该Agent并使用A2A AspNetCore SDK进行端点的映射,主要就是使用MapA2A这个扩展方法来实现:
  1. var builder = WebApplication.CreateBuilder(args);
  2. var app = builder.Build();
  3. // Create and register your agent
  4. var taskManager = new TaskManager();
  5. var agent = new EchoAgent();
  6. agent.Attach(taskManager);
  7. app.MapA2A(taskManager, "/echo");
  8. app.Run();
复制代码
好啦,Server有了,现在我们创建一个控制台项目作为A2A Client来调用Server。
同样,你需要安装一下A2A Package(这里就不再是A2A.AspNetCore了哈):
  1. A2A 0.1.0-preview.2
复制代码
然后,通过下面的示例代码一步步完成Agent的服务发现、卡片解析 以及 发送消息通信。
  1. // Discover agent and create client
  2. var cardResolver = new A2ACardResolver(new Uri("https://localhost:7243/"));
  3. var agentCard = await cardResolver.GetAgentCardAsync();
  4. var client = new A2AClient(new Uri(agentCard.Url));
  5. // Send message
  6. var userMessage = new Message
  7. {
  8.     Role = MessageRole.User,
  9.     Parts = [new TextPart { Text = "Hello!" }]
  10. };
  11. Console.WriteLine($"User Message: {((TextPart)userMessage.Parts[0]).Text}");
  12. var agentResponse = (Message)await client.SendMessageAsync(new MessageSendParams
  13. {
  14.     Message = userMessage
  15. });
  16. Console.WriteLine($"Agent Response: {((TextPart)agentResponse.Parts[0]).Text}");
  17. Console.ReadKey();
复制代码
这里我们将Server 和 Client 都启动起来,查看控制台输出结果:
4.png

可以看到,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入门到精通》
 
5.jpeg

作者:爱迪生
出处:https://edisontalk.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册