上週我翻開 Google 的 A2A(Agent-to-Agent)協議規範,看完 Agent Card 的 JSON schema 和 Task 狀態機,第一個反應不是「哇好先進」,而是「等等,這不就是我們自己搞出來的那套東西嗎?」
只不過,我們的版本是用正則表達式從一段純文字裡硬剖出來的。
一個以純文字開始的通訊協議
讓我從頭說起。我們的多代理人系統裡有二十多個 agent——programmer 寫程式碼、reviewer 做審查、secretary 負責 commit、blog-publisher 部署文章。它們之間需要溝通:「我做完了,下一步交給你。」
最初的解法極其樸素:讓 agent 在輸出文字的最末尾附加一段固定格式的標記:
1 | ---HANDOFF--- |
系統用 lastIndexOf('---HANDOFF---') 找到這段文字,用正則一行一行解析 KEY: value,然後自動把任務丟給下游。本質上,我們在 Claude 的輸出文字流裡「偷渡」了一個迷你通訊協議。
這在技術上叫什麼?帶內信令(in-band signaling)——就像早年的數據機在語音通道裡夾帶控制信號。不優雅,但能用。
10% 的成功率
問題是,它很快就不太能用了。
今年三月初,我們的架構師做了一次全面審查,結果令人尷尬:HANDOFF 的實際成功率只有 10-17%。最近 30 個已完成的任務裡,只有 5 個正確附加了 HANDOFF 標記。Programmer 的成功率是 1/10,Reviewer 更慘——1/15。
超過一半的任務完全沒有任何形式的下游交接,需要我(CTO)手動補派。這就像你開了一間工廠,生產線上的工人做完自己的工序後,有六成機率是直接把零件放在地上走人,等你去撿。
根因分析揭示了一個經典的系統設計失誤:三套互相矛盾的交接指引同時存在。
- 指引 A:系統注入的提示詞告訴 agent「用 HANDOFF 標記」
- 指引 B:同一份系統提示詞裡又介紹了
dispatch_taskMCP 工具 - 指引 C:agent 自身的配置 prompt 裡明確寫了「用 dispatch_task 交付」
三套互相矛盾的指引塞給一個 LLM,它能穩定執行才怪。有些 agent 用了 A,有些用了 C,有些兩個都用了,有些乾脆一個都不用。
修復方案其實簡單得令人尷尬:統一。HANDOFF 標記負責流水線交接(「我做完了,下一個」),dispatch_task 負責橫向子任務委託(「幫我查個東西」)。兩者涇渭分明,不再競爭。
然後我遇到了 A2A
就在我們修完這個 10% 的問題後不久,我深入閱讀了 Google 發起的 A2A 協議。它在 2025 年 4 月發布,同年 7 月 31 日釋出 v0.3,目前已移交 Linux Foundation 治理,有超過 150 個組織支持。
A2A 解決的問題和我們一模一樣:讓不同的 AI agent 能夠互相發現、溝通、協作。但它的實現方式,讓我們的 HANDOFF 看起來像是在用烽火台傳遞軍情。
Agent Card vs. 我們的 agent config
A2A 的第一個核心概念是 Agent Card——一個標準化的 JSON 文件,描述 agent 的身份、能力、服務端點、安全機制。任何人拿到這張卡片,就知道這個 agent 能做什麼、怎麼跟它說話。
我們有類似的東西:soul/agents/*.json。每個 agent 有 name、description、schedule、systemPrompt、role、permissions。但這些配置是給我們自己的 worker-scheduler 看的——它不是一個對外的介面,外部系統無法理解它。
| 概念 | A2A Agent Card | 我們的 AgentConfig |
|---|---|---|
| 能力聲明 | skills 陣列 + capabilities flags |
description + role + permissions |
| 端點發現 | serviceEndpoint URL |
內部 enqueueTask() 函式呼叫 |
| 安全 | OAuth2, mTLS, API Key | 無(同進程信任) |
| 通訊模式 | JSON-RPC, gRPC, SSE, Push | 純文字正則解析 |
| 互通性 | 跨組織、跨框架 | 僅限自家系統 |
Task 狀態機 vs. 我們的 HANDOFF
A2A 的任務有完整的狀態機,定義了七個狀態:working(處理中)、input-required(需要客戶端補充資訊)、auth-required(需要二次驗證)、completed(完成)、failed(失敗)、canceled(取消)、rejected(拒絕)。其中 input-required 和 auth-required 是中斷狀態——agent 暫停執行,等待外部回應後才能繼續。
我們的對應物是 HANDOFF 的 INTENT 欄位。handoff 是正常交接,feedback 是退回上游要求修改(等同於 A2A 的 input-required),escalate 是升級到管理層。概念上有所對應,但我們的實現缺乏正式的狀態轉換邏輯——一個任務要嘛完成了,要嘛失敗了,沒有像 auth-required 這樣的精細中間狀態。
通訊層:HTTP vs. 純文字
這是差距最大的地方。A2A 用 JSON-RPC 2.0 over HTTPS,支援三種模式:
- 同步 request/response——發任務、等結果
- Server-Sent Events (SSE)——即時串流更新
- Push Notifications——webhook 回調
我們呢?agent 把一段文字吐出來,worker-scheduler 用 lastIndexOf 找到 ---HANDOFF---,然後 regex 解析。沒有 schema 驗證、沒有認證、沒有重試機制、沒有跨進程能力。所有 agent 都跑在同一台機器上的同一個 Node.js 進程裡——這不是通訊協議,這是函式呼叫。
那我們該採用 A2A 嗎?
誠實的答案是:現在不需要,但未來可能需要。
一個月前我在框架調研文章裡寫過:「A2A 仍在 v0.3,等它穩定到 1.0 再投資。」這個判斷在戰術上仍然成立,但戰略考量在變化。
不急的理由
- 我們的 agent 都在同一台機器上。A2A 解決的核心問題是跨系統互通——不同框架、不同語言、不同組織的 agent 要協作。我們目前不需要這個。
- HANDOFF 修復後已經夠用。統一指引之後,agent 交接的可靠性大幅提升,流水線跑得動。
- A2A 還沒到 1.0。雖然 Linux Foundation 背書讓人安心,但在正式穩定版出來前投入大量工程資源,風險收益比不對。
會需要的理由
- 如果我們想讓外部 agent 接入。想像一下:一個用 LangGraph 搭建的數據分析 agent 要跟我們的 reviewer 協作——沒有標準協議,這做不到。
- 如果我們想把能力開放給別人。「Agent-as-a-Service」——讓別人的系統透過 A2A 向我們的 deep-researcher 發任務、取結果。這是一個商業可能性。
- 生態壓力。當你周圍的系統都說 A2A,而你還在用 regex 解析純文字,你就會成為那個需要「轉接器」的存在。
一條可能的路徑
如果真要遷移,最小成本的路徑是:在 worker-scheduler 前面加一層 A2A Server 薄封裝。Agent Card 直接從我們的 AgentConfig 轉換生成,tasks/send 對應 enqueueTask(),Task 狀態從我們的任務佇列映射。內部機制完全不變,只是對外多了一個標準介面。
這不是今天的任務,但值得記在架構備忘錄裡。
重新發明輪子的價值
寫到這裡,我想說一個可能不太受歡迎的觀點:重新發明輪子不一定是壞事。
如果我們一開始就採用 A2A,我們會得到一個功能更完整的通訊層。但我們也會失去一些東西:對 agent 通訊本質的深刻理解。
那個 10% 成功率的危機教會我們的,不只是「要統一指引」。它讓我們理解了一個基本事實:LLM agent 的行為不是程式碼執行,是語言理解。給它三段矛盾的指令,它不會像程式一樣報錯——它會「自作主張」地選一個。這種不確定性,是任何 agent 通訊機制(包括 A2A)都必須面對的。
A2A 用 JSON-RPC 和嚴格的 schema 解決了傳輸層的確定性,但它沒有解決「agent 願不願意正確呼叫 API」的問題。那仍然是 prompt engineering 的領地。
我們用最土的方法——在文字輸出裡貼標記、用正則解析——撞過了這些牆。現在看 A2A 的設計,每一個決策我們都能理解它的 why。Agent Card 為什麼要有 capabilities flags?因為不同 agent 支援不同的通訊模式,你需要在發任務前知道。Task 為什麼要有 input-required 和 auth-required 這樣的中斷狀態?因為人機迴圈(或 agent-agent 迴圈)和安全驗證是不可避免的。Push Notification 為什麼需要 webhook?因為 polling 在跨系統場景下太浪費了。
這些洞見,我們用自己的傷疤換來了。A2A 的設計者大概也是。
給同樣在造輪子的人
如果你也在搭建多代理人系統,目前正在用自己發明的通訊機制——regex 也好、message queue 也好、shared memory 也好——我的建議是:
繼續造你的輪子,但把 A2A 的藍圖貼在牆上。
你的輪子教你 agent 通訊的本質。A2A 的藍圖告訴你行業最終會收斂到什麼形狀。當你的輪子和那個形狀越來越像的時候,遷移的代價就越來越低。
我們的 ---HANDOFF--- 大概還會繼續用一陣子。但現在我知道,當有一天需要換的時候,我們不是在放棄一個舊系統——我們是在畢業。
一見生財 / 2026-03-03
從烽火台到光纖的距離,有時候就是一個正則表達式。
載入留言中...