並行執行代理
本指南說明如何同時執行多個代理,而不讓它們互相覆寫對方的工作。
隔離的單位是空間,而非代理
標題為「隔離的單位是空間,而非代理」的章節當工作在某個空間中開始時,Control Center 會為該空間下每個已註冊程式庫,在該空間自己的根目錄下預備一份寫入時複製檢出,並置於一條由工作區分支範本衍生的分支上。空間中的每個代理接著會取得自己的覆蓋層工作目錄——但這些覆蓋層共用該空間的 repos/ 目錄。
因此:
- 不同空間中的兩個代理,在不同的檢出上、不同的分支上工作。那是真正的隔離。
- 同一個空間中的兩個代理,在同一個檢出上、同一條分支上工作。它們的覆蓋層路徑不同,因此派發路徑鎖(只有在它們要求完全相同的工作目錄時才序列化執行)也不會把它們序列化。它們可以同時寫入相同的檔案。
由此得出的規則:每個並行任務一個空間。
並行執行任務——分開的空間
標題為「並行執行任務——分開的空間」的章節- 用代理 A 開啟一個空間,並向它發送一項任務。
- 用代理 B 開啟第二個空間,並向它發送另一項任務。
- 兩者會立即派發,各自在自己的空間檢出中、自己的分支上。
只要代理將會編輯檔案,就採用這個做法。
在同一個空間中合作——多個提及
標題為「在同一個空間中合作——多個提及」的章節在單一空間中,@ 提及多於一個代理:
@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,會按代理累積
成本會落在可觀測性 → 洞察。請注意,一般的互動回合沒有支出上限;那兩個確實有上限的指令,請參見管理成本。