先说结论
用 Claude Code、Codex、Cursor 这类工具写代码,最烧钱的往往不是模型思考,而是它反复把 git status、cargo test、docker ps 的整屏输出塞回上下文。rtk 就是一个卡在 Agent 和 shell 之间的 CLI 代理,把命令输出过滤压缩后再喂给模型,Rust 单二进制、零依赖、Apache-2.0。
但预期必须先摆正:它削的是命令输出,不是你的账单。README 自己写得很直白——命令输出只是输入 token 的一小部分,输入 token 又只是账单的一部分,每往下一层都在稀释。更值得警惕的是,过滤器会把硬失败伪装成良性摘要,这是社区实测踩出来的坑。
它到底做什么
rtk 拦截 shell 命令,把输出压缩后再交给你的 Agent。它逐条命令认,而不是粗暴截断:
| 命令 | rtk 怎么处理输出 |
|---|---|
| ls / tree | 目录树加文件计数,不再一行一个条目 |
| cat / read | 智能读文件,签名与结构优先于函数体 |
| grep / rg | 截断长行,按文件分组 |
| git status / diff / log | 紧凑 stat 按状态分组 / 精简上下文 / 只要 hash、作者、主题 |
| git add / commit / push | 一行确认替代整段进度输出 |
| cargo test / npm test | 只留失败项,通过的折叠成一个计数 |
| docker ps / kubectl logs | 只留关键字段 / 日志去重 |
背后是四种策略:Smart Filtering(去注释、空白、样板)、Grouping(按目录/错误类型聚合)、Truncation(保留相关上下文)、Deduplication(重复日志折叠成计数)。仓库声明覆盖 100+ 条命令,开销小于 10ms。
怎么用(命令逐字取自 README)
安装,三条路任选:
brew install rtk curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh cargo install --git https://github.com/rtk-ai/rtk
验证装对了没:
rtk --version # Should show "rtk 0.28.2" rtk gain # Should show the savings dashboard
这里 README 特意给了个警告:crates.io 上另有一个同名的 rtk(Rust Type Kit),如果 rtk gain 跑不动,说明装错了包,改用上面的 cargo install --git。
接上你的 AI 工具,装 hook:
rtk init -g # Claude Code / Copilot (default) rtk init -g --gemini # Gemini CLI rtk init -g --codex # Codex (OpenAI) rtk init -g --agent cursor # Cursor rtk init -g --opencode # OpenCode plugin rtk init --agent cline # Cline / Roo Code rtk init --show # Verify installation
装完必须重启你的 AI 工具。hook 会把 Bash 调用里的 git status 透明改写成 rtk git status。注意范围:hook 只作用于 Bash 工具调用,Claude Code 内置的 Read、Grep、Glob 不走 hook,那部分要自己显式调 rtk read / rtk grep。
配置文件(macOS 在 ~/Library/Application Support/rtk/config.toml):
[hooks] exclude_commands = ["curl", "playwright"] # skip rewrite for these [retriever] mode = "sqlite" # sqlite (default) | tee (legacy files) | disabled
命令失败时 rtk 会把完整未过滤输出存下来,模型不用重跑就能取回,格式是 FAILED: 2/15 tests 后面跟一行 [full output: rtk recall 3f9c2a81d4e7]。
优点
- Apache-2.0,可商用可改,没有 copyleft 包袱。
- 单二进制、零依赖,仓库声明开销小于 10ms,不用为它起服务。
- 认命令而不是乱截:git、测试框架、构建、lint、包管理、容器、k8s、AWS、Pulumi 各有专用过滤器,覆盖面在同类里算厚。
- 失败留后路:出错时完整输出进 sqlite,能 rtk recall 取回,不逼 Agent 重跑一遍。
- 不破坏 prompt cache:每条命令只过滤一次,结果照常进历史并被缓存,官方说明还提到更小的输出意味着更便宜的缓存写入与读取。
- 遥测默认关闭,要显式 opt-in;不想碰可以直接 export RTK_TELEMETRY_DISABLED=1 强制关掉。
- 适配面广:README 列了 17 个 AI 编码工具,从 Claude Code、Copilot、Cursor、Gemini CLI、Codex 到 Cline、OpenCode、Hermes、Kimi 都有对应装法。
缺点与风险(社区 issue 实测)
三个要命的点
- 过滤器会把硬失败说成正常:issue #2317 报告 pytest 收集错误被显示成「No tests collected」,被标为 help wanted、高优先级。让 Agent 拿这个当验收结论,会直接误判。
- 重写会绕过权限设置:issue #3152 指改写后的命令不再走 Claude Code 的权限配置,标签同时挂了 area:security 和 priority:high。
- 压缩率可能远不及文档:issue #2001 有人实测平均只压掉约 2%,远低于文档写的 40%。效果高度依赖你的命令构成。
另外几个真实短板也得记下:自动重写可能丢掉精确的文件与路径语义(#2110,高优先级);有一条 P0 记录是被 Claude Code 调用时直接崩溃(#1556);cargo install --git 走的其实是 develop 分支、Cargo.toml 过期,容易装到旧版本(#2235);走 hook 重写时 rtk gain 统计记不上(#1082、#3276),省了多少你自己都看不准。还有两条实操层面:Flutter 与 Dart 命令目前还没支持(#1098 仍 open),Flutter 主力用不上;部分过滤器 shell out 给 ripgrep,rg 不在 PATH 上会一直告警。最后,rtk 不内置 tokenizer,token 数按 bytes/4 估算——官方原话是百分比可信、绝对 token 数只作参考。
最终效果:适合谁、不适合谁
适合:重度用 Claude Code / Codex / Cursor 写代码,日常命令又长又吵(跑测试、构建、看 git、查 k8s 与 AWS),想把上下文里那些噪音压下去、顺带降低缓存成本的人。
不适合:指望装上就把账单砍九成的人;把 Agent 当验收工具、依赖精确退出码与完整错误栈的人;以及 Flutter / Dart 主力项目——过滤器还没覆盖。
落地三坑:① 算账要换算,命令输出削减不等于账单削减,别拿 README 的 90% 当财务预期;② 涉及失败与错误的命令,先跑一次原始命令或用 rtk proxy 对照,别只信压缩摘要;③ 关注 #3152 权限绕过,在没权限约束的环境里别裸用。
下期预告:把上下文管起来之后,下一个烧钱点是记忆——开源 Agent 记忆层方案横向对比。
数据来源:GitHub Trending 官方页(Rust 周榜)+ github.com/rtk-ai/rtk 仓库页、raw README(master 分支)、issues(抓取时间 2026-09-16)。许可 Apache-2.0,安装与用法命令均逐字取自 README。压缩率为项目自报与社区 issue 反馈,未独立复现。
