当前位置: 首页 > news >正文

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

大家好,我是Edison。

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

A2A协议简介

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

image

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

image

可以看到,各个Agent按统一消息格式响应各自的信息,最终由旅游规划Agent将结果进行整合并生成最终结果输出给用户。

技术上来说,A2A 通过标准化的组件(如 Agent Cards)为 Agent 间的“相互发现与握手”提供了通用语言。它在 JSON-RPC、HTTP/SSE 等底层传输之上,定义了能力发现(通过 Agent 卡片以及标准化的能力定义)、会话管理、任务生命周期管理、消息与内容单元(Part)、权限认证、流式与事件等语义,使多智能体系统能够灵活拼接、异步协作,并具备企业级安全与可扩展性。

A2A和MCP的关系

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

image

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 都启动起来,查看控制台输出结果:

image

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

 

http://www.hskmm.com/?act=detail&tid=26164

相关文章:

  • 时尚产品需求预测与库存优化模型解析
  • 自制带得分和推荐走法的象棋视频
  • DP分析黑科技——闫氏DP分析法
  • MUGEN游戏引擎等一系列相关杂谈
  • # 20232313 2025-2026-1 《网络与系统攻防技术》实验一实验报告 - 20232313
  • 一生一芯学习:PA2:输入输出
  • vector使用中的一个小问题
  • OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering() - 指南
  • 2025.10.7——2绿
  • 完整教程:无人机避障——感知部分(Ubuntu 20.04 复现Vins Fusion跑数据集)胎教级教程
  • 我真的博了
  • 2025.10.6——1绿1蓝
  • 深入解析:人工智能-Chain of Thought Prompting(思维链提示,简称CoT)
  • 年龄排序
  • 二分图最大匹配 输出具体方案
  • 我的联想小新潮7000笔记本的优化
  • Go语言之接口与多态 -《Go语言实战指南》 - 指南
  • 地球科学概论
  • 2025多校冲刺CSP模拟赛4 总结
  • 多路归并、败者树、置换-选择排序、最佳归并树
  • 看vue文档记录(未整理)
  • Spring5笔记
  • 50天50个前端项目 - HTML/CSS和JavaScript实战合集
  • [BalticOI 2002] Tennis Club (Day1) 解题报告
  • 党徽
  • ZKEACMS:基于ASP.Net Core开发的开源免费内容管理系统
  • MySQL面试题汇总
  • 穷人的中国象棋打谱程序
  • 文件系统的层次结构
  • oracle 19c学习笔记2