模型
Coograph 會把工作分給六個代理,而它們的需求相差一個數量級。explore 讀得多、判斷少;debugger 讀得少、判斷全靠它。六個都跑在同一個模型上,要嘛為讀的部分多花錢,要嘛讓思考的部分力不從心。
Claude Code 一直支援為每個代理、每次呼叫單獨指定模型。Coograph 現在用上了,而且會先問你。
五個工具,而模型清單是你的。 Claude Code、Cursor、VS Code Copilot、Codex CLI 和 OpenCode 都能給每個代理單獨指定模型,所以 Coograph 會把對應寫到那個工具讀的地方。它做不到的是猜你手上有哪些模型:這五個工具要的模型 id 各不相同。所以由你宣告一份清單,建議就依你的模型、你的價格來算。Aider 和 Cline 是完全另一回事 — 見下面的涵蓋範圍。
它從不替你決定
全新安裝帶的是 models.mode: unset。那不是一套預設對應,而是沒有對應:每個代理都沿用你當前工作階段的模型,和以前完全一樣。
專案裡的第一張工單會問一次,在調查之後、提案之前——因為那是第一次真正了解這件事長什麼樣的時刻:
Coograph 可以讓每個代理跑在不同模型上。你想所有代理用同一個模型、存一套對應,還是每張工單都問一次?
你的答案寫進 openspec/config.yaml,然後無論你選了什麼,這個問題都不會再出現。每張工單都問一遍,正是那種會讓好功能因為錯誤理由被關掉的摩擦。
四種模式
| 模式 | 行為 |
|---|---|
unset | 出廠狀態。下一張工單問一次,之後再也不問。 |
off | 每個代理沿用工作階段模型,永遠不再提出建議。 |
preset | 安靜套用已儲存的對應,只有異常工單才會冒出建議。 |
per-task | 每張工單都先給出建議再使用。 |
# openspec/config.yaml
models:
mode: preset
preset:
explore: haiku
search: haiku
verifier: sonnet
reviewer: opus
debugger: opus
planner: opus
retro: opus
sync 從不覆寫 config.yaml,所以你的選擇撐得過模板更新。
兩條指令
/coograph-suggest-multi-models 給出一套對應,針對專案或針對手上這張工單。每一行都寫明代理、模型、一句基於你這次改動的理由,以及相對工作階段模型的預估成本差。你可以改任何一行、整體接受、或者拒絕。在你接受之前什麼都不會寫。它也是重新開啟一個已關閉專案的入口。
/coograph-disable-multi-models 一步把 mode 設成 off。不會再問你一遍確認,因為這條指令只做這一件事。已儲存的對應會留著,所以再打開時不用從零開始。
每次執行都告訴你是哪個模型做的
一次委派執行結束時會有一行:
models: reviewer=opus (mapping), explore=haiku (mapping)
它在每種模式下都印出來。off 和 unset 時顯示 (inherited) 並寫出你的工作階段模型。這一行就是關鍵:沒有它,你分不清對應是生效了還是被悄悄忽略了,而一個看不見的功能和一個壞掉的功能沒有區別。
你的模型清單
一份對應只有在它寫的模型你的工具能載入時才有意義,而沒有兩個工具的寫法是一樣的。Cursor 要 composer-2。OpenCode 要 provider/model-id。Copilot 只認它自家廠商的模型。由我們發一張 Anthropic 別名表,對大多數人是錯的,對其餘的人是錯得您無聲無息。
所以清單是你的。每個別名綁定到你的工具能載入的 id,加上大致的每百萬 token 價格——正是後者讓建議能用你的口徑而不是我們的口徑報出成本差:
# openspec/config.yaml
models:
mode: preset
catalog:
cheap: { id: claude-haiku-4-5, in: 1, out: 5 }
mid: { id: claude-sonnet-5, in: 2, out: 10 }
capable: { id: claude-opus-5, in: 5, out: 25 }
preset:
explore: cheap
search: cheap
verifier: mid
reviewer: capable
debugger: capable
上面那些 id 是例子,不是預設值。Coograph 一份清單都不附帶。
沒有清單,什麼都不變。 在 Claude Code 上,四個內建別名照舊能用。在其他工具上,建議會請你先宣告一份清單,而不是編一個載入時會報錯的 id。它從不從 API key、已裝的 SDK 或你正在用的工具去推測清單。
preset 裡出現一個清單沒定義的別名,是錯誤,不是猜測:它會說出是哪個別名,然後停下。
哪個代理配哪一檔
角色對應到你的別名,所以重要的是形狀而不是名字:
| 代理 | 檔位 | 理由 |
|---|---|---|
explore、search | 最便宜 | 大量閱讀與歸納。token 量大、判斷少,能省最多。 |
verifier | 中檔 | 跑指令、把結果對照既定標準檢查。機械性工作。 |
debugger | 強檔 | 找根因正是便宜模型靠猜、把省下的錢又燒回去的地方。 |
reviewer | 強檔 | 抓到一個真缺陷,就把價差賺回來很多倍。 |
planner | 強檔 | 量小、槓桿高,它決定了後面一切的形狀。 |
retro | 強檔 | 讀一份確定性報告並據此論證。 |
建議會隨工作性質調整。一個檔案、改法顯而易見的變更,不需要昂貴的審查;並發 bug、資料遷移、驗證路徑或任何碰錢的東西,結論正好相反。最高檔通常是中檔的好幾倍價,只有真正困難、長週期的工作才值得。
值得知道的代價
提示快取是按模型隔離的。六個代理分到四個模型,就是六個快取命名空間而不是一個,而一次短的代理執行,快取未命中損失的可能比按 token 省下的還多。這正是便宜模型只配給讀得多的代理的原因:它們跑得夠久,能攤薄這筆開銷。這也是為什麼一條提出三個或更多模型的建議會明說這一點。
還有兩條限制,直說:建議是根據工單文字和檔案數量猜的,所以有時會猜錯——這就是為什麼不經你接受什麼都不會套用。還有上面那張價格表會過期;指令本身會重申記錄日期,並說明這些是估算。
涵蓋範圍
有五個工具會把工作分給 Coograph 的代理,所以依角色選模型在那裡是一個真實的設定。每個工具要求寫的地方不同,Coograph 就寫到那裡:
| 工具 | 對應寫到哪裡 |
|---|---|
| Claude Code | Agent 呼叫上的 model 參數 |
| Cursor | .cursor/agents/ 或 .claude/agents/ 下子代理 markdown 的 model: frontmatter |
| VS Code Copilot | .github/agents/*.agent.md 的 model: frontmatter |
| Codex CLI | ~/.codex/agents/ 下的 TOML 代理定義,還能帶推理強度 |
| OpenCode | opencode.json 裡的代理,id 用 provider/model-id 形式 |
你沒有對應的角色會繼承,不會被釘死。
寫不了的對應會被拒絕,而不是拿個差不多的頂上。 VS Code Copilot 只能解析它自家廠商的模型,所以清單裡寫了別的 id 會被駁回,並說明是哪個 id、受什麼限制。寫一個接近的值、等工具載入時才報錯,比直接說不更糟。
Aider 和 Cline
不支援,也不在計畫內 — 因為根本沒有可支援的東西。
Coograph 在這兩個工具裡是以規則的形式跑的。只有一個代理,它包辦所有工作,所以沒有角色可以配模型。Aider 的 --editor-model 和 --weak-model,以及 Cline 分開的 Plan 和 Act 模型,都是那些工具自己的流水線階段。把 Coograph 的 reviewer 掛到 Aider 的 editor 槽位上,不是把七個角色有損地壓成三個;執行時壓根兒就沒有一個 reviewer 可壓。
如果你用這兩個,選一個模型自己設就行。這就是全部答案,把它說成「即將支援」只會暗示一份永遠不該到來的工作。