中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

多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)運行。

那么,都是哪幾個角色呢?下面告訴你:

image

角色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來完成任務。

image

其實,它(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)。

image

在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)據。

image

第四個對象: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)示:

image

除此之外,實際應用案例中通常是A2A與MCP兩個協議一起使用,形成(cheng)更廣的應用范圍。

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

image

由此可見,其實在企業客(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入門到精通

 

posted @ 2025-10-09 08:00  EdisonZhou  閱讀(1064)  評論(0)    收藏  舉報