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

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

其實,它就和(he)我(wo)們在(zai)做后(hou)端服(fu)(fu)務開發中(zhong)的服(fu)(fu)務注(zhu)冊和(he)發現的機(ji)制(zhi)差不多(duo),只不過這(zhe)個注(zhu)冊的信息(xi)被(bei)標準化了,下(xia)面我(wo)們可(ke)以看看一個典型的Agent Card的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)個JSON數據簡要(yao)描述了(le)一個名為"Google Maps Agent"的(de)Agent定義。這(zhe)個Agent的(de)主要(yao)功能是(shi)規(gui)劃路(lu)線、記住(zhu)地點和(he)(he)生成導航指示。這(zhe)個應用由(you)Google提(ti)供,版(ban)本號是(shi)1.0.0,采用OAuth2身份驗(yan)證。它(ta)支持文本和(he)(he)HTML格(ge)式的(de)輸入和(he)(he)輸出,具有(you)流媒體(ti)功能,但不支持推送通知(zhi)。它(ta)的(de)一個核心技能是(shi)"route-planner",可(ke)以幫助用戶規(gui)劃兩(liang)個地點之間(jian)的(de)路(lu)線,并輸出HTML和(he)(he)視頻格(ge)式的(de)內容(rong)。
在(zai)A2A .NET SDK中,AgentCard的定義(yi)如(ru)下(xia):
public class AgentCard { public string Name { get; set; } // 代理名(ming)稱 public string Description { get; set; } // 代理描述 public string Url { get; set; } // 代理 URL public AgentProvider? Provider { get; set; } // 提(ti)供商信(xin)息 public string Version { get; set; } // 版本信息 public AgentCapabilities Capabilities { get; set; } // 代(dai)理能力 public List<AgentSkill> Skills { get; set; } // 代理技能(neng) public List<string> DefaultInputModes { get; set; } // 默認輸入(ru)模式 public List<string> DefaultOutputModes { get; set; }// 默認輸(shu)出模式 }
在(zai)上一篇的Demo中,我(wo)們在(zai)定義EchoAgent時,就(jiu)實現(xian)了一個(ge)GetAgentCard方法,并將其注(zhu)冊到服務發(fa)現(xian)中最終被Client探索發(fa)現(xian)時就(jiu)會以JSON格式輸出(chu)給到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中(zhong)也可以主動進行服(fu)務發現,例(li)如(ru)上一(yi)篇Demo中(zhong)的Client示例(li)代(dai)碼:
// 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 (任務)
Task 是 Client 和 遠(yuan)程Agent 之間(jian)協作的(de)一(yi)個(ge)概念,很好理解,一(yi)個(ge)Task代表一(yi)個(ge)需要完成的(de)任務,每個(ge)Task都(dou)有一(yi)個(ge)唯(wei)一(yi)的(de)ID號(hao),它通(tong)常包含了任務狀態(tai)、歷史記錄(lu) 和 執行結果 等信息。
Task的主要具體狀態(tai)有:submitted, working, completed, canceled, failed 等,下圖展示了Task的狀態(tai)機轉換流。

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

第四個對象:Message(消息(xi))
Message 也很(hen)好理(li)解(jie),它(ta)就是 Client 和(he) 遠(yuan)程Agent 之(zhi)間通(tong)信的 一(yi)個(ge)消息對象(xiang),它(ta)通(tong)常包含了 指令 和(he) 狀(zhuang)態更新 等(deng)內容(rong)。
同樣的,一(yi)個(ge)(ge)Message對象也可(ke)以包含多(duo)個(ge)(ge)parts,用于傳遞如 文(wen)本、文(wen)件 或 結(jie)構(gou)化 等不同類(lei)型的內容(rong)。每個(ge)(ge)Message都有發(fa)送(song)方設(she)置的一(yi)個(ge)(ge)唯一(yi)的messageId,且(qie)通過一(yi)些關鍵(jian)詞如"user"(代表(biao)Client發(fa)送(song)的)或“agent”(代表(biao)服(fu)務端發(fa)送(song)的)來區分角色。
在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; } // 關聯任務 ID public string? ContextId { get; set; } // 上下文 ID public Dictionary<string, JsonElement>? Metadata { get; set; } // 元(yuan)數據 }
A2A協議的工作流程
這(zhe)里我們(men)來(lai)通過一個(ge)簡單的(de)例子(zi)看(kan)(kan)看(kan)(kan)A2A協議的(de) 請求-響應 工作流程是怎么樣的(de)。
例如,有這樣一(yi)個場景“招聘XX崗位候選人搜尋”:
Step1,用戶在統(tong)一(yi)界面下(xia)向Client(假設它(ta)也是一(yi)個Agent)發送一(yi)個請求(qiu)消息(xi)“請幫(bang)我尋找(zhao)一(yi)個XX崗位的候選人”。
Step2,Client將用戶的請(qing)求消息進行封裝,并根(gen)據崗位需求依次調用一些遠(yuan)程Agent如 簡歷檢(jian)索(suo)Agent、技能篩選Agent 等等。
例(li)如,下面(mian)的(de)請求示(shi)例(li)展示(shi)了Client在(zai)檢索了5位候選人簡歷之后(hou)通過(guo)A2A協議向遠端技能篩選Agent發(fa)送的(de)任務請求:
{ "jsonrpc": "2.0", "id": 1, "method": "tasks/send", "params": { "id": "de38c76d-d54c-436c-8b9f-4c2703648d64", "message": { "role": "user", "parts": [ { "type": "text", "text": "請(qing)分析下面(mian)5位候選(xuan)人(ren)是否(fou)符合(he)崗(gang)位需求,并推薦最佳(jia)面(mian)試人(ren)選(xuan)。" } ] }, "metadata": {} } }
Step3,各個遠端(duan)Agent執行(xing)各自的(de)任務,并(bing)返回給Client對(dui)應的(de)Artifact對(dui)象結(jie)果(如候(hou)選人名單等),然后再由Client進行(xing)匯總(zong)和展示。
{ "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": "第三位候(hou)選人(ren)最符合你的需求!建議安排面試。" } ] } ], "metadata": {} } }
Step4,后(hou)續Client可以陸續調(diao)用其他遠端Agent如 面試安排Agent、背景調(diao)查(cha)Agent等,完成(cheng)端到端的自動化(hua)招聘(pin)流(liu)程。
那么(me),該場景的整個工作(zuo)流程便如下(xia)圖所示:

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

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

作者:愛(ai)迪生(sheng)
出處:
本文(wen)(wen)版權歸作(zuo)者(zhe)和博客園共(gong)有(you),歡迎轉(zhuan)載,但未經(jing)作(zuo)者(zhe)同意必須保留(liu)此段聲(sheng)明(ming),且在文(wen)(wen)章頁面明(ming)顯位置給出原文(wen)(wen)鏈接。

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