跳到內容

並行執行代理

本指南說明如何同時執行多個代理,而不讓它們互相覆寫對方的工作。

當工作在某個空間中開始時,Control Center 會為該空間中每個已註冊的儲存庫,在該空間自己的根目錄下佈建一份寫入時複製檢出,並使用派生自工作區分支範本的分支。空間中的每個代理接著會取得自己的覆蓋層工作目錄——但這些覆蓋層共用該空間的 repos/ 目錄。

因此:

  • 不同空間中的兩個代理在不同的檢出、不同的分支上工作。這才是真正的隔離。
  • 同一空間中的兩個代理在同一份檢出、同一個分支上工作。它們的覆蓋層路徑不同,因此派送路徑鎖(只有在兩次執行要求完全相同的工作目錄時才會將它們串行化)也不會將它們串行化。它們可能同時寫入同一批檔案。

由此得出的規則是:每個並行任務使用一個空間。

  1. 用代理 A 開啟一個空間,並向它傳送一項任務。
  2. 用代理 B 開啟第二個空間,並向它傳送另一項任務。
  3. 兩者都會立即派送,各自在自己的空間檢出、自己的分支上執行。

只要代理會編輯檔案,就應採用這個做法。

在單一空間中協作——使用多個提及

標題為「在單一空間中協作——使用多個提及」的章節

在單一空間中,@提及多個代理:

@alice refactor the auth module. @bob review what alice lands.

兩個代理會並行派送,並以傳送者為標記串流到同一個空間。由於它們共用該空間的檢出,這種做法適用於協作——一個負責寫、一個負責讀,或兩個代理對同一棵程式碼樹進行推理——而不適用於兩項各自獨立的編輯。

內建的 pr_review 範本是隨附的扇出範例:多個審查節點由同一個觸發器並行執行,再由 Consolidate (join) 節點將它們的發現彙整成一份報告。從管線畫面執行它,每個審查者都會並行派送。

當你新增或連接步驟時,管線編輯器會隱藏終端哨兵,並改寫其接線,讓它等待每一個仍活動的匯點,因此你自己畫出的分支確實會執行。

可觀測性 → 即時(側邊欄底部 → 可觀測性,然後是即時分頁)會顯示此工作區的代理名冊,每秒重新整理一次:狀態(執行中 / 閒置 / 已停駐 / 已中止)、每個代理正在做什麼、它最近一次執行的 token 數與成本,以及可終止執行中程序的終止控制項。選取某一列會停靠出即時逐字稿抽屜。

設定 → 工作區 → 代理顯示同一份名冊,但採用另一套以需要關注為優先的狀態詞彙,這套詞彙衍生自每個代理的執行歷史——執行中、已封鎖、失敗、閒置、從未執行——並經過排序,讓任何需要注意的項目浮到最上方。每個代理的日誌分頁保存它自己的執行歷史。

這兩個介面都限定在目前作用中的工作區範圍內。

跨空間時,每個空間都在自己的分支上,因此當你合併第二個 pull request 時,衝突會以一般 Git 合併衝突的形式出現。像處理任何合併衝突那樣解決它即可。

在單一空間內部,既沒有分支邊界,也沒有鎖:代理正在即時寫入同一批檔案,落敗的一方只會被直接覆寫。如果你發現自己想讓兩個代理在同一個空間中編輯,請改為把工作拆分成兩個空間。

無論採取哪種方式,都可以這樣減少衝突:

  • 為每個代理劃定明確的範圍——不同的檔案、不同的模組。
  • 派送前先用程式碼圖檢查某項變更會觸及什麼。請參閱用程式碼圖搜尋程式碼。
  • 及時審查並合併每個代理的 pull request。

每個執行中的代理都會消耗:

  • 一份空間檢出——在寫入時複製可用時,磁碟佔用微乎其微;在 Windows 上則是一個 git worktree。無法使用 reflink 的檔案系統會讓佈建失敗,而不是改為複製。
  • 伺服器主機上的一個程序
  • 模型 token,會依代理累加

成本會匯總到可觀測性 → 洞察。請注意,一般的互動回合沒有花費上限;設有上限的那兩道指令請參閱管理成本。