你的 Hermes 一重启就变笨,啥也记不住?原因可能是这个
很多使用 docker 部署 Hermes 的小伙伴,都会发现一个现象,明明之前安装过的插件、工具,怎么转眼 Hermes 就忘记了。
明明前面文字里还提到它,现在让它去找,它怎么都找不到,还反过来让你给它提供信息,笨的要死。

比如我刚刚让它安装了一个飞书 CLI,完整完成之后重启了一下容器。

好家伙,这个 feishu cli 直接找不到了。容器路径里找不到,指令找不到,甚至在安装记录里都找不到。

因为答案很简单,不是它变笨了,而是 Hermes 丢了环境变量。npm包,是目前通用型 Agent 最主流的插件、工具包安装指令之一,之前很多未集成到官方服务内的工具都是以npm工具包的形式存在,比如之前的微信。

而在 Hermes 的官方yaml文件中,默认默认只对/opt/data(~/.hermes),即 Hermes 的自身数据进行持久化存储。而apt、npm、pip等常用的软件包配置路径和工具,Hermes 是一个也不保存的。
所以npm包的丢失,原因是因为我们没有做容器的持久化存储,这是 docker 的特性,重启后会初始化容器内的一切数据,并且重新挂载映射的文件夹、容器卷。
在极空间的 Hermes 应用中,也可以看到仅有/opt/data映射,与官方一致。

那么如何解决呢?有两种方案:
1️⃣ 改变工具包路径
以 npm 为例,默认 prefix 是~/.local,这是一个不持久化存储的路径,所以任何安装进去的工具,都会在 docker 重启后被清空。
因此我们要做的是,就是将 prefix 设置到$HOME路径。在 Hermes 中,容器化部署的时候会传入HERMES_HOME这个环境变量来作为容器内的$HOME。
所以聪明的大模型,会在安装完 npm 工具后,提醒用户配置bashrc里的 PATH 参数,或者自动执行,同时将bashrc持久化。但是笨的模型么,那就呵呵哒了。
很多人觉得自己没遇到过这个问题,原因是你的模型某几次安装的时候聪明了,帮你解决了这个坑。

2️⃣ 持久化存储容器根目录
有人会说了,那我是不是直接把/root/usr/.config等等路径都映射到容器外,就能确保安装不丢失?
没错,力大飞砖出奇迹。你可以在 Hermes 的 docker volume 里,增加 docker volume 对应的容器内路径来解决。
但是这种方法会增加整个容器系统存储到 NAS 里,虽然可能只有几十G,但是时间久了难免占用过多空间。
两种方案里,我更倾向的是第一种,因此我基于 Hermes 的官方 Hooks 渠道,做了一个 hook,将依靠模型的不确定性路径持久化,变为安全可靠的路径持久化。
Hermes Hooks 采用 0 侵入式修复,可以在网关启动的时候同步完成 PATH 路径重新映射到/opt/data/(home),跟随容器的/opt/data长期存储,所以安装的 NPM 包都不会丢失。
只要 Hooks 机制不变,永远可以迁移存储,和 Hermes 版本升级无关。我把这个 hook 分享出来,直接放到 Hermes 的项目根目录下的 Hooks 文件夹下就行了。
夸克 /s/3635877615f0

重新启动容器之前,告诉 Hermes 查看一下 Hooks 下的文件,让它帮你迁移一下服务和现有的工具包。
接着重启容器,可以看到新的持久化路径被写入 $HOME 下的/.profile/.bashrc两个文件里。

这个时候你再去问 Hermes 之前安装过的 NPM 工具,它都可以回答上来。至此,你将拥有一个永远不会因重启容器而变蠢的 Hermes-Agent。

在极空间的持久化路径里,你可以看到安装过的工具包。

如果,你是在其它 Hermes 里使用,而且自己更改了HERMES_HOME这个环境变量的,那么可以在 hooks 下的py脚本里修改DATA_DIR和HOME_DIR为容器内的实际路径。