CASE 04

Hindsight 记忆后端 — 一次失败背后的三层根因

记忆功能不可用却叠加了三个互不相关的故障:依赖版本互相冲突且不可解;Windows GBK 把 plugin.yaml 读坏;环境变量文件也被写成了 GBK。修复不是强装依赖,而是换上游版本 + 一行 UTF-8 补丁 + 只修编码。

类别
根因诊断 / 依赖工程
时间跨度
2026-10-17 修复
技术栈
Hermes 插件 1.0.1 → 1.2.3 · PG 379 MB
状态
通过 memory status / doctor / 新会话 recall 验收

三件毫不相关的事

根因 1 · 依赖无解

不能靠强装

插件 1.0.1 要把整套 hindsight-all 装进固定环境:hindsight-api-slim 需要 protobuf>=7.35.1、otel>=0.65b0——都与 mem0ai / modal、mistralai 的既有约束硬冲突。Hermes 0.22.2 还把旧的自动补装 API 退休成报错 shim。这条路是数学上不可能的,不是「再试一次」能解决的。

根因 2 · GBK

读插件的 yaml 就失败

1.2.3 解决了依赖冲突,但随即暴露第二层:
_plugin_version() 读 plugin.yaml 没指定 encoding,中文 Windows 默认 GBK → 插件注册直接失败。

根因 3 · GBK 又一次

env 文件也坏了

profiles\hermes.env 是 09-27 由默认编码进程写入的 GBK 文件,而 hindsight-embed 按 UTF-8 读 → daemon 无法启动。

修复策略

最小变更,不动依赖图

①升级插件到 1.2.3(服务器移出进程,从依赖困境中脱困)②在 __init__.py:94 加一行 encoding="utf-8" 补丁 ③env 只改编码不改内容(备份在 hermes.env.bak-gbk-…) ④Gateway 优雅重启一次。

验收 · 不是「好像好了」
  • hermes memory status = installed ✓ / available ✓
  • hermes doctor = hindsight provider active
  • 新会话直连 daemon 并成功 recall 既有记忆(~/.pg0 379 MB 数据完好)
工程判断

面对三层故障,最贵的动作其实是「全推倒重来」。这里选择「分清层次、每层取最小修复」——所以有回滚、不赌博、不需要 --force。

← Pi Bridge — 多 Agent 委派的协议工程OPS_SAFETY v1.1 — 给「AI 运维 AI」写一份权限规范 →