A2A 協議完全指南:2026 年 Google 開源 AI 代理通訊標準

A2A 協議完全指南:2026 年 Google 開源 AI 代理通訊標準

A2A 協議完全指南:2026 年 Google 開源 AI 代理通訊標準

發佈時間:2026 年 3 月 · 版本:v0.3.0 · 許可證:Apache 2.0 · 維護者:Google + Linux Foundation

2025 年 4 月,Google 正式開源了 A2A(Agent2Agent)協議 —— 一個旨在解決 AI 代理互操作性問題的開放標準。隨著 AI 代理(AI Agent)在 2026 年的爆發式增長,不同框架、不同公司開發的代理之間如何通訊協作成為了關鍵挑戰。A2A 協議應運而生,被譽為”AI 代理時代的 HTTP”。

A2A 協議的核心目標是讓基於不同框架(如 Google ADK、LangGraph、BeeAI 等)構建的 AI 代理能夠安全、高效地通訊和協作,而無需暴露各自的內部狀態、記憶或工具實現。這一設計理念與 MCP(Model Context Protocol)形成互補:MCP 讓代理連線外部工具,A2A 讓代理互相連線

為什麼需要 A2A 協議?

AI 代理的”巴別塔”問題

2026 年的 AI 開發生態中,存在著眾多代理框架和平臺:

  • Google ADK - Google 官方的代理開發框架
  • LangGraph - LangChain 推出的圖式代理框架
  • CrewAI - 面向任務編排的多代理框架
  • AutoGen - Microsoft 開源的多代理對話框架
  • Goose - Block 公司開源的本機代理
  • OpenClaw - 快速增長的開源代理平臺

這些框架各自為政,代理之間無法直接通訊。想象一下:你有一個擅長資料分析的 LangGraph 代理,另一個擅長生成報告的 CrewAI 代理,但它們無法協作完成”分析資料並生成報告”的任務。

A2A 的解決方案

A2A 協議透過標準化通訊介面,讓代理能夠:

  1. 發現彼此的能力 - 透過”代理卡片”(Agent Cards)宣告功能
  2. 協商互動方式 - 支援文字、表單、媒體等多種模態
  3. 安全協作長任務 - 支援串流和非同步通訊
  4. 保持內部隱私 - 無需暴露記憶、工具或專有邏輯

A2A vs MCP:有什麼區別?

特性A2A ProtocolMCP (Model Context Protocol)
目標代理 ↔ 代理通訊代理 ↔ 工具/資料源連線
場景多代理協作編排單個代理擴充套件能力
通訊方式JSON-RPC 2.0 over HTTPJSON-RPC 2.0 over stdio/HTTP
發現機制Agent CardsMCP Server Registry
典型用例資料分析代理 + 報告生成代理代理 + GitHub/資料庫/檔案系統
互補關係代理間的”HTTP”代理與工具的”USB”

最佳實踐:在現代 AI 系統中,同時使用 A2A 和 MCP。例如:一個 A2A 協調代理透過 MCP 連線本地工具,同時透過 A2A 呼叫其他專業代理。

核心概念

1. Agent Card(代理卡片)

每個 A2A 相容的代理都必須提供一個”代理卡片”,宣告其能力:

{
  "name": "資料分析代理",
  "description": "專門處理 CSV/Excel 資料分析任務",
  "url": "https://agents.example.com/data-analyzer",
  "version": "1.0.0",
  "capabilities": {
    "inputFormats": ["text/csv", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
    "outputFormats": ["application/json", "text/markdown"],
    "skills": ["統計分析", "資料視覺化", "異常檢測"]
  },
  "authentication": {
    "type": "bearer",
    "required": true
  }
}

2. 通訊模式

A2A 支援三種通訊模式:

  • 同步請求/響應 - 適用於快速任務
  • 串流響應(SSE) - 適用於長任務,實時返回進度
  • 非同步推送通知 - 適用於耗時任務,完成後回撥

3. 任務狀態機

[新建] → [進行中] → [完成/失敗/取消]

      [需要輸入] → [繼續]

快速開始

系統要求

  • Python:3.10+
  • Node.js:18+(可選,用於 JS SDK)
  • Go:1.21+(可選,用於 Go SDK)
  • Java:17+(可選,用於 Java SDK)
  • .NET:8.0+(可選,用於 .NET SDK)

安裝 SDK

Python SDK(推薦)

# 安裝 A2A Python SDK
pip install a2a-sdk

# 驗證安裝
python -c "import a2a; print(a2a.__version__)"

Node.js SDK

npm install @a2a-js/sdk

Go SDK

go get github.com/a2aproject/a2a-go

Java SDK(Maven)

<dependency>
  <groupId>org.a2a</groupId>
  <artifactId>a2a-sdk</artifactId>
  <version>0.3.0</version>
</dependency>

.NET SDK

dotnet add package A2A

實戰案例:構建多代理協作系統

場景描述

假設我們需要構建一個”內容創作工作流”,涉及三個專業代理:

  1. 研究代理 - 搜尋和整理資訊
  2. 寫作代理 - 根據研究結果撰寫文章
  3. 審校代理 - 檢查語法和事實準確性

步驟 1:建立研究代理伺服器

# research_agent.py
from a2a.server import A2AServer
from a2a.types import AgentCard, Task, TaskStatus

class ResearchAgent:
    def __init__(self):
        self.card = AgentCard(
            name="研究代理",
            description="搜尋和整理網路資訊",
            version="1.0.0",
            capabilities={
                "skills": ["網路搜尋", "資訊提取", "摘要生成"],
                "inputFormats": ["text/plain"],
                "outputFormats": ["application/json"]
            }
        )
    
    async def execute(self, task: Task):
        """執行研究任務"""
        query = task.input.text
        # 呼叫搜尋工具(實際專案中整合 web_search 或 Serper API)
        results = await self.search_web(query)
        
        return Task(
            id=task.id,
            status=TaskStatus.COMPLETED,
            output={
                "summary": results.summary,
                "sources": results.sources,
                "key_points": results.key_points
            }
        )
    
    async def search_web(self, query: str):
        # 實現搜尋邏輯
        pass

# 啟動伺服器
server = A2AServer(
    agent=ResearchAgent(),
    host="0.0.0.0",
    port=8080
)
server.run()

步驟 2:建立寫作代理客戶端

# writing_agent.py
from a2a.client import A2AClient
from a2a.types import Task, TaskRequest

class WritingAgent:
    def __init__(self):
        self.research_client = A2AClient(
            agent_url="http://localhost:8080",
            api_key="your-api-key"
        )
    
    async def write_article(self, topic: str):
        # 步驟 1:請求研究代理收集資訊
        research_task = TaskRequest(
            input={"text": f"研究主題:{topic},需要提供關鍵事實、資料來源和相關引用"},
            mode="streaming"  # 使用串流模式獲取實時進度
        )
        
        research_result = await self.research_client.execute(research_task)
        
        # 步驟 2:基於研究結果撰寫文章
        article = await self.generate_article(
            topic=topic,
            research_data=research_result.output
        )
        
        return article
    
    async def generate_article(self, topic: str, research_data: dict):
        # 呼叫 LLM 生成文章
        pass

# 使用範例
async def main():
    writer = WritingAgent()
    article = await writer.write_article("A2A 協議詳解")
    print(article)

import asyncio
asyncio.run(main())

步驟 3:編排完整工作流

# workflow_orchestrator.py
from a2a.client import A2AClient
from a2a.types import Task, TaskRequest

class ContentWorkflow:
    def __init__(self):
        self.research_agent = A2AClient("http://localhost:8080")
        self.writing_agent = A2AClient("http://localhost:8081")
        self.review_agent = A2AClient("http://localhost:8082")
    
    async def execute_workflow(self, topic: str):
        print(f"📝 開始內容創作工作流:{topic}")
        
        # 階段 1:研究
        print("🔍 階段 1:資訊收集...")
        research_task = TaskRequest(
            input={"text": topic},
            mode="sync"
        )
        research_result = await self.research_agent.execute(research_task)
        print(f"✅ 研究完成,找到 {len(research_result.output['sources'])} 個來源")
        
        # 階段 2:寫作
        print("✍️  階段 2:文章撰寫...")
        writing_task = TaskRequest(
            input={
                "topic": topic,
                "research_data": research_result.output
            },
            mode="streaming"
        )
        async for chunk in self.writing_agent.execute_stream(writing_task):
            print(f"📝 寫作進度:{chunk.progress}%")
        
        draft = chunk.output
        print(f"✅ 初稿完成,{len(draft['content'])} 字")
        
        # 階段 3:審校
        print("🔎 階段 3:質量審校...")
        review_task = TaskRequest(
            input={
                "content": draft['content'],
                "check_types": ["grammar", "facts", "citations"]
            },
            mode="sync"
        )
        review_result = await self.review_agent.execute(review_task)
        
        print("✅ 工作流完成!")
        return {
            "final_content": review_result.output['revised_content'],
            "quality_score": review_result.output['quality_score'],
            "suggestions": review_result.output['suggestions']
        }

# 執行工作流
async def main():
    workflow = ContentWorkflow()
    result = await workflow.execute_workflow("2026 年 AI 代理發展趨勢")
    print("\n📄 最終文章:")
    print(result['final_content'])

asyncio.run(main())

高階特性

1. 串流響應處理

async def handle_streaming_task(client: A2AClient, task: TaskRequest):
    async for event in client.execute_stream(task):
        if event.type == "progress":
            print(f"進度:{event.data['progress']}%")
        elif event.type == "partial_output":
            print(f"部分結果:{event.data['content']}")
        elif event.type == "completed":
            print(f"任務完成!最終結果:{event.data['output']}")

2. 錯誤處理與重試

from a2a.exceptions import AgentUnavailable, TaskFailed

async def execute_with_retry(client: A2AClient, task: TaskRequest, max_retries=3):
    for attempt in range(max_retries):
        try:
            return await client.execute(task)
        except AgentUnavailable:
            if attempt == max_retries - 1:
                raise
            await asyncio.sleep(2 ** attempt)  # 指數退避
        except TaskFailed as e:
            print(f"任務失敗:{e.message}")
            raise

3. 認證與安全

# 使用 Bearer Token 認證
client = A2AClient(
    agent_url="https://agents.example.com/analyzer",
    api_key="your-secret-key",
    auth_type="bearer"
)

# 使用 OAuth 2.0
from a2a.auth import OAuth2Provider

oauth = OAuth2Provider(
    client_id="your-client-id",
    client_secret="your-client-secret",
    token_url="https://auth.example.com/oauth/token"
)
client = A2AClient(
    agent_url="https://agents.example.com/analyzer",
    auth_provider=oauth
)

A2A 生態工具

官方資源

社群工具

工具描述連結
A2A Inspector除錯和檢查 Agent Cardspip install a2a-inspector
A2A Gateway代理閘道器和負載均衡https://github.com/a2aproject/a2a-gateway
A2A Registry代理發現和服務註冊https://github.com/a2aproject/a2a-registry

最佳實踐

✅ 推薦做法

  1. 明確宣告能力 - 在 Agent Card 中詳細描述代理的技能和限制
  2. 使用串流通訊 - 對於耗時超過 5 秒的任務,優先使用串流模式
  3. 實現優雅降級 - 當依賴的代理不可用時,提供備選方案
  4. 記錄互動日誌 - 便於除錯和稽核代理間的通訊
  5. 設定超時限制 - 避免無限等待,建議設定 30-60 秒超時

❌ 避免的陷阱

  1. 過度依賴單個代理 - 設計冗餘和備選方案
  2. 忽略認證 - 生產環境必須啟用認證
  3. 暴露敏感資料 - 不要在 Agent Card 中洩露內部實現細節
  4. 同步阻塞長任務 - 使用非同步或串流模式處理長任務

與 OpenClaw 整合

如果你正在使用 OpenClaw 構建 AI助手,可以透過以下方式整合 A2A:

# 在 OpenClaw 技能中呼叫 A2A 代理
from a2a.client import A2AClient

async def a2a_research_task(query: str):
    """呼叫外部研究代理"""
    client = A2AClient("http://research-agent:8080")
    result = await client.execute({
        "input": {"text": query},
        "mode": "sync"
    })
    return result.output

# 註冊為 OpenClaw 技能
# 在 skills/a2a-integration/SKILL.md 中定義

未來展望

A2A 協議目前由 Linux Foundation 託管,Google 作為主要貢獻者。2026 年的發展路線圖包括:

  • v0.4.0(2026 Q2) - 增加多模態支援(影象、音訊)
  • v0.5.0(2026 Q3) - 引入代理市場發現機制
  • v1.0.0(2026 Q4) - 正式穩定版,向後相容保證

隨著更多公司和專案加入 A2A 生態,我們有望看到一個真正互聯的 AI 代理網路,就像今天的 Web 一樣開放和互操作。

總結

A2A 協議代表了 AI 代理發展的下一個階段:從孤立的智慧體到協作的代理網路。對於開發者而言,現在正是學習和採用 A2A 的好時機:

  • 開源免費 - Apache 2.0 許可,無使用限制
  • 多語言支援 - Python、JS、Go、Java、.NET
  • 大廠背書 - Google 出品,Linux Foundation 託管
  • 生態完善 - 豐富的 SDK、文件和範例
  • 前瞻設計 - 與 MCP 互補,面向未來多代理系統

開始行動:存取 https://github.com/a2aproject/A2A 獲取最新程式碼和文件,或者透過 Google 的免費課程系統學習 A2A 協議。


參考資料

  1. A2A Protocol 官方倉庫
  2. A2A 協議規範
  3. Google 官方部落格:A2A 協議發佈
  4. A2A 免費課程
  5. A2A 範例程式碼庫