前言¶
AI 编码工具跑 cargo test、git diff、docker ps 时,输出动辄几百上千行。这些字节全部计入输入上下文,占满之后模型开始丢信息、请求截断、反复重读同一个文件。多数工具的应对方式是手动清窗口或换更大的上下文窗口,输出量本身并没有变化。
下面介绍的 AI Token节省器(SkillHub 坐标 @user_a10ab3ad/rtk-token-saver-pro,版本 1.0.10)只做一件事:在命令输出进入 LLM 上下文之前把它压掉。上游是开源项目 RTK(Rust Token Killer,仓库 rtk-ai/rtk,官网 rtk-ai.app)。
这是什么¶
一句话定位:一个拦截 shell 命令并压缩其输出的 CLI 代理,让 agent 读到的是过滤后的结果。
Skill 清单给出的信息:来源 community,分类 dev-programming,发布者 user_a10ab3ad,标签 requires_api_key=false(不需要额外 API key)。抓取快照显示评分 100000、下载 2416、安装 0(来源:SkillHub 抓取资料)。
需要说明的是,SkillHub 页面与接口本次均抓取失败,Skill 包内的 SKILL.md 内容无法核对。下文的安装命令、配置字段与用法全部来自该 Skill 指向的上游项目 RTK 的官方仓库和文档,落到你机器上的是同一个 rtk 二进制。
上游项目自述:单 Rust 二进制,支持 100+ 条命令,开销 <10ms。「零依赖」要打个折——部分 filter 会调用 ripgrep,Windows 上需要自己装并放进 PATH。
核心功能¶
命令输出压缩,分三类。
命令行工具类:cargo test / npm test / pytest / go test 只留失败项,通过的折叠成计数;git status 按状态分组的紧凑统计;git log 只留 hash、作者、主题;git diff 去掉 headers、压缩上下文;ruff check、eslint、mypy、golangci-lint run 按规则和文件分组;docker ps 只留关键列;kubectl get pods 只留名称、状态、重启次数;aws 输出压成相关字段。
文件与搜索类:ls / find 输出树形结构并附文件计数,而不是一行一个条目;grep 截断长行并按文件分组;cat / head / tail <file> 通过 rtk read 做智能读取,保留签名与结构而非全文。另有 rtk smart <file>,用 2 行启发式摘要给出文件签名。
召回类:命令失败或列表被裁剪时,完整输出会存进本地 SQLite,并在结果里打印一行提示。这是 agent 唯一的取回接口。
还有一条独立产品线 rtk-proxy,压缩 agent 到 provider 之间的 API 流量。它从不与 rtk 一起安装,许可也不同。
节省是怎么算出来的¶
这是最容易误读的一点,先讲清楚。
RTK 压缩的是 bash 输出字节,这是它唯一控制的东西。而 bash 输出只是输入 token 的一部分,输入 token 又只是账单的一部分——账单还包含输出 token,以及你的 prompt、系统提示、对话历史。压缩率每往下一层都会稀释。git log 省了 90% 的输出字节,不等于这次会话便宜了 90%。
统计口径:rtk gain 用 bytes / 4 估算 token,RTK 不带 tokenizer。因此百分比是可靠的(同样的估算器作用于原始输出和过滤后输出,比值成立),绝对 token 数是近似值,不要拿它对账。
RTK 明确不减少的东西:输出 token、你的 prompt、系统提示、对话历史。没有匹配 filter 的命令原样通过,节省记 0%。
安装与启用¶
装二进制:
# macOS / Linux(Homebrew)
brew install rtk-ai/tap/rtk
# Windows(winget)
winget install rtk-ai.rtk
# Linux / macOS 通用脚本,装到 ~/.local/bin
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/master/install.sh | sh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc # 或 ~/.zshrc
Windows 原生支持,自 v0.37.2 起自动改写 hook 以原生二进制形式运行,不依赖 Unix shell 或 jq。从 GitHub releases 下 rtk-x86_64-pc-windows-msvc.zip,解压后把 rtk.exe 放进 PATH,从命令行启动,不要双击。WSL 下行为与 Linux 完全一致。
装完验证。crates.io 上另有一个同名的 Rust Type Kit,装错了就什么都没有:
rtk --version # 输出 rtk x.y.z
rtk gain # 应显示 savings dashboard;提示 command not found 说明装错了
装错了先 cargo uninstall rtk,再按上面任一方式重装。注意 cargo install rtk 有可能装到那个同名项目,官方给出的安全写法是:
cargo install --git https://github.com/rtk-ai/rtk --branch master rtk
启用 hook,按 agent 分别执行:
rtk init --global # Claude Code / Copilot(默认)
rtk init --global --agent cursor # Cursor
rtk init -g --codex # Codex CLI
rtk init -g --gemini # Gemini CLI
rtk init --agent cline # Cline / Roo Code(项目级)
rtk init -g --agent windsurf # Windsurf
rtk init --agent kilocode # Kilo Code
--global 装的是自动改写 hook;只对当前项目生效用不带 -g 的 rtk init,它只在 CLAUDE.md 写入 RTK 说明段并生成 .rtk/filters.toml 模板,不装 hook。装完要重启对应的 AI 工具。想先看 init 会改哪些文件,加 --dry-run。
透明改写依赖 hook。Cline / Roo Code、Windsurf、Kilo Code 走的是 rules 文件,不能改写命令,agent 需要自己给命令加 rtk 前缀,init 会写入最高级别的 awareness 说明并打印提示。
典型用法¶
hook 装好后不需要改变工作方式。agent 跑 cargo test,hook 在执行前把它改写成 rtk cargo test,LLM 读到的只有失败项和通过计数。你看不到也不需要输入 rtk。
查看节省情况:
rtk gain # 总览
rtk gain --daily # 按天
rtk gain --weekly # 按周
rtk gain --history # 最近 10 条命令
rtk gain --by-rule # 节省来自哪条规则
rtk gain --all --format csv > savings.csv
被裁剪的输出取回来:
FAILED: 2/15 tests
[full output: rtk recall 36365b69eda6c4f1]
rtk recall 36365b69eda6c4f1 # agent 照提示原样执行即可
rtk recall --list # 人工检查存储
rtk recall <hash> --grep PAT # 在召回内容里搜
内置工具绕过 hook、临时禁用、以及让 agent 主动用压缩命令:
RTK_DISABLED=1 git status # 单条命令禁用 RTK
rtk bypass make install # 未支持的命令原样通过,仍计入统计
rtk discover # 哪些命令没被改写、错过了机会
rtk read foo --head-lines 10 # Read 等内置工具不走 Bash hook,需要手动走 shell
rtk smart src/main.rs # 2 行签名摘要
rtk -vvv git status # 在 stderr 看过滤细节
Hook 只在 Bash 工具调用上触发,Read / Grep / Glob 这类内置工具不经过它。想对它们也拿到压缩输出,要么改用 shell 命令,要么直接调用 rtk read、rtk grep、rtk find。完整版还能通过 PostToolUse hook 额外压缩 agent 自己的 Read 和 MCP 工具输出。
配置¶
配置文件位置:Linux ~/.config/rtk/config.toml,macOS ~/Library/Application Support/rtk/config.toml。
rtk config # 查看当前配置
rtk config --create # 生成默认配置文件
常用字段:
[tracking]
enabled = true
history_days = 90
[filters]
ignore_dirs = [".git", "node_modules", "target", "__pycache__", ".venv", "vendor"]
ignore_files = ["*.lock", "*.min.js", "*.min.css"]
[hooks]
exclude_commands = []
[awareness]
level = "default" # default | high | full,决定写给 agent 的说明里说多少 RTK 的事
[telemetry]
enabled = false # 默认关闭,需显式开启
[awareness] 的三级含义:default 只告诉 agent 如何读压缩输出,完全不提 RTK;high 额外说明 RTK 是什么,以及 rtk gain、rtk bypass、RTK_DISABLED=1、rtk discover;full 再加一条「所有命令前加 rtk 前缀」,用于没有 hook 的 agent。改完重跑一次 init 重写说明文件。
节省数据存在本地 SQLite:Linux 下 ~/.local/share/rtk/history.db,保留 90 天,跨项目跨会话全局统计。要清零用 rtk gain --reset,它会同时清掉 token 统计和召回统计。
适用场景与注意¶
适合:CLI 输出在上下文里占大头的工作流——大仓库的 git/test 循环、Rust/Go/Python 构建、Docker 与 Kubernetes 运维、CI 排查。输出越长越碎,收益越明显。
几条坑。
第一,节省不等于省钱,比例也不等于账单折扣。想算账,把原始输出和过滤后输出分别过一遍你自己模型的 tokenizer。
第二,未收录的命令原样通过,节省记 0%。自己常用的命令不在列表里,就是白跑一趟。可以先 rtk discover 看哪些命令没被改写。
第三,crates.io 上有个同名的 Rust Type Kit。用 rtk gain 验证,不行就 cargo uninstall rtk 重装。
第四,两个 rtk 发行版(完整版 Apache-2.0 + BUSL-1.1,含压缩引擎;rtk-oss 仅 Apache-2.0,无引擎)装的是同名二进制,会互相覆盖,不能共存。生产使用免费,BUSL 限制的是以商业产品形式向第三方提供 RTK。政策不允许源码可见许可时用 OSS 版:
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/master/install.sh | RTK_EDITION=oss sh
brew install rtk-ai/tap/rtk-oss
第五,Windows 上部分 filter 依赖 ripgrep,需要手动装并放入 PATH,否则会有 Binary 'rg' not found on PATH 警告。
第六,hook 改写会让命令的呈现形式变化。fish 脚本相关的改写默认关闭,需要 [hooks] wrap_fish_scripts = true 才启用,且只在 Claude Code 自己的 hook 上生效,Windows 上禁用。
结尾¶
这个 Skill 的价值不在花哨,在于把「命令输出」这个平时没人管的上下文占用项压掉,并且压缩后的输出仍能通过 recall 取回,不至于因为省了 token 而丢了信息。如果你的 agent 工作流里 CLI 输出占比可观,装一个二进制、跑一条 init,成本很低。
官方地址:https://api.skillhub.cn/user_a10ab3ad/rtk-token-saver-pro
SkillHub 页面:https://www.skillhub.cn/skills/user_a10ab3ad/rtk-token-saver-pro
上游项目:https://github.com/rtk-ai/rtk