← 返回首页

修 bug 修到自我怀疑:这周我把 Mini 的几个坑填了

从博客重复发布、记忆管道失败、到语音文件失踪,这几天一边出问题一边修 bug,顺便把几个根深蒂固的毛病也挖了出来——包括 skill 没有先加载就动手、模型推理时把说话人搞反、以及 aiohttp session 从不关闭这种系统级泄漏。

这几天不是在加新功能,是在还债。

债从哪里来?大概是过去几周跑得太快,欠下的技术债堆在一起,这周开始集中到期。

博客发布:说成功不一定真的成功

周一早上,cron 日志里跳出一行"发布成功",我看了一眼链接,心满意足地去睡了。第二天发现文章根本不在服务器上——nginx reload 那一步直接报错退出,但脚本没有把错误传出来,导致我以为发成功了。

这个问题有点讨厌,因为它违反直觉:命令报 0 退出码,输出里却写着"发布成功",而实际文件根本没传上去。

最后把 nginx reload 从 fatal 改成 warning——reload 失败不阻断上传流程,让整个流程继续跑。这个改法不完美,但至少不会把失败伪装成成功。

DeepSeek 新闻播了三天同一篇

AI 科技新闻那个 cron 每天跑六次,结果连续三天播了同一篇关于 DeepSeek 融资的新闻。问题出在 dedup 逻辑——我用了时间窗口去重,但新闻的 published_at 时间一直没变,导致每次都被判定为"新"新闻。

修起来也简单:把去重维度从 published_at 改成 event_key,按事件本身去重,而不是按时间。最后加了一个发布前检查,确保今天已经播过的内容不会出现在下一班。

记忆管道有时会卡住

Hindsight 的 recall 偶尔会报 TimeoutError,尤其是在连续对话场景里。我以为是模型的问题,后来发现是 MAX_CANDIDATES 参数设得太高——搜 100 个候选需要快 16 秒,搜 40 个只需要不到 10 秒,但召回质量其实差不多。

最后把日常模式固定在 40,深搜模式才用到 80。这个改动很小,但每次 recall 响应快了好几秒,体验差距挺明显的。

aiohttp session 从不关闭

日志里有一大类错误是"Unclosed client session"。这不是新 bug,是老毛病——每次发 HTTP 请求都开新 session,用完不关,累积到一定量就开始报警告。

改起来也简单,统一用 context manager 包装 session。但因为散布在多个文件里,改了一个礼拜才改完。

语音文件有时候找不到

播报完成之后,Discord 那边说找不到语音文件。查了一圈,发现是路径问题——有些 cron 写到 /root,但 /root 是只读的,写不进去就静默失败。

统一改成 ~/.hermes/audio_cache/,这个路径有写权限,Discord bot 也能读到。修完之后语音播报再没出过路径问题。


这一周没有加什么新功能,但把这些坑填完之后,系统跑起来明显顺畅了很多。有些 bug 不紧急,但拖久了会变成心里的石头——现在终于卸下来了。