一、rtk的原理(Rust Token Killer)
RTK 会在命令输出内容到达上下文窗口之前对其进行压缩处理。
很多命令工具输出的信息都是冗长的,关键信息只占很少。AI编程助手本身不具备过滤和压缩功能。rtk会设钩子自动处理命令后再发送给大模型。
如:git status 会自动转成 rtk git status
二、安装步骤(原生Windows + OpenCode)
- 下载与解压
- 从rtk的GitHub releases页面下载
rtk-x86_64-pc-windows-msvc.zip。 - 解压后将
rtk.exe放入PATH路径中(例如C:\Users\<你>\ .local\bin)。
- 从rtk的GitHub releases页面下载
- 验证安装
cmd
rtk --version # 应显示 "rtk 0.28.2"
rtk gain # 应显示 token 节省统计
- 为OpenCode初始化插件
cmd
rtk init --global --opencode
此命令会在OpenCode的插件目录(C:\Users\<你>\.config\opencode\plugins)中安装rtk.ts插件。
- 验证插件安装
cmd
rtk init --show # 应显示 "OpenCode: plugin installed"
- 验证功能
进入opencode,输入!进入shell模式
cmd
git status
rtk gain # 应显示 token 节省统计
三、为什么原生Windows上OpenCode也能自动重写命令?
文档明确指出,原生Windows不支持系统级别的Bash Hook(即无法自动拦截所有shell命令),这种能力仅适用于WSL或Linux/macOS。但OpenCode是通过**自身的插件系统(TypeScript插件)**来实现命令拦截的,与操作系统无关。
具体机制:
- OpenCode的插件会在每个命令执行前 (
tool.execute.before)运行。 - rtk的插件会检查当前命令(如
git status)是否需要重写,如果需要,则替换为rtk git status。 - 因此,只要OpenCode插件在Windows上能正常运行,自动重写就有效,完全绕过了Windows缺少Bash Hook的限制。
四、常见问题及修复:插件未生效
问题现象
执行rtk init --show显示插件未安装,或运行git status时未被重写。
错误原因
社区发现,rtk官方插件中使用了which rtk命令来检查rtk二进制是否存在,但**which命令在Windows上可能不兼容或未安装**,导致插件检查失败并静默禁用(静默意味着插件不报错,但实际不工作)。
修复方法(手动修改插件文件)
- 打开插件文件:
C:\Users\<你>\.config\opencode\plugins\rtk.ts - 找到类似下面的代码段(原版):
typescript
const check = await $`which rtk`.quiet()
if (check.exitCode !== 0) throw new Error("rtk not available")
- 修改为(已修复版):
typescript
const check = await $`rtk --version`.quiet().nothrow()
if (check.exitCode !== 0) throw new Error("rtk not available")
- 重启OpenCode,插件会自动重新加载。
修改原理
- 原版:
which rtk--- 在Windows上可能找不到which命令或返回非零退出码。 - 修改版:直接运行
rtk --version--- 不需要外部命令,直接检测rtk是否存在且可执行,更兼容Windows。
五、使用说明
- 不要双击
rtk.exe--- 它是CLI工具,双击会闪退,必须在命令提示符、PowerShell或Windows Terminal中运行。 - 初始化模式 :对于OpenCode,使用
rtk init --global --opencode(CLAUDE.md注入模式不适用于OpenCode)。 - 验证工作状态 :执行任意可被重写的命令(如
git status),观察是否被自动替换为rtk git status并输出token节省信息。
六、总结对比:支持能力
| 功能 | WSL | 原生Windows(一般CLI) | 原生Windows + OpenCode |
|---|---|---|---|
| 命令过滤(cargo, git等) | ✅ 完整 | ✅ 完整 | ✅ 完整 |
| 自动重写命令 | ✅ 是(Bash Hook) | ❌ 否(仅CLAUDE.md注入) | ✅ 是(OpenCode插件) |
| 初始化模式 | Hook模式 | CLAUDE.md模式 | OpenCode插件模式 |
| 统计与分析 | ✅ 完整 | ✅ 完整 | ✅ 完整 |
关键结论
- 您能在原生Windows上使用OpenCode并让rtk自动重写命令,是因为OpenCode通过自己的TypeScript插件系统实现了命令拦截,绕过了Windows缺失的Bash Hook。
- 若插件因
which命令不兼容而静默失效,手动修改rtk.ts中的检查逻辑即可恢复。 - 该机制同样适用于其他依赖插件/规则系统的AI工具(如Cline、Roo Code等),但Claude Code的自动重写仍需通过WSL或Linux/macOS环境实现。