Squelch — ノイズを減らしてトークンを節約

コーディングエージェントが読むものの大半はコマンド出力で、コマンド出力の大半はノイズです。失敗した 1 つのテストを取り囲む何百行もの 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)に倣ったものです。rtk は、あなたのマシン上でエージェントのシェルコマンドを書き換えることで同じことを行います。発想、コマンドの種類ごとのフィルタリング戦略、「節約したトークン」のレポート(rtk gain)は rtk に由来します。Bromure のフィルターは独自のもので、代わりにプロキシ内で動くため、フックなしですべてのエージェントに届きます。

オンにする

方法は 2 つで、どちらもすぐに効きます。エージェントの次のリクエストから切り詰められ、何も再起動しません。

  • セッションのヘッダーで、Squelch アイコン(トークン数の後ろにある、だんだん短くなる 3 本の線)をクリックし、ポップオーバーのスイッチを切り替えます。
  • マシンの設定で モデル の下の 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成功したテストごとの 1 行、進捗のドット、コンパイルの進捗失敗、トレースバック、アサーションの差分、要約
インストール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)だけが違う行の連続。最初の 1 行を件数つきで残します違いのあるものすべて
検索grep、rg、ag、git grep非常に長い行(minify されたファイル)の末尾すべてのマッチとその場所
その他すべて—端末のエスケープシーケンス、描き直される進捗行、進捗バー、6 回以上連続する同じ行残り

エラー、失敗、警告、パニック、タイムアウトに触れている行は、どのパターンに当てはまっても決して省かれません。

アンインストール(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 ツール)の結果にも決して手を加えません。対象はシェルコマンドだけです。

約 300 バイト未満の出力や、縮む量が 10% 未満になる出力は、そのまま通します。

モデルに見えるもの

切り詰められた出力の最後には、何を省いたか、全体を得るにはどうするかを伝える 1 行が付きます。

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 を付けてコマンドを再実行します。シェルには無害で、Squelch はそのコマンドの出力を丸ごと通します。

切り詰められたテキストを見るのはエージェントのモデルだけです。エージェント自身のトランスクリプト、チャットビュー、あなたのターミナルには完全な出力が残ります。Squelch はリクエストを文字列単位で変更し、それ以外のバイトはエージェントが送ったとおりに残します。また、同じ出力は常に同じように切り詰められるので、ターンごとに再送される会話でもプロンプトキャッシュが保たれます。(会話の途中で Squelch をオンまたはオフにすると、それより前のターンが一度だけ変わるため、次のリクエストはキャッシュミスになります。)

節約量を確認する

各セッションのヘッダーには、その会話で Squelch が節約した量が表示されます(12K 節約)。クリックするとポップオーバーが開きます。

  • この会話 — 節約したトークン、省いたコマンド出力の割合、モデルに送られたコマンド出力の数と、そのうち切り詰めた数。
  • 「…」全体(マシン全体) — 同じ内容を、マシン上のすべての会話について。
  • 内訳 — 節約の多かったコマンド(pytest、npm install、…)。
  • 過去 2 週間 — 1 日ごとの節約トークン。

マシンの Squelch 設定ペインには、コマンドの完全なリストと同じグラフが表示されます。

トークン数は rtk と同じく文字数 ÷ 4 で概算しています。処理の中にトークナイザーはないので、節約の割合は信頼でき、絶対数は概算です。エージェントは毎ターン会話全体を再送しますが、各コマンド出力は、リクエストが最初にそれを運んだときに一度だけ数えます。そのため、長いセッションでの実際の節約量は表示される数字より大きくなります。

節約量はマシンごとに ~/Library/Application Support/BromureAC/squelch/ledger.json に保存されます(会話、コマンド、種類、日ごとに、直近 90 日分)。ファットクライアント(別の Mac に接続した Mac、iPhone、iPad)では、数字はマシンを動かしているサーバーから来ており、ポップオーバーのスイッチはそのサーバー側で Squelch をオンまたはオフにします。

制限事項

  • マシンのみ。 Squelch は、各マシンの AI トラフィックがすべて通るプロキシの中にあります。ネイティブマシン(Bromure Sidecar を実行する Mac)は、エージェントのトラフィックをプロバイダーへ直接送るため、Squelch は適用されません。
  • 判断ではなくパターン。 フィルターは一般的なツールの出力形式を認識します。珍しいテストランナーや独自のビルドスクリプトは、汎用的な掃除(エスケープシーケンス、進捗バー、繰り返し行)だけを受けます。
  • リクエストに名前の出てこないコマンド。 Codex のターンがサーバー上で以前のターンを引き継ぐと、結果がそれを生んだ呼び出しなしで届くことがあります。Squelch はそれを、モデルが返答の中で予告した呼び出しと突き合わせます。呼び出しを一度も見ていない結果(たとえば Bromure の再起動後)はそのままにします。テキストだけでは、テストの実行とテストログの cat を区別できないからです。