Squelch — 雜訊更少,token 更省

程式代理程式讀到的東西大多是命令輸出,而命令輸出大多是雜訊:圍繞著唯一失敗的那個測試的數百行 PASSED、安裝時每下載一個套件就一條進度列、建置時每個檔案一行 Compiling、git 的物件計數器。模型每一輪都會把這些全部讀一遍,而它們全都計入上下文視窗與帳單。

Squelch 會在模型讀取之前去除這些雜訊。它保留代理程式據以行動的內容——錯誤、失敗、警告、摘要——其餘的則略去。它適用於每一個代理程式(Claude Code、Codex、Kimi Code、Grok、omp),機器內不需安裝任何東西:你 Mac 上的代理伺服器會精簡每個請求所攜帶的命令結果,就像個人資料保護替換個人資料一樣。Squelch 依機器設定(在設定編輯器中即工作區),預設為關閉;各欄位的說明請見設定 → Squelch。

致謝: Squelch 仿效 rtk(Rust Token Killer,github.com/rtk-ai/rtk,Apache-2.0),它透過在你的電腦上改寫代理程式的 shell 命令來做到同樣的事。這個構想、依命令類別的過濾策略,以及「節省的 token」報告(rtk gain)都來自 rtk;Bromure 的過濾器是自己的,改在代理伺服器中執行,因此不需要 hook 就能涵蓋每一個代理程式。

開啟它

有兩種方式,都立即生效——代理程式的下一個請求就會被精簡,不需重新啟動任何東西:

  • 在工作階段的標頭中,按一下 Squelch 圖示(token 數之後、三條逐漸變短的線),然後在彈出視窗中切換開關。
  • 在機器的設定中,選取模型下的 Squelch,勾選在模型讀取之前,去除命令輸出中的雜訊,然後按一下儲存。

若要讓它成為新機器的預設值,請在 Bromure → 偏好設定…(預設值範本)中開啟它。

它去除什麼

Squelch 會查看一段輸出來自哪個命令——一串命令中真正做事的最後一個命令,會穿過 sudo、timeout、env 與 VAR=value 這些前綴——並套用該類別的過濾器:

類別命令(範例)略去一律保留
測試pytest、jest、vitest、mocha、go test、cargo test、swift test、xcodebuild test、npm test、dotnet test、rspec、phpunit每個通過的測試一行、進度點、編譯進度失敗、traceback、斷言差異、摘要
安裝npm/pnpm/yarn/bun install、pip/uv/poetry、apt、brew、cargo fetch、go mod download、docker pull下載、解壓縮與「already satisfied」的行、進度列、棄用通知錯誤、衝突、結果行
建置cargo build、swift build、xcodebuild、make、cmake、gradle、mvn、tsc、docker build每個檔案的編譯行、xcodebuild 的步驟區塊、make 進出目錄的訊息、再次印出的同一個警告每一個錯誤與警告,連同其原始碼片段
gitgit push、pull、fetch、clone、status、commit物件計數器、(use "git add"…) 提示、冗長的 create mode 清單分支、ref、衝突、檔案
記錄docker logs、kubectl logs、journalctl只有數字(時間戳記、id)不同的連續行——保留第一行並附上次數任何不同之處
搜尋grep、rg、ag、git grep超長行(壓縮過的檔案)的尾端每一個符合項及其位置
其他一切—終端機跳脫序列、重繪的進度行、進度列、連續出現六次以上的同一行其餘部分

提到錯誤、失敗、警告、panic 或逾時的行,無論符合哪個模式,都絕不會被略去。

解除安裝(pip uninstall、uv pip uninstall、npm remove、brew uninstall、apt remove…)不算安裝:它印出的是被移除項目的清單,因此只會得到「其他一切」的通用清理。

有些輸出永遠不會被動到,因為代理程式把它當成內容本身來讀——通常是要從中複製到編輯裡:cat、head、tail、sed、less、jq、awk、diff、git diff、git show、git log、git blame(不論前面接了什麼選項:git --no-pager diff、git -C repo log)、gh pr diff、gh api、hg diff、curl、python -c 之類。代理程式自己組出的管線(pytest -v | tail -40)也不會動:它已經選好要看什麼了。代理程式自身檔案工具(Read、Edit、Grep 工具)的結果也永遠不會被動到——只處理 shell 命令。

小於約 300 位元組、或縮減不到 10% 的輸出,會原封不動地通過。

模型看到什麼

精簡過的輸出最後會有一行,說明略去了什麼以及如何取得全部內容:

FAILED tests/test_api.py::test_retry_budget - assert 2 == 3
========================= 1 failed, 120 passed in 4.12s =========================
[Bromure Squelch left out 120 noise lines (passing tests 120). Run the command again prefixed with BROMURE_FULL_OUTPUT=1 to see all of it.]

當代理程式需要完整輸出時,它會在命令前面加上 BROMURE_FULL_OUTPUT=1 再執行一次——這對 shell 無害,而 Squelch 會讓該命令的輸出完整通過。

只有代理程式的模型會看到精簡後的文字。代理程式自己的對話紀錄、聊天檢視與你的終端機都保留完整輸出。Squelch 逐字串修改請求,其餘每個位元組都維持代理程式送出時的樣子,而且同一段輸出永遠以同樣方式精簡,因此一輪又一輪重送的對話能保住它的提示快取。(在對話進行中開啟或關閉 Squelch,會讓先前的回合改變一次,因此下一個請求會快取未命中。)

查看節省了多少

每個工作階段的標頭會顯示 Squelch 在該對話中節省的量(節省 12K)。按一下即可開啟彈出視窗:

  • 此對話——節省的 token、被略去的命令輸出比例、送給模型的命令輸出有幾個,以及其中幾個被精簡。
  • 「…」全部(整部機器)——同樣的資訊,涵蓋機器上的所有對話。
  • 來源——節省最多的命令(pytest、npm install、…)。
  • 最近兩週——每天節省的 token。

機器的 Squelch 設定窗格會顯示完整的命令清單與同一張圖表。

token 數與 rtk 一樣以字元數 ÷ 4 估算——流程中沒有 tokenizer,所以節省的比例是可靠的,絕對數字則是近似值。每段命令輸出只計算一次,也就是請求第一次攜帶它的時候,即使代理程式每一輪都會重送整段對話——因此長工作階段的實際節省量比顯示的數字還大。

節省量依機器保存在 ~/Library/Application Support/BromureAC/squelch/ledger.json(依對話、命令、類別與日期,保留最近 90 天)。在厚用戶端(連到另一台 Mac 的 Mac、iPhone 或 iPad)上,數字來自執行該機器的伺服器,而彈出視窗中的開關會在那裡開啟或關閉 Squelch。

限制

  • 僅限機器。 Squelch 位於每部機器所有 AI 流量都會經過的代理伺服器中。原生機器(執行 Bromure Sidecar 的 Mac)會把其代理程式的流量直接送到供應商,因此 Squelch 在那裡不適用。
  • 靠模式,不靠判斷。 過濾器能辨識常見工具的輸出格式。少見的測試執行器或自訂的建置腳本,只會得到通用清理(跳脫序列、進度列、重複行)。
  • 請求中沒有指名的命令。 當 Codex 的某一輪在伺服器上接續先前的一輪時,結果可能會在沒有產生它的那個呼叫的情況下抵達。Squelch 會把它對應到模型在回覆中預告的呼叫;從未見過其呼叫的結果——例如 Bromure 重新啟動之後——則維持原樣,因為單憑文字無法分辨一次測試執行和一次對測試記錄的 cat。