Lesson 09 · 協作

多個 agent 透過檔案信箱通信

從 subagent 到 teammate:一次性 → 持久;無名 → 有名字;無通信 → 檔案信箱。

⏱ 約 12 分鐘 · 📝 3 個可互動元件 · 🧑‍💻 基於 shareAI-lab · s09_agent_teams.py

Subagent 和 Teammate 有什麼區別?

S04 的 subagent 簡單粗暴:spawn → 跑 → 回傳 summary → 死。一次性,沒有名字,父子之間沒有雙向通信。

s09 的 teammate 是一個有名字、能被反覆喚醒、能收發訊息的獨立 agent:

subagent (s04):  spawn -> execute -> return -> destroyed
teammate (s09):  spawn -> work -> idle -> work -> ... -> shutdown

兩個機制的用途不同:

  • subagent 適合「做一件具體探索」(比如 review 一個 PR)。
  • teammate 適合「持續承擔一個角色」(比如長期的 reviewer,每當有新 commit 就被叫醒)。

信箱是一個 JSONL 檔案

團隊成員之間怎麼通信?s09 用的是最土的機制:append-only JSONL 檔案

.team/
  config.json          # 團隊花名冊
  inbox/
    alice.jsonl        # 給 alice 的信都 append 到這裡
    bob.jsonl
    lead.jsonl

send 就是 open("alice.jsonl", "a").write(msg);read 就是讀完整個檔案、parse JSONL、然後 truncate 清空(drain 語義)。

為什麼用檔案,不用記憶體佇列?檔案天然持久。agent 重啟、行程崩潰、甚至機器重啟——郵件都還在。加上它可讀可 grep,除錯體驗非常好。

看一條訊息從 lead 到 alice 的完整流程

下面 widget 讓你給 alice 發一條訊息,看每一步磁碟上發生了什麼。

5 種訊息類型

s09 定義了 5 種訊息類型(VALID_MSG_TYPES),但只實作了前兩個,後三個在 s10 協議課才補上:

  • message — 普通文字訊息。
  • broadcast — 發給除自己外所有 teammate。
  • shutdown_request / shutdown_response — 請求/回應優雅關機(s10)。
  • plan_approval_response — 計畫審批(s10)。

為什麼宣告了但不實作?因為 s09 想把「協議擴充」做成開放式——訊息類型是枚舉,新加一個只需要在字典裡加一條、在 _exec 路由裡處理。

Interactive

Widget 1 · Mail Flow · 一條訊息從 lead 到 alice

點 Send,追蹤檔案系統上的每個步驟:lead.send → append alice.jsonl → alice 下一輪讀 inbox → truncate。

Interactive

Widget 2 · Team Config · 誰在線、狀態什麼

.team/config.json 是團隊花名冊。做幾個操作(spawn / message / shutdown),看配置怎麼變。

操作
.team/config.json

        
Interactive

Widget 3 · Subagent vs Teammate · 決定用哪個

6 個任務場景,決定用 subagent (spawn-then-die) 還是 teammate (spawn-then-live)。思考任務是否「一錘子買賣」。

答對 0 / 6