多Agent協作入門:基于A2A協議的Agent通(tong)信(上)
大家好,我是Edison。
之前我們學習了Semantic Kernel中的一些常見的編排模式,相信你已經了解了一些。在(zai)Agent時(shi)代,有(you)兩個協(xie)議(yi)目前(qian)非常火熱(re),一個是MCP 模型上下(xia)文協(xie)議(yi)(之前(qian)我(wo)們已經學過了(le)),另一個是A2A (Agent-to-Agent),今天(tian)我(wo)們就來開始(shi)了(le)解下(xia)A2A。
A2A協議簡介
A2A 即 Agent-to-Agent,翻譯(yi)過(guo)來就是“智能代理之間的協議”,我們可以理解為它就是一個(ge)大模(mo)型Agent們用來“聊天”的“通用語(yu)言”。

Agent 和 Agent 之間的交互,和人類之間的溝通有些類似:不同的人有不同的能力,每個人都擅長做自己最擅長的領域。為了一起完成一個任務,必須不斷地交換信息 和 協同合作。在Agent時代也如此,Agent也需要分工明確和相互協作。但是,不同的企業不同的團隊可能會開發出各種各樣的Agent,而這些Agent可能都只會說自己的“方言”,如何讓它們能夠順暢溝通,就是A2A協議產生的背景。
簡而言之,A2A定義了一套清晰、標準的溝通方式,讓Agent們可以順暢地交流,讓不同平臺和框架下的Agent都能夠說“同一種話”,實現無障礙的信息交換和協作。
例如,下面有三個Agent,它(ta)們(men)分別(bie)用于不同的任務,通(tong)過(guo)A2A協議(yi)可(ke)以(yi)讓它(ta)們(men)之(zhi)間(jian)可(ke)以(yi)順暢地通(tong)信,最終一起為用戶提供完整的方案(an)。

可以看到,各個Agent按(an)統一消息格(ge)式響應各自的(de)信息,最終由旅游(you)規(gui)劃Agent將結(jie)果進行(xing)整合(he)并生(sheng)成最終結(jie)果輸出(chu)給用戶(hu)。
技術上(shang)來說,A2A 通(tong)(tong)(tong)過標(biao)準化(hua)的組件(jian)(如 Agent Cards)為 Agent 間的“相互發(fa)現與握(wo)手”提供了通(tong)(tong)(tong)用語言。它在 JSON-RPC、HTTP/SSE 等底層傳輸(shu)之(zhi)上(shang),定義(yi)(yi)了能(neng)力發(fa)現(通(tong)(tong)(tong)過 Agent 卡片以及標(biao)準化(hua)的能(neng)力定義(yi)(yi))、會話管理、任務生命周期管理、消息(xi)與內容(rong)單(dan)元(Part)、權(quan)限認證、流式與事件(jian)等語義(yi)(yi),使多(duo)智(zhi)能(neng)體系(xi)統(tong)能(neng)夠靈活拼接、異步協作,并(bing)具備企業(ye)級安全(quan)與可擴展(zhan)性。
A2A和MCP的關系
A2A 和 MCP 看起(qi)來很(hen)相似,但其實(shi)它們是互(hu)補的(de)(de)關系(xi),一(yi)起(qi)形成完整的(de)(de)AI時代的(de)(de)通(tong)信協議方案。

MCP提供了統一的上下文管理和工具調用接口,整合大模型驅動的概率計算與傳統工具驅動的結構化計算。A2A則為多Agent協同注入了開放標準。二者的(de)結合,將單(dan)一AI應用推向分布式、模塊(kuai)化的(de)智能生態。
總結(jie)一下:
- MCP:提(ti)供垂直集成,將Agent連接到工具和資源。
- A2A:提供水平通信,將(jiang)Agent連接到(dao)其他(ta)Agent。
Hello A2A
這里我們(men)來實現一個A2A的Hello World示例,當然是(shi)用我們(men)最(zui)熟悉的.NET啦。
A2A .NET SDK 是一個(ge)實(shi)現 A2A 協議(yi) v0.2.1 的(de)(de) .NET 庫,用(yong)于(yu)在 .NET 應用(yong)程序(xu)中(zhong)啟用(yong)代(dai)理之(zhi)間的(de)(de)通信。該 SDK 設計用(yong)于(yu)與 ASP.NET Core 應用(yong)程序(xu)配(pei)合使用(yong),提供(gong)了一種簡單的(de)(de)方(fang)式為 Agent 添加 A2A 支持。
GitHub:
這里(li)我們先不(bu)管(guan)A2A的一(yi)些核心對象,直接來寫(xie)一(yi)個(ge)Hello World來有個(ge)感性認(ren)識即可。根據官網示(shi)例,我們寫(xie)一(yi)個(ge)A2A Agent Server和一(yi)個(ge)A2A Client。
(1)EchoAgentServer:負責將用戶輸入的信息進行加工(gong)返回;
(2)A2A Client:負(fu)責將用(yong)戶輸入的信息傳遞給(gei)EchoAgentServer處(chu)理(li),返回EchoAgentServer的處(chu)理(li)結果(guo);
首(shou)先,我(wo)們創(chuang)建一個ASP.NET Web (Empty) 項目取(qu)名為(wei)EchoAgentServer,然后安裝以下包(bao):
A2A.AspNetCore 0.1.0-preview.2
然后,創建(jian)一個EchoAgent類用(yong)于定義該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這個擴(kuo)展(zhan)方法來實(shi)現(xian):
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有(you)了,現在(zai)我們創建一(yi)個控制臺項目作為A2A Client來調(diao)用(yong)Server。
同(tong)樣,你需要安裝(zhuang)一下(xia)A2A Package(這里就不再是A2A.AspNetCore了哈(ha)):
A2A 0.1.0-preview.2
然后(hou),通(tong)過下面的(de)(de)示例代(dai)碼一步步完成Agent的(de)(de)服務發現、卡(ka)片解析 以(yi)及 發送消息通(tong)信。
// Discover agent and create client var cardResolver = new A2ACardResolver(new Uri("//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();
這里我們(men)將Server 和 Client 都啟動(dong)起(qi)來,查看控制臺輸出結果:

可以看(kan)到,Agent Response是從(cong)Agent Server處理后返回(hui)的結果,正確!
小(xiao)結
本文介(jie)紹了(le)A2A的基本概念以及(ji)和MCP的關系,然(ran)后(hou)通過(guo)一個(ge)Hello World案例介(jie)紹了(le)如何快速開始(shi)一個(ge)A2A Demo,相信我們(men)可(ke)以有一個(ge)快速的感性認(ren)識。
下一篇,我們將學習對A2A的核(he)心對象如Agent Card, Task, Artifact, Message等,典型(xing)工作(zuo)流程(cheng),以及在A2A .NET SDK中集(ji)成大模型(xing)實現一個稍微復雜點(dian)的案例。
參考資料
黃佳:《》
圣杰:《.NET+AI | Semantic Kernel入門到精通》

作者:愛迪(di)生
出處:
本(ben)文版(ban)權歸作者和博客(ke)園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置(zhi)給出原文鏈接。

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