多Agent協作入門:基于A2A協議的Agent通(tong)信(中)
大家好,我是Edison。
上一篇,我們了解了A2A協議的基本概念,還通過A2A組件實現了一個Hello World的Demo,有了(le)一個快(kuai)速的(de)感性(xing)認識。這一篇,我(wo)們來(lai)了(le)解下(xia)A2A協議的(de)三大角色(se)、四大對(dui)象 以(yi)及 工作流程,有了(le)這些基(ji)礎的(de)認知后會(hui)對(dui)我(wo)們全面認識A2A有所幫助(zhu)。
A2A協議的三大角色
A2A 即 Agent-to-Agent,它定義了三個(ge)關鍵的(de)角(jiao)色,它們(men)各司(si)其(qi)職+互相配合,支(zhi)撐多個(ge)Agent的(de)運行。
那么,都是哪幾個角色呢?下面告訴你:

角色1:用戶(User)
即終端用戶(可能是人類 或 服務(wu)),需要使用Agent來完成某個任務(wu)。
角色2:客戶端(Client)
一個(ge)代(dai)表用(yong)戶向(xiang) 遠(yuan)程Agent 發送請求的(de)實體,它發送的(de)請求是(shi)嚴格(ge)按照A2A協(xie)議的(de)。它的(de)表現(xian)形式可以(yi)是(shi)一個(ge)應用(yong)程序(xu)、服務 或 一個(ge)Agent。
例(li)如,我們在上一篇(pian)的Demo中開發(fa)(fa)的一個控(kong)制臺應用(yong)程序通過(guo)引用(yong)A2A包來向遠(yuan)端的Agent發(fa)(fa)送請求。
角色3:遠程Agent(Remote Agent)
一個執行實際任務的(de)Agent(部(bu)署在某個遠端Server上),對于(yu)客戶端來說是(shi)“黑(hei)盒”一樣的(de)存在,僅僅通過(guo)Agent Card聲明自(zi)己提供的(de)接口或技能(neng),但內部(bu)實現細節或工作(zuo)機制是(shi)不透明的(de),即一個“黑(hei)盒”。
例如,我們在(zai)上一篇(pian)的Demo中開(kai)發的一個(ge)WebAPI項目EchoAgent,提供(gong)了一個(ge)ProcessMessage的技(ji)能 以及 聲明了一個(ge)AgentCard公開(kai)了一些元數(shu)據。
A2A的四大(da)對象
A2A中(zhong)定義了一(yi)套完整的對(dui)象體系,其中(zhong)最核(he)心的就是下(xia)面這(zhe)四個核(he)心對(dui)象:
第一個對象:Agent Card(又稱Agent名片(pian))
每個(ge)A2A的(de)(de)遠程(cheng)Agent都需要(yao)發布一個(ge)JSON格式的(de)(de)名片,被稱為“Agent Card”,用于描述這個(ge)Agent具有(you)哪些技能 及(ji)其(qi) 認證機制,便(bian)于Client可以獲(huo)得這些信息并選擇合適(shi)的(de)(de)Agent來完成任務。

其實,它(ta)就和(he)(he)我(wo)(wo)們(men)在做(zuo)后端服(fu)務開發中的(de)(de)服(fu)務注冊(ce)和(he)(he)發現的(de)(de)機制差不(bu)多(duo),只(zhi)不(bu)過這個注冊(ce)的(de)(de)信(xin)息被標準化(hua)了,下面我(wo)(wo)們(men)可以(yi)看看一個典型的(de)(de)Agent Card的(de)(de)JSON格式:
{ "name": "Google Maps Agent", "description": "Plan routes, remember places, and generate directions", "url": "//maps-agent.google.com", "provider": { "organization": "Google", "url": "//google.com" }, "version": "1.0.0", "authentication": { "schemes": "OAuth2" }, "defaultInputModes": ["text/plain"], "defaultOutputModes": ["text/plain", "application/html"], "capabilities": { "streaming": true, "pushNotifications": false }, "skills": [ { "id": "route-planner", "name": "Route planning", "description": "Helps plan routing between two locations", "tags": ["maps", "routing", "navigation"], "examples": [ "plan my route from Sunnyvale to Mountain View", "what's the commute time from Sunnyvale to San Francisco at 9AM" ], "outputModes": ["application/html", "video/mp4"] } ] }
這(zhe)個(ge)JSON數(shu)據簡(jian)要描(miao)述了一個(ge)名為(wei)"Google Maps Agent"的(de)Agent定義。這(zhe)個(ge)Agent的(de)主要功能是(shi)規(gui)劃路線、記住地點和(he)(he)(he)生成(cheng)導航指(zhi)示。這(zhe)個(ge)應用由Google提供(gong),版本號是(shi)1.0.0,采用OAuth2身份(fen)驗證。它支(zhi)持(chi)文本和(he)(he)(he)HTML格式(shi)的(de)輸(shu)(shu)入和(he)(he)(he)輸(shu)(shu)出,具有流媒體(ti)功能,但不支(zhi)持(chi)推送通知(zhi)。它的(de)一個(ge)核(he)心技能是(shi)"route-planner",可以幫助用戶(hu)規(gui)劃兩個(ge)地點之間的(de)路線,并輸(shu)(shu)出HTML和(he)(he)(he)視(shi)頻格式(shi)的(de)內容。
在A2A .NET SDK中,AgentCard的定義(yi)如下:
public class AgentCard { public string Name { get; set; } // 代理名(ming)稱 public string Description { get; set; } // 代理(li)描述 public string Url { get; set; } // 代理(li) URL public AgentProvider? Provider { get; set; } // 提供商信息 public string Version { get; set; } // 版本(ben)信息 public AgentCapabilities Capabilities { get; set; } // 代理能力 public List<AgentSkill> Skills { get; set; } // 代理技能 public List<string> DefaultInputModes { get; set; } // 默認輸(shu)入(ru)模式 public List<string> DefaultOutputModes { get; set; }// 默認輸出(chu)模式 }
在(zai)(zai)上一篇(pian)的(de)Demo中,我們在(zai)(zai)定義EchoAgent時,就實現(xian)了(le)一個(ge)GetAgentCard方法,并將其(qi)注冊到(dao)服務發現(xian)中最終被Client探索發現(xian)時就會以JSON格式輸(shu)出給到(dao)Client:
public class EchoAgent { public void Attach(ITaskManager taskManager) { taskManager.OnMessageReceived = ProcessMessageAsync; taskManager.OnAgentCardQuery = GetAgentCardAsync; } private Task<Message> ProcessMessageAsync(MessageSendParams messageSendParams, CancellationToken cancellationToken) { ...... } 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 } }); } }
與此同時,在Client中也(ye)可(ke)以主動(dong)進行服務發現,例(li)如上一篇Demo中的Client示例(li)代碼:
// 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));
第二個對象:Task (任務(wu))
Task 是 Client 和 遠(yuan)程Agent 之(zhi)間協作的一(yi)個概(gai)念,很好理解,一(yi)個Task代(dai)表一(yi)個需要(yao)完成的任務,每(mei)個Task都(dou)有一(yi)個唯一(yi)的ID號,它通常包(bao)含了任務狀態、歷(li)史記錄 和 執行結(jie)果(guo) 等信息。
Task的(de)(de)主要具體狀態有:submitted, working, completed, canceled, failed 等(deng),下圖展示了Task的(de)(de)狀態機轉(zhuan)換流(liu)。

在A2A .NET SDK中,AgentTask的(de)定義如下:
public class AgentTask : A2AResponse { public string Id { get; set; } // 任務 ID public string? ContextId { get; set; } // 上下文 ID public AgentTaskStatus Status { get; set; } // 任務狀態 public List<Artifact>? Artifacts { get; set; } // 任務產出物 public List<Message>? History { get; set; } // 消息(xi)歷史 public Dictionary<string, JsonElement>? Metadata { get; set; } // 元數(shu)據(ju) }
第三個對象:Artifact(工件 或 成果)
Artifact 和我們(men)在DevOps CI/CD流水線中(zhong)的Artifact(即(ji)工件)的概念類似,它是 遠程Agent執行完某(mou)個(ge)任務(wu)后生成(cheng)輸出的結(jie)果(即(ji)遠程Agent返回的結(jie)果通過一個(ge)Artifact對象輸出給Client),每個(ge)任務(wu)的結(jie)果可能(neng)都不(bu)一樣。
一個(ge)(ge)Artifact可(ke)以(yi)包含多個(ge)(ge)部分(fen)(parts),每個(ge)(ge)部分(fen)(part)可(ke)以(yi)是:文本、文檔、圖像 等,涉及純文本、文件 和 結構化數(shu)據。

第四個對象:Message(消息(xi))
Message 也很好理解,它(ta)就是(shi) Client 和 遠(yuan)程Agent 之間通信的 一(yi)個消息對象,它(ta)通常包含了 指(zhi)令 和 狀(zhuang)態(tai)更(geng)新 等(deng)內(nei)容。
同(tong)樣的(de),一(yi)(yi)個(ge)Message對象也可以(yi)包含多個(ge)parts,用于傳(chuan)遞如 文(wen)本、文(wen)件 或 結構化 等不同(tong)類型的(de)內(nei)容。每個(ge)Message都有(you)發(fa)送方(fang)設置的(de)一(yi)(yi)個(ge)唯(wei)一(yi)(yi)的(de)messageId,且通過一(yi)(yi)些(xie)關鍵詞(ci)如"user"(代表Client發(fa)送的(de))或“agent”(代表服務端發(fa)送的(de))來區分角色。
在A2A .NET SDK中,Message的定義如下:
public class Message : A2AResponse { public MessageRole Role { get; set; } // 消息角(jiao)色 (User/Agent) public List<Part> Parts { get; set; } // 消息部分 public string? MessageId { get; set; } // 消(xiao)息 ID public string? TaskId { get; set; } // 關聯(lian)任務 ID public string? ContextId { get; set; } // 上(shang)下文 ID public Dictionary<string, JsonElement>? Metadata { get; set; } // 元數據 }
A2A協議的(de)工作流程
這(zhe)里我們(men)來通過(guo)一個簡單的例子看(kan)看(kan)A2A協(xie)議的 請(qing)求-響應 工(gong)作流(liu)程是怎么樣的。
例如,有這樣一(yi)個場(chang)景(jing)“招聘XX崗(gang)位候選(xuan)人搜尋”:
Step1,用戶在統一(yi)(yi)界面下向Client(假設它也是(shi)一(yi)(yi)個Agent)發(fa)送一(yi)(yi)個請(qing)求消息“請(qing)幫我尋找(zhao)一(yi)(yi)個XX崗(gang)位的(de)候選人”。
Step2,Client將用戶的請求消息(xi)進行封裝,并根據崗位(wei)需求依次調用一些遠(yuan)程Agent如 簡歷檢索(suo)Agent、技能(neng)篩選Agent 等(deng)(deng)等(deng)(deng)。
例如,下面的請(qing)求示例展示了Client在檢索了5位(wei)候選(xuan)人簡歷之后(hou)通過A2A協議向遠端技能篩(shai)選(xuan)Agent發送的任務請(qing)求:
{ "jsonrpc": "2.0", "id": 1, "method": "tasks/send", "params": { "id": "de38c76d-d54c-436c-8b9f-4c2703648d64", "message": { "role": "user", "parts": [ { "type": "text", "text": "請分(fen)析下面(mian)5位(wei)候(hou)選人(ren)是否(fou)符合崗位(wei)需求,并推薦最(zui)佳面(mian)試(shi)人(ren)選。" } ] }, "metadata": {} } }
Step3,各個遠(yuan)端Agent執行各自的任(ren)務,并返(fan)回(hui)給Client對應的Artifact對象結(jie)果(如候選人(ren)名單等(deng)),然后再(zai)由Client進(jin)行匯總和展(zhan)示。
{ "jsonrpc": "2.0", "id": 1, "result": { "id": "de38c76d-d54c-436c-8b9f-4c2703648d64", "sessionId": "c295ea44-7543-4f78-b524-7a38915ad6e4", "status": { "state": "completed" }, "artifacts": [ { "name": "result", "parts": [ { "type": "text", "text": "第三位(wei)候選人最符(fu)合你的需求(qiu)!建議安排(pai)面(mian)試。" } ] } ], "metadata": {} } }
Step4,后續(xu)Client可(ke)以陸(lu)續(xu)調(diao)用其他遠端(duan)Agent如(ru) 面試安排Agent、背景調(diao)查Agent等,完成端(duan)到端(duan)的自動化招聘流(liu)程。
那(nei)么,該場景的整個(ge)工作流(liu)程(cheng)便如下圖所(suo)示:

除此之外,實際應用案例中通常是A2A與MCP兩個協議一起使用,形成(cheng)更廣的應用范圍。
例如,下圖展示了一個汽車維修店的場景,店長智能體 和 機械師智能體 通過A2A協議完成任務移交(hand-off),店長可以處理常見問題,但機械師可以解決技術難題。機械師智能體再通過MCP協議完成內部工具使用完成具體任務,還可以通過A2A協議和零件供應商Agent完成外部協作。

由此可見,其實在企業客(ke)服(fu) 或 售(shou)后中(zhong)心 等場景中(zhong),A2A協議(yi)可以被廣泛應用于多(duo)Agent協作。
小結
本(ben)文介紹了A2A的三個主要角色(User、Client 和 Remote Agent)以及 四(si)個核心對(dui)象(Agent Card、Task、Artifact 和 Message),并通過簡(jian)單(dan)的例子介紹了A2A協(xie)議的典型工作流程(cheng),相信對(dui)于你加深了解A2A協(xie)議會(hui)有幫助。
下一篇,我們將以一個旅行規劃的應用場景,結合LLM大模型來實現一個A2A協議的案例,它會涉及一個Client 和 三個Remote Agent,是一個拿來練手的好案例。
參考資料
sing1ee:《2025年完整指南:A2A協議 - AI智能體協作的新標準》
黃佳:《》
圣杰:《.NET+AI | Semantic Kernel入門到精通》

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

本文介紹了A2A的三個主要角色(User、Client 和 Remote Agent)和 四個核心對象(Agent Card、Task、Artifact 和 Message),并通過簡單的例子介紹了A2A協議的典型工作流程,相信對于你加深了解A2A協議會有幫助。