首页
/ RTK:用单一 Rust 二进制在 LLM 读取前削减 Bash 输出的 CLI 代理

RTK:用单一 Rust 二进制在 LLM 读取前削减 Bash 输出的 CLI 代理

2026-09-04 15:13:31作者:裴锟轩Denise

rtk(Rust Token Killer)是一个高性能 CLI 代理,在 shell 命令的输出到达智能体(Agent)上下文之前对其进行过滤和压缩,为智能体削减多达 90% 的 bash 输出。它编译为单一 Rust 二进制文件、零运行时依赖、代理开销小于 10ms。读完本文,你将掌握 rtk 的安装与初始化流程、按命令类别使用的完整命令清单、"节省百分比"的真实含义与计算方式,以及其底层过滤策略和 Token 追踪机制的源码实现。

RTK 做什么

RTK 拦截 shell 命令,在你的智能体读取输出之前先压缩它。核心思路是:把 git statuspytestgrep 这类输出冗长但信息密度低的命令,转换为 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:记录字段包括 timestamporiginal_cmdrtk_cmdinput_tokensoutput_tokenssaved_tokenssavings_pctexec_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        | 过滤     |
    +-----------------------------------+            +------- (已过滤)-----+----------+

四条基本策略:

  1. 智能过滤 - 去除噪音(注释、空白、样板代码);
  2. 分组 - 聚合相似项(按目录分文件,按类型分错误);
  3. 截断 - 保留相关上下文,删除冗余;
  4. 去重 - 合并重复日志行并计数。

从源码结构看,实际实现远比这四条更精细。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.rsstd::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 = 3lto = truecodegen-units = 1strip = truepanic = "abort",配合"零依赖"目标产出单文件可执行体。

延伸阅读

项目采用 Apache 2.0 许可证(见 LICENSE),免责声明见 DISCLAIMER.md

登录后查看全文
热门项目推荐
相关项目推荐