RTK:用单一 Rust 二进制在 LLM 读取前削减 Bash 输出的 CLI 代理
rtk(Rust Token Killer)是一个高性能 CLI 代理,在 shell 命令的输出到达智能体(Agent)上下文之前对其进行过滤和压缩,为智能体削减多达 90% 的 bash 输出。它编译为单一 Rust 二进制文件、零运行时依赖、代理开销小于 10ms。读完本文,你将掌握 rtk 的安装与初始化流程、按命令类别使用的完整命令清单、"节省百分比"的真实含义与计算方式,以及其底层过滤策略和 Token 追踪机制的源码实现。
RTK 做什么
RTK 拦截 shell 命令,在你的智能体读取输出之前先压缩它。核心思路是:把 git status、pytest、grep 这类输出冗长但信息密度低的命令,转换为 LLM 真正需要的那几行摘要。
官方列出的典型转换效果如下(继承自 README_zh.md):
| 操作 | RTK 对输出做了什么 |
|---|---|
ls / tree |
用带文件计数的树形格式代替每个条目一行 |
cat / read |
智能文件读取:保留签名和结构,而非完整函数体 |
grep / rg |
截断超长行,按文件分组匹配结果 |
git status |
紧凑的 stat 格式,按状态分组 |
git diff |
减少上下文,去掉头部信息 |
git log |
仅保留哈希、作者和标题 |
git add/commit/push |
用一行确认代替完整的进度输出 |
cargo test / npm test |
仅显示失败,通过的测试折叠为计数 |
ruff check |
按规则和文件分组 |
pytest |
仅显示失败,精简 traceback |
go test |
解析 NDJSON,仅显示失败 |
docker ps |
仅保留关键字段 |
从源码结构看,上述每一项都对应 src/cmds/ 下按生态划分的命令模块:git/(status、diff、log、gh、glab 等)、python/(ruff、pytest、pip、mypy、uv)、go/(go test/build/vet、golangci-lint)、js/(lint、tsc、vitest、playwright、prisma 等)、rust/(cargo)、ruby/(rake、rspec、rubocop)、cloud/(aws、docker/kubectl、curl、psql)以及 system/(ls、tree、read、grep、find、log、json 等)。
节省是如何计算的
RTK 为智能体削减多达 90% 的 bash 输出。这是 RTK 自身测量的指标,它与"账单降低 90%"不是一回事。
bash 输出只是输入 token 的来源之一,此外还有你的提示词、系统提示词和对话历史;而输入 token 本身也只是账单的一部分,账单还包含输出 token。削减效果在每一步都会被稀释。
RTK 报告的 token 数量按 字节数 / 4 估算——这一点在源码中可以得到直接印证。src/core/tracking.rs 中:
// ~4 chars per token on average
(text.len() as f64 / 4.0).ceil() as usize
由于 RTK 不内置分词器(嵌入分词器会增加启动时间,且每个模型都不同,RTK 刻意不实现),百分比是可靠的,但 token 绝对数值只是近似值:同一个估算器同时作用于原始输出和过滤后输出,两者的比值与估算器的绝对精度无关。更完整的说明可参考 savings-explained.md。
追踪数据存在哪里
每次被代理的命令都会写入 SQLite 数据库 src/core/tracking.rs:记录字段包括 timestamp、original_cmd、rtk_cmd、input_tokens、output_tokens、saved_tokens、savings_pct、exec_time_ms(自 v0.7.1 起记录执行耗时)。数据库位于 ~/.local/share/rtk/(文件名常量见 src/core/constants.rs 中的 HISTORY_DB),并自动清理超过 90 天的历史记录(DEFAULT_HISTORY_DAYS = 90)。rtk gain 统计命令就是查询这张表生成的。
安装
Homebrew(推荐)
brew install rtk
Homebrew 配方定义在本仓库的 Formula/rtk.rb。
快速安装(Linux/macOS)
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh
安装脚本为 install.sh,详细安装说明见 INSTALL.md。
Cargo
cargo install --git https://github.com/rtk-ai/rtk
验证
rtk --version # 应显示 "rtk 0.27.x"
rtk gain # 应显示 token 节省统计
注意:README 中写的版本号是发布时的示意值;当前仓库 Cargo.toml 中的版本为 0.42.4,以仓库实际内容为准。
快速开始:为智能体安装 hook
# 1. 为 Claude Code 安装 hook(推荐)
rtk init --global
# 2. 重启 Claude Code,然后测试
git status # 自动重写为 rtk git status
rtk init 的完整参数在 src/main.rs 中定义,远不止 --global 一个选项:
--global:写入全局助手配置目录而非项目本地文件;--agent <target>:选择目标智能体(默认 claude),还支持--gemini、--codex、--copilot、--opencode等;--claude-md:注入完整说明到 CLAUDE.md 的遗留模式;--hook-only:只装 hook 不写 RTK.md;--auto-patch/--no-patch:是否自动修补settings.json;--trust-filters/--no-trust-filters:对检测到的自定义过滤器的信任策略;--uninstall:移除已安装的 RTK 集成;--dry-run:预览改动而不写任何文件;--show:查看当前配置。
各智能体的 hook 实现集中在仓库顶层的 hooks/ 目录:claude/(含 rtk-rewrite.sh 重写脚本与测试 test-rtk-rewrite.sh)、codex/、copilot/、cursor/、opencode/(rtk.ts)、pi/、antigravity/、windsurf/、cline/、kilocode/、hermes/ 等。
工作原理
没有 rtk: 使用 rtk:
Claude --git status--> shell --> git Claude --git status--> RTK --> git
^ | ^ | |
| ~2,000 tokens(原始) | | ~200 tokens | 过滤 |
+-----------------------------------+ +------- (已过滤)-----+----------+
四条基本策略:
- 智能过滤 - 去除噪音(注释、空白、样板代码);
- 分组 - 聚合相似项(按目录分文件,按类型分错误);
- 截断 - 保留相关上下文,删除冗余;
- 去重 - 合并重复日志行并计数。
从源码结构看,实际实现远比这四条更精细。ARCHITECTURE.md 给出了完整的"过滤策略分类法",共 12 种策略,包括:统计提取(git status/log)、仅保留错误(err 模式)、按模式分组(lint 按规则计数)、去重计数(日志)、结构提取(JSON 只留键和类型)、代码分级过滤(read 按 none/minimal/aggressive 三档剥离)、失败聚焦(测试只留失败项)、树压缩(ls 目录带计数)、进度过滤(wget/pnpm install 剥 ANSI 进度条)、JSON/文本双模式(ruff check 走 JSON、format 走文本)、状态机解析(pytest 逐行跟踪 test → PASSED/FAILED)、NDJSON 流式解析(go test 的交错的包事件)。
以六阶段执行流为例(rtk git log --oneline -5):Clap 解析参数 → 路由到 src/cmds/git/git.rs → std::process::Command 执行并捕获 stdout/stderr/exit_code → 按策略过滤 → 输出(-v/-vv/-vvv 三级详细度分别显示调试信息、执行命令、过滤前原始输出)→ 调用 tracking::track() 写入 SQLite。
两个保障 CI/CD 可靠性的设计值得注意:退出码保留——当底层工具失败时,rtk 会把 stderr 透传到标准错误并按原工具退出码退出(如 git 返回 128 就传播 128);Fail-Safe——过滤失败时回退输出原始结果,绝不让代理本身成为故障点。
命令速查
下列百分比是 bash 输出字节数的削减比例,由 RTK 的
字节数 / 4估算器测得,见上文"节省是如何计算的"。
文件
rtk ls . # 优化的目录树
rtk read file.rs # 智能文件读取
rtk find "*.rs" . # 紧凑的查找结果
rtk grep "pattern" . # 按文件分组的搜索结果
Git
rtk git status # 紧凑状态
rtk git log -n 10 # 单行提交
rtk git diff # 精简 diff
rtk git push # -> "ok main"
测试
rtk jest # Jest 紧凑输出
rtk vitest # Vitest 紧凑输出
rtk pytest # Python 测试(-90%)
rtk go test # Go 测试(-90%)
rtk test <cmd> # 仅显示失败(-90%)
构建 & 检查
rtk lint # ESLint 按规则分组
rtk tsc # TypeScript 错误分组
rtk cargo build # Cargo 构建(-80%)
rtk ruff check # Python lint(-80%)
容器
rtk docker ps # 紧凑容器列表
rtk docker logs <container> # 去重日志
rtk kubectl pods # 紧凑 Pod 列表
分析
rtk gain # 节省统计
rtk gain --graph # ASCII 图表(30 天)
rtk discover # 发现遗漏的节省机会
rtk gain 的完整参数面比 README 展示的更广,src/main.rs 中除 --graph 外还支持:--project(只看当前项目的统计)、--history(最近命令历史,未匹配过滤器的命令会以 0% 节省记录在这里)、--quota(按 pro/5x/20x 订阅档位估算月度配额节省)、--daily/--weekly/--monthly/--all(时间维度拆分)、--format text|json|csv(机器可读输出)、--failures(查看解析失败回退日志)。rtk discover 则扫描历史找出尚未被 rtk 覆盖、仍有节省空间的高频命令,对应实现位于 src/discover/。
性能特征与构建优化
ARCHITECTURE.md 给出的量级参考:release 二进制约 4.1 MB(stripped),冷启动约 5-10ms,典型内存占用 2-5 MB;各命令的 rtk 代理开销约 5-20ms(如 rtk git status 约 +8ms,rtk pytest 约 +10ms)。这些是文档标注的估算值,实际随系统、命令复杂度和输出大小变化。
构建层面通过 Cargo.toml 的 release profile 实现极致优化:opt-level = 3、lto = true、codegen-units = 1、strip = true、panic = "abort",配合"零依赖"目标产出单文件可执行体。
延伸阅读
- INSTALL.md - 详细安装指南
- docs/guide/resources/troubleshooting.md - 故障排除
- docs/guide/resources/savings-explained.md - 节省是如何计算的完整说明
- docs/contributing/ARCHITECTURE.md - 技术架构深度参考
- docs/contributing/TECHNICAL.md - 端到端流程导览
项目采用 Apache 2.0 许可证(见 LICENSE),免责声明见 DISCLAIMER.md。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00