注入「精簡版三段式」回覆格式規則(只對主對話);看板的切換鍵切到詳細後每則都寫詳細版;只要單次的話輸入「詳細說明」,就把上一則回覆改寫成詳細版。

讓 Claude Code 像一個小團隊一樣分工:Opus 當主管負責想,Sonnet 和 Haiku 負責動手;對話變長時先寫交接筆記,清空後照筆記接著做。
A Claude Code plugin for tiered model delegation — Opus plans, Sonnet executes, Haiku retrieves and digests bulk output — plus context-length reminders with handoff notes so the main conversation stays short, and persistent, source-cited memory that accumulates across conversations. English documentation: README.en.md.
目的:用同樣的預算做更多事,而且長時間工作也不會因為對話越拉越長而變貴、變亂。
為什麼用它
/clear 或隔天開新對話,進度都會自動接回來。usage-stats 可以量出主對話 context 長度、每個 agent 用了多少 token、依 API 牌價估算的金額,也能輸出一份有每日圖表的 HTML 報表。agent-board 看板常駐在輸入框上方,即時列出每個子 agent 的類型、模型、狀態、經過時間、token 與估計金額。reply-detail 讓回覆預設只講現況、你要做的、需要你決定的事;要細節時用看板的「⇄ 回覆:精簡/詳細」切換鍵,切到詳細後每則都寫詳細版。用 Claude Code 一陣子,常會遇到兩件事:
這個 plugin 的做法像一位主管帶團隊:主管(Opus)聽你說、想清楚、決定派給誰;動手的工作交給組員(Sonnet、Haiku)在各自的桌上做完,只把結論交回來,主管的桌面因此保持乾淨。桌面快滿時,主管先寫好交接筆記,清掉桌面後照筆記繼續做。
適合:已經在用 Claude Code、常做多步驟工作(改程式、讀 log、查資料),想省錢或不想讓長對話失控的人。只偶爾問一兩句話的話,分工的好處不明顯。
在 Claude Code 裡輸入:
/plugin install smart-agent-route --marketplace Novie131/smart-agent-route
/reload-plugins
(Claude Code 2.1.275 以前:先 /plugin marketplace add Novie131/smart-agent-route,再 /plugin install smart-agent-route@smart-agent-route。)
裝完就能用。接著建議做兩件事:
/model opus。plugin 不會自動改。/smart-agent-route:route-setup,可以設定 context 狀態列、自動壓縮門檻、Haiku 版 Explore、claude-memory/ 記憶庫。它一次只問一項,每項都說明做什麼、影響、怎麼還原,可以隨時略過;寫 settings.json 前會備份,已有的值不覆蓋。沒做的話,session 開始時會提醒你(最多 3 次)。context 長度提醒需要 python3,沒有的話會安靜停用。不想用 marketplace,見其他安裝方式。
照平常講話就好,主對話會自己判斷要不要派工:
| 你說 | 誰處理 |
|---|---|
| 「幫我想清楚這該怎麼做」 | 主對話(Opus)自己想 |
| 「照剛才講的做」 | worker(Sonnet)動手,做完先驗證再回報 |
| 「看一下這 18 張截圖有沒有跑版」「這份 log 為什麼失敗」 | bulk(Haiku)讀完只回結論 |
| 「我之前有記過 X 嗎」 | librarian(Haiku)查記憶,附出處 |
| 「這個 API 新版怎麼設定」 | research skill 查外部資料,回答附來源,官方資料存進 claude-memory/web/ |
| 「交接一下」 | handoff skill 寫 handoff.md,之後可以 /clear |
想強制指定某個 agent,用 @agent-smart-agent-route:worker。
對話變長時(預設超過 10 萬 token)你會看到提醒,Claude 會先把目前進度寫進 handoff.md。之後不管是自動壓縮、/clear 還是隔天開新對話,交接筆記都會自動帶回來,不用重新解釋一次。
handoff。你 ──► 主對話(Opus) ← 大門。理解、判斷、決定派給誰
│
├──► worker(Sonnet) ← 方向已定、動手做的事
│ └► worker-hard ← worker 失敗後的升級
├──► bulk(Haiku) ← 大量讀取只要結論:圖片、長 log、網頁
├──► librarian(Haiku) ← 查知識庫。唯讀
└──► harvester(Sonnet) ← 挖歷史對話進知識庫。手動觸發
skill:handoff(交接筆記)、research(查外部資料並附來源)、usage-stats(量測 context 與子 agent 用量)、route-setup(一次性完整設定)
hook :session 開始帶入分工慣例與記憶;context 過長時提醒
| 元件 | 模型 | 做什麼 |
|---|---|---|
| worker | Sonnet,effort medium | 方向已定的實作:寫程式、修 bug、補測試。回報完成前必須先驗證 |
| worker-hard | Sonnet,effort high | 只在 worker 失敗後使用,派工時必須附上前次失敗報告 |
| bulk | Haiku | 大量讀取、只回結論:大量圖片、長 log、網頁、輸出很多的指令,以及機械式的批次修改 |
| librarian | Haiku,effort low | 查知識庫與記憶。只有 Read、Glob、Grep,什麼都改不了;回傳原文片段與來源,並說明搜過哪些詞、什麼沒找到 |
| harvester | Sonnet | 把歷史對話逐字稿挖進知識庫筆記。只在你明確要求時才跑,成本不低 |
| Explore(選裝) | Haiku | 內建 Explore 在主對話是 Opus 時也跑 Opus。plugin 蓋不掉它(只有使用者或專案層級、名為 Explore 的 agent 能覆蓋),所以用 route-setup 或 bash install.sh --with-explore 把 Haiku 版裝進 ~/.claude/agents/ |
handoff 寫 handoff.md;research 查外部資料並附來源;usage-stats 量測主對話 context 長度、各 agent 的派工次數、token 用量與估計金額(唯讀;加 --html 可輸出圖表報表);route-setup 是一次性完整設定。主對話怎麼分工,不靠你的 CLAUDE.md:SessionStart hook 會在每個 session 開始時把分工表帶進去(內容見 hooks/guide.md)。設計理由與取捨見 docs/spec.md。
路由發生在 Opus 之後,不是之前。 判斷意圖就得先讀懂訊息,而讀懂就等於規劃了,所以沒辦法在前面放一個便宜的路由器。Opus 永遠是入口,由它派工。
省下的錢來自四個地方,照影響大小排序:
effort 等級。 worker 用 medium,失敗才升級到 worker-hard(high);librarian 用 low。/clear 仍然最省。子 agent 收工時用固定的回報格式,主對話只看前兩行就能決定下一步:狀態行(完成、失敗、需要決策)與驗證行(通過、未驗證、失敗)。「完成」只能搭配「驗證通過」。遇到需要決策的岔路時,子 agent 會停下來回報有哪些選項與各自的影響,不會自己選一條路走完。
失敗升級依序:補背景後同一個 agent 重派 → bulk 失敗改 worker → worker 失敗改 worker-hard(附前次失敗報告)→ 仍失敗就停下來重新規劃或問你。不會無限升級。
CONTEXT_REMIND_TOKENS 調整。handoff.md(目前任務 / 已完成 / 下一步 / 未決問題)。autoCompactWindow 時,提醒只會告訴你約多少 k 會自動壓縮、壓縮後會帶回交接筆記;沒設才給可複製的指令:告一段落用 /clear、做到一半用 /compact 並指定重點、後半段是除錯雜訊就用 /rewind 局部摘要。/clear、新 session 開始時,SessionStart hook 自動帶入 handoff.md:專案有 claude-memory/ 就用它,否則用 transcript 旁 auto memory 目錄的 handoff.md(Claude Code 只會自動帶入 auto memory 的 MEMORY.md 索引,不會帶 handoff.md)。建議在 ~/.claude/settings.json 把自動壓縮當保險(plugin 不能代設,/smart-agent-route:route-setup 會幫你安全地寫入):
"autoCompactWindow": 153000
扣掉約 33k 的 buffer 後,約在 12 萬自動壓縮,在 10 萬提醒之後留 2 萬緩衝寫 handoff。33k 是作者機器的實測值(不確定是否固定);寫入後請用 /context 確認 Autocompact buffer 約 33k、壓縮點約 120k(有 modelSettings 逐模型覆蓋時要一併看)。
顯示 模型 │ ctx 95k │ 提醒 100k │ 壓縮 120k,壓縮點讀自 autoCompactWindow(沒設就不顯示)。plugin 不能設定主狀態列:plugin 安裝的使用者請用 /smart-agent-route:route-setup,它會把檔案放到固定位置;install.sh 安裝的用 bash install.sh --with-statusline,或手動貼進 settings.json:
"statusLine": { "type": "command", "command": "python3 ~/.claude/hooks/smart-agent-route/statusline.py" }
兩個選裝的 mod(Claude Code 的介面擴充,需要 2.1.299 以上;作者在 VS Code 擴充 2.1.301 實測):
| mod | 做什麼 |
|---|---|
agent-board | 常駐面板列出每個子 agent 的類型、模型、狀態、經過時間、token 與估計金額(API 牌價),上方顯示合計。可以縮小成一行摘要,用 /agent-board 開關;底部有「⇄ 回覆:精簡/詳細」切換鍵 |
reply-detail | 在 system prompt 注入回覆格式:預設精簡三段(現況/你要做的/需要你決定或提供),只對主對話生效。看板的切換鍵切到「詳細」後,之後每則回覆都是詳細版,直到切回精簡;只要單次詳細版時,直接輸入「詳細說明」就會把上一則改寫成詳細版 |
安裝:用 plugin 市集的話是 /plugin install agent-board@smart-agent-route、/plugin install reply-detail@smart-agent-route;用 install.sh 的話加 --with-agent-board、--with-reply-detail(VS Code 不能帶 --plugin-dir,腳本會把目錄加進 settings.json 的 env.CLAUDE_CODE_PLUGIN_DIRS)。裝完在 VS Code 執行 Developer: Reload Window。
agent-board 的設定(plugin 的 userConfig,預設都開):autoOpen 子 agent 啟動時自動開面板、persistent 對話一開始就開且不自動收起、detailButton 看板底部的回覆模式切換鍵(名稱沿用舊版)。切換鍵切到詳細時,看板會在你送出的每則訊息附上「這一輪寫詳細版」的要求;reload 後回到精簡。
限制:mod 不能在 VS Code 輸入框的工具列(模型選單那一排)加按鈕,所以切換鍵放在看板裡。回覆訊息底下和輸入框上方的橫條也能放,但 VS Code 會替 mod 畫的這些區塊加上外框和「From the … plugin」標籤(mod 關不掉),所以不採用。另外,Claude Code 對不是使用者自己打開的面板有寬度門檻(沒手動開過要 144 欄),VS Code 聊天面板常常不夠寬,面板會停在看不見的「未放置」狀態;常駐模式會在畫面重連、寬度改變、回合開始與結束時檢查並補開。
想知道每一輪固定要付多少(系統提示、工具定義、MCP、skills、記憶檔),在對話裡輸入 /context,或在 terminal 跑 claude -p "/context"(不用開互動對話,在本機計算、不呼叫模型)。作者機器上新對話的固定成本約 29k token,其中約 18k 是 Claude Code 內建的系統提示與工具定義;標為 deferred 的工具用到才載入,不計入。固定內容每輪都會命中快取,通常不是大頭,先處理對話長度與輸出,再考慮拔掉不用的 MCP 或 plugin。
<你的資料夾>/claude-memory/
├── MEMORY.md ← 常駐索引,session 開始時由 hook 帶入,預算 40 行
├── handoff.md ← 交接筆記,下個 session 自動帶入
├── topics/ ← agent 累積的知識
├── kb/ ← 你自己的筆記
└── web/ ← research 存的外部資料筆記(附來源與過期日)
沒有 claude-memory/ 時,記憶退回 Claude Code 自己的 auto memory,一樣可用;claude-memory/ 是進階選項,好處是可以進 git、跨環境共用。
MEMORY.md 只放觸發條件,知識本體放主題檔。這讓成本跟「這次用得到多少」成正比,而不是「總共記得多少」:知識可以無限成長,每次啟動的固定成本不變。索引寫成條件,不是主題:
setup.md — 環境設定相關(這是主題)setup.md — 要改路徑或指令跑不起來時先讀(這是條件)記憶放在哪裡:
claude-memory/,找不到才退回自己的 agent 記憶目錄(~/.claude/agent-memory/worker/)。autoMemoryEnabled 或設了 CLAUDE_CODE_DISABLE_AUTO_MEMORY,memory 欄位不會生效,連接資料夾就從選用變成必要。.md。請開新的專用 vault,不要指向你現有的個人筆記,因為 agent 有寫入權。保持 MEMORY.md 薄很重要:超過上限會被截斷(hook 最多帶入 120 行,auto memory 200 行),而且常駐內容是每個 session 都付的固定成本。它會腐化,需要定期整理;超過 150 行就是警訊。
餵知識庫有兩種方式:自己把 .md 放進 kb/(不用任何前處理,librarian 立刻找得到),或叫 harvester 去挖歷史對話(它會先列出可讀的 session 讓你選範圍)。先講清楚四個限制:
kb/,而那原本是你自己的東西。如果你在意這條界線,先叫它寫到 kb/harvested/。第一次安裝後跑一次,把已經累積的東西撈起來當起點;之後 worker 收工時會即時寫記憶,就很少需要再跑。
librarian 用關鍵詞搜尋與條件判斷做檢索。個人規模(數十到數百篇)這樣通常比向量好:不用多一套基礎設施、檢索失敗看得出原因、不會因為切塊破壞 Markdown 的結構。而且它會換同義詞、換語言、改搜檔名重試,固定的向量查詢做不到。
上千篇或大量 PDF、長逐字稿才值得考慮向量。屆時 kb/ 的 markdown 直接當語料。
skills/route-setup/templates/runner.md.example 是預留的位置,刻意不載入。Haiku 層是唯一真正省錢、也唯一真正有風險的一層:它不會停下來問你,會照著它以為的意思安靜做完。所以每個 Haiku agent 都必須綁死在一件具體任務上。
三個條件同時成立才啟用:
任何一項不成立,就繼續留在 worker。檢索(librarian)是例外,因為它是唯讀的。
不想用 marketplace 的話,repo 內附 install.sh,或直接 claude --plugin-dir ./plugins/smart-agent-route。
bash install.sh # 複製安裝(agent、skill、hook 放進 ~/.claude/,沒有命名空間前綴;重跑即更新)
bash install.sh --agents-only # 只複製 agent(hook 與 skill 不會生效)
bash install.sh --link # 用符號連結裝 agent、skill、hook(改 repo 立即生效)
bash install.sh --uninstall # 移除(依安裝清單,不動你自己的檔案)
bash install.sh --with-explore # 另外安裝 Haiku 版 Explore 到 ~/.claude/agents/
bash install.sh --with-statusline # 另外在 ~/.claude/settings.json 加 context 狀態列
bash install.sh --with-agent-board # 另外載入子 agent 看板 mod(寫入 settings.json 的 env.CLAUDE_CODE_PLUGIN_DIRS)
bash install.sh --with-reply-detail # 另外載入回覆格式 mod(同上)
注意事項:
worker,skill 是 /handoff(plugin 安裝則是 smart-agent-route:worker)。~/.claude/.smart-agent-route-installed。內容完全相同的既有檔案會併入清單;內容不同的(你自己的)不會覆蓋,並給警告。--with-statusline 可與預設的複製模式或 --link 併用,不能與 --agents-only、--uninstall 併用。它只動 settings.json 的 statusLine 這個 key:檔案不存在就建立,已有 statusLine 絕不覆蓋(只印出建議片段),其餘情況寫入前先備份成 settings.json.bak-<timestamp>。JSON 壞掉或沒有 python3 時什麼都不做。--with-agent-board、--with-reply-detail 的限制同 --with-statusline,兩者可以同時使用。它們只動 env.CLAUDE_CODE_PLUGIN_DIRS:已有的路徑保留,寫入前先備份;--uninstall 只移除自己加的路徑。settings.json 裡的 hooks,結尾會印出一段片段,由你自己併進 "hooks"。之後執行 /route-setup 取得完整功能。更多說明見 docs/部署安裝.md與 plugins/smart-agent-route/INSTALL.md(英文版:INSTALL.en.md)。
smart-agent-route/
├── .claude-plugin/marketplace.json ← 市集目錄
├── plugins/smart-agent-route/ ← plugin 本體
│ ├── .claude-plugin/plugin.json
│ ├── agents/ ← worker / worker-hard / bulk / librarian / harvester
│ ├── skills/ ← handoff / research / usage-stats / route-setup
│ ├── hooks/ ← SessionStart 帶入、context 長度提醒
│ (範本在 skills/route-setup/templates/:MEMORY.md、知識庫說明、Explore、Haiku 層範本)
├── plugins/agent-board/ ← 子 agent 看板 mod(選裝)
├── plugins/reply-detail/ ← 回覆格式 mod(選裝)
├── docs/
│ ├── spec.md ← 架構設計與實作附錄
│ ├── 部署安裝.md
│ └── 發佈到-GitHub.md
├── claude-memory/ ← 記憶庫(不進版控)
└── install.sh ← 不用 marketplace 的安裝方式
v0.8.0 — 早期版本。 0.7.0 以前叫 tiered-agents,升級請先移除舊版(見 docs/部署安裝.md)。 context 提醒 hook、handoff、bulk、Explore 覆蓋版移植自作者的個人設定:hook 已在真實對話中觸發、Explore 與 bulk 已確認跑在 Haiku,但都還在驗證期。worker-hard 升級鏈、research skill 與 plugin 形式的 hook 尚未實際使用。agent-board 與 reply-detail 已在 VS Code 擴充 2.1.301 實測過看板;常駐模式、看板裡的按鈕與回覆格式注入還在驗證。
已知會需要調整的地方:
description 匹配,不是保證。要確定就 @agent-smart-agent-route:workerMEMORY.md 會腐化,需要你定期整理(超過 150 行即是訊號)plugins/smart-agent-route/skills/route-setup/templates/runner.md.example 的啟用條件harvester 只讀得到本機 session歡迎開 issue。
MIT
hooks/register.tsx 21 lines1import type { Register } from 'claude-code'
2
3// 不接手畫回覆訊息:mod 一畫 AssistantMessage,VS Code 就會加外框和「From the reply-detail plugin」標籤,
4// 而且 mod 關不掉。回覆模式切換鍵改放在 agent-board 看板;只要單次詳細版,也可以直接輸入「詳細說明」。
5export const FORMAT_RULE = `# 回覆格式(reply-detail plugin)
6本段只適用於直接回覆使用者的主對話;如果你是子 agent,忽略本段,照你自己的回報格式。
7- 每一輪結束的回覆預設是精簡版,讓使用者一眼看懂,固定三段(某段沒有內容就寫「無」):
8 - **現況**:一到三句,做到哪、結果如何、驗證有沒有過
9 - **你要做的**:需要使用者動手的事,附可直接複製的指令
10 - **需要你決定/提供**:問題附推薦答案;要使用者提供的資訊說清楚是什麼
11- 過程、證據、檔案清單、取捨分析不放精簡版;工作途中的進度更新維持一句話
12- 使用者送出「詳細說明」開頭的訊息時,把上一則回覆改寫成詳細版:背景、做了什麼、證據與檔案位置、取捨與風險;不重做工作,只展開說明
13- 使用者訊息附有「回覆模式:詳細」時(看板上的切換鍵),那一輪結束的回覆直接寫詳細版,不用三段式`
14
15export const register: Register = on => {
16 on('prompt.compose', async ($, e, next) => {
17 const r = await next(e)
18 return { ...r, sections: [...r.sections, { id: 'reply-detail:format', text: FORMAT_RULE, scope: 'session' }] }
19 })
20}
21