乐于分享
好东西不私藏

RTK-Hermes 插件在微信入口下失效的排查手记

RTK-Hermes 插件在微信入口下失效的排查手记

RTK 是一个终端输出压缩工具,官方宣称可节省 60-90% 的 Token 消耗。然而在实际使用中发现,官方提供的 rtk-hermes 插件在微信入口下完全失效。经过深入排查,发现这是 3 个独立 Bug 叠加导致的系统性问题,最终采用手动 rtk 前缀方案作为临时解决方案。


背景:为什么需要 RTK

使用 AI Agent 的成本主要来自 Token 消耗。一个典型的开发任务:

读取 10 个文件:~50K tokens
执行 20 个命令:~30K tokens
对话历史:~20K tokens
总计:~100K tokens

其中,终端命令的输出往往包含大量冗余信息(空行、重复内容、装饰字符),这些都会被计入 Token 消耗。

RTK(Rust Token Killer)就是为解决这个问题而生的。它的工作原理很简单:

拦截终端命令的输出
移除冗余信息
保留关键信息
输出压缩率 60-90%

实测效果:

命令原始 tokens压缩后节省
ls -la120030075%
git status80020075%
npm install5000100080%
docker build10000200080%

对于长期使用的场景,这些优化可以节省可观的费用。


问题发现:插件安装成功,但不生效

RTK 官方提供了 rtk-hermes 插件,声称可以无缝集成到 Hermes Agent 中。按照官方文档:

# 安装插件
uv pip install rtk-hermes

# 在 config.yaml 中启用
plugins:
  enabled:
    - rtk-rewrite

我按照这个流程操作,一切看起来都很顺利:

✅ 插件安装成功
✅ 配置文件已更新
✅ Gateway 已重启

但是,当我通过微信发送消息,让 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_hermes

Hermes 期望的格式:

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
第一次发现失败后,后续调用都是 no-op

结果:插件发现失败时没有任何错误信息,用户完全不知道发生了什么。

来源:GitHub Issue [hermes#23140](https://github.com/NousResearch/hermes-agent/issues/23140)

Bug 3:Gateway 模式不调用 pre_tool_call Hook

问题:即使插件成功加载,Gateway 模式下 pre_tool_call hook 也不会被触发。

CLI 模式:✅ 正常调用
Gateway 模式(Telegram/Discord/微信):❌ 不调用

结果:rtk-hermes 的命令重写功能在所有消息平台会话中完全失效。

来源:GitHub Issue [hermes#23140](https://github.com/NousResearch/hermes-agent/issues/23140)


为什么手动测试能成功?

这是一个很好的问题。手动测试时插件可以被加载,但 Gateway 启动时不行,原因在于:

手动测试

直接调用 discover_plugins(force=True)
不经过 Gateway 的启动流程
不受 Gateway 的异常处理机制影响

Gateway 启动

经过复杂的启动流程
discover_plugins() 被包装在 try/except
异常被静默吞掉,不报错
结果被缓存,后续调用无效

这就像在一个黑盒子里调试——你看不到任何错误信息,但功能就是不工作。


当前可用的解决方案

由于这是项目本身的 Bug,我们需要等待官方修复。目前可用的替代方案:

方案 1:手动 rtk 前缀(推荐)

在 SOUL.md 中添加指令,让 Agent 自觉使用 rtk 前缀:

执行终端命令时,用 rtk 前缀包裹,压缩输出节省 token。
例如:rtk ls -la、rtk git status、rtk docker ps

优点

简单可靠
不依赖插件系统
立即可用

缺点

需要 Agent 自觉执行
不是 100% 覆盖

实测效果:节省约 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 前缀,虽然不如自动插件方便,但至少能用。

希望这篇文章能帮到遇到同样问题的朋友,少走一些弯路。


相关链接

RTK 项目:https://github.com/rtk-ai/rtk
rtk-hermes 插件:https://github.com/ogallotti/rtk-hermes
相关 Issue:[rtk#1597](https://github.com/rtk-ai/rtk/issues/1597)、[hermes#23140](https://github.com/NousResearch/hermes-agent/issues/23140)