RTK 是一个终端输出压缩工具,官方宣称可节省 60-90% 的 Token 消耗。然而在实际使用中发现,官方提供的 rtk-hermes 插件在微信入口下完全失效。经过深入排查,发现这是 3 个独立 Bug 叠加导致的系统性问题,最终采用手动 rtk 前缀方案作为临时解决方案。
背景:为什么需要 RTK
使用 AI Agent 的成本主要来自 Token 消耗。一个典型的开发任务:
其中,终端命令的输出往往包含大量冗余信息(空行、重复内容、装饰字符),这些都会被计入 Token 消耗。
RTK(Rust Token Killer)就是为解决这个问题而生的。它的工作原理很简单:
实测效果:
| 命令 | 原始 tokens | 压缩后 | 节省 |
|---|---|---|---|
ls -la | 1200 | 300 | 75% |
git status | 800 | 200 | 75% |
npm install | 5000 | 1000 | 80% |
docker build | 10000 | 2000 | 80% |
对于长期使用的场景,这些优化可以节省可观的费用。
问题发现:插件安装成功,但不生效
RTK 官方提供了 rtk-hermes 插件,声称可以无缝集成到 Hermes Agent 中。按照官方文档:
# 安装插件
uv pip install rtk-hermes
# 在 config.yaml 中启用
plugins:
enabled:
- rtk-rewrite我按照这个流程操作,一切看起来都很顺利:
但是,当我通过微信发送消息,让 Agent 执行终端命令时,发现输出完全没有被压缩。Token 消耗依然很高。
插件明明装好了,为什么不生效?
排查过程:逐步定位问题
第一步:检查 RTK 二进制
首先确认 RTK 本身是否正常工作:
rtk --version
# RTK v0.39.0
rtk ls /opt/data
# 正常输出,压缩有效RTK 二进制本身没问题。
第二步:检查插件安装
确认插件是否正确安装:
python -c "import importlib.metadata; print(importlib.metadata.entry_points(group='hermes.plugins'))"输出为空!插件的 entry point 没有被正确注册。
第三步:检查 config.yaml
确认配置是否正确:
plugins:
enabled:
- rtk-rewrite配置没问题,但 Hermes 似乎没有加载这个插件。
第四步:检查 Gateway 日志
查看 Gateway 的日志,寻找错误信息:
grep -i "plugin\|rtk" ~/.hermes/logs/gateway.log没有任何相关日志! 插件的加载过程完全没有被记录。
第五步:手动测试插件加载
直接在 Python 中测试插件是否能被加载:
import sys
sys.path.insert(0, '/opt/hermes')
from hermes_cli.plugins import discover_plugins, get_plugin_manager
discover_plugins(force=True)
mgr = get_plugin_manager()
for name, p in mgr._plugins.items():
print(f'{name}: enabled={p.enabled}, error={p.error}')手动测试时,插件可以被正常加载!
但为什么 Gateway 启动时不行?
根本原因:3 个独立的 Bug
经过深入排查和社区调研,发现这是 3 个独立 Bug 叠加导致的系统性问题:
Bug 1:Entry Point 格式不兼容
问题:rtk-hermes 发布的 entry point 格式与 Hermes 的插件加载器期望不匹配。
rtk-hermes 发布的格式:
rtk-rewrite = rtk_hermesHermes 期望的格式:
hermes.plugins = rtk_hermes结果:hermes plugins enable rtk-rewrite 报错"插件未安装",即使 pip 安装成功。
来源:GitHub Issue [rtk#1597](https://github.com/rtk-ai/rtk/issues/1597)
Bug 2:Gateway 插件发现静默失败
问题:Gateway 的 discover_plugins() 函数在发现失败时会静默吞掉异常。
# gateway/run.py line 2789
def discover_plugins():
try:
# ... 发现逻辑
except Exception:
logger.debug("...") # ← 静默吞掉异常!logger.debug() 在 WARNING 级别下不可见model_tools.py 在 import 时缓存发现结果(_discovered=True)结果:插件发现失败时没有任何错误信息,用户完全不知道发生了什么。
来源:GitHub Issue [hermes#23140](https://github.com/NousResearch/hermes-agent/issues/23140)
Bug 3:Gateway 模式不调用 pre_tool_call Hook
问题:即使插件成功加载,Gateway 模式下 pre_tool_call hook 也不会被触发。
结果:rtk-hermes 的命令重写功能在所有消息平台会话中完全失效。
来源:GitHub Issue [hermes#23140](https://github.com/NousResearch/hermes-agent/issues/23140)
为什么手动测试能成功?
这是一个很好的问题。手动测试时插件可以被加载,但 Gateway 启动时不行,原因在于:
手动测试:
discover_plugins(force=True)Gateway 启动:
discover_plugins() 被包装在 try/except 中这就像在一个黑盒子里调试——你看不到任何错误信息,但功能就是不工作。
当前可用的解决方案
由于这是项目本身的 Bug,我们需要等待官方修复。目前可用的替代方案:
方案 1:手动 rtk 前缀(推荐)
在 SOUL.md 中添加指令,让 Agent 自觉使用 rtk 前缀:
执行终端命令时,用 rtk 前缀包裹,压缩输出节省 token。
例如:rtk ls -la、rtk git status、rtk docker ps优点:
缺点:
实测效果:节省约 30-50% 的 Token。
方案 2:等待官方修复
需要修复以下问题:
1. rtk-hermes 更新 entry point 格式
2. Hermes 修复 Gateway 的插件发现机制
3. Hermes 修复 Gateway 的 hook 调用机制
预计时间:未知,需要关注 GitHub Issue 的进展。
方案 3:使用 CLI 模式
如果不需要微信接入,可以直接使用 CLI 模式:
hermes chat在 CLI 模式下,插件可以正常工作。
经验教训
1. 不要轻信"开箱即用"
官方文档说的"pip install + 配置即可使用",在实际环境中可能完全不是那么回事。
2. 静默失败是最难排查的
没有错误信息、没有日志、没有提示——这是最难调试的情况。
3. 多层 Bug 叠加更可怕
一个 Bug 可能还能找到 workaround,但三个独立 Bug 叠加在一起,基本上就把路堵死了。
4. 社区 Issue 是宝藏
GitHub Issue 里往往有其他人遇到的相同问题,以及官方的回应。排查问题时先搜 Issue,可以节省大量时间。
总结
RTK-Hermes 插件在微信入口下失效,不是我们的配置问题,而是项目本身的 3 个独立 Bug 叠加导致的:
1. Entry point 格式不兼容
2. Gateway 插件发现静默失败
3. Gateway 模式不调用 pre_tool_call hook
目前最可靠的解决方案是手动 rtk 前缀,虽然不如自动插件方便,但至少能用。
希望这篇文章能帮到遇到同样问题的朋友,少走一些弯路。
相关链接:
夜雨聆风