Hermes Agent 的记忆由两个小文件加一份可搜索的历史组成。 这两个文件都由 agent 自己管理:MEMORY.md(2,200 字符)存 agent 的笔记,USER.md(1,375 字符)存你的资料。两者在会话开始时加载进系统提示词。较早的对话存在 SQLite 里,需要时再搜索。还可以再加一个外部插件。
Hermes Agent 是 Nous Research 开发的开源(MIT)agent。它可以在终端、Hermes Agent 桌面版 或聊天应用里运行(所有入口共享同一份记忆),还能从自己的经验中创建可复用的技能。本页介绍它记忆的每一层、外部插件,以及记忆看起来不工作时该检查什么。细节来自官方 Hermes 记忆文档,2026 年 10 月核对。
Hermes Agent 的记忆是什么?
Hermes Agent 的记忆是一个有容量上限、会跨会话保留的精选存储。 agent 决定保存什么,通过 memory 工具把简短条目写入 MEMORY.md 和 USER.md。每次会话开始时,Hermes 把两个文件作为冻结的一块注入系统提示词。
这个设计刻意保持小巧。两个文件合计约 1,300 个 token,始终在上下文里。其他内容(完整对话记录、旧任务)在 agent 搜索之前都不进入提示词。这种"始终加载的记忆 + 按需召回"的分工,与 AI agent 记忆解释 中描述的相同。第一次用 Hermes?Hermes Agent 指南 介绍了安装、设置,以及每个记忆文件放在哪里。
Hermes 记忆的各层
| 层 | 位置 | 大小 | 何时在上下文中 |
|---|---|---|---|
| MEMORY.md | ~/.hermes/memories/ | 2,200 字符(约 800 个 token) | 每次会话,作为冻结快照 |
| USER.md | ~/.hermes/memories/ | 1,375 字符(约 500 个 token) | 每次会话,作为冻结快照 |
| 会话历史 | ~/.hermes/state.db(SQLite,FTS5) | 无上限,除非开启自动清理 | 仅当 agent 调用 session_search 时 |
| 技能 | 技能目录 | 每个技能不同 | 技能相关时 |
| 外部插件 | 取决于插件 | 取决于插件 | 每轮对话前预取 |
使用 profile 时,文件位于 ~/.hermes/profiles/<name>/memories/ 下。
MEMORY.md 和 USER.md
MEMORY.md 存 agent 的工作知识:环境事实、项目约定、工具的怪癖,以及有效的做法。USER.md 存你的信息:姓名、角色、时区、沟通风格、讨厌的事情和技术水平。文档建议跳过琐碎的事实、容易再查到的东西、原始数据堆,以及 SOUL.md 或 AGENTS.md 里已有的内容。
条目之间用 § 分隔。注入的内容带有一个用量标题(例如 67%,2,200 字符中用了 1,474 个),让模型知道存储有多满。
memory 工具
agent 用一个工具、三个动作编辑记忆:
- add:追加一个新条目。
- replace:用唯一的子串(
old_text)找到条目,然后覆盖。 - remove:删除匹配
old_text的条目。
没有读取动作,因为内容已经在提示词里。完全相同的重复条目会被拒绝。如果写入会超过上限,工具会返回错误并列出当前条目,agent 必须用一批操作既腾出空间又添加新条目。Hermes 从不自动压缩记忆。文档建议用量超过 80% 时整理一次。
每个条目在保存前都会扫描提示词注入、凭据外泄、SSH 后门和不可见的 Unicode 字符。这很重要,因为记忆是已知的攻击面,见 AI 记忆注入。
会话搜索
过去的 CLI 和聊天会话存在 ~/.hermes/state.db 里。session_search 工具对它们做全文搜索(SQLite FTS5),返回原始消息,agent 还可以翻阅找到的会话。hermes sessions list 可以在命令行里列出这些会话。这是 Hermes 对"我们上个月做了什么?“的回答:不存进记忆,但可以找回来。
一次搜索胜过更好的摘要。 第三方项目 hermes-jev-skills(2026 年 10 月约 1,100 个 GitHub 星标)在它自己的 7 次 Hermes 工作会话上测试了会话交接,每次用 15 道题的回忆测试。在其 评分表 中,让下一个会话多调用一次 session_search,对每种交接笔记都能把回忆率提高 20 到 33 个百分点。没有笔记、只搜索一次的会话(56.7%),胜过所有只读笔记而不搜索的情况。最好的笔记是根据整段对话、预算 1,200 字写成的:单独 58.7%,加一次搜索 75.0%;被它替换的 400 字笔记分别是 37.5% 和 68.3%。这些是作者自己在 7 个会话上的数字,不是独立基准。实际的经验是:让交接笔记写明旧会话的 id,方便下一个会话搜索,不要清理你可能还要找的会话。他们的 交接笔记 还提到,在 Hermes 0.21 上,同时传 query 和 session_id 时,session_search 会从头读取会话而忽略查询;应先用关键词搜索,再用 around_message_id 打开命中的位置。
这段历史只有在它还存在时才找得到。默认情况下 Hermes 保留所有会话,而 会话文档 警告 state.db 会"无限增长”,网关和定时任务的安装中有多 GB 的报告。自动清理默认关闭(v0.22.3,2026 年 10 月 21 日改回需手动开启):
1sessions:
2 auto_prune: true # delete ended sessions past retention_days, at startup
3 retention_days: 90 # default
只删除已结束的会话,按最后活动时间计算,清理最多每天运行一次。如果 config.yaml 没有 auto_prune 项,而且存放 state.db 的磁盘空间不足(可用少于 2 GB,或可用低于 10% 且少于 20 GB),Hermes 会问一次;用 /autoprune on、/autoprune off 或 /autoprune later 回答。要做一次性清理,可以用 hermes sessions prune --older-than 30(加 --dry-run 先预览),hermes sessions optimize 会压缩文件但不删除任何内容。对记忆来说的代价是:被清理的会话会从 session_search 消失,所以超过 retention_days 仍需保留的内容,必须放进 MEMORY.md、技能,或外部插件(插件会保存自己的副本)。
后台审查和写入审批
一次对话结束后,后台审查可以更新记忆和技能。它默认开启(auxiliary.background_review.enabled),默认使用主模型,输入上限为模型上下文窗口的 75%(最多 600,000 个 token)。如果你想审批写入,设置 memory.write_approval: true;待写入的内容会出现在 /memory pending 下,可以批准或拒绝。
从 v0.22.6 起,审查只保存对话支持的事实:每条事实都必须有用户消息或工具结果作为依据。之前,一次性的"把那个改短一点"会在 3 次测试中 3 次变成长期的"用户偏好简洁的回答";现在是 3 次中 0 次,而你明确说出的事实(“始终用摄氏度,记住这个”)和调试时发现的环境事实仍会保存(PR #80788,作者用一个故意较弱的模型做的 A/B 测试)。明确说出的长期喜好或厌恶(“不要再做 Y”)仍会保存。
配置 Hermes 记忆
设置保存在 ~/.hermes/config.yaml:
1memory:
2 memory_enabled: true
3 user_profile_enabled: true
4 memory_char_limit: 2200
5 user_char_limit: 1375
6 write_approval: false
7 # provider: honcho # optional external provider
如果同时关闭 memory_enabled 和 user_profile_enabled,memory 工具会被完全移除。你可以调高字符上限,但每个字符每轮都要付费,所以更大并不免费。
/journey 命令(也可以用 hermes journey)显示技能和记忆条目的时间线,hermes journey delete <node> 可以删除一条。
外部记忆插件
Hermes 可以在内置文件之外同时运行一个外部插件。启用后,Hermes 会在每轮对话前预取相关记忆,每次回复后同步对话,在支持的情况下于会话结束时提取记忆,并把内置记忆的写入同步到插件。记忆插件页面 截至 2026 年 10 月列出了九个:
| 插件 | 功能(据 Hermes 文档) | 托管方式 | 工具数 |
|---|---|---|---|
| Honcho(Plastic Labs) | 跨会话的用户建模,带辩证推理 | 云端或自托管 | 5 |
| OpenViking(火山引擎) | 带文件系统式层级的上下文数据库 | 自托管(AGPL-3.0)或火山引擎云 | 6 |
| Mem0 | LLM 事实抽取,语义搜索和去重 | 云端、自托管或进程内 | 4 |
| Hindsight(Vectorize) | 带知识图谱和实体解析的长期记忆 | 云端、嵌入式 Postgres 或本地服务器 | 3 |
| Holographic | 本地 SQLite 事实库,带 FTS5、信任评分和 HRR 代数 | 仅本地 | 2 |
| RetainDB | 带混合搜索的云记忆 API | 云端(标价每月 20 美元) | 10 |
| ByteRover | 本地优先的记忆,通过 brv 命令行工具 | 本地,可选云同步 | 3 |
| Supermemory | 带用户画像召回的语义长期记忆 | 云端或自托管 | 4 |
| Memori(Memori Labs) | 结构化长期记忆 | Memori Cloud | 5 |
插件正在从 Hermes 代码树中移到各自维护者的仓库。Holographic 以前内置在代码树中,现在由 itpartypattaya 维护(itpartypattaya/hermes-plugin-holographic),通过同名的插件目录安装,设置和数据库保持不变。RetainDB 和 ByteRover 将于 2026 年 10 月 15 日移出核心,文档说它们的独立仓库"无人维护,欢迎新的维护者",也没有列出目录安装命令。Honcho、OpenViking、Mem0、Hindsight、Holographic 和 Supermemory 用 hermes plugins install <name> 安装;Memori 使用它自己的 hermes-memori 命令行工具。Holographic 使用全息约简表示,在 用于 AI agent 的全息记忆 中有解释;Honcho LLM 记忆 有专门的页面。
如果你用的插件不再随 Hermes 一起发布,不必手动重新安装。据文档,hermes update 会为每个指定了它的 profile 安装其目录插件(桌面版首次启动时也会这样做),插件名、设置、数据目录和工具都保持不变。如果安装无法完成(离线、被拒绝,或 security.allow_lazy_installs: false),Hermes 会打印准确的 hermes plugins install <name> 命令。
插件能看到什么。 Hermes 会把每一轮的内容交给插件:包括工具输出在内的完整对话记录、召回查询、会话结束和压缩前的对话记录、同步的记忆写入、委派结果,以及插件自己工具的参数。所有内容先经过 Hermes 用于聊天投递的同一套密钥清理,即使设置了 security.redact_secrets: false,因此工具输出中回显的 API 密钥会在插件保存前被遮盖。文档还有一个限制:没有可识别格式的凭据(例如任意密码)不会被检测到。如果这很重要,请选择你能自托管的插件。
OpenViking 发布过一项针对 Hermes 自带记忆的测试。在其 2026 年 5 月的基准文章中,Hermes 使用原生记忆在 LoCoMo 上得分 33.38%,使用 OpenViking 时为 82.86%,输入 token 减少 34.3%。这些是 OpenViking 自己的数字,没有写明评判模型,并且比较的是 Hermes 那 1,300 个 token 的文件,而不是其他插件。OpenViking 的 Hermes 设置提供快速本地服务器或火山引擎的托管服务;记忆要等后台抽取完成后才会出现,详见 OpenViking agent 记忆。
这些插件如何安装、更新并在每轮对话中接入,以及 v0.23.0 中插件目录里 79 项 Memory 分类,见 Hermes Agent 插件。
每个插件的设置方式相同:
1hermes plugins install honcho # or mem0, hindsight, supermemory, openviking
2hermes memory setup # interactive picker and credentials
3hermes memory status # confirm which provider is active
4hermes memory off # disable the external provider
Hermes Agent 最好的记忆插件
没有唯一的最佳选择,取决于 agent 必须记住什么。Hermes 的插件文档 也没有推荐某一个,但说明了各自的特点(2026 年 10 月 28 日核对):
| 你需要 | 选择 | Hermes 文档说的特点 | 运行位置 |
|---|---|---|---|
| 几个月的历史,记忆合并成结论 | Hindsight | hindsight_reflect “提供其他插件都没有的跨记忆综合” | 云端、嵌入式 Postgres 或本地服务器 |
| 跨会话的用户模型 | Honcho | “带辩证推理的跨会话用户建模” | 云端或自托管 |
| 不用手动管理的记忆 | Mem0 | 最适合"免手动的记忆管理":Mem0 自己做抽取 | 云端、自托管服务器或进程内 |
| 数据不离开本机,不需要额外服务 | Holographic | 最适合"仅本地记忆……没有外部依赖" | 本地 SQLite |
| 把召回的记忆排除在存储内容之外 | Supermemory | “自动上下文围栏"把召回的记忆从捕获的对话轮次中剥离 | 云端或自托管 |
| 文件系统式的上下文存储 | OpenViking | 带文件系统层级的上下文数据库 | 自托管或火山引擎云 |
| 除两个文件外不需要别的 | 不用插件 | 内置记忆始终开启 | 本地文件 |
如果你关心的是对用户建模,选 Honcho;想要托管的事实库、设置又少,选 Mem0 或 Supermemory;想把记忆整理成有证据支持的观察,并能调用 reflect,选 Hindsight;如果任何数据都不能离开本机,选 Holographic(或 Hindsight 的嵌入式 Postgres)。在 RetainDB 或 ByteRover 重新有人维护之前,不要新建在它们上面的配置。Mnemosyne 是单文件的 SQLite 记忆,Hermes 文档把它列为目录插件(hermes plugins install mnemosyne),也是一个本地选项,见 Mnemosyne 与 Hindsight 对比。如果内置的两个文件已经够用,就完全不用插件;插件会增加 LLM 调用和一个依赖。
九个插件中,Hindsight 和 Mem0 是仅有公开正面对比数字的两个。在 Mem0 自己的对比页上,两者在 LongMemEval(94.6 对 94.4)和 LoCoMo(92 对 92.5)上基本持平;在长历史的 BEAM 测试中,Hindsight 领先:1M token 时 73.9 对 64.1,10M token 时 64.1 对 48.6(均为厂商自测)。对于运行数月的 Hermes agent,这一点很重要。Hermes 文档还说,Hindsight 的 hindsight_reflect 工具"提供其他插件都没有的跨记忆综合”。Hindsight 是 MIT 许可,自托管服务器包含全部功能,并且可以通过 Ollama、LM Studio 或 llama.cpp 使用本地模型,所以在数据不能离开机器时也能用。代价是:Hindsight 服务器在默认设置下,每次检索返回的上下文比 Mem0 多(按 Mem0 的测量,24K 到 44K 对比 7K 以下的 token)。Hermes 插件把这个值限制在每轮 4,096 个 token(recall_max_tokens),并且按 Hindsight 的 Hermes 集成文档,默认只召回已整理的观察;由于 Hermes 每轮都会预取召回,如果你在意提示词成本,请调低这个上限。每次写入还要调用 LLM,所以写入比本地 FTS 存储更贵。详见 Mem0 与 Hindsight 对比。
Hindsight v1.2.0(2026 年 11 月 3 日)根据其 PR 修复了 Hermes 插件的主要缺口:
| v1.2.0 之前的问题 | 现在 | PR |
|---|---|---|
| 自动保存失败(服务器宕机、超时、5xx)后只记日志并丢弃 | 保留,并在下一次保存前和退出时重发,最多 5 次,不会重复存储。失败的保存暂存在内存中,因此服务器宕机时崩溃仍会丢失它们 | #6013 |
| 服务器已接受、随后失败的保存被计为完成 | 会被监控直到结束;失败的会在服务器上重试,最多 3 次 | #6013 |
Kanban 工作者和 delegate_task 子 agent 的内容被存入记忆库 | 跳过,与定时任务相同 | #6000 |
| Windows 上使用中文、日文或韩文区域设置时插件无法加载 | 可以加载 | #6000 |
Hermes Docker 镜像中插件找不到 uvx | 可以找到 | #6000 |
同一版本给 Hindsight 的 OpenClaw 插件提供了相同的三个工具,所以同一个记忆库可以同时被两个 agent 使用,见 OpenClaw 与 Hermes Agent 记忆对比。
Hermes v0.23.0 的记忆变化
v0.23.0(2026 年 11 月 5 日)是完整版本,记录了 v0.22.1 到 v0.22.7 的补丁,因此下面 v0.22.6 表格中的内容也包含在其中。以下是那些未在其中说明的记忆相关改动,来自发布说明和 PR 内容:
| 改动 | 之前 | v0.23.0 中 | 来源 |
|---|---|---|---|
| 每个 profile 一个 gateway | CLI、TUI、桌面版、编辑器、机器人和定时任务各自可以运行一个 agent,并同时写入同一段对话的 state.db,导致消息被写两次或丢失 | 一个 gateway 进程管理该 profile 的会话;每个入口都接入它,每个会话只有一个队列和一个写入者 | 发布说明,#106742 |
| 压缩摘要 | “可能"之类的猜测常被丢掉,所以压缩后猜测会作为事实回来 | 每份摘要都有"未验证 / 工作假设"一节,每个不确定的论断占一行 UNVERIFIED: <claim> — <basis>;按 PR 的测试,每次摘要调用多约 79 个提示词 token | #86019 |
| 压缩后的技能 | 只有超过 5,000 字符的技能正文会留下"重新加载"提示,较小的技能会悄悄消失 | 每个被压缩掉的技能都会留下重新加载标记 | #138428 |
| 记忆的插件钩子 | 插件会收到 on_pre_compress,但压缩后或会话被删除时没有信号 | 每次压缩完成后触发一次 post_compaction,插件可以重新注入被摘要掉的内容;on_session_delete 在删除、归档和清理时触发(不保证恰好一次) | #141017,#140995 |
| 插件目录中的 Memory 分类 | 67 项(10 月 21 日) | v0.23.0 标签时 79 项,全部为 community 级别;新增的有 Mnemoverse、post-cortex、Membase、conxt、Inspeximus 和 nyx | 我们统计的 plugin-catalog/ 标签内容 |
最明显的变化是单一 gateway。之前,同一个聊天如果在两个地方打开,可能有两个 agent 同时写入同一段历史,重复或丢失的消息就是这样来的。现在,在任何地方打开的聊天都是同一段对话、只有一个写入者,所以 session_search 读到的是一份干净的历史。UNVERIFIED: 行对长会话很重要:agent 在压缩前做的猜测,不会再作为它"记得"的事实回来。插件方面的更多内容见 Hermes Agent 插件。
Hermes v0.22.6 的记忆变化
v0.22.6(2026 年 11 月 2 日)是一个汇总了 776 个已合并 PR 的补丁版本;v0.23.0 后来完整记录了它。下面的记忆改动都已对照 PR 核实,并确认在 v0.22.6 标签中:
| 改动 | 之前 | 现在 | PR |
|---|---|---|---|
| 后台审查 | 从一次性请求和随口的评论中猜测偏好 | 只保存有用户消息或工具结果支持的事实 | #80788 |
| Kanban 工作者 | 工作轮次被当作操作者本人的内容发给记忆插件,于是 “work kanban task t_…” 被存成关于你的事实 | 工作轮次带有 kanban:dispatcher 作者标记 | #144861 |
调低 memory_char_limit / user_char_limit | 超过新上限的条目会阻止所有替换和删除,直到你手动编辑文件 | 删除可以进行(会先做 .bak 快照);只有增加文字的写入会被拒绝 | #144240 |
hermes update 关闭了插件 | memory.provider 被清空,Hermes 悄悄回退到内置记忆 | 保留插件设置,之后的更新在插件适配时重新开启;hermes memory status 和 hermes doctor 会说明插件已关闭 | #144257 |
| 桌面版和控制台的记忆页面 | 只显示 MEMORY.md / USER.md,所以正在工作的插件看起来没有启用 | 显示当前启用的插件及其就绪状态,并把两个文件标注为始终开启的内置层 | #145574 |
| 压缩 | 压缩触发时才写摘要(相关 issue 中的中位停顿为 184 秒) | 可选的 compression.prepare_ahead: true 在接近触发点时后台写摘要;如果记忆插件会添加压缩上下文,它在第一次压缩后自动关闭 | #144684 |
| 技能 | agent 可以改写任何技能 | hermes curator lock <skill> 阻止所有 agent 写入该技能的路径;见 Hermes Agent 技能 | #147557 |
对"Hermes 记住了错误的东西"这一问题最重要的两项是:审查不再凭空编造偏好;Kanban 运行不再污染外部插件中的你的资料。如果你在 v0.22.6 之前用某个插件运行过 Kanban,请检查其中是否有被当作关于你的事实保存的任务笔记。
Hermes 记忆不工作:检查什么
大多数"Hermes 忘了"的报告来自少数几个原因:
- 快照是冻结的。 写入会立即保存到磁盘,但只在下一次会话才出现在提示词中。运行
/new重新加载。消息网关(Telegram、Discord)会一直是一个长会话,直到你重置它。 - 存储已满。 达到 2,200 或 1,375 字符后,新增会失败,直到 agent 整理。在标题处或直接打开文件查看用量。
- 记忆被关闭。 在
config.yaml中确认memory_enabled和user_profile_enabled,并确认memory没有出现在agent.disabled_toolsets里。 - 写入在等待审批。 设置了
write_approval: true时,在你于/memory pending下批准之前,什么都不会写入。 - profile 不对。 每个 profile 有自己的记忆目录。
- 这个细节本来就不是记忆。 长的任务历史属于会话搜索,所以让 agent 搜索过去的会话。如果开启了自动清理,超过
retention_days的会话已经没了。 - 插件出问题。 运行
hermes memory status。同一时间只能启用一个插件,云端插件需要它们的凭据(例如 RetainDB 从~/.hermes/.env读取RETAINDB_API_KEY)。从 v0.22.6 起,那里显示的Plugin: turned off表示某次更新停用了该插件;启动提示会给出原因,hermes plugins enable <name>可以重新开启。
Hermes 与其他 agent 的比较
Hermes 的内置记忆最接近 OpenClaw 的 Markdown 文件和 Claude Code 的自动记忆:纯文本、体积小、启动时加载。不同之处在于严格的字符上限和冻结快照。Hermes 还可以导入其他 agent 的记忆。从 v0.22.5 起,这是官方的 agent-importers 插件(hermes plugins install agent-importers,然后 hermes import-agent),全新的 hermes setup 在发现 ~/.openclaw、~/.claude、~/.codex 或 ~/.cursor 时会提供它。OpenClaw 的 MEMORY.md、USER.md 和每日笔记会合并进 Hermes 记忆;Claude Code 的 CLAUDE.md、Codex 的 AGENTS.md 和 memories/*.md,以及 Cursor 的规则,会变成 MEMORY.md 中的条目。每次导入都会先显示预览,hermes import-agent --sync 会拉取之后的变化(Hermes 文档)。大批量导入后请检查 MEMORY.md:memory 工具把它限制在 2,200 字符,而一份很长的 CLAUDE.md 本身就可能超过这个数。并排对比见 OpenClaw 与 Hermes Agent 记忆对比。