多Agent協作入門:基于A2A協議的Agent通信(上)
大家好,我是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入門到精通》


本文介紹了A2A的基本概念以及和MCP的關系,然后通過一個Hello World案例介紹了如何快速開始一個A2A Demo,相信我們可以有一個快速的感性認識。

浙公網安備 33010602011771號