ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Hermes Agent 从入门到精通:自托管 AI 智能体的持久记忆实战

Hermes Agent 从入门到精通:自托管 AI 智能体的持久记忆实战 1. 为什么自托管 AI 智能体总在“失忆”Hermes Agent 持久记忆到底解决什么问题如果你玩过一段时间自托管 AI 智能体大概率遇到过这种尴尬昨天刚跟它聊完项目架构今天开新会话它一脸茫然地问你“请问你想做什么”。这不是模型笨而是大多数 Agent 框架把会话当成一次性请求——请求结束上下文清空记忆归零。Hermes Agent 是 Nous Research 开源的一个自托管 AI 智能体MIT 协议核心卖点就是持久记忆和自动技能沉淀。它不像 IDE 里的代码补全插件也不是套壳聊天机器人而是跑在你服务器上、跨会话记住你偏好和项目背景的长期助手。适合谁适合想搭一个 7×24 小时在线、越用越懂你的个人 Agent 的开发者尤其是预算有限、又不想被某一家模型锁死的场景。我这次要跑通的目标很明确从零部署一个 Hermes Agent 实例让它具备跨会话记忆并且通过 TaoToken 统一 Key/API 通道接入模型省去在多个模型提供商之间来回切换 Key 的麻烦。整篇会给出可复制的环境配置、记忆存储参数、验证对话连续性的具体命令以及我踩过的报错排查。先说清楚持久记忆在 Hermes 里的三层结构不然后面配置容易懵。第一层是人格文件SOUL.md定义 Agent 的行为准则和风格第二层是长期记忆MEMORY.md存项目信息、决策记录、经验第三层是用户画像USER.md记录你的偏好和习惯。这三个文件都在~/.hermes/目录下完全本地化零遥测。Agent 在接近 token 上限时会自动合并相似条目、删除过时信息硬上限大约 1300 tokensMEMORY.md 约 800USER.md 约 500。这个设计思路是“精准少量记忆”优于“模糊大量记忆”。除了文件层Hermes 还有跨会话回溯能力底层用 SQLite FTS5 全文搜索引擎上层用 LLM 摘要索引。也就是说即使某条信息没被写进 MEMORY.md你也能通过历史会话检索把它捞回来。再往上还可以接 Honcho 这种 AI 原生记忆后端做辩证推理和深度用户建模——这部分属于进阶本文先把内置记忆跑通。理解了这个结构你就明白为什么单纯“换个模型”解决不了失忆问题记忆不在模型里而在 Agent 的存储层。接下来进入部署。2. 部署前的前置准备用 TaoToken 统一 Key 接入 Hermes Agent 模型通道Hermes Agent 支持 18 模型提供商包括 OpenAI、Anthropic、DeepSeek、Kimi、Qwen、OpenRouter、Ollama 等。但如果你每个提供商都单独申请 Key、单独配环境变量管理成本会很高尤其是想让 Agent 在不同任务间切换模型时。我的做法是用 TaoToken 作为统一 API 通道一个 Key 覆盖多家模型Hermes 侧只需要配一个 OpenAI 兼容端点。TaoToken 的 API 地址是https://taotoken.net/api兼容 OpenAI 的chat_completions接口格式。Hermes 的 provider 解析逻辑里支持任意 OpenAI 兼容端点所以接入很直接。你需要先去控制台创建一个 API Key地址是https://taotoken.net/console然后在 API Keys 页面生成。生成后先别关页面后面配置要用。这里有个关键点Hermes 的模型配置走的是hermes model命令或直接改配置文件。我推荐直接改配置文件因为可复制、可版本管理。Hermes 的配置目录在~/.hermes/主配置文件是config.toml部分版本是config.yaml以你安装后的实际文件为准。模型相关的配置项包括 provider、base_url、api_key、model 四个字段。在配之前先确认你的环境。Hermes 官方安装脚本会自动处理 uv 包管理器、Python 3.11、克隆仓库和初始配置无需 sudo。Linux / macOS / WSL2 下执行curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bashWindows PowerShell 下iex (irm https://hermes-agent.nousresearch.com/install.ps1)安装完成后刷新 shell 环境source ~/.bashrc # 或 source ~/.zshrc然后跑一次诊断确认基础依赖没问题hermes doctorhermes doctor会检查 Python 版本、依赖完整性、配置目录权限、数据库可写性等。如果这一步报错先别急着配模型把环境问题解决掉。常见的输出会列出每一项的 OK/FAIL 状态FAIL 项后面通常带修复建议。接下来是配置 TaoToken 通道。我建议用环境变量存 Key配置文件里引用避免 Key 明文散落在多个文件。在~/.hermes/.env里加一行TAOTOKEN_API_KEYsk-你的实际Key注意.env文件权限设成 600避免其他用户读到chmod 600 ~/.hermes/.env然后在~/.hermes/config.toml里配置 provider。下面是我实测可用的片段路径和字段名以你本地文件为准如果已有[model]段就合并不要重复[model] provider openai base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY model claude-sonnet-4-20250514 api_mode chat_completions这里几个字段解释一下。provider填openai是因为 TaoToken 走 OpenAI 兼容协议base_url是 TaoToken 的 API 根地址注意不要带末尾斜杠api_key_env指向环境变量名Hermes 启动时会自动读取model填你想用的模型 IDTaoToken 支持的模型 ID 以控制台模型列表为准api_mode指定chat_completionsHermes 还支持codex_responses和anthropic_messages两种模式但走统一通道时用chat_completions最稳。如果你更习惯用命令行配置等价操作是hermes config set model.provider openai hermes config set model.base_url https://taotoken.net/api hermes config set model.api_key_env TAOTOKEN_API_KEY hermes config set model.model claude-sonnet-4-20250514 hermes config set model.api_mode chat_completions配完后用hermes model查看当前生效的模型配置确认没有拼写错误。这一步是整个接入的地基配错了后面所有对话都会失败所以多花两分钟核对。3. 可复制配置Hermes Agent 记忆存储参数与 settings 片段模型通道配好后重点转向记忆系统。Hermes 的记忆存储默认就在~/.hermes/下但有几个参数需要显式配置否则跨会话记忆可能不按预期工作。这一节给出可直接复制的配置片段包括记忆文件路径、上下文注入参数、会话持久化设置。先看目录结构。安装后~/.hermes/大致长这样~/.hermes/ ├── config.toml # 主配置 ├── .env # 环境变量含 API Key ├── SOUL.md # Agent 人格 ├── MEMORY.md # 长期记忆 ├── USER.md # 用户画像 ├── hermes_state.db # SQLite 会话数据库 ├── skills/ # 技能目录 └── plugins/ # 插件目录SOUL.md、MEMORY.md、USER.md这三个文件如果不存在Hermes 首次运行会自动创建空模板。你可以手动编辑它们来塑造 Agent 行为。我的建议是初始化时就把USER.md写清楚比如你的技术栈、常用语言、工作习惯这样第一次对话它就有基础认知。记忆相关的配置项在config.toml的[memory]段。下面是我用的片段[memory] enabled true provider builtin memory_file ~/.hermes/MEMORY.md user_file ~/.hermes/USER.md soul_file ~/.hermes/SOUL.md max_memory_tokens 800 max_user_tokens 500 auto_compress true compress_threshold 0.9 recall_mode hybrid session_db ~/.hermes/hermes_state.db fts_enabled true逐项说明。provider builtin表示用内置记忆系统不接 Honchomax_memory_tokens和max_user_tokens控制两个文件的 token 预算超过就触发压缩auto_compress true开启自动压缩compress_threshold 0.9表示用到 90% 预算时开始合并recall_mode hybrid是混合检索模式兼顾上下文注入和工具检索fts_enabled true开启 SQLite FTS5 全文索引这是跨会话回溯的基础。如果你后面想接 Honcho 做辩证推理把provider改成honcho再加一段[memory.honcho] api_key_env HONCHO_API_KEY context_cadence 1 dialectic_cadence 2 dialectic_depth 1 recall_mode hybrid session_strategy per-directorycontext_cadence是基础上下文刷新频率轮dialectic_cadence是辩证推理频率推荐 1-5 之间dialectic_depth是每次辩证的推理轮数1-3 之间。session_strategy per-directory表示会话按工作目录映射这样你在不同项目目录下对话记忆是隔离的。会话持久化配置在[session]段[session] backend sqlite db_path ~/.hermes/hermes_state.db fts_table session_fts lineage_tracking true atomic_write truelineage_tracking true开启会话血缘追踪跨压缩的父/子关系会被记录这样即使上下文被压缩历史链路还能追溯。atomic_write true保证并发写入时的原子性多平台网关同时写入时不会损坏数据库。还有一个容易忽略的点上下文压缩器配置。Hermes 用有损摘要压缩控制 token 消耗配置在[context]段[context] compressor lossy_summary max_context_tokens 32000 compress_at 0.85 preserve_recent_turns 6max_context_tokens按你用的模型上下文窗口设compress_at 0.85表示用到 85% 时触发压缩preserve_recent_turns 6保留最近 6 轮不压缩保证近期对话连贯。配完这些跑一次配置校验hermes config validate如果输出所有项 OK说明配置语法和路径都没问题。这一步别跳过配置文件里一个拼写错误就可能导致记忆不落盘而表面上看对话还是正常的排查起来很费时间。4. 验证请求确认 Hermes Agent 跨会话记忆真的生效配置写完不代表记忆就生效了必须做端到端验证。这一节给出具体的验证步骤包括单会话内记忆写入、跨会话记忆读取、以及用 FTS5 检索历史。整个过程用 CLI 完成不需要接消息网关。第一步启动一次对话让 Agent 记住一个特定信息。执行hermes进入交互式界面后输入一句带明确事实的话比如我的项目用 Rust 写后端数据库是 PostgreSQL 16部署在 2 核 2G 的 VPS 上。等它回复后再补一句让它确认记忆请把你刚才了解到的我的项目信息复述一遍。如果它准确复述了 Rust、PostgreSQL 16、2 核 2G 这些点说明当前会话内上下文注入正常。但这只是会话内记忆还不算持久化。退出对话/exit第二步检查MEMORY.md和USER.md是否被写入。执行cat ~/.hermes/USER.md cat ~/.hermes/MEMORY.md正常情况下USER.md里会出现类似“用户后端使用 Rust数据库 PostgreSQL 16”的条目MEMORY.md里可能出现项目部署环境记录。如果两个文件都是空的说明自动记忆写入没触发回去检查[memory]段的enabled和auto_compress配置。第三步开一个全新会话验证跨会话读取hermes新会话里直接问我的后端用什么语言写的如果它答出 Rust说明跨会话记忆生效了。这一步是关键验证点——很多框架在会话内表现正常一开新会话就失忆Hermes 的内置记忆系统就是为解决这个设计的。第四步验证 FTS5 历史检索。即使某条信息没进 MEMORY.md也应该能通过全文检索捞回来。在对话里输入/search PostgreSQL或者用斜杠命令查看会话洞察/insights/insights会展示当前会话的 token 使用、记忆命中情况、技能调用统计。如果 FTS5 索引正常搜索历史关键词应该能返回之前对话的片段。第五步验证技能自动创建。Hermes 在完成 5 次以上工具调用的复杂任务后会自动评估是否值得沉淀为技能。你可以故意让它做一个多步任务比如帮我查一下当前目录下所有 .toml 文件统计每个文件的行数然后按行数排序输出。这个任务会触发文件读取、统计、排序等多个工具调用。任务完成后检查技能目录hermes skills ls ~/.hermes/skills/如果出现新的SKILL.md说明自动技能创建生效了。打开看看内容通常包含触发条件、执行步骤、注意事项。第六步验证会话数据库。执行sqlite3 ~/.hermes/hermes_state.db .tables应该能看到会话表和 FTS 索引表。再查一下会话数量sqlite3 ~/.hermes/hermes_state.db SELECT COUNT(*) FROM sessions;如果数字大于 0说明会话持久化正常。这一步能帮你确认底层存储没出问题尤其是多平台网关场景下会话血缘追踪依赖这个数据库。走完这六步一个具备跨会话记忆的 Hermes Agent 实例就算跑通了。接下来是排错环节这些是我实际遇到过的报错。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 报错怎么解接入和验证过程中报错基本集中在模型通道和记忆存储两块。这一节按真实报错逐条给排查路径每条都附上我实际见过的错误信息和解决方式。报错一401 UnauthorizedError: 401 Unauthorized - invalid api key这个最常见原因通常是 Key 没读到或读错。排查顺序先确认~/.hermes/.env里TAOTOKEN_API_KEY的值没有多余空格和引号再确认config.toml里api_key_env填的是TAOTOKEN_API_KEY而不是别的名字然后确认 Hermes 启动时确实加载了.env。可以用这条命令验证环境变量是否可见hermes config get model.api_key_env env | grep TAOTOKEN如果env里没有说明.env没被加载检查文件路径和权限。还有一种情况是 Key 本身失效去 TaoToken 控制台https://taotoken.net/api-keys重新生成一个。报错二local proxy failedError: local proxy failed - connection refused这个报错通常出现在你本地配了某个转发层但 Hermes 连不上。注意Hermes 直连https://taotoken.net/api即可不需要任何本地转发。如果你之前配过HTTP_PROXY或HTTPS_PROXY环境变量先清掉unset HTTP_PROXY unset HTTPS_PROXY然后确认base_url拼写正确没有多余路径。用 curl 直接测通道连通性curl -s -o /dev/null -w %{http_code} https://taotoken.net/api返回 200 或 401 都说明网络可达401 是没带 Key 的正常响应。报错三reading choices 相关错误Error: reading choices: unexpected end of JSON input这个报错说明 Hermes 收到了响应但解析choices字段失败。常见原因是api_mode配错了。走 TaoToken 统一通道时必须用chat_completions如果你误配成anthropic_messages响应结构对不上就会报这个。检查hermes config get model.api_mode确保输出是chat_completions。另外确认model字段填的模型 ID 在 TaoToken 支持列表里填错模型 ID 有时会返回非标准错误体也会触发解析失败。报错四OAuth 相关报错Error: OAuth token expired - please re-authenticate这个报错一般出现在你用了 Nous Portal 原生 OAuth 的场景。如果你走的是 TaoToken 的 API Key 通道不应该出现 OAuth 报错。如果出现了说明配置里还残留了 Portal 的 provider 设置。检查config.toml里有没有[model.portal]段有就删掉确保provider是openai而不是portal。然后重新跑hermes model确认当前生效的是 TaoToken 通道。报错五记忆不落盘Warning: memory file not writable这个不是致命错误但会导致记忆丢失。检查~/.hermes/目录权限ls -la ~/.hermes/确保当前用户对MEMORY.md、USER.md、hermes_state.db有写权限。如果是 Docker 部署注意挂载卷的权限映射。修复chmod 644 ~/.hermes/MEMORY.md ~/.hermes/USER.md chmod 664 ~/.hermes/hermes_state.db报错六FTS5 索引未启用Error: no such table: session_fts说明 SQLite 编译时没带 FTS5或者数据库初始化失败。先确认 SQLite 版本sqlite3 --versionFTS5 从 SQLite 3.9.0 起内置版本太低就升级。如果版本没问题删掉旧数据库重新初始化rm ~/.hermes/hermes_state.db hermes doctorHermes 会在下次启动时重建数据库和 FTS 表。注意这会清空历史会话操作前先备份。排查完这些基本能覆盖 90% 的接入问题。如果还遇到别的报错先跑hermes doctor它会给出大部分环境问题的定位。6. 长期运行与模型切换让 Hermes Agent 持久记忆真正用起来跑通验证只是起点真正让持久记忆产生价值是长期运行和按任务切换模型。这一节讲两件事怎么把 Hermes 装成常驻服务以及怎么在 TaoToken 通道下切换模型而不破坏记忆连续性。先装常驻服务。Hermes 内置了 systemd 集成hermes gateway install这条命令会把消息网关注册为 systemd 服务后台常驻开机自启。装完后检查状态systemctl --user status hermes-gateway如果状态是 active (running)说明服务正常。日志用journalctl --user -u hermes-gateway -f这样即使你关掉终端Agent 依然在线消息平台发来的请求会被处理记忆持续累积。模型切换方面Hermes 的设计是模型和记忆解耦的——换模型不影响 MEMORY.md 和会话数据库。你可以按任务类型切模型比如日常对话用便宜快速的模型复杂推理用强模型。走 TaoToken 通道时切换只需改model字段hermes config set model.model deepseek-chat或者用交互命令hermes model它会列出可用模型让你选。切换后开新会话记忆依然在因为记忆存在~/.hermes/下跟模型无关。这一点是 Hermes 相比纯 API 调用的核心优势。如果你想让 Agent 在特定任务上自动用特定模型可以配 profile。每个 profile 有独立的配置、记忆、会话和 Gateway PIDhermes -p work setup hermes -p personal setup工作 profile 用强模型个人 profile 用轻量模型互不干扰。启动时指定 profilehermes -p work长期运行还要注意备份。~/.hermes/目录里全是你的记忆和技能丢了很麻烦。我用的备份脚本tar -czf ~/hermes-backup-$(date %Y%m%d).tar.gz ~/.hermes/可以配成 cron 定时任务Hermes 内置了调度器hermes cron add --name backup --schedule 0 3 * * * --command tar -czf ~/hermes-backup-$(date %Y%m%d).tar.gz ~/.hermes/每天凌晨 3 点自动备份。这样即使数据库损坏也能从备份恢复记忆。最后说一个实际使用中的技巧定期清理 MEMORY.md。虽然 Hermes 有自动压缩但如果你发现某些记忆条目已经过时手动删掉比等它自动合并更干净。打开~/.hermes/MEMORY.md删掉不再相关的行保存即可下次对话就会用新版本。记忆质量比数量重要这是 Hermes 设计哲学里最值得记住的一点。如果你还没开始先去 TaoToken 控制台https://taotoken.net/api-keys拿一个 Key然后按第 2 节的配置片段接上再走第 4 节的六步验证。整个过程顺利的话半小时内能跑通剩下的就是让它慢慢积累记忆越用越顺手。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进