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

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

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


因为答案很简单,不是它变笨了,而是 Hermes 丢了环境变量。npm 包,是目前通用型 Agent 最主流的插件、工具包安装指令之一,之前很多未集成到官方服务内的工具都是以 npm 工具包的形式存在,比如之前的微信。
而在 Hermes 的官方 yaml 文件中,默认默认只对 /opt/data(~/.hermes),即 Hermes 的自身数据进行持久化存储。而 apt、npm、pip 等常用的软件包配置路径和工具,Hermes 是一个也不保存的。
所以 npm 包的丢失,原因是因为我们没有做容器的持久化存储,这是 docker 的特性docker service,重启后会初始化容器内的一切数据,并且重新挂载映射的文件夹、容器卷。
在极空间的 Hermes 应用中,也可以看到仅有 /opt/data 映射,与官方一致。

那么如何解决呢?有两种方案:
1️⃣ 改变工具包路径

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

2️⃣ 持久化存储容器根目录
有人会说了,那我是不是直接把 /root/usr/.config 等等路径都映射到容器外,就能确保安装不丢失?
没错,力大飞砖出奇迹。你可以在 Hermes 的 docker volume 里,增加 docker volume 对应的容器内路径来解决。
但是这种方法会增加整个容器系统存储到 NAS 里,虽然可能只有几十G,但是时间久了难免占用过多空间。
两种方案里,我更倾向的是第一种,因此我基于 Hermes 的官方 Hooks 渠道,做了一个 hookubuntu linux,将依靠模型的不确定性路径持久化,变为安全可靠的路径持久化。
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 为容器内的实际路径。

好消息是,如果你已经更新了极空间应用中心的 Hermes-Agent,那么这个插件已经被内置在软件里了,无需配置即可启用。
HOOKS 可能是大家使用通用型 Agent 时候经常忽略的一个机制,它虽然不如 skill、plugin 那么常用,但是它的机制是独一无二的,而且更稳定。
可以在 Agent 启动前、会话启动前通过提示词、配置的方式修改 Agent 的参数,甚至改变 Agent 的行为习惯。只需要符合 Hermes 对 Hooks 的定义即可。

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
#上头条 聊热点#
