谷歌 A2A (Agent2Agent)架構設計深度剖析 原創
2025年4月9日,Google正式推出Agent2Agent Protocol(以下簡稱“A2A”)。這一協議為各類 AI Agent 之間的高效溝通與協作搭建了橋梁,無論是獨立 Agent 與獨立 Agent、獨立 Agent與企業 Agent,還是企業 Agent與企業 Agent,都可以通過該協議實現通信交互和事務協作。
下文詳細剖析之。
1、A2A 介紹
A2A 是一個開放協議,它為 AI Agent 之間提供了一種標準方式,無論底層開發框架或供應商如何,都可以進行協作,A2A 充分考慮了 Agent 在與用戶和企業交互過程中所面臨的挑戰,具備以下四大核心功能特性:
第一、能力發現:所有實現 A2A 的 AI Agent 都通過“Agent Card”公開其能力目錄。這有助于其他 AI Agent 發現給定 AI Agent 實現的潛在有用功能。谷歌建議使用統一的位置來存儲組織的“Agent Card”。
比如:
https://<DOMAIN>/<agreed-path>/agent.json
第二、任務管理:通信協議,時代短期和長期任務變得更容易。它幫助通信中的 AI Agent 保持同步,直到請求的任務完成并返回答案。這很重要,因為有些 AI Agent 可能需要很長時間來執行工作,而且目前沒有統一標準如何等待這種情況發生。
第三、協作:AI Agent 可以相互發送消息以傳達上下文、回復、工件或用戶指令。
第四、用戶體驗協商:這是一個很有趣的功能。它允許協商數據返回的格式,以符合用戶界面的期望(比如:圖像、視頻、文本等)。
通過 A2A 公開的 AI Agent 的發現是一個重要話題。谷歌建議使用統一的位置來存儲組織的“Agent Card”。
另外,A2A 并沒有重新發明輪子,建立在現有標準之上:
1.該協議建立在現有、流行的標準之上,包括:HTTP、SSE、JSON-RPC,這意味著它更容易與企業日常使用的現有 IT 堆棧集成。
2.默認安全 - A2A 旨在支持企業級身份驗證和授權,與 OpenAPI 的身份驗證方案相當。
2、A2A 架構設計剖析
1)、A2A 架構設計剖析
在 A2A 協議中,涉及三個核心角色:
- User:用戶是協議中的關鍵主體,主要負責進行認證和授權操作,確保交互的安全性和合法性。
- Client Agent:客戶端 Agent 是任務的發起者,它代表用戶提出需求或請求。
- Server Agent:服務端 Agent 是任務的執行者,它接收來自客戶端 Agent 的請求,并執行相應的操作。
客戶端 Client 與服務端 Client 之間的通信,本質上是基于任務的請求與響應機制。每個請求都對應一個具體任務,服務端 Agent 處理任務后返回結果。值得注意的是,一個 Agent 既可以作為客戶端 Agent 發起任務,也可以作為服務端 Agent 執行任務,具有雙重角色的靈活性。
Client Agent 和 Server Agent 交互的過程中,會涉及到一些 Entity:AgentCard、Task 、Artifact 、Message、Part,下面做個介紹。
第一、AgentCard 是 Server Agent 的“名片”,它詳細描述了 Server Agent 的能力、認證機制等關鍵信息。通過獲取不同 Server Agent 的 AgentCard,Client Agent 能夠全面了解各個 Server Agent 的功能特點,從而精準地選擇最適合執行具體任務的 Server Agent。
以下是 AgentCard 的內容示例:
#AgentCard 內容示例
interface AgentCard {
name: string;
description: string;
url: string;
provider?: {
organization: string;
url: string;
};
version: string;
documentationUrl?: string;
capabilities: {
streaming?: boolean;
pushNotifications?: boolean;
stateTransitionHistory?: boolean;
};
authentication: {
schemes: string[];
credentials?: string;
};
defaultInputModes: string[];
defaultOutputModes: string[];
skills: {
id: string;
name: string;
description: string;
tags: string[];
examples?: string[];
inputModes?: string[];
outputModes?: string[];
}[];
}
第二、Task 是一個具有明確狀態的實體,由 Client Agent 創建并發起,其狀態由 Server Agent 負責維護和更新。每個 Task 都旨在實現一個特定的目標或結果。在 Task 的執行過程中,Client Agent 和 Server Agent 通過交換 Message 進行通信,而 Server Agent 執行任務后生成的輸出結果被稱為 Artifact。
此外,每個 Task 都擁有一個唯一的 sessionId。多個 Task 可以共享同一個 sessionId,這表明這些 Task 屬于同一個會話(Session)的一部分,便于管理和跟蹤相關任務的執行流程。
以下是 Task 的示例:
interface Task {
id: string;
sessionId: string;
status: TaskStatus;
history?: Message[];
artifacts?: Artifact[];
metadata?: Record<string, any>;
}
interface TaskStatus {
state: TaskState;
message?: Message;
timestamp?: string;
}
interface TaskStatusUpdateEvent {
id: string;
status: TaskStatus;
final: boolean; //indicates the end of the event stream
metadata?: Record<string, any>;
}
interface TaskArtifactUpdateEvent {
id: string;
artifact: Artifact;
metadata?: Record<string, any>;
}
interface TaskSendParams {
id: string;
sessionId?: string;
message: Message;
historyLength?: number;
pushNotification?: PushNotificationConfig;
metadata?: Record<string, any>; // extension metadata
}
type TaskState =
| "submitted"
| "working"
| "input-required"
| "completed"
| "canceled"
| "failed"
| "unknown";
第三、Artifact 是 Server Agent 在執行任務后生成的目標結果。一個 Task 可能產生一個或多個 Artifact。
Artifact 具有以下特性:
- 不可變性:一旦生成,其內容不可更改,保證了結果的穩定性和可靠性。
- 可命名:可以為其指定名稱,便于識別和引用。
- 多部分結構:一個Artifact可以包含多個部分,以支持復雜的結果結構。
- 流式響應支持:對于需要分批次處理的任務,可以將結果逐步附加到已有的Artifact上,實現流式響應。
這些特性使得 Artifact 成為任務執行結果的有效載體,既保證了數據的完整性,又提供了靈活性。
以下是 Artifact 的示例:
interface Artifact {
name?: string;
description?: string;
parts: Part[];
metadata?: Record<string, any>;
index: number;
append?: boolean;
lastChunk?: boolean;
}
第四、Message 在 Task 執行過程中,Server Agent 和 Client Agent 通過 Message 進行交互,但不涉及 Artifact。Message 可以包含以下內容:
- Agent 的思考過程
- 用戶上下文信息
- 執行指令
- 錯誤信息
- 任務狀態
- 元數據等
每個 Message 可以由多個 Part 組成,每個 Part 攜帶不同類型的內容,以支持豐富多樣的交互需求。
以下是 Message 的示例:
interface Message {
role: "user" | "agent";
parts: Part[];
metadata?: Record<string, any>;
}
第五、Part 是 Message 和 Artifact 的基本構成單元,承載著它們的核心內容。每個 Part 都明確標識了其內容類型以及具體內容本身。
以下是 Part 的示例:
interface TextPart {
type: "text";
text: string;
}
interface FilePart {
type: "file";
file: {
name?: string;
mimeType?: string;
// oneof {
bytes?: string; //base64 encoded content
uri?: string;
//}
};
}
interface DataPart {
type: "data";
data: Record<string, any>;
}
type Part = (TextPart | FilePart | DataPart) & {
metadata: Record<string, any>;
};
2)、A2A 架構設計核心流程
ClientAgent 和 ServerAgent 之間通過 HTTP協議 進行通信,采用經典的 C/S(客戶端/服務器)模式。通信支持 SSE(Server-Sent Events)流式數據傳輸,并且數據格式遵循 JSON-RPC 2.0 標準。
在身份驗證方面,A2A 遵循 Open API 規范。值得注意的是,A2A 協議本身并不直接交換身份信息。相反,身份驗證所需的材料(比如:令牌)是在協議之外(帶外)獲取的,并通過 HTTP 頭部 進行傳輸。
Client Agent 和 Server Agent 之間的協同工作流程主要包括以下6個關鍵步驟:
第一、Server Agent 在指定站點上托管自己的 AgentCard,公開其能力和服務信息。
第二、Client Agent 主動發現并獲取 Server Agent 的 AgentCard,了解其功能和認證要求。
第三、Client Agent 根據需求發起一個 Task,明確任務目標和要求。
第四、Client Agent 設置任務通知監聽,以便及時接收任務執行狀態和結果。
第五、Server Agent 接收任務后執行,并生成 Artifact 作為任務結果返回。
第六、Client Agent 獲取 Artifact,完成任務的最終交付和處理。
2.1、AgentCard 托管與發現
官方建議將 AgentCard 找在以下路徑:??https://${host}/.well-known/agent.json??
這種方式被稱為 Open Discovery。除此之外,還有另外兩種發現方式:Curated Discovery 和 Private Discovery。
Agent Client 可以通過向 ??https://${host}/.well-known/agent.json?? 發起請求,獲取指定的 AgentCard,并將其集成到自己的提示詞或工具集中。
//agent card 示例
{
"name": "Google Maps Agent",
"description": "Plan routes, remember places, and generate directions",
"url": "https://maps-agent.google.com",
"provider": {
"organization": "Google",
"url": "https://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",
"create turn by turn directions from Sunnyvale to Mountain View"
],
// can return a video of the route
"outputModes": ["application/html", "video/mp4"]
},
{
"id": "custom-map",
"name": "My Map",
"description": "Manage a custom map with your own saved places",
"tags": ["custom-map", "saved-places"],
"examples": [
"show me my favorite restaurants on the map",
"create a visual of all places I've visited in the past year"
],
"outputModes": ["application/html"]
}
]
}
2.2、Client Agent 發起 Task
Client Agent 可以向 Server Agent 發送內容,用于啟動新任務、恢復中斷的任務或重新打開已完成的任務。
{
"jsonrpc": "2.0",
"id": 1,
"method":"tasks/send",
"params": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"message": {
"role":"user",
"data": [{
"type":"text",
"text": "tell me a joke"
}]
},
"metadata": {}
}
}
2.3、Client Agent 設置回調監聽
Client Agent 可以配置一個回調方法并提供給 Server Agent。一旦 Server Agent 修改了 Task 的狀態,它將自動調用 Client Agent 的回調方法,從而實現狀態的實時同步。
//Request
{
"jsonrpc": "2.0",
"id": 1,
"method":"tasks/pushNotification/set",
"params": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"pushNotificationConfig": {
"url": "https://example.com/callback",
"authentication": {
"schemes": ["jwt"]
}
}
}
}
//Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"pushNotificationConfig": {
"url": "https://example.com/callback",
"authentication": {
"schemes": ["jwt"]
}
}
}
}
2.4、執行 Task,返回結果
Server Agent 執行任務后,會將執行結果以 Artifact 的形式返回給 Client Agent。
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"sessionId": "c295ea44-7543-4f78-b524-7a38915ad6e4",
"status": {
"state": "completed",
},
"artifacts": [{
"name":"joke",
"parts": [{
"type":"text",
"text":"Why did the chicken cross the road? To get to the other side!"
}]
}],
"metadata": {}
}
}
2.5、獲取 Artifact 結果數據
需要注意的是,Client Agent 需要通過查詢 Task 的方式來獲取對應的 Artifact。
//Request
{
"jsonrpc": "2.0",
"id": 1,
"method":"tasks/get",
"params": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"historyLength": 10,
"metadata": {}
}
}
//Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "de38c76d-d54c-436c-8b9f-4c2703648d64",
"sessionId": "c295ea44-7543-4f78-b524-7a38915ad6e4",
"status": {
"state": "completed"
},
"artifacts": [{
"parts": [{
"type":"text",
"text":"Why did the chicken cross the road? To get to the other side!"
}]
}],
"history":[
{
"role": "user",
"parts": [
{
"type": "text",
"text": "tell me a joke"
}
]
}
],
"metadata": {}
}
}
總之,AI Agent 之間的相互發現、了解以及交互調用正逐漸成為一種重要的發展趨勢,這主要體現在以下兩個方面:
第一、企業內部領域 Agent 的溝通協作需求
在企業內部,隨著業務的不斷發展,各種各樣的領域 Agent 正在被探索和建立,以滿足特定業務場景的需求。這些領域 Agent 之間需要進行高效的溝通與協作,以實現業務流程的自動化和優化。因此,解決內部領域 Agent 之間的交互問題,已成為企業數字化轉型過程中必須面對的關鍵挑戰之一。
第二、 對外提供 Agent 服務的發現性問題
對于那些對外提供 Agent 服務的供應商來說,如何讓其他 Agent 主動發現并使用自己的服務,類似于搜索引擎優化(SEO)吸引流量,也是一個亟待解決的問題。通過提高 Agent 的可見性和吸引力,可以更好地促進 Agent 之間的互操作性和生態系統的健康發展。
本文轉載自公眾號玄姐聊AGI 作者:玄姐
