如果你正在使用 Claude Code、Cursor、Copilot 或任何 AI 程式碼助手,你正在把大量 token 浪費在雜訊上——冗長的 git 輸出、完整的測試日誌、塞滿權限和時間戳的目錄列表。RTK(Rust Token Killer)是一個單一的 Rust 二進位檔,它坐在你的 AI 代理和 shell 之間,在輸出進入 LLM 上下文窗口之前就先過濾和壓縮。
為什麼這很重要
一般 30 分鐘的 Claude Code 工作階段,光是 shell 命令輸出就會消耗約 118,000 個 token。使用 RTK 後降到約 24,000——減少 80%。這省下了 API 成本,更重要的是,你的 AI 代理有更多上下文空間用來思考,而不是解析 git push 的廢話。
| 命令 | 無 RTK | 有 RTK | 節省 |
|---|---|---|---|
ls / tree (x10) | 2,000 | 400 | -80% |
cat / read (x20) | 40,000 | 12,000 | -70% |
grep / rg (x8) | 16,000 | 3,200 | -80% |
git status/log/diff (x20) | 15,500 | 3,600 | -77% |
| 測試工具 (x12) | 39,000 | 3,900 | -90% |
| 總計 | ~118,000 | ~23,900 | -80% |
運作原理
沒有 RTK:
Claude --git status--> shell --> git
^ |
| ~2,000 tokens(原始) |
+-----------------------------------+
有 RTK:
Claude --git status--> RTK --> git
^ | |
| ~200 tokens | 過濾 |
+----(已過濾)----------+----------+
RTK 透過四種策略壓縮輸出:
-
智慧過濾 — 移除雜訊:註解、空白、模板文字。
git push原本 15 行的冗長輸出變成ok main。 -
分組 — 聚合相似項目。測試結果壓縮成「FAILED: 2/15 tests」只顯示失敗的測試。Lint 錯誤按規則或檔案分組。
-
截斷 — 保留頭尾相關部分,切掉中間。長檔案讀取保留函式簽名和關鍵區段。
-
去重 — 重複的日誌行合併成一行加計數。Docker logs 重複 500 次的健康檢查變成一行。
核心魔法是 auto-rewrite hook:安裝後,RTK 會透明地攔截 AI 代理的每個 Bash 工具呼叫。git status 在執行前被改寫成 rtk git status。AI 代理完全不知道——它只是得到更乾淨、更短的輸出。
安裝與設定
安裝
# Homebrew(推薦)
brew install rtk
# 或用快速安裝腳本
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh
# 或透過 Cargo
cargo install --git https://github.com/rtk-ai/rtk
# 驗證
rtk --version
設定你的 AI 工具
# Claude Code(預設)— 一個命令搞定
rtk init -g
# 其他工具:
rtk init -g --gemini # Gemini CLI
rtk init -g --codex # OpenAI Codex
rtk init -g --agent cursor # Cursor
rtk init --agent windsurf # Windsurf
rtk init --agent cline # Cline / Roo Code
然後重啟你的 AI 工具。 就這樣。你的 AI 代理執行的每個 shell 命令現在都會自動經過 RTK。
日常使用
你不需要改變任何東西
執行 rtk init -g 後,hook 會透明地處理一切。你的 AI 代理呼叫 git status,實際執行的是 rtk git status,得到壓縮的輸出。工作流程完全不變。
直接命令(需要明確控制時)
# 檔案操作
rtk ls . # 精簡目錄樹
rtk read file.rs # 智慧檔案讀取
rtk read file.rs -l aggressive # 只看簽名(省略函式主體)
rtk grep "pattern" . # 分組搜尋結果
# Git — 冗長輸出變成一行
rtk git status # 精簡狀態
rtk git log -n 10 # 每個 commit 一行
rtk git push # -> "ok main"
rtk git commit -m "msg" # -> "ok abc1234"
# 測試 — 只顯示失敗
rtk cargo test # -90% tokens
rtk pytest # -90% tokens
rtk vitest run # 只有失敗
# 建構與 lint
rtk tsc # TypeScript 錯誤按檔案分組
rtk cargo clippy # -80%
rtk ruff check # -80%
注意事項
Hook 只攔截 Bash 工具呼叫。Claude Code 的內建工具(Read、Grep、Glob)完全繞過 hook。如果你想要 RTK 過濾這些操作,使用 shell 等效命令:
Read-> 改用rtk read file.rsGrep-> 改用rtk grep "pattern" .Glob-> 改用rtk find "*.rs" .
追蹤你的節省
rtk gain # 摘要統計
rtk gain --graph # ASCII 圖表(最近 30 天)
rtk gain --daily # 每日明細
rtk discover # 發現遺漏的節省機會
rtk session # 顯示最近會話的 RTK 採用率
設定
設定檔:~/Library/Application Support/rtk/config.toml(macOS)
[hooks]
exclude_commands = ["curl", "playwright"] # 跳過這些命令的改寫
[tee]
enabled = true # 失敗時存完整輸出
mode = "failures" # "failures"、"always" 或 "never"
tee 功能很聰明:當命令失敗時,RTK 會把完整未過濾的輸出存到磁碟,讓 LLM 需要時可以讀取而不用重新執行。你先得到壓縮版本,需要時完整版本也有。
支援的 AI 工具(12 個且持續增加)
| 工具 | 命令 | 方法 |
|---|---|---|
| Claude Code | rtk init -g | PreToolUse hook |
| GitHub Copilot | rtk init -g --copilot | PreToolUse hook |
| Cursor | rtk init -g --agent cursor | hooks.json |
| Gemini CLI | rtk init -g --gemini | BeforeTool hook |
| OpenAI Codex | rtk init -g --codex | AGENTS.md 注入 |
| Windsurf | rtk init --agent windsurf | .windsurfrules |
| Cline / Roo Code | rtk init --agent cline | .clinerules |
| Kilo Code | rtk init --agent kilocode | rules 檔案 |
| Google Antigravity | rtk init --agent antigravity | rules 檔案 |
深入原理:RTK 內部運作
架構
RTK 是一個單一的 Rust 二進位檔,模組化設計:
src/
├── main.rs # CLI 入口,Clap 參數解析
├── hooks/ # Hook 系統(Claude Code、Cursor、Gemini 等)
│ ├── init.rs # rtk init — 為每個 AI 工具安裝 hook
│ ├── rewrite_cmd.rs # 命令改寫邏輯
│ ├── integrity.rs # SHA-256 hook 固定(防篡改)
│ └── trust.rs # 專案級過濾器的信任模型
├── filters/ # 60+ 個 TOML 定義的過濾規則
├── cmds/ # 內建命令處理器(ls、read、grep、git 等)
├── core/ # 核心過濾引擎
├── parser/ # 輸出解析(NDJSON、TAP、JUnit 等)
├── analytics/ # Token 追蹤 + 節省計算
└── discover/ # 「遺漏節省」偵測
Hook 系統
核心創新是 Claude Code 的 PreToolUse hook。執行 rtk init -g 時,它在 ~/.claude/settings.json 中加入一個 hook,攔截每個 Bash 工具呼叫:
- Claude 決定執行
git diff HEAD~3 - 執行前,hook 腳本(
rtk-rewrite.sh)攔截命令 - 改寫成
rtk git diff HEAD~3 - 改寫的命令執行,RTK 過濾輸出
- Claude 收到壓縮的輸出 — 它完全不知道改寫發生了
Hook 還輸出 permissionDecision: "allow",自動批准改寫的命令。這很方便但擴大了 Claude Code 的自動批准範圍。
過濾系統
RTK 附帶 60+ 個基於 TOML 的過濾定義。每個過濾器指定:
- 匹配模式:攔截哪些命令(例如
cargo test、git status) - 輸出轉換:基於正規表達式的規則來移除、分組或折疊輸出
- 格式感知解析:針對測試工具的 NDJSON、TAP、JUnit XML
使用者也可以在 .rtk/filters.toml 定義專案級過濾器(需要 SHA-256 信任驗證)或在 ~/.config/rtk/filters.toml 定義全域過濾器。
Tee:失敗恢復
命令失敗時,RTK 將完整未過濾輸出存到 ~/.local/share/rtk/tee/。壓縮輸出包含完整日誌的指標:
FAILED: 2/15 tests
[full output: ~/.local/share/rtk/tee/1707753600_cargo_test.log]
AI 代理先得到壓縮摘要,只在需要時才讀取完整輸出——一種聰明的懶載入模式。
競爭者與替代方案
| 工具 | 方法 | 範圍 | Token 節省 |
|---|---|---|---|
| RTK | CLI 代理,輸出過濾 | 僅 Shell 命令 | 60-90% |
| Headroom | 上下文優化層 | 所有(JSON、程式碼、日誌、RAG、對話) | 不定 |
| Morph Compact | 對話壓縮 SDK | 代理對話歷史 | 50-70% |
| Claude Prompt Caching | Claude 內建 | 重複內容(系統提示、檔案) | 最高 90% |
| Model Routing | 按任務難度路由 | 所有 LLM 呼叫 | 透過較便宜模型降低成本 |
| Subagent Delegation | Claude Code 內建 | 冗長任務 | 上下文隔離 |
Headroom — 最接近的競爭者
Headroom 是一個「上下文優化層」,在輸出到達 LLM 之前壓縮所有內容:JSON、程式碼(Python/JS/Go/Rust 的 AST 感知)、日誌、RAG 結果和對話歷史。
RTK vs Headroom:它們其實互補。RTK 用手工過濾器專門處理 CLI 命令輸出。Headroom 用 ML 壓縮處理其他所有東西。你可以同時使用兩者。
Morph Compact
一個託管/SDK 服務,透過逐字刪除(非摘要)壓縮代理對話上下文 50-70%。專注於對話歷史膨脹,不是 CLI 輸出。不同問題空間。
內建替代方案(免費)
在使用 RTK 之前,考慮已有的免費方案:
- Prompt Caching:Claude 自動快取重複內容。零設定,快取命中時最高 90% 成本降低。
- Auto-compaction:Claude Code 在接近上下文限制時自動壓縮對話歷史。
- Subagents:將冗長任務委派給子代理——只有摘要回到主上下文。
.claudeignore:排除檔案和目錄不被索引。
安全性分析
社群發起的安全審計(issue #640)發現了一些問題。以下是誠實的分析:
嚴重:Shell 注入
rtk err、rtk test 和 rtk summary 直接將使用者提供的命令字串傳給 sh -c 而不做清理。由於 RTK 的 hook 自動改寫來自 LLM 輸出的命令,這創造了一個 LLM 提示注入 -> shell 注入 的鏈條。
// 有問題的模式:
Command::new("sh")
.args(["-c", command]) // command 是使用者控制的,未轉義
由於 hook 自動批准命令,繞過了 Claude Code 的權限提示,因此嚴重性提高。
高:遙測疑慮
- 預設遙測(Homebrew 版本)發送持久設備雜湊(hostname + username 的 SHA-256)——跨會話可追蹤
top_commands揭示工作流程模式- 沒有安裝時的同意對話框(退出需要編輯設定)
緩解方式:
# 停用遙測
rtk telemetry disable
# 或透過環境變數
export RTK_TELEMETRY_DISABLED=1
高:追蹤資料庫中的 Token/密鑰洩漏
RTK 將完整命令字串(包括參數)存在 SQLite 資料庫中 90 天。像 curl -H "Authorization: Bearer tok_abc" 這樣的命令會原封不動地保存。rtk gain --history 命令可能在 LLM 上下文中暴露這些。
中等:全域過濾器未做完整性檢查
專案級的 .rtk/filters.toml 需要 SHA-256 驗證,但全域的 ~/.config/rtk/filters.toml 無條件信任。如果惡意軟體修改全域過濾器,它可以抑制安全掃描器輸出或改寫任意命令輸出——因為 RTK 坐在 LLM 的輸出管道中,這特別危險。
權衡分析
優點
| 面向 | 細節 |
|---|---|
| Token 節省 | 60-90% 的減少對重度使用者來說是真實且顯著的 |
| 零摩擦 | 安裝一次,然後忘記它。透明的 hook 系統。 |
| 效能 | 每個命令 <10ms 額外開銷。Rust 寫的。單一二進位檔,零依賴。 |
| 廣度 | 100+ 支援命令,12+ AI 工具,60+ 過濾規則 |
| Tee 恢復 | 失敗時存完整輸出——重要時不會有資訊損失 |
| 開源 | MIT 授權,活躍社群,27k+ stars |
缺點
| 面向 | 細節 |
|---|---|
| 安全表面 | 透過 sh -c 的 shell 注入風險,自動批准擴大攻擊面 |
| 資訊損失 | 激進的過濾可能隱藏相關上下文。如果 RTK 過濾掉 LLM 需要的東西,你會靜默地得到更差的結果。 |
| Hook 繞過 | Claude Code 的內建工具完全繞過 RTK——覆蓋不一致 |
| 遙測預設 | Homebrew 版本是退出而非加入 |
| 密鑰保留 | 完整命令字串在 SQLite 中存 90 天 |
| 除錯困難 | 出問題時,RTK 增加了一個需要除錯的層 |
| 過濾維護 | 每個命令的過濾器都是手工製作的——新工具需要新過濾器 |
誰不該用
- 安全敏感環境:如果你在敏感基礎設施上運行 Claude Code,shell 注入鏈是真正的顧慮。
- 大量除錯的工作流程:如果你經常需要完整命令輸出來除錯,RTK 的過濾增加摩擦。
- 輕度 AI 程式碼使用:如果你只偶爾使用 Claude Code,token 節省不值得增加的複雜性。
核心權衡
RTK 用完整性換取效率。你在賭 80% 的 shell 輸出是 LLM 不需要的雜訊。大多數時候這是對的——LLM 不需要 15 行 git push 的進度條。但偶爾,被過濾掉的資訊恰好是 LLM 診斷問題所需要的。Tee 系統為失敗情況緩解了這個問題,但對於產生「過多」輸出的成功命令,資訊就直接消失了。
安全性的權衡更微妙:RTK 的 hook 自動批准改寫的命令,這很方便但意味著你信任 RTK 的改寫邏輯永遠不會產生危險的東西。sh -c shell 注入的發現表明這種信任還不完全成立。
我的建議
對大多數 AI 程式碼重度使用者:值得安裝,但注意以下事項:
# 安裝
brew install rtk
rtk init -g
# 立即停用遙測
rtk telemetry disable
# 或在 shell 設定檔中設定
echo 'export RTK_TELEMETRY_DISABLED=1' >> ~/.zshrc
定期用 rtk gain 監控你的節省。如果你注意到 Claude 因過濾輸出而有困難,你可以排除特定命令:
# ~/.config/rtk/config.toml
[hooks]
exclude_commands = ["curl", "playwright", "your-custom-tool"]
連結:
- GitHub:https://github.com/rtk-ai/rtk
- 安全審計:https://github.com/rtk-ai/rtk/issues/640
- Discord:https://discord.gg/RySmvNF5kF
- 授權:MIT

