Hermes 到底跑在 venv、.venv 还是别的?答案是「别的」,顺手清了 1.15G 残留
一篇五月修复 .venv 的运维文,现在看却指向了错误对象——因为 Hermes 的运行时架构已经从 .venv 迁到了 embedded 托管运行时。三条铁证 + 删残留安全四查,一次讲清。

Hermes 到底跑在 venv、.venv 还是别的?答案是「别的」,顺手清了 1.15G 残留
排查 Hermes 记忆系统的 SQLite 误报时(上篇《honcho 换 Holographic》提过),我一度以为生产正跑在一个会损坏数据的 SQLite 3.50.4 上,差点把 venv 重建到 3.14 去"彻底解决"。
结果逐解释器一测,发现我查错了对象。这篇把整个来龙去脉讲清楚:Hermes 现在到底跑在哪个 Python 上、为什么老文档会骗人、以及我最后怎么安全地把那堆闲置残留清掉的。
一、先给结论
现在的 Hermes(v0.22.3)既不是跑在 venv,也不是 .venv,而是跑在一个 embedded 托管运行时:~/.hermes/tools/python-3.14.7(Python 3.14.7 / SQLite 3.53.1)。
磁盘上其实有三种 Python 目录并存过:
| 目录 | Python | SQLite | 是谁 |
|---|---|---|---|
~/.hermes/tools/python-3.14.7(embedded) | 3.14.7 | 3.53.1 | ✅ CLI + gateway 真在跑 |
~/.hermes/hermes-agent/.venv | 3.11.15 | 3.50.4 | ❌ 闲置残留 |
~/.hermes/hermes-agent/venv(无点) | — | — | ❌ 闲置残留 |
hermes --version 报的是 Python: 3.14.7——不是 3.11。就这一条,足以说明生产不走 .venv。
二、为什么老文档会说「跑在 .venv」
我有一篇五月的运维文(《Hermes 环境配置与修复实录》),里面认认真真记录了怎么把 .venv 修好:补 pip、统一命名、uv sync --active。那篇文章在当时是对的——因为那是 v0.14.0 时代,Hermes 确实跑在 uv venv 建的 .venv(3.11.15)上。
但它现在过时了。 原因是架构变了。
三、架构变化:从「.venv 运行层」到「embedded 托管运行时」
- v0.14.0 时代:Hermes 源码装在
~/.hermes/hermes-agent,靠uv管理的.venv当 Python 运行层,hermes命令最终落到.venv的 python。 - v0.22.3(现在):Hermes 改用托管的 embedded 运行时
~/.hermes/tools/python-3.14.7。launcher 和 gateway 的 systemd 服务都直接指向它,不再经过.venv。第三方依赖(openai、numpy)也装进 embedded 运行时自己的site-packages。
所以那个"被五月修好的 .venv",在架构迁移之后就自动变成了没人用的残留。venv(无点)同理。
四、三条铁证(你也能自查复现)
hermes --version:Hermes Agent v0.22.3+13.g47b23fa · upstream 47b23fa0 Install directory: /home/oklife/.hermes/hermes-agent Python: 3.14.7 ← 关键:3.14.7,不是 3.11- gateway 活进程的
/proc/PID/exe:指向~/.hermes/tools/python-3.14.7…/bin/python3.14,不是.venv。 - CLI 启动链:整条链最终落在 embedded 3.14.7,和
~/.local/bin/hermes → exec ~/.hermes/hermes-agent/.hermes/bin/hermes .hermes/bin/hermes → exec ~/.hermes/tools/python-3.14.7…/bin/python3 -I -c ....venv无关。
(Desktop 端走它自带的 Electron 运行时,也不碰 .venv。)
五、对 SQLite 误报的影响
- 生产(CLI+gateway)在 embedded 3.14.7 / SQLite 3.53.1,WAL 正常、无损坏 bug。
- 那条"
3.50.4 有 WAL 损坏 bug、已降级 DELETE“的告警,只在我拿闲置的.venv(3.11.15)跑测试时才触发。 - 结论:生产记忆系统不用修 SQLite,那条是"查错了解释器"闹的。
六、处置:删掉两个闲置残留(安全四查 + 零影响)
先做安全四查,再 rm -rf,别裸删:
AG=~/.hermes/hermes-agent
# 1) 确认没有活进程从 .venv/venv 里跑
for p in $(pgrep -f hermes); do readlink /proc/$p/exe; done # 都不在 .venv/venv
# 2) 确认 embedded 自带依赖(不依赖 .venv)
~/.hermes/tools/python-3.14.7*/bin/python3.14 -c "import numpy, openai"
# 3) 留底
du -sh "$AG/.venv" "$AG/venv" # 485M + 667M ≈ 1.15G
# 4) 删除 + 删后验证
rm -rf "$AG/.venv" "$AG/venv"
hermes --version # 仍报 Python: 3.14.7 ✓
pgrep -f 'gateway run' # gateway 活体仍在 ✓结果:释放约 1.15G,hermes --version 仍报 3.14.7、gateway 活体正常,生产零影响。
注意:若你以后在源码树里做 dev(
uv sync),uv会按.python-version(3.14)自动重建.venv——删了不碍事,需要时会回来。
七、判断命令速查 + 口诀
hermes --version | grep Python # 最省事:看 hermes 自报的 Python
readlink /proc/$(pgrep -f 'gateway run' | head -1)/exe # 看活进程 exe 在哪个 python
which python; which pip; python -m pip -V # 看当前 shell 落在哪个环境(别看提示符)口诀:诊断 Hermes 运行时 / SQLite / 依赖,先定位 embedded 托管运行时(~/.hermes/tools/python-3.14.x),别拿 dev 的 .venv/venv 当靶子——它们和生产是两回事。
八、三句话带走
- 运行时架构会随版本迁移:
.venv(v0.14.0)→ embedded 托管运行时(v0.22.3)。老文档里的"环境位置"不保证还成立,引用前先看hermes --version的 Python 对不对得上。 - 目录名并存 = 误诊温床:
venv/.venv/tools/…并存极易把闲置目录当生产。修环境前先搞清楚"到底哪个在跑”。 - 删残留前四查(无活进程 / embedded 自带依赖 / 留底 / 删后验证),再动手
rm -rf。
梦行志