跳到內文
coograph 17

模型

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)

它在每種模式下都印出來。offunset 時顯示 (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 裡出現一個清單沒定義的別名,是錯誤,不是猜測:它會說出是哪個別名,然後停下。

哪個代理配哪一檔

角色對應到你的別名,所以重要的是形狀而不是名字:

代理檔位理由
exploresearch最便宜大量閱讀與歸納。token 量大、判斷少,能省最多。
verifier中檔跑指令、把結果對照既定標準檢查。機械性工作。
debugger強檔找根因正是便宜模型靠猜、把省下的錢又燒回去的地方。
reviewer強檔抓到一個真缺陷,就把價差賺回來很多倍。
planner強檔量小、槓桿高,它決定了後面一切的形狀。
retro強檔讀一份確定性報告並據此論證。

建議會隨工作性質調整。一個檔案、改法顯而易見的變更,不需要昂貴的審查;並發 bug、資料遷移、驗證路徑或任何碰錢的東西,結論正好相反。最高檔通常是中檔的好幾倍價,只有真正困難、長週期的工作才值得。

值得知道的代價

提示快取是按模型隔離的。六個代理分到四個模型,就是六個快取命名空間而不是一個,而一次短的代理執行,快取未命中損失的可能比按 token 省下的還多。這正是便宜模型只配給讀得多的代理的原因:它們跑得夠久,能攤薄這筆開銷。這也是為什麼一條提出三個或更多模型的建議會明說這一點。

還有兩條限制,直說:建議是根據工單文字和檔案數量猜的,所以有時會猜錯——這就是為什麼不經你接受什麼都不會套用。還有上面那張價格表會過期;指令本身會重申記錄日期,並說明這些是估算。

涵蓋範圍

有五個工具會把工作分給 Coograph 的代理,所以依角色選模型在那裡是一個真實的設定。每個工具要求寫的地方不同,Coograph 就寫到那裡:

工具對應寫到哪裡
Claude CodeAgent 呼叫上的 model 參數
Cursor.cursor/agents/.claude/agents/ 下子代理 markdown 的 model: frontmatter
VS Code Copilot.github/agents/*.agent.mdmodel: frontmatter
Codex CLI~/.codex/agents/ 下的 TOML 代理定義,還能帶推理強度
OpenCodeopencode.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 可壓。

如果你用這兩個,選一個模型自己設就行。這就是全部答案,把它說成「即將支援」只會暗示一份永遠不該到來的工作。