開場:十個 mods,三個留下
Claude Code mods 是放在 plugin 裡的 TypeScript 函式,可以重繪 Claude Code 的介面,或改寫它的行為。十月初推出後不到一天,三支不同的影片導覽都叫開發者安裝其中十個。其中兩位創作者還在鏡頭前承認,有些 mods 根本省不了什麼,而沒有人真的量過任何一個。這次實測就來量:十個爆紅的 mods 全部在真實的一週工作中跑過,每一個都有負擔、節省量的數字,以及留下或刪除的判決。先講結果:十個裡只有三個值得放進一位實際工作的開發者的機器,而且其中一個還會在每一次回答時默默花掉 tokens。
這波熱潮,以及我們測了什麼
Anthropic 自己的定義一句話就講完:mod 是一個掛在事件上的函式,可以在事件之前、之後或取而代之執行。事件可以是一次工具呼叫、一個送出的 prompt,或是介面正在繪製的某個部分。Mods 就是純 TypeScript,包在 plugin 裡,安裝方式和其他 plugin 一樣。
發表當天的推文在大約一天內突破四百萬次觀看,有兩萬個讚,而收藏數比回覆加轉發的總和還多。上線兩天後,一個社群目錄就已經掃描了數百個儲存庫中超過一千個公開的 mods。
這次測試的基準是真實的一週工作:橫跨四個專案的 85 個 session、近 900 個 prompts,以及不到 6,000 次工具呼叫。每個 mod 都先通過驗證器的稽核,稽核會列出它掛在哪些事件上、能碰到什麼;接著每個 mod 都在同一台機器、最新版本上,與乾淨的基準線跑同一個任務。
整體分布是:十個裡有六個在執行時沒有任何可量測的成本,三個要花上實際的時間或 tokens,還有一個違背了它唯一的承諾。
實測裝飾層
安靜的六個都落在連線雜訊的範圍內。目標計量器、儲存庫熱度圖、飛行記錄器、模型路由器、session 書籤和自動交接,在大約四秒的基準任務上,差距介於省下四分之一秒到多出五分之一秒之間。
| Mod | 執行時差異 | 備註 |
|---|---|---|
| 目標計量器 | 在雜訊範圍內 | 裝飾面板 |
| 儲存庫熱度圖 | 在雜訊範圍內 | 檔案被讀取時就會亮起 |
| 飛行記錄器 | 在雜訊範圍內 | 這一回合的即時時間軸 |
| 模型路由器 | 在雜訊範圍內 | 對 subagent 有回報,見判決 |
| Session 書籤 | 在雜訊範圍內 | 能力範圍很廣 |
| 自動交接 | 閒置時約 70 ms | 在 context 達到門檻時寫入一份交接 |
它們看起來很漂亮,也沒有任何東西壞掉:每一種設定的每一次執行都正確完成了任務。無頭執行時它們不花任何成本,因為沒有東西可畫;在終端機裡,這些面板每秒最多重繪三十次,所以裝飾層真正的代價是注意力,而不是 tokens。
驗證器的稽核就是不好笑的地方。書籤 mod 可以呼叫模型、在你的機器上啟動程序、寫入檔案,還會從環境變數讀取你的設定路徑。這些都沒有被隱藏,也沒有惡意,但對一個書籤來說,權限實在太大。有四個 mods 在這裡出局:目標計量器、熱度圖和飛行記錄器是裝飾,實測沒有任何好處;書籤 mod 則是要的比它賺的多。
主打功能每回合都在計費
建議引擎是每支影片最先示範的 mod:你的回答結束,三個 prompt 建議出現在輸入框上方,你按下一個數字,草稿就自動填好。它的機制由作者自己寫在文件裡:回合結束時,它會分岔這個 session,向模型要那些建議,而這個分岔共用 session 的 prompt cache,所以成本大約是一則簡短的回覆。導覽影片從來沒提過那一行。
在基準測試上量到的是,每個符合條件的回答多約 250 個輸出 tokens,並多出近三秒的實際等待時間,而符合條件的回答幾乎就是每一個回答:只要超過大約八十個字元。這個分岔也沒有任何介面的判斷。建議只會在終端機裡繪製,但分岔在所有地方都會觸發,包括什麼都畫不出來的無頭執行。
| Mod | 實測成本 | 何時觸發 |
|---|---|---|
| 建議引擎 | 每個符合條件的回答約 250 個輸出 tokens + 約 2.9 秒 | 每個超過約 80 個字元的回答,包括無頭執行 |
| 快取維持器 | 每回合約 1.5 秒,外加暖機模式的模型呼叫 | 每一回合,暖機長達數小時 |
快取維持器的形狀一樣:每回合大約一秒半,暖機模式還會連續好幾個小時花掉小額的模型呼叫,只為了不讓你的 prompt cache 變冷。在訂閱方案上,cache 的時間窗本來就是一小時,所以你是在花 ping 的錢去解決方案已經大致解決的問題。兩者都是誠實的設計,成本也都寫在文件裡,但它們都是每一回合的稅,安裝清單上從來沒標價,而兩者都要從機器上移除。
Mod 與 hook,同一份工作
Claude Code 早就有 hooks:設定檔裡的一個 shell 腳本,在同樣的事件上觸發。文件用表格的一列就回答了該怎麼選:mod 用於介面和改寫事件;hook 用於用你已經有的腳本來封鎖、放行或記錄。
可量測的差別在於程序的啟動。設定檔裡的 hook 每一次工具呼叫都會啟動一個全新的程序。在這台機器上計時,什麼都不做的 shell hook 約 8 ms,啟動 Node 的 hook 約 43 ms,每一次呼叫都是如此,而且在腳本開始做任何事之前就先付掉了。以測試那一週的 5,993 次工具呼叫來算,光是直譯器啟動就超過四分鐘。Mod 一毫秒也不用付:它的處理函式在引擎自己的程序內執行,引擎的日誌顯示這一跳大約一毫秒就完成。
| 處理函式 | 每次呼叫的成本 | 一週 5,993 次呼叫 |
|---|---|---|
| Shell hook(空操作) | ~8 ms | ~48 秒 |
| Node hook(空操作) | ~43 ms | ~4.3 分鐘 |
| Mod(程序內) | ~1 ms | ~6 秒 |
外面唯一一份真正的遷移報告也說了同樣的事:二十七個 shell hooks 合併成五個 mods,每次呼叫的程序啟動也跟著消失。留下來的規則是:介面或改寫事件,用 mod;用你信任的腳本來封鎖、放行或記錄,用 hook,而程序啟動的成本只有在上千次呼叫時才有意義;一直重複的知識,用 skill。你讀過的 hook,勝過你沒讀過的 mod。
什麼都沒做的守衛
最簡單的安全 mod,就是監看每一個 shell 指令的守衛,而這一個被刻意寫成會當掉。我們請 Claude Code 建立一個標記檔案;守衛丟出了例外;指令還是照樣執行,檔案也出現了。這不是 bug,而是文件寫明的預設行為:當 hook 丟出例外、逾時或回傳了錯誤的格式,Claude Code 會跳過它繼續往下走。壞掉的裝飾不該讓 session 當機,但壞掉的守衛會在無聲無息中放行失敗,只在沒人會看的除錯日誌裡留下一行。
修正方式是一個回傳拒絕的 catch 處理函式。同一個會當掉的守衛加上 catch 後,就會拒絕這個指令並指出失敗原因。一行程式碼決定守衛是放行失敗還是擋下失敗,文件裡就附有這個確切的寫法,但幾乎沒人安裝。
一個社群團隊在最新版本上重跑了這些案例,並且以標記檔案而不是模型說了什麼來判斷。Catch 的寫法三次裡有三次都擋下失敗,但有一條路徑仍然無聲地壞掉:在呼叫已經轉發出去之後才回傳的拒絕,並不會阻止工具。檔案三次裡有三次都寫進去了,而模型卻被告知寫入失敗。
點出這個問題的實地報告中,有一個守衛運作了好幾天,它是啟用的、載入的,卻什麼也沒做,因為一個過期的旗標在底下把它關掉了:三個綠色的狀態標籤,底下卻是一個卡在零的計數器。這種沉默,看起來和健康一模一樣。
碰撞守門員贏得了第一個留下。它解決的是真實的問題,也就是兩個開著的聊天同時編輯同一個檔案,而且它的失敗方式很響亮:它會跳出對話框詢問,絕不會默默放行。它在編輯時大約花半秒,也不會往 prompt 裡加任何東西。裝上它,並且還是替它加上 catch 處理函式。
你貼上去的那一刻交出了什麼
Anthropic 在發表當天就講得很直白:mods 擁有和 Claude Code 本身相同的機器存取權限。它們沒有沙箱;安裝它們的方式,就像安裝你電腦上的任何程式碼。具體來說,mod 可以以你的身分在你的機器上行動:讀取你的環境變數和設定,API 金鑰就放在那裡;看到每一個 prompt 和每一次工具呼叫;改寫它們;在你被詢問之前就先核准一次工具呼叫;還能把你方案的用量花在它自己的模型呼叫上。
有兩個陷阱連小心的使用者也會踩到。權限規則管的是 Claude 的工具呼叫,不是 mod 自己的呼叫:你拒絕 Claude 讀取 env 檔案,mod 仍然可以用它自己的檔案存取直接讀那個檔案,或是啟動一個程式去讀。網路政策也有同樣的缺口:關掉網頁流量後,mod 自己的 fetch 呼叫會被拒絕,但 mod 啟動的子程序卻能以完整的權限連上網路。有一個內建的守衛 mod 會在所有東西之前載入,但只限受管理的機器,以及 Team 或 Enterprise 席位;個人訂閱的單人席位什麼也拿不到。
這些都不是紙上談兵。有位使用者在發表後幾天就公開了一個概念驗證:一個 mod,它的按鈕會啟動一個程式並寫入家目錄,從目錄安裝時沒有任何警告,而他的論點站得住腳:這個目錄看起來像應用程式商店,讓人以為有經過審核,但其實沒有。另外有一個 hook 的 bug 讓 subagent 的隔離失效了一天;維護者稱它是個大失誤,並在下一個版本修好。
目錄自己對一千多個公開 mods 的掃描結果是:超過四百個會啟動主機程序,將近四百個會讀取檔案,超過三百個看得到每一次工具呼叫。目錄自己的但書才是正確的看法:這是足跡,不是判決;PR 追蹤器本來就得執行 git。這套紀律只要兩分鐘:啟用任何東西之前先跑驗證器,並且知道退路:安全模式可以管一個 session,一個設定可以永久停掉所有已安裝的 hook。
留三個,刪七個
十個裡有三個值得留下:碰撞守門員、模型路由器和自動交接。
| Mod | 判決 | 背後的數字 |
|---|---|---|
| 碰撞守門員 | 留下 | 編輯時 ~0.5 秒,失敗時很響亮,不會往 prompt 加任何東西 |
| 模型路由器 | 留下 | subagent 以便宜的模型計費,只要三分之一的價格 |
| 自動交接 | 留下 | 70 ms 的空轉,在 context 門檻時寫入一次交接 |
| 建議引擎 | 刪除 | 每個符合條件的回答 ~250 個輸出 tokens + ~2.9 秒 |
| 快取維持器 | 刪除 | 每回合 ~1.5 秒,對著 1 小時的 cache 時間窗做暖機 ping |
| 錄製模式 | 刪除 | 遮住了螢幕,卻沒遮住磁碟 |
| 目標計量器 | 刪除 | 裝飾,實測沒有任何好處 |
| 儲存庫熱度圖 | 刪除 | 裝飾,實測沒有任何好處 |
| 飛行記錄器 | 刪除 | 裝飾,實測沒有任何好處 |
| Session 書籤 | 刪除 | 權限範圍遠超出它的工作 |
模型路由器有收據可以證明:一個在大模型上的 session 產生了一個 subagent,而這次執行自己的用量讀數顯示,subagent 是以便宜的模型計費,同樣的小工作只要三分之一的價格。在 subagent 用得很重的幾週,這就是實實在在的錢。自動交接在它回本之前一毛錢也不花:閒置時的負擔是七十毫秒,而在超過 context 門檻後,它會為冷啟動寫入一份交接,只寫一次。這波熱潮的其中一位創作者承認,手動的交接按鈕其實省不了多少時間;改成自動的門檻寫入,它才真的有用。
經得起這次測試的紀律是:啟用任何東西之前先讀驗證器的稽核,讓每個守衛都有 catch 處理函式,使它擋下失敗,並且在安全模式下錄製示範,而不是相信一個遮罩的 mod。限制是真實存在的:一週、一台機器、一種工作量、小模型上每個數據點跑三次。你的三個可能不同,但現在你知道怎麼找出它們了。
AIDive