RTK:讓你的 AI 程式碼助手省下 80% Token 的 CLI 代理工具

RTK:讓你的 AI 程式碼助手省下 80% Token 的 CLI 代理工具

中文 EN

如果你正在使用 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,000400-80%
cat / read (x20)40,00012,000-70%
grep / rg (x8)16,0003,200-80%
git status/log/diff (x20)15,5003,600-77%
測試工具 (x12)39,0003,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 透過四種策略壓縮輸出:

  1. 智慧過濾 — 移除雜訊:註解、空白、模板文字。git push 原本 15 行的冗長輸出變成 ok main。

  2. 分組 — 聚合相似項目。測試結果壓縮成「FAILED: 2/15 tests」只顯示失敗的測試。Lint 錯誤按規則或檔案分組。

  3. 截斷 — 保留頭尾相關部分,切掉中間。長檔案讀取保留函式簽名和關鍵區段。

  4. 去重 — 重複的日誌行合併成一行加計數。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.rs
  • Grep -> 改用 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 Codertk init -gPreToolUse hook
GitHub Copilotrtk init -g --copilotPreToolUse hook
Cursorrtk init -g --agent cursorhooks.json
Gemini CLIrtk init -g --geminiBeforeTool hook
OpenAI Codexrtk init -g --codexAGENTS.md 注入
Windsurfrtk init --agent windsurf.windsurfrules
Cline / Roo Codertk init --agent cline.clinerules
Kilo Codertk init --agent kilocoderules 檔案
Google Antigravityrtk init --agent antigravityrules 檔案

深入原理: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 工具呼叫:

  1. Claude 決定執行 git diff HEAD~3
  2. 執行前,hook 腳本(rtk-rewrite.sh)攔截命令
  3. 改寫成 rtk git diff HEAD~3
  4. 改寫的命令執行,RTK 過濾輸出
  5. 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 節省
RTKCLI 代理,輸出過濾僅 Shell 命令60-90%
Headroom上下文優化層所有(JSON、程式碼、日誌、RAG、對話)不定
Morph Compact對話壓縮 SDK代理對話歷史50-70%
Claude Prompt CachingClaude 內建重複內容(系統提示、檔案)最高 90%
Model Routing按任務難度路由所有 LLM 呼叫透過較便宜模型降低成本
Subagent DelegationClaude 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"]

連結: