用 worker 團隊平行重構
一個對話只能做一件事。當你手上有一批彼此獨立的整理工作,CoS 的 agents 工具可以開出 worker 對話,讓它們各自帶著自己的 context 幹活,再由 prime(主對話)收攏結果。
情境
monorepo receipt-workspace 累積了三件獨立工作:
- A:
packages/core把散落各檔的Receipt型別集中到types.ts。 - B:
packages/api把所有console.log換成專案的 logger 介面。 - C:
packages/web替formatTotal()補測試。
A 與 B 可以立刻平行;C 需要 A 完成後的新型別。
目標
讓 prime 負責規劃與驗收,worker 負責執行:一次 spawn 出 A、B,A 完成後在原對話喚醒它接著做 C,全程用 update_plan 讓你看得到進度。
步驟一:先留下乾淨的 checkpoint
git add -A && git commit -m "checkpoint before worker run"
平行修改最怕的是事後分不清誰改壞了什麼;commit 是最便宜的保險。
步驟二:給 prime 的 prompt
I have three cleanup jobs in this monorepo:
A. packages/core: consolidate the Receipt types into types.ts.
B. packages/api: replace direct console.log calls with the logger interface.
C. packages/web: add tests for formatTotal().
C depends on A, so start with A and B.
Use the agents tool: spawn workers for A and B, and give each worker the
exact files to touch and the acceptance command to run. Keep reports
short: what changed, which command proved it, and anything unfinished.
When A is done, reuse that worker for C using the new types.
Track everything with update_plan, and use status to check who is asleep
and how many slots are free. Don't push or commit anything.
預期的工具呼叫序列
1. update_plan(plan: ["A: core types", "B: api logger", "C: web tests"])
2. agents(action: "spawn",
tasks: [
{ id: "A", task: "packages/core:集中 Receipt 型別;驗收:pnpm -F core test" },
{ id: "B", task: "packages/api:console.log 換 logger;驗收:pnpm -F api test" }
],
model: "<較便宜的 model slug>",
reasoning_effort: "medium")
3. agents(action: "status")
→ run 與各 worker 狀態、誰在睡、還剩幾個名額
4. agents(action: "message",
to: "A",
message: "Report status and paste the test output.")
→ 喚醒睡著的 worker:需要名額,會重新開啟它自己的對話,
並把這段訊息當一般使用者訊息打進去
5. (worker 自己的對話)
agents(action: "finish", result: "A 完成:…;pnpm -F core test 全綠")
→ 回報並進入睡眠
6. agents(action: "message",
to: "A",
message: "Now do C: packages/web,替 formatTotal() 補測試,使用新的 Receipt 型別。")
→ 同一個 worker 帶著原本的 context 繼續
7. agents(action: "status")
→ 確認 B 已睡、名額釋放
agents的參數欄位以連接器當下暴露的 schema 為準;model/reasoning_effort是文件中明列的可選項。
認識 agents 的四個動作
agents 恰有四個動作,沒有第五個:
| 動作 | 行為 |
|---|---|
spawn |
由一份共享 context 加上每個 worker 的任務建立 worker 對話。一次執行只用一次:之後需要 worker 就重用已經有的。 |
message |
送出一則訊息,或一個全有全無的批次。喚醒睡著的 worker 就是送訊息——在原對話裡當成一般使用者訊息。 |
status |
回報 run 與 worker,包括誰在睡、還有多少名額。 |
finish |
worker 對 prime 的交接:回報結果並讓自己睡眠。 |
幾個容易搞錯的細節:
- Worker 是睡著,不是結束。 睡著時名額釋放,所以「同時上限」只計算真正在工作的人。預設每個 family 同時 2 個,可設定到 8 個。
- 喚醒需要一個空名額,會重新開啟或聚焦該 worker 自己的對話。
spawn可帶可選的modelslug:worker 的新對話以?model=<slug>開啟,適合讓 prime 留在貴的模型、worker 跑便宜的。slug 被省略、或 ChatGPT 不認識,就用帳號預設。模型在該對話生命期內固定,包括睡醒重用之後。- 也可帶可選的
reasoning_effort:pro、none、minimal、low、medium、high、xhigh、max、ultra,與model獨立轉送。層級本身不會挑選或改變模型;兩者都省略時繼承 App 設定或帳號預設。 - 400,000 token 天花板:跨過界線不會打斷進行中的工作,只會讓「下一次停止」成為最後一次。之後該 worker 不能再被喚醒。
- Worker 永遠不跑 Compact & Resume(自動或手動都不行):它的對話就是它的耐久代理身分。
- 沒有模型提供的代理憑證或
agent_key;worker/prime 身分綁在 ChatGPT 對話上、由擴充套件證據證明,無法證明時控制呼叫會 fail closed,例如回CALLER_IDENTITY_REQUIRED或WORKER_IDENTITY_LOST。需要時,直接在已配對的瀏覽器裡使用那個對話。
驗收方式
- 三個 package 的變更都在,且每個 worker 的
finish回報都能對應到真實 diff。 - Prime 用命令自己重跑一次驗收(例如
pnpm -r test),而不是只信 worker 的敘述。 agents(action: "status")最終顯示沒有 worker 還在工作中。
注意事項
- 只平行彼此獨立的工作;兩個 worker 改同一批檔案遲早會撞。
- Worker 與 prime 共用同一個帳號的模型可用性與用量限制。Worker、Goal/Loop 只是組織工作,不給額度,也不得用來規避任何 provider 限制。
- 平行產出越漂亮,越要記得:合併前自己看過 diff。詳見worker 團隊與 Goal/Loop、worker 團隊、Goal/Loop 與續航。