<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hermes on Kalend's Blog</title><link>https://blog.kalend.top/categories/hermes/</link><description>Recent content in Hermes on Kalend's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Fri, 29 May 2026 18:30:00 +0800</lastBuildDate><atom:link href="https://blog.kalend.top/categories/hermes/index.xml" rel="self" type="application/rss+xml"/><item><title>Hermes Agent v0.15：速度翻倍，从单兵到军团</title><link>https://blog.kalend.top/2026/05/29/2026-05-29-hermes-v0.15-whats-new.html/</link><pubDate>Fri, 29 May 2026 18:30:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/29/2026-05-29-hermes-v0.15-whats-new.html/</guid><description>&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;Hermes Agent v0.15.0（5月28日）是迄今最大的单版本更新。
&lt;strong&gt;1,302个提交、747个合并PR、1,746个文件变更、321位社区贡献者&lt;/strong&gt;。
隔天（5月29日）发布的 v0.15.1 修复了影响所有 Dashboard 用户的 P0 bug。&lt;/p&gt;
&lt;p&gt;这个版本的三个关键词：&lt;strong&gt;快、拆、稳&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="速度从各个维度变快"&gt;速度：从各个维度变快
&lt;/h2&gt;&lt;h3 id="冷启动再砍1秒"&gt;冷启动再砍1秒
&lt;/h3&gt;&lt;p&gt;v0.15.0 延续了冷启动性能优化的浪潮，三轮优化叠加：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openai._base_client&lt;/code&gt; 导入延迟加载：&lt;strong&gt;-240ms / -17MB&lt;/strong&gt; 内存&lt;/li&gt;
&lt;li&gt;热路径函数调用削减 47%（399k → 213k，31轮对话）&lt;/li&gt;
&lt;li&gt;压缩可行性检查延迟：-170 到 -290ms&lt;/li&gt;
&lt;li&gt;自适应子进程轮询：-195ms/工具调用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际效果：Termux 冷启动从 2.9s → 0.8s。
&lt;code&gt;hermes --version&lt;/code&gt; 冷启动 701ms → 258ms（&lt;strong&gt;降63%&lt;/strong&gt;），首次超越 Codex CLI。&lt;/p&gt;
&lt;h3 id="session_search-快了4500倍"&gt;session_search 快了4500倍
&lt;/h3&gt;&lt;p&gt;旧版 &lt;code&gt;session_search&lt;/code&gt; 是辅助 LLM 驱动的工具，每次搜索花 90 秒、花费 $0.30，偶尔还会编造结果。新版完全重写：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;零 LLM 调用&lt;/strong&gt;，纯 FTS5 搜索引擎&lt;/li&gt;
&lt;li&gt;三种模式（发现/滚动/浏览），自动推断无需切换&lt;/li&gt;
&lt;li&gt;搜索延迟：~20ms（旧版 ~90s）&lt;/li&gt;
&lt;li&gt;滚动延迟：~1ms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;搜索历史对话现在免费且即时。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="拆核心代码大瘦身"&gt;拆：核心代码大瘦身
&lt;/h2&gt;&lt;h3 id="run_agentpy-从16000行拆成3800行"&gt;run_agent.py 从16,000行拆成3,800行
&lt;/h3&gt;&lt;p&gt;这是整个版本最激进的重构。
&lt;code&gt;run_agent.py&lt;/code&gt; 从 16,083 行缩减到 3,821 行（&lt;strong&gt;-76%&lt;/strong&gt;），拆分到 14 个内聚的 &lt;code&gt;agent/*&lt;/code&gt; 模块。&lt;/p&gt;
&lt;p&gt;关键保证：&lt;strong&gt;行为零变化&lt;/strong&gt;。每个拆分都在 &lt;code&gt;AIAgent&lt;/code&gt; 上保留薄转发器，所有测试补丁路径不受影响，外部调用者完全兼容。&lt;/p&gt;
&lt;p&gt;为什么你应该关注？以前这个文件在你的编辑器里要 90 秒才能打开，现在眨眼即开。未来开发迭代速度会显著加快。&lt;/p&gt;
&lt;h2 id="稳kanban长成真正的多agent平台"&gt;稳：Kanban长成真正的多Agent平台
&lt;/h2&gt;&lt;p&gt;v0.15.0 用 &lt;strong&gt;104个PR&lt;/strong&gt; 把 Kanban 从任务队列升级为多 Agent 协作平台。&lt;/p&gt;
&lt;h3 id="新能力一览"&gt;新能力一览
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;能力&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;自动分解&lt;/td&gt;
 &lt;td&gt;Triage 自动将一个任务分解为子任务树&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Swarm 拓扑&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;hermes kanban swarm&lt;/code&gt; 一键创建完整 Swarm v1 图&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;每任务模型覆盖&lt;/td&gt;
 &lt;td&gt;便宜模型做杂活，贵模型啃硬骨头&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;工作树隔离&lt;/td&gt;
 &lt;td&gt;每个任务独立 git worktree，互不干扰&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;定时启动&lt;/td&gt;
 &lt;td&gt;任务支持指定开始时间&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;陈旧任务检测&lt;/td&gt;
 &lt;td&gt;自动发现并回收卡住的任务&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Worker 可视化&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/workers/active&lt;/code&gt;、&lt;code&gt;/runs/{id}&lt;/code&gt;、&lt;code&gt;/inspect&lt;/code&gt; 端点&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="swarm-是什么"&gt;Swarm 是什么
&lt;/h3&gt;&lt;p&gt;一条命令创建一个完整的多 Agent 工作流：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban swarm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;自动生成：根节点 → 并行 Worker → 门控验证者 → 门控综合者 → 共享黑板。适合代码审查、批量研究、多文件重构等场景。&lt;/p&gt;
&lt;h2 id="安全三道防线对抗提示注入"&gt;安全：三道防线对抗提示注入
&lt;/h2&gt;&lt;p&gt;受 Brainworm/Promptware Kill Chain 研究（arxiv 2601.09625）启发，v0.15.0 在三个关键位置部署了防御：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;威胁模式库&lt;/strong&gt;（&lt;code&gt;tools/threat_patterns.py&lt;/code&gt;）：~15个新的 Brainworm/C2 模式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记忆加载扫描&lt;/strong&gt;：召回的记忆在注入上下文前先过安全检查&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具结果分隔符&lt;/strong&gt;：恶意文件或远程服务无法伪装成 Hermes 自身的系统内容&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;配合新增的 &lt;code&gt;security-guidance&lt;/code&gt; 插件，对危险代码写入进行模式匹配。&lt;/p&gt;
&lt;h2 id="其他值得关注的更新"&gt;其他值得关注的更新
&lt;/h2&gt;&lt;h3 id="bitwarden-secrets-manager-集成"&gt;Bitwarden Secrets Manager 集成
&lt;/h3&gt;&lt;p&gt;一个引导令牌（&lt;code&gt;BWS_ACCESS_TOKEN&lt;/code&gt;）替代所有明文 API Key。在 Bitwarden Web 端轮换密钥，重启即生效。&lt;/p&gt;
&lt;h3 id="ntfy第23个消息平台"&gt;ntfy：第23个消息平台
&lt;/h3&gt;&lt;p&gt;无需注册、无需 API Key，只要一个 topic URL。Agent 完成任务、cron 到点，推送通知直达手机/桌面/智能家居。&lt;/p&gt;
&lt;h3 id="skill-bundle一条命令加载多个-skill"&gt;Skill Bundle：一条命令加载多个 Skill
&lt;/h3&gt;&lt;p&gt;设置你的&amp;quot;写作日&amp;quot;组合（humanizer + ideation + obsidian + youtube-content）。
&lt;code&gt;/writing-day&lt;/code&gt; 一次性激活全部。&lt;/p&gt;
&lt;h3 id="tui-会话管理器"&gt;TUI 会话管理器
&lt;/h3&gt;&lt;p&gt;Ink TUI 新增多会话切换器：在同一个终端窗口里列出、切换、刷新、关闭多个会话，不用退出。&lt;/p&gt;
&lt;h3 id="docker-s6-overlay-容器管理"&gt;Docker s6-overlay 容器管理
&lt;/h3&gt;&lt;p&gt;容器内网关自动监督、重启对账、docker logs 集成。Node 升级到 22 LTS。&lt;/p&gt;
&lt;h2 id="v0151-热修复5月29日"&gt;v0.15.1 热修复（5月29日）
&lt;/h2&gt;&lt;p&gt;v0.15.0 发布隔天，一个 P0 bug 浮出水面：&lt;strong&gt;Dashboard 在 loopback 模式下无限重载&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="根因"&gt;根因
&lt;/h3&gt;&lt;p&gt;Dashboard 的身份探针（&lt;code&gt;/api/auth/me&lt;/code&gt;）在 loopback 模式下返回 401（设计如此）。
但 v0.15.0 的过期令牌重载守卫把每个 401 都当成了需要刷新的会话令牌，触发整页重载。
重载后其他请求清除了单次重载守卫，于是又触发下一轮。
Firefox 表现为 &amp;ldquo;Navigated to /sessions&amp;rdquo; 暴风，Chrome 表现为 React 重渲染风暴。&lt;/p&gt;
&lt;h3 id="修复"&gt;修复
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;fetchJSON&lt;/code&gt; 新增 &lt;code&gt;allowUnauthorized&lt;/code&gt; 选项，跳过 loopback 下的过期令牌重载逻辑。
401 仍然抛异常让 &lt;code&gt;AuthWidget&lt;/code&gt; 处理，但不再触发整页刷新。&lt;/p&gt;
&lt;h3 id="其他修复"&gt;其他修复
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Docker &lt;code&gt;--insecure&lt;/code&gt; 改为显式环境变量（&lt;code&gt;HERMES_DASHBOARD_INSECURE=1&lt;/code&gt;），不再从绑定主机推断&lt;/li&gt;
&lt;li&gt;MCP bare 命令（npx/npm/node）在 Docker 容器内正确解析到 &lt;code&gt;/usr/local/bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Kanban Worker 的 SIGTERM 终于能正常终止进程&lt;/li&gt;
&lt;li&gt;Skills 页面源标签和分类侧边栏恢复&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/yolo&lt;/code&gt; 中途启用变为 per-session 级别&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/model&lt;/code&gt; 和 &lt;code&gt;hermes model&lt;/code&gt; 显示统一列表&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.md&lt;/code&gt; 文件媒体投递恢复&lt;/li&gt;
&lt;li&gt;Web URL 不再被误删查询参数&lt;/li&gt;
&lt;li&gt;Skills Hub 全目录：858 → 19,932，所有 skills.sh 条目可搜索&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="升级建议"&gt;升级建议
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 源码安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/hermes-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install -e .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或 Docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull nousresearch/hermes-agent:latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;直接跳到 v0.15.1，不要停在 v0.15.0。&lt;/strong&gt; Dashboard 无限重载 bug 只影响 v0.15.0。&lt;/p&gt;
&lt;h2 id="数据总结"&gt;数据总结
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指标&lt;/th&gt;
 &lt;th&gt;v0.15.0&lt;/th&gt;
 &lt;th&gt;v0.15.1&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;提交数&lt;/td&gt;
 &lt;td&gt;1,302&lt;/td&gt;
 &lt;td&gt;28&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;合并PR&lt;/td&gt;
 &lt;td&gt;747&lt;/td&gt;
 &lt;td&gt;21&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;文件变更&lt;/td&gt;
 &lt;td&gt;1,746&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;贡献者&lt;/td&gt;
 &lt;td&gt;321&lt;/td&gt;
 &lt;td&gt;9&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;P0 修复&lt;/td&gt;
 &lt;td&gt;15&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;P1 修复&lt;/td&gt;
 &lt;td&gt;65&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;安全修复&lt;/td&gt;
 &lt;td&gt;19&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;关注 varkm，一起学习，一起成长&lt;/p&gt;</description></item><item><title>Hermes Agent 升级指南：v0.14.0 → v0.15.1，为什么要隔天发补丁</title><link>https://blog.kalend.top/2026/05/29/hermes-v0.15.1-upgrade-guide.html/</link><pubDate>Fri, 29 May 2026 10:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/29/hermes-v0.15.1-upgrade-guide.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;2026年5月，Hermes Agent 两周内连发三版：v0.14.0 → v0.15.0 → v0.15.1。第三版是隔天紧急修复——Dashboard 无限重载，新装用户直接无法使用。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;所有用户直接升级到 v0.15.1。&lt;/strong&gt; 不用停在 v0.15.0，它的 Dashboard 有 P0 级缺陷。&lt;/p&gt;
&lt;p&gt;一张表看全貌：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;版本&lt;/th&gt;
 &lt;th&gt;日期&lt;/th&gt;
 &lt;th&gt;代号&lt;/th&gt;
 &lt;th&gt;一句话定位&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;v0.14.0&lt;/td&gt;
 &lt;td&gt;5.16&lt;/td&gt;
 &lt;td&gt;Foundation&lt;/td&gt;
 &lt;td&gt;全平台基础版本&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;v0.15.0&lt;/td&gt;
 &lt;td&gt;5.28&lt;/td&gt;
 &lt;td&gt;Velocity&lt;/td&gt;
 &lt;td&gt;1302 commits 大重构&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;v0.15.1&lt;/td&gt;
 &lt;td&gt;5.29&lt;/td&gt;
 &lt;td&gt;Hotfix&lt;/td&gt;
 &lt;td&gt;隔天紧急修复&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="v0140--v0150大版本跳跃"&gt;v0.14.0 → v0.15.0：大版本跳跃
&lt;/h2&gt;&lt;p&gt;这不是小更新。v0.15.0 是 Hermes 历史上最大的单版本变更——747 个 PR、1302 个 commit、321 位贡献者。&lt;/p&gt;
&lt;h3 id="核心代码大瘦身"&gt;核心代码大瘦身
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;run_agent.py&lt;/code&gt; 从 &lt;strong&gt;16,000 行&lt;/strong&gt;重构到 &lt;strong&gt;3,800 行&lt;/strong&gt;，缩减 76%。不是删功能，是把职责拆分到独立模块。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;性能实测数据：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指标&lt;/th&gt;
 &lt;th&gt;变化&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;每轮工具调用&lt;/td&gt;
 &lt;td&gt;-195ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;每轮函数调用&lt;/td&gt;
 &lt;td&gt;-240ms（-47%）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="session_search-重写4500x-提速"&gt;session_search 重写：4500x 提速
&lt;/h3&gt;&lt;p&gt;会话搜索引擎从 LLM 驱动改为纯 FTS5 实现。搜索速度快了 &lt;strong&gt;4500 倍&lt;/strong&gt;，而且不再消耗 token。&lt;/p&gt;
&lt;h3 id="kanban-演进为多-agent-平台"&gt;Kanban 演进为多 Agent 平台
&lt;/h3&gt;&lt;p&gt;Kanban 模块经过 &lt;strong&gt;104 个 PR&lt;/strong&gt; 打磨，从任务看板变成了多 Agent 协作平台。支持任务分解、子 Agent 分发、跨 Agent 依赖管理。&lt;/p&gt;
&lt;h3 id="安全防护promptware-defense"&gt;安全防护：Promptware Defense
&lt;/h3&gt;&lt;p&gt;新增 promptware 防御机制，防止恶意提示词注入攻击 Agent 系统提示。&lt;/p&gt;
&lt;h3 id="新集成"&gt;新集成
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bitwarden Secrets Manager&lt;/strong&gt;：密钥管理集成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Krea 2 + FAL 插件&lt;/strong&gt;：两个新图像生成提供商&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nous 官方 MCP 目录&lt;/strong&gt;：审核过的 MCP 服务目录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ntfy 平台&lt;/strong&gt;：第 23 个消息平台&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mTLS 支持&lt;/strong&gt;：MCP 连接支持 TLS 客户端证书&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="breaking-changes"&gt;Breaking Changes
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;变更&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;API_SERVER_KEY&lt;/code&gt; 强制&lt;/td&gt;
 &lt;td&gt;API Server 现在强制要求 Key，无 Key 不再允许请求&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;web_crawl&lt;/code&gt; 移除&lt;/td&gt;
 &lt;td&gt;该工具及相关 provider 已被移除&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;context engine&lt;/td&gt;
 &lt;td&gt;新增外部上下文引擎接口，需配合新配置&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="v0150--v0151为什么隔天就发补丁"&gt;v0.15.0 → v0.15.1：为什么隔天就发补丁
&lt;/h2&gt;&lt;p&gt;v0.15.0 发布后隔天社区报告了多个阻断性问题。&lt;/p&gt;
&lt;h3 id="-dashboard-无限重载循环p0"&gt;🔴 Dashboard 无限重载循环（P0）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;这是 v0.15.1 存在的唯一理由。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 loopback 模式下（Docker 部署 / 托管环境 / 全新安装），Dashboard 的 SPA 在 token 过期后陷入死循环：401 → 重新登录 → 又 401 → 无限刷新。用户看到页面不停闪烁，完全无法使用。&lt;/p&gt;
&lt;p&gt;修复方式：&lt;code&gt;/api/auth/me&lt;/code&gt; 返回 401 时不再触发整页重载，改为 SPA 内部处理 token 刷新。&lt;/p&gt;
&lt;h3 id="-kanban-worker-sigterm-不终止"&gt;🔴 Kanban Worker SIGTERM 不终止
&lt;/h3&gt;&lt;p&gt;发送 SIGTERM 后进程没有正确终止，任务超时或手动取消时僵尸进程堆积。&lt;/p&gt;
&lt;h3 id="-其他修复"&gt;🟡 其他修复
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;问题&lt;/th&gt;
 &lt;th&gt;影响&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/model&lt;/code&gt; 和模型选择器列表不统一&lt;/td&gt;
 &lt;td&gt;CLI 和 gateway 显示不同模型列表&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/yolo&lt;/code&gt; 模式未绕过 session&lt;/td&gt;
 &lt;td&gt;yolo 模式实际没生效&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Skills 目录不完整&lt;/td&gt;
 &lt;td&gt;858 → 19,932，只拉取了部分条目&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.md&lt;/code&gt; 媒体投递被误拦截&lt;/td&gt;
 &lt;td&gt;Gateway 把正常 Markdown 附件也拦了&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Web URL 被误脱敏&lt;/td&gt;
 &lt;td&gt;URL 参数被错误替换&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="docker-安全加固"&gt;Docker 安全加固
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--insecure&lt;/code&gt; 标志必须通过环境变量&lt;strong&gt;显式启用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;MCP bare command（&lt;code&gt;npx&lt;/code&gt;/&lt;code&gt;npm&lt;/code&gt;/&lt;code&gt;node&lt;/code&gt;）明确解析到 &lt;code&gt;/usr/local/bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;arm64 CI 缓存问题修复&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="升级指南"&gt;升级指南
&lt;/h2&gt;&lt;h3 id="从-v0140-升级推荐"&gt;从 v0.14.0 升级（推荐）
&lt;/h3&gt;&lt;p&gt;直接跳到 v0.15.1，不需要中间停 v0.15.0：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 源码安装（推荐）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/NousResearch/hermes-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; hermes-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install -e .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或 PyPI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install --upgrade hermes-agent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="从-v0150-升级到-v0151必须"&gt;从 v0.15.0 升级到 v0.15.1（必须）
&lt;/h3&gt;&lt;p&gt;v0.15.0 的 Dashboard 无限重载是影响所有新装和 Docker 用户的 P0 问题：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install --upgrade hermes-agent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="升级后检查清单"&gt;升级后检查清单
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;检查项&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Gateway 重启&lt;/td&gt;
 &lt;td&gt;升级后必须 &lt;code&gt;hermes gateway restart&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;API_SERVER_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;v0.15.0+ 强制要求，检查 &lt;code&gt;~/.hermes/.env&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Browser Use 配置&lt;/td&gt;
 &lt;td&gt;需配置 &lt;code&gt;BEARER_TOKEN&lt;/code&gt; 匹配 &lt;code&gt;API_SERVER_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kanban 备份&lt;/td&gt;
 &lt;td&gt;并发加固后更稳定，但建议备份 &lt;code&gt;~/.hermes/kanban.db&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Docker &lt;code&gt;--insecure&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;必须显式设置环境变量&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="版本号背后的逻辑"&gt;版本号背后的逻辑
&lt;/h2&gt;&lt;p&gt;v0.15.1 不是计划内版本。大版本（v0.15.0）涉及 1300+ commits 变更，回归测试不可能覆盖所有部署环境。Dashboard 无限重载只在 loopback/Docker 场景触发，CI 没覆盖到。&lt;/p&gt;
&lt;p&gt;发现问题后团队在隔天内发布修复——这是健康开源项目的标准响应速度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;建议所有用户直接使用 v0.15.1。&lt;/strong&gt;&lt;/p&gt;
&lt;section style="margin:20px 0;padding:16px 20px;background:linear-gradient(135deg,#4a90d9,#357abd);border-radius:8px;text-align:center;"&gt;
&lt;p style="margin:0 0 8px 0;color:#fff;font-size:16px;font-weight:bold;line-height:1.6;"&gt;关注 varkm，一起学习，一起成长&lt;/p&gt;
&lt;p style="margin:0;color:rgba(255,255,255,0.85);font-size:13px;line-height:1.6;"&gt;更多 AI Agent 实战经验和踩坑记录，持续更新中&lt;/p&gt;
&lt;/section&gt;</description></item><item><title>我给AI建了个全自动知识库：每周自动从对话中提炼知识点</title><link>https://blog.kalend.top/2026/05/26/wiki-auto-knowledge-base.html/</link><pubDate>Tue, 26 May 2026 23:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/26/wiki-auto-knowledge-base.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;和AI聊了几百轮，发现最有价值的知识全散落在聊天记录里。下次遇到类似问题，还得重新问一遍。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这不是工具推荐，是我自己搭的一套系统。用了一年，从零长到23个知识页面，全是AI自己从对话里提炼出来的。&lt;/p&gt;
&lt;p&gt;先说结论：把AI当知识管理员，比当聊天机器人有用得多。&lt;/p&gt;
&lt;h2 id="一为什么要自动化知识库"&gt;一、为什么要自动化知识库
&lt;/h2&gt;&lt;p&gt;我每天和AI助手聊天，聊技术、聊工具、聊踩坑经验。&lt;/p&gt;
&lt;p&gt;这些对话里藏着大量可复用的知识点：某个工具的配置方法、某个问题的解决方案、某个概念的清晰解释。&lt;/p&gt;
&lt;p&gt;但问题是——它们全在聊天记录里。&lt;/p&gt;
&lt;p&gt;想找的时候翻不到，找到了也不确定是最新的。&lt;/p&gt;
&lt;p&gt;更关键的是，下次遇到类似问题，我又得重新描述一遍背景，重新问一遍。&lt;/p&gt;
&lt;p&gt;所以我想要一个系统：自动扫描对话，自动提炼知识点，自动写入知识库。&lt;/p&gt;
&lt;p&gt;不是什么Notion模板，不是Obsidian手动整理。&lt;/p&gt;
&lt;p&gt;是真正的全自动——我正常聊天，知识库自动生长。&lt;/p&gt;
&lt;h2 id="二方案llm-wiki-规范--定时扫描"&gt;二、方案：LLM Wiki 规范 + 定时扫描
&lt;/h2&gt;&lt;p&gt;我的方案基于Karpathy提出的LLM Wiki规范。&lt;/p&gt;
&lt;p&gt;核心思路：用Markdown文件存知识，用双向链接把知识点串成图谱，用AI定时扫描对话来增量更新。&lt;/p&gt;
&lt;p&gt;整个知识库就是一个文件夹，长这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wiki/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; entities/ # 实体页（工具、人物、项目）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; concepts/ # 概念页（方法论、架构、工作流）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; comparisons/ # 对比页（方案选型）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; queries/ # 查询页（常见问题）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; raw/ # 原始素材（对话摘要）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SCHEMA.md # 规范定义
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index.md # 全局索引
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; log.md # 操作日志
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;每个页面都有统一的frontmatter格式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;页面标题&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;created&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2026-05-14&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;updated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2026-05-25&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;entity | concept | comparison | query&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;ai, tools, open-source]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;raw/articles/xxx.md]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;confidence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;high | medium | low&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;用&lt;code&gt;[[wikilinks]]&lt;/code&gt;语法在页面间建立双向链接。&lt;/p&gt;
&lt;p&gt;比如opencode页面引用了understand-anything，后者又引用了hermes-agent。&lt;/p&gt;
&lt;p&gt;这些链接自动形成知识图谱，不用手动维护。&lt;/p&gt;
&lt;h2 id="三扫描脚本从对话中挖知识点"&gt;三、扫描脚本：从对话中挖知识点
&lt;/h2&gt;&lt;p&gt;核心是一个Python脚本，每周自动扫描最近7天的AI对话记录。&lt;/p&gt;
&lt;p&gt;它的逻辑很简单：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步&lt;/strong&gt;：扫描会话数据库，找到最近有实质内容的对话。&lt;/p&gt;
&lt;p&gt;筛选标准：消息数≥5条，标题非空，时间在7天内。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步&lt;/strong&gt;：用关键词匹配分类。我定义了8个类别：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AI/模型 | 工具/Agent | 数据库 | OSINT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DevOps | 编程 | 写作 | 记忆/知识库
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;每条匹配规则是多个关键词用管道符连接。&lt;/p&gt;
&lt;p&gt;比如&amp;quot;ai|llm|模型|训练|推理&amp;quot;都归到AI类。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步&lt;/strong&gt;：过滤掉已有页面覆盖的内容，输出候选清单。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四步&lt;/strong&gt;：LLM Agent拿到候选清单，判断是否值得入库。&lt;/p&gt;
&lt;p&gt;不是什么都记。有两个硬性门槛：&lt;/p&gt;
&lt;p&gt;同一个知识点出现2次以上，或者来自1个高质量核心来源。&lt;/p&gt;
&lt;p&gt;这样避免了把闲聊当知识的问题。&lt;/p&gt;
&lt;h2 id="四自动化流程定时任务配置"&gt;四、自动化流程：定时任务配置
&lt;/h2&gt;&lt;p&gt;我把扫描脚本配成了定时任务，每周日上午11点自动运行。&lt;/p&gt;
&lt;p&gt;流程是四步：&lt;/p&gt;
&lt;p&gt;扫描脚本输出候选 → LLM判断是否值得入库 → 创建或更新wiki页面 → 追加操作日志&lt;/p&gt;
&lt;p&gt;目前已经跑了5轮自动入库，产生了这些内容：&lt;/p&gt;
&lt;p&gt;实体页13个：hermes-agent、mempalace、opencode、obsidian、karpathy等。&lt;/p&gt;
&lt;p&gt;概念页5个：双向链接、知识库工作流、五层记忆架构、MySQL大表DDL方案、被动验证方法论。&lt;/p&gt;
&lt;p&gt;最有价值的是交叉引用。&lt;/p&gt;
&lt;p&gt;opencode → understand-anything → hermes-agent → openclaw&lt;/p&gt;
&lt;p&gt;这条引用链，把四个工具的定位和关系串了起来。&lt;/p&gt;
&lt;p&gt;下次我需要对比它们，直接看知识库就行。&lt;/p&gt;
&lt;h2 id="五设计思考为什么不用notion"&gt;五、设计思考：为什么不用Notion
&lt;/h2&gt;&lt;p&gt;很多人会问：为什么不直接用Notion？或者Obsidian的插件？&lt;/p&gt;
&lt;p&gt;三个原因：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一&lt;/strong&gt;，数据主权。我的知识库是本地Markdown文件，git管理。&lt;/p&gt;
&lt;p&gt;不依赖任何云服务，不会因为某天服务下线就丢数据。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二&lt;/strong&gt;，增量构建。不是一次性搭好架子然后手动填充。&lt;/p&gt;
&lt;p&gt;是每周自动从对话中生长，越用越丰富。&lt;/p&gt;
&lt;p&gt;我正常使用AI，知识库自动变厚。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三&lt;/strong&gt;，AI做苦力。扫描、分类、提取、格式化，全部自动化。&lt;/p&gt;
&lt;p&gt;我只做最终决策——这个东西值不值得记。&lt;/p&gt;
&lt;p&gt;当然也有代价：没有Notion那么漂亮的界面，没有协作功能。&lt;/p&gt;
&lt;p&gt;但知识库的本质是&amp;quot;能找到&amp;quot;，不是&amp;quot;好看&amp;quot;。&lt;/p&gt;
&lt;h2 id="六一个真实页面长什么样"&gt;六、一个真实页面长什么样
&lt;/h2&gt;&lt;p&gt;拿hermes-agent这个实体页举例：&lt;/p&gt;
&lt;p&gt;开头是frontmatter，包含标题、日期、类型、标签、来源、置信度。&lt;/p&gt;
&lt;p&gt;然后是正文：概述、核心架构（配置层级表格）、Profile隔离系统、Skill系统、五层记忆架构、多平台网关。&lt;/p&gt;
&lt;p&gt;最后是相关页面链接：nous-research、llm-wiki、obsidian、mempalace。&lt;/p&gt;
&lt;p&gt;每个链接都能跳转，形成知识网络。&lt;/p&gt;
&lt;p&gt;整个页面从创建到现在更新了3次，每次都是自动扫描触发的。&lt;/p&gt;
&lt;p&gt;不是手动维护的&amp;quot;死&amp;quot;文档，而是跟着我的使用持续进化的&amp;quot;活&amp;quot;知识。&lt;/p&gt;
&lt;p&gt;回看log.md的操作记录，5次自动入库覆盖了完全不同的领域：&lt;/p&gt;
&lt;p&gt;从MySQL大表DDL方案到OSINT被动验证方法论。&lt;/p&gt;
&lt;p&gt;这正是自动化的价值——它不会只记你&amp;quot;觉得重要&amp;quot;的东西。&lt;/p&gt;
&lt;p&gt;而是记录你&amp;quot;实际在用&amp;quot;的东西。&lt;/p&gt;
&lt;p&gt;如果你也在大量使用AI工具，强烈建议搭一个自己的知识库。&lt;/p&gt;
&lt;p&gt;不需要复杂，一个文件夹 + 一个扫描脚本就够了。&lt;/p&gt;
&lt;p&gt;关键不是工具选型，而是让知识自动沉淀。&lt;/p&gt;
&lt;p&gt;手动整理的知识库，最后都会变成没人维护的死文档。&lt;/p&gt;
&lt;p&gt;只有自动化的，才能活下来。&lt;/p&gt;
&lt;p&gt;关注 varkm，一起学习，一起成长&lt;/p&gt;
&lt;p&gt;下一篇讲怎么给这个知识库加上语义搜索，让它从&amp;quot;能找到&amp;quot;变成&amp;quot;能联想&amp;quot;&lt;/p&gt;</description></item><item><title>我给AI知识库加了"联想大脑"：从关键词搜索到语义理解</title><link>https://blog.kalend.top/2026/05/26/wiki-semantic-search.html/</link><pubDate>Tue, 26 May 2026 22:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/26/wiki-semantic-search.html/</guid><description>&lt;p&gt;我的 wiki 里有 27 个页面，涵盖 Hermes、Obsidian、MySQL 等十几个主题。&lt;/p&gt;
&lt;p&gt;搜&amp;quot;AI怎么记住之前的对话&amp;quot;——0 结果。&lt;/p&gt;
&lt;p&gt;明明写了，为什么搜不到？&lt;/p&gt;
&lt;p&gt;因为那篇 wiki 叫&amp;quot;五层记忆架构&amp;quot;，标题里没有&amp;quot;对话&amp;quot;&amp;ldquo;记住&amp;quot;这些词。&lt;/p&gt;
&lt;p&gt;再来一个。搜&amp;quot;有没有能自动理解项目的工具&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;还是 0。wiki 里写的是&amp;quot;Understand Anything&amp;quot;，英文名。&lt;/p&gt;
&lt;p&gt;第三个。搜&amp;quot;知识库怎么同步&amp;quot;。&lt;/p&gt;
&lt;p&gt;0。wiki 里用的是&amp;quot;knowledge-base-workflow&amp;quot;。&lt;/p&gt;
&lt;p&gt;三次搜索，三次翻车。不是 wiki 没写，是我用的词跟标题对不上。&lt;/p&gt;
&lt;p&gt;现有 wiki-scan.py 用正则匹配：&lt;code&gt;ai|llm|模型&lt;/code&gt; 这类关键词去打标签。&lt;/p&gt;
&lt;p&gt;这种方案有个硬伤：同义词、近义词、描述性语句一律匹配不到。&lt;/p&gt;
&lt;p&gt;关键词搜索只认字面，不懂意思。你脑子里想的跟标题不一样，就搜不到。&lt;/p&gt;
&lt;p&gt;这是关键词搜索的天花板：它能找字，但不能找意思。&lt;/p&gt;
&lt;h2 id="embedding给每段话算一个语义坐标"&gt;Embedding：给每段话算一个&amp;quot;语义坐标&amp;quot;
&lt;/h2&gt;&lt;p&gt;Embedding 模型的能力就一件事：把文本变成一组数字（向量）。&lt;/p&gt;
&lt;p&gt;意思相近的文本，向量距离就近。意思无关的，距离远。&lt;/p&gt;
&lt;p&gt;不需要懂线性代数。想象每段话都有自己的&amp;quot;语义指纹&amp;quot;。指纹越像，内容越相关。&lt;/p&gt;
&lt;p&gt;专业说法叫&amp;quot;余弦相似度&amp;quot;——两个向量的夹角越小，内容越像。&lt;/p&gt;
&lt;p&gt;但你不关心数学，只关心结果：输入一个问题，返回最相关的几段文字。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;AI怎么记住之前的对话&amp;quot;和&amp;quot;五层记忆架构&amp;quot;这两个短语，字面完全不同。&lt;/p&gt;
&lt;p&gt;但语义指纹很接近——都在说&amp;quot;AI的记忆机制&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;这就是 Embedding 解决的核心问题：跨越字面，匹配语义。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;有没有能自动理解项目的工具&amp;quot;和&amp;quot;Understand Anything&amp;quot;也一样。&lt;/p&gt;
&lt;p&gt;一个中文描述，一个英文专有名词，但语义空间里它们是邻居。&lt;/p&gt;
&lt;p&gt;我用的本地模型是 &lt;code&gt;qwen3-embedding&lt;/code&gt;，4.7GB，跑在 Ollama 上。&lt;/p&gt;
&lt;p&gt;不调云 API，数据不出本机。对于个人知识库来说完全够用。&lt;/p&gt;
&lt;p&gt;技术选型还有 &lt;code&gt;nomic-embed-text&lt;/code&gt; 和 &lt;code&gt;bge-m3&lt;/code&gt;，后面踩坑段会说差异。&lt;/p&gt;
&lt;h2 id="动手三步给-wiki-接上向量引擎"&gt;动手：三步给 Wiki 接上向量引擎
&lt;/h2&gt;&lt;p&gt;向量数据库选 ChromaDB，轻量，Python 几行搞定。&lt;/p&gt;
&lt;p&gt;版本是 1.5.8，&lt;code&gt;pip install chromadb&lt;/code&gt; 直接装。&lt;/p&gt;
&lt;h3 id="第一步扫描-wiki-文件--分段切片"&gt;第一步：扫描 wiki 文件 + 分段切片
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;glob&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load_wiki_chunks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wiki_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;扫描 wiki 目录，按固定字数切片&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;wiki_dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/**/*.md&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recursive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 按 chunk_size 字符切，保留来源信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;27 个 md 文件，500 字符切片，大约生成 80 个 chunk。&lt;/p&gt;
&lt;p&gt;每个 chunk 都带着 source 元数据，搜索命中后可以直接跳到原文。&lt;/p&gt;
&lt;h3 id="第二步embedding-向量化--存入-chromadb"&gt;第二步：Embedding 向量化 + 存入 ChromaDB
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;chromadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;chromadb.utils.embedding_functions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;OllamaEmbeddingFunction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OllamaEmbeddingFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;qwen3-embedding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://localhost:11434/api/embed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromadb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PersistentClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./wiki_chroma&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_or_create_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;wiki&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;embedding_function&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_wiki_chunks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/root/wiki&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;metadatas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;chunk_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;))],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;PersistentClient&lt;/code&gt; 把索引存到本地目录，重启不丢数据。&lt;/p&gt;
&lt;p&gt;每个 chunk 附带 metadata 记录来源文件，方便溯源。&lt;/p&gt;
&lt;p&gt;整个入库过程在我的机器上跑完不到 30 秒。&lt;/p&gt;
&lt;h3 id="第三步语义查询"&gt;第三步：语义查询
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;query_texts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AI怎么记住之前的对话&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;n_results&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;documents&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;metadatas&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;→&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 命中 memory-layered-architecture.md ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;三步搞定。从安装到跑通，不超过 10 分钟。&lt;/p&gt;
&lt;h2 id="效果对比搜同一个问题"&gt;效果对比：搜同一个问题
&lt;/h2&gt;&lt;p&gt;三组实测，关键词搜索 vs 语义搜索：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;查询&lt;/th&gt;
 &lt;th&gt;关键词结果&lt;/th&gt;
 &lt;th&gt;语义搜索结果&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;怎么防止模型记不住东西&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;0 条&lt;/td&gt;
 &lt;td&gt;命中 memory-layered-architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;大表加字段怎么办&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;命中 gh-ost&lt;/td&gt;
 &lt;td&gt;同时命中 gh-ost + mysql-big-table-ddl&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;类似 Notion 的本地工具&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;命中 obsidian&lt;/td&gt;
 &lt;td&gt;额外关联 bidirectional-links&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;第一组最典型。关键词完全匹配不到，语义搜索直接命中。&lt;/p&gt;
&lt;p&gt;因为&amp;quot;防止记不住&amp;quot;和&amp;quot;五层记忆架构&amp;quot;在语义空间里是近邻。&lt;/p&gt;
&lt;p&gt;第二组说明语义搜索不会丢掉关键词能找到的内容。&lt;/p&gt;
&lt;p&gt;gh-ost 关键词能找到，语义也能找到，还额外关联了同主题的另一个页面。&lt;/p&gt;
&lt;p&gt;这是语义搜索的加分项：不只补齐关键词的盲区，还能发现你可能没想到的关联。&lt;/p&gt;
&lt;p&gt;第三组体现了&amp;quot;联想&amp;quot;能力。&lt;/p&gt;
&lt;p&gt;用户想找的不只是工具名称，还有工具背后的核心理念（双向链接）。&lt;/p&gt;
&lt;p&gt;Obsidian 的核心卖点就是 bidirectional-links，语义搜索自动把这个关联挖了出来。&lt;/p&gt;
&lt;p&gt;从&amp;quot;能找到&amp;quot;到&amp;quot;能联想&amp;rdquo;，这是质变，不是量变。&lt;/p&gt;
&lt;h2 id="让索引自动更新"&gt;让索引自动更新
&lt;/h2&gt;&lt;p&gt;wiki 内容会增长，索引也得跟上。用 cronjob 定时增量更新：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;metadatas&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;new_chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;load_wiki_chunks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/root/wiki&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;new_chunks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;new_chunks&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;metadatas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;new_chunks&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;chunk_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;existing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_chunks&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;新增 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_chunks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 个 chunk&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;新页面入库时自动切片 + 向量化，零手动操作。&lt;/p&gt;
&lt;p&gt;和 Hermes 的联动更进一层：搜索结果注入对话上下文。&lt;/p&gt;
&lt;p&gt;Agent 回答问题时自动从 wiki 检索相关知识，不用每次手动查。&lt;/p&gt;
&lt;p&gt;这个联动让知识库从&amp;quot;被动存档&amp;quot;变成&amp;quot;主动辅助&amp;quot;。&lt;/p&gt;
&lt;h2 id="踩坑记录"&gt;踩坑记录
&lt;/h2&gt;&lt;p&gt;三个坑，踩过了才知道。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型选择&lt;/strong&gt;：通用 embedding 模型对中文效果差。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nomic-embed-text&lt;/code&gt; 是好模型，但主要针对英文。中文查询经常跑偏。&lt;/p&gt;
&lt;p&gt;搜&amp;quot;怎么防止模型记不住东西&amp;quot;，它返回的是跟&amp;quot;模型训练&amp;quot;相关的内容。&lt;/p&gt;
&lt;p&gt;换成 &lt;code&gt;qwen3-embedding&lt;/code&gt; 后，中文语义理解提升明显。&lt;/p&gt;
&lt;p&gt;如果你的 wiki 主要是中文，选中文优化模型。这是效果差距最大的一个选择。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;切片粒度&lt;/strong&gt;：500 字符是经验值，不是万能解。&lt;/p&gt;
&lt;p&gt;太粗（&amp;gt;1000）会丢细节。搜&amp;quot;五层记忆架构的第三层&amp;quot;可能匹配不到具体段落。&lt;/p&gt;
&lt;p&gt;因为第三层的描述被淹没在一大段文字里，向量被平均掉了。&lt;/p&gt;
&lt;p&gt;太细（&amp;lt;200）会丢上下文。返回的片段短到看不懂在说什么。&lt;/p&gt;
&lt;p&gt;建议从 500 开始，根据实际搜索效果调整。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;索引体积&lt;/strong&gt;：27 个页面、80 个 chunk，ChromaDB 索引只有几 MB。&lt;/p&gt;
&lt;p&gt;不需要百万级向量库的方案。个人知识库，ChromaDB 完全够用。&lt;/p&gt;
&lt;p&gt;不要过度工程化，够用就好。&lt;/p&gt;
&lt;p&gt;关键词搜索是&amp;quot;翻字典&amp;quot;——你得知道精确的词。&lt;/p&gt;
&lt;p&gt;语义搜索是&amp;quot;问懂行的人&amp;quot;——描述个大概就能找到。&lt;/p&gt;
&lt;p&gt;给知识库加上这层能力，从&amp;quot;能找到&amp;quot;到&amp;quot;能联想&amp;quot;，区别很大。&lt;/p&gt;
&lt;p&gt;而这个升级，只需要一个 embedding 模型 + 一个向量数据库，本地就能跑。&lt;/p&gt;</description></item><item><title>11个PR，6.1k颗星：这个AI Agent的Web界面终于能用了</title><link>https://blog.kalend.top/2026/05/26/hermes-web-ui-v061-update.html/</link><pubDate>Tue, 26 May 2026 10:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/26/hermes-web-ui-v061-update.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;Hermes Web UI 刚发了 v0.6.1，11个PR合并。&lt;/p&gt;
&lt;p&gt;移动端断线重连、登录安全、Skills外部目录——都是用户催了几个月的刚需。&lt;/p&gt;
&lt;p&gt;我花了一晚上升级体验，把值得关心的点全整理出来了。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;这次更新解决了&lt;strong&gt;两个最烦人的问题&lt;/strong&gt;：移动端聊着聊着断线丢状态，以及多人共用时登录安全性不够。&lt;/p&gt;
&lt;p&gt;加上 Profile 管理优化和 Skills 外部目录支持，v0.6.1 是一个&lt;strong&gt;值得立刻升级&lt;/strong&gt;的版本。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4个重点更新按优先级排"&gt;4个重点更新，按优先级排
&lt;/h2&gt;&lt;h3 id="1-移动端断线重连终于不丢状态了"&gt;1. 移动端断线重连——终于不丢状态了
&lt;/h3&gt;&lt;p&gt;之前用手机打开 Web UI，切个应用回来，&lt;strong&gt;连接就断了&lt;/strong&gt;。聊天记录、Agent运行状态全没了。&lt;/p&gt;
&lt;p&gt;v0.6.1 把移动端和后台聊天断线视为&lt;strong&gt;临时性故障&lt;/strong&gt;，重连后从服务器恢复运行状态。&lt;/p&gt;
&lt;p&gt;简单说：你切出去回个微信，回来还能接着聊。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;**实际体感：**从&amp;quot;每次切应用都要刷新页面&amp;quot;变成了&amp;quot;无感重连&amp;quot;。如果你主要用手机操作 Agent，这一个改动就值得升级。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="2-登录安全增强防暴力破解"&gt;2. 登录安全增强——防暴力破解
&lt;/h3&gt;&lt;p&gt;新增 IP 锁定机制：同一 IP 连续登录失败 &lt;strong&gt;10 次&lt;/strong&gt;，自动锁定。&lt;/p&gt;
&lt;p&gt;锁了之后，登录界面直接显示恢复命令：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;命令&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;clear-lock&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;清除 IP 锁定&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;reset-default-login&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;重置默认登录凭据&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;同时，遗留的 &lt;code&gt;AUTH_DISABLED&lt;/code&gt; 绕过已被&lt;strong&gt;彻底移除&lt;/strong&gt;。多人环境下不再有免认证后门。&lt;/p&gt;
&lt;h3 id="3-skills-外部目录插件管理更灵活"&gt;3. Skills 外部目录——插件管理更灵活
&lt;/h3&gt;&lt;p&gt;现在可以在 Profile 配置中指定 &lt;code&gt;skills.external_dirs&lt;/code&gt;，从&lt;strong&gt;任意目录加载 Skills&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;规则很清晰：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本地优先&lt;/strong&gt;：同名 Skill，本地版本覆盖外部版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标记区分&lt;/strong&gt;：外部 Skills 会被标记，方便识别来源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;热加载&lt;/strong&gt;：从活跃的 Profile 配置中直接读取&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着你可以把通用 Skills 放在一个共享目录，多个 Profile 复用，不用再每个 Profile 复制一份。&lt;/p&gt;
&lt;h3 id="4-profile-管理列表更完整操作更精准"&gt;4. Profile 管理——列表更完整、操作更精准
&lt;/h3&gt;&lt;p&gt;Session 列表现在显示账户下&lt;strong&gt;所有可用 Profile&lt;/strong&gt;，不再只显示当前过滤后的。&lt;/p&gt;
&lt;p&gt;历史操作也更精准了：删除 session 时用 profile 限定目标，全局 Profile 变更时自动刷新 History 列表。&lt;/p&gt;
&lt;p&gt;加上 CLI 的 &lt;code&gt;node:sqlite&lt;/code&gt; 实验性警告也被干掉了——控制台终于干净了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="其他值得注意的改动"&gt;其他值得注意的改动
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;改动&lt;/th&gt;
 &lt;th&gt;影响&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;确认/澄清回复通道修复&lt;/td&gt;
 &lt;td&gt;Clarify 和 confirmation 消息走认证 socket，不再丢失&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;导航链接改进&lt;/td&gt;
 &lt;td&gt;支持新标签页打开、复制链接、持久化折叠侧边栏&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Session 链接修复&lt;/td&gt;
 &lt;td&gt;不再泄漏 Profile 过滤器到普通 session 列表&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;工具标记持久化&lt;/td&gt;
 &lt;td&gt;Bridge marker 在 tool/run 边界持久化，状态更可靠&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="我的升级建议"&gt;我的升级建议
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;如果你在用 Hermes Web UI&lt;/strong&gt;，直接升。移动端重连和安全修复是刚需，没有不升的理由。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你还没用过&lt;/strong&gt;，6k+ Star、765 Fork——社区最活跃的第三方 Web UI，值得一试。&lt;/p&gt;
&lt;p&gt;多 Profile 管理、移动端支持、Skills 扩展，该有的都有了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="快速上手"&gt;快速上手
&lt;/h2&gt;&lt;p&gt;三步搞定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;升级&lt;/strong&gt;：拉取最新代码，重新构建&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置&lt;/strong&gt;：设置 &lt;code&gt;AUTH_TOKEN&lt;/code&gt;，多用户环境下别用默认密码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证&lt;/strong&gt;：手机打开 Web UI，切应用再切回来，确认无感重连生效&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;v0.6.1 合并了 11 个 PR（#971 ~ #1014），发布于 2026-05-25。仓库星标 6.1k，Fork 765。&lt;/p&gt;</description></item><item><title>5款Hermes Agent Web UI对比：只有2个值得装</title><link>https://blog.kalend.top/2026/05/23/hermes-web-ui-comparison.html/</link><pubDate>Sat, 23 May 2026 12:20:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/23/hermes-web-ui-comparison.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;用了半年 Hermes Agent，一直靠终端敲命令。直到有一天我想在手机上查个对话记录——没办法，只能SSH上去翻日志。于是我开始找 Web UI。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;只想装一个？选 hermes-webui（8.3K Star）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;想要IDE级体验？hermes-workspace。其余三个，各有硬伤。&lt;/p&gt;
&lt;p&gt;下面逐个拆解。&lt;/p&gt;
&lt;h2 id="1-官方内嵌-dashboard"&gt;1. 官方内嵌 Dashboard
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes dashboard
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;启动后打开 &lt;code&gt;http://localhost:9119&lt;/code&gt;，FastAPI + Uvicorn 驱动。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;能干什么：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看和编辑配置文件（config.yaml）&lt;/li&gt;
&lt;li&gt;管理环境变量（.env）&lt;/li&gt;
&lt;li&gt;浏览会话列表&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;不能干什么：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不能聊天（没有对话界面）&lt;/li&gt;
&lt;li&gt;不能管理Skills、Cron任务&lt;/li&gt;
&lt;li&gt;不能在手机上用（只绑127.0.0.1）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官方 Dashboard 本质是个配置编辑器。&lt;/p&gt;
&lt;p&gt;适合不需要Web聊天、只想改改配置的轻量用户。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;评分：&lt;/strong&gt; 安装 ★★★★★ | 功能 ★★☆☆☆ | 手机 ★☆☆☆☆ | 维护 ★★★★★&lt;/p&gt;
&lt;h2 id="2-nesquenahermes-webui---83k"&gt;2. nesquena/hermes-webui — ⭐ 8.3K
&lt;/h2&gt;&lt;p&gt;Python + 原生JS，三栏布局。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/nesquena/hermes-webui.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; hermes-webui
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install -r requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python app.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不需要npm构建，不需要Docker。装完直接跑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心功能：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;完整对话界面（聊天、发图、文件上传）&lt;/li&gt;
&lt;li&gt;会话管理（创建、切换、删除）&lt;/li&gt;
&lt;li&gt;手机端自适应（三栏自动折叠）&lt;/li&gt;
&lt;li&gt;直接读取Hermes本地数据（会话、记忆、配置）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;为什么推荐它：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;零构建步骤这一点就秒杀了大部分竞品。&lt;/p&gt;
&lt;p&gt;三栏布局在桌面端是会话列表 | 对话区 | 详情面板，手机上自动折叠为单栏。&lt;/p&gt;
&lt;p&gt;根据README描述，支持实时流式输出和Markdown渲染。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不足：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不支持Cron任务管理&lt;/li&gt;
&lt;li&gt;不支持Kanban看板&lt;/li&gt;
&lt;li&gt;没有多用户系统&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;评分：&lt;/strong&gt; 安装 ★★★★★ | 功能 ★★★★☆ | 手机 ★★★★☆ | 维护 ★★★★☆&lt;/p&gt;
&lt;h2 id="3-outsourc-ehermes-workspace---47k"&gt;3. outsourc-e/hermes-workspace — ⭐ 4.7K
&lt;/h2&gt;&lt;p&gt;JavaScript，IDE风格多面板界面。&lt;/p&gt;
&lt;p&gt;2026年黑客松获奖项目。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/outsourc-e/hermes-workspace.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; hermes-workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;需要Node.js环境，有构建步骤。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心功能：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IDE风格多面板（对话、终端、记忆、Skills、检查器）&lt;/li&gt;
&lt;li&gt;内置终端模拟器&lt;/li&gt;
&lt;li&gt;记忆和Skills的可视化管理&lt;/li&gt;
&lt;li&gt;支持实时日志查看&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适合谁：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;重度开发者，喜欢IDE布局，需要同时看对话、终端和状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不足：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要npm构建（对纯Python用户不友好）&lt;/li&gt;
&lt;li&gt;手机端体验一般（面板太多，小屏挤不下）&lt;/li&gt;
&lt;li&gt;Star数最少，社区相对小&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;评分：&lt;/strong&gt; 安装 ★★★☆☆ | 功能 ★★★★★ | 手机 ★★☆☆☆ | 维护 ★★★☆☆&lt;/p&gt;
&lt;h2 id="4-ekkolearnaihermes-web-ui---58k"&gt;4. EKKOLearnAI/hermes-web-ui — ⭐ 5.8K
&lt;/h2&gt;&lt;p&gt;Vue3 + Koa，端口8648。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/EKKOLearnAI/hermes-web-ui.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; hermes-web-ui
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 需要分别构建前后端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;核心功能：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全功能管理界面（聊天、会话、配置）&lt;/li&gt;
&lt;li&gt;支持8个平台渠道可视化（Telegram、Discord、Slack等）&lt;/li&gt;
&lt;li&gt;定时任务（Cron）管理&lt;/li&gt;
&lt;li&gt;用量分析面板&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;不足：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;构建步骤最复杂（前后端分离）&lt;/li&gt;
&lt;li&gt;Vue3技术栈对非前端开发者有门槛&lt;/li&gt;
&lt;li&gt;从功能来看，平台渠道可视化是亮点也是局限——大部分个人用户用不到8个平台&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;评分：&lt;/strong&gt; 安装 ★★☆☆☆ | 功能 ★★★★★ | 手机 ★★★☆☆ | 维护 ★★★★☆&lt;/p&gt;
&lt;h2 id="5-open-webui---138k"&gt;5. Open WebUI — ⭐ 138K+
&lt;/h2&gt;&lt;p&gt;138K Star的通用LLM前端，不是专为Hermes设计的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;怎么接Hermes：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 启动Hermes API Server（端口8642）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes gateway --platform api_server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 启动Open WebUI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -p 3000:8080 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;OPENAI_API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:8642/v1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dummy &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ghcr.io/open-webui/open-webui:main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通过Hermes的API Server（端口8642）接入。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优势：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;生态最大（138K Star，社区资源丰富）&lt;/li&gt;
&lt;li&gt;支持RAG、文件上传、图像生成等高级功能&lt;/li&gt;
&lt;li&gt;Docker一键部署&lt;/li&gt;
&lt;li&gt;多用户系统、权限管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;为什么不是首选：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Open WebUI是通用LLM前端，不是Hermes原生客户端。&lt;/p&gt;
&lt;p&gt;你无法管理Hermes特有的功能：Skills、Cron、记忆、Kanban、多Profile。&lt;/p&gt;
&lt;p&gt;它只能「聊天」，不能「管理Hermes」。&lt;/p&gt;
&lt;p&gt;适合需要多用户+RAG+文件分析的团队场景，不适合个人Hermes全功能管理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;评分：&lt;/strong&gt; 安装 ★★★☆☆ | 功能 ★★★☆☆（Hermes维度） | 手机 ★★★★☆ | 维护 ★★★★★&lt;/p&gt;
&lt;h2 id="对比总表"&gt;对比总表
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th style="text-align: center"&gt;官方Dashboard&lt;/th&gt;
 &lt;th style="text-align: center"&gt;hermes-webui&lt;/th&gt;
 &lt;th style="text-align: center"&gt;hermes-workspace&lt;/th&gt;
 &lt;th style="text-align: center"&gt;hermes-web-ui&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Open WebUI&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Star&lt;/td&gt;
 &lt;td style="text-align: center"&gt;内置&lt;/td&gt;
 &lt;td style="text-align: center"&gt;8.3K&lt;/td&gt;
 &lt;td style="text-align: center"&gt;4.7K&lt;/td&gt;
 &lt;td style="text-align: center"&gt;5.8K&lt;/td&gt;
 &lt;td style="text-align: center"&gt;138K&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;安装难度&lt;/td&gt;
 &lt;td style="text-align: center"&gt;零&lt;/td&gt;
 &lt;td style="text-align: center"&gt;极低&lt;/td&gt;
 &lt;td style="text-align: center"&gt;中&lt;/td&gt;
 &lt;td style="text-align: center"&gt;高&lt;/td&gt;
 &lt;td style="text-align: center"&gt;中&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;聊天功能&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;会话管理&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Skills管理&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Cron管理&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;记忆管理&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;手机适配&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;一般&lt;/td&gt;
 &lt;td style="text-align: center"&gt;一般&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;多平台渠道&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;构建步骤&lt;/td&gt;
 &lt;td style="text-align: center"&gt;无&lt;/td&gt;
 &lt;td style="text-align: center"&gt;无&lt;/td&gt;
 &lt;td style="text-align: center"&gt;npm&lt;/td&gt;
 &lt;td style="text-align: center"&gt;npm&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Docker&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;适合人群&lt;/td&gt;
 &lt;td style="text-align: center"&gt;改配置&lt;/td&gt;
 &lt;td style="text-align: center"&gt;日常使用&lt;/td&gt;
 &lt;td style="text-align: center"&gt;重度开发&lt;/td&gt;
 &lt;td style="text-align: center"&gt;运维管理&lt;/td&gt;
 &lt;td style="text-align: center"&gt;团队协作&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="选择建议"&gt;选择建议
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;个人用户，想最快用上Web界面：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;hermes-webui。三条命令装完，手机也能用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;开发者，需要IDE级管理：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;hermes-workspace。终端、记忆、Skills全在一个界面。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;运维需求，管多平台+Cron：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;hermes-web-ui。唯一一个带Cron管理和渠道可视化的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;团队场景，多用户+RAG：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Open WebUI。但别指望它管理Hermes特有功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;只是偶尔改改配置：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;官方Dashboard就够了。&lt;code&gt;hermes dashboard&lt;/code&gt; 一条命令。&lt;/p&gt;
&lt;section style="margin:20px 0;padding:16px 20px;background:linear-gradient(135deg,#4a90d9,#357abd);border-radius:8px;text-align:center;"&gt;
&lt;p style="margin:0;color:#fff;font-size:16px;font-weight:bold;line-height:1.6;"&gt;关注 varkm，一起学习，一起成长&lt;/p&gt;
&lt;/section&gt;</description></item><item><title>装完就懵？一份文件告诉你 Hermes 的每个配置到底管什么</title><link>https://blog.kalend.top/2026/05/22/hermes-config-guide.html/</link><pubDate>Fri, 22 May 2026 10:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/22/hermes-config-guide.html/</guid><description>&lt;h2 id="开篇导语"&gt;开篇导语
&lt;/h2&gt;&lt;p&gt;装好 Hermes Agent，&lt;code&gt;~/.hermes/&lt;/code&gt; 下一堆文件，&lt;code&gt;config.yaml&lt;/code&gt;、&lt;code&gt;.env&lt;/code&gt;、&lt;code&gt;SOUL.md&lt;/code&gt;&amp;hellip; 哪个改哪个不改，新手完全懵。&lt;/p&gt;
&lt;h2 id="第一章你的-hermes-长什么样"&gt;第一章：你的 ~/.hermes/ 长什么样
&lt;/h2&gt;&lt;p&gt;用一棵目录树展示所有文件/目录分层：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.hermes/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 核心配置（3个文件）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── config.yaml # 主配置文件（300+ 行）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── .env # API 密钥和凭证（405 行，18+ 供应商）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── SOUL.md # Agent 个性定义（每轮加载，改了立生效）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 数据存储
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── sessions/ # 历史会话 JSON 文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── memories/ # 记忆文件（MEMORY.md、USER.md）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── kanban/ # 看板任务和日志
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── cron/ # 定时任务输出
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── logs/ # 日志文件（agent.log、errors.log）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── state.db # SQLite 数据库（会话索引、状态）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── checkpoints/ # 文件系统快照（/rollback 使用）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 扩展层
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── skills/ # 技能目录（SKILL.md + 脚本/模板）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── scripts/ # 自定义脚本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── plugins/ # 插件目录（MCP 服务器、平台适配器）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── hooks/ # 事件钩子脚本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── Profile 隔离
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── profiles/ # 多配置并行目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── blog-writer/ # 博客写作 profile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── reviewer/ # 审核 profile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── yuan/ # 个人 AI profile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── 其他
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── auth.json # 认证状态（OAuth token）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── kanban.db # 看板 SQLite 数据库
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── memory.db # 记忆系统数据库
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── .update_check # 版本检查缓存
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;每个 profile（如 &lt;code&gt;blog-writer&lt;/code&gt;）是完整的并行 &lt;code&gt;~/.hermes/&lt;/code&gt;，包含独立的 &lt;code&gt;config.yaml&lt;/code&gt;、&lt;code&gt;.env&lt;/code&gt;、&lt;code&gt;SOUL.md&lt;/code&gt;、&lt;code&gt;state.db&lt;/code&gt;、&lt;code&gt;sessions/&lt;/code&gt;、&lt;code&gt;logs/&lt;/code&gt; 等。&lt;/p&gt;
&lt;h2 id="第二章三大核心文件新手必读"&gt;第二章：三大核心文件（新手必读）
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;文件&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;th&gt;怎么改&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;config.yaml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;所有行为参数（模型、工具、终端、压缩、看板等）&lt;/td&gt;
 &lt;td&gt;编辑文本，改后立即生效（部分需重启 gateway）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;API 密钥和平台凭证&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;export KEY=xxx&lt;/code&gt; 或直接编辑，改后立即生效&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;SOUL.md&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Agent 个性、称呼、反驳机制&lt;/td&gt;
 &lt;td&gt;编辑 Markdown，每轮对话重新加载，&lt;strong&gt;不需要重启&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="configyaml-核心字段速查"&gt;config.yaml 核心字段速查
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;glm-5.1 &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 默认模型&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;zai &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 默认供应商&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;xxx &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# API 密钥（也可用 .env）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;context_length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;204800&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 上下文长度（tokens）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;131072&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 最大输出（tokens）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max_turns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;90&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 最大对话轮数&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;gateway_timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1800&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Gateway 空闲超时（秒）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;reasoning_effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;medium &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 推理强度&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tool_use_enforcement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;auto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 工具调用强制策略&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;terminal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;local &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 终端后端：local/docker/ssh/modal&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;180&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 命令超时（秒）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;compression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 上下文压缩&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 触发阈值（50%）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;target_ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 压缩到阈值比例&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;toolsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;hermes-cli &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 启用的工具集&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kanban&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="env-环境变量全表按供应商分类"&gt;.env 环境变量全表（按供应商分类）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;供应商&lt;/th&gt;
 &lt;th&gt;必须环境变量&lt;/th&gt;
 &lt;th&gt;可选环境变量&lt;/th&gt;
 &lt;th&gt;备注&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;OpenRouter&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;OPENROUTER_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;路由到多模型&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Anthropic&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; 或 &lt;code&gt;ANTHROPIC_TOKEN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;Claude 模型&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;GPT、o1 系列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Z.AI / GLM&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ZAI_API_KEY&lt;/code&gt; 或 &lt;code&gt;GLM_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;智谱 GLM 模型&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Kimi&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;KIMI_API_KEY&lt;/code&gt; 或 &lt;code&gt;KIMI_CN_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;月之暗面&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;MiniMax&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;MINIMAX_API_KEY&lt;/code&gt; 或 &lt;code&gt;MINIMAX_CN_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;国产大模型&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DeepSeek&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;深度求索&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Google / Gemini&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;GOOGLE_API_KEY&lt;/code&gt; 或 &lt;code&gt;GEMINI_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;Gemini 系列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;xAI&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;XAI_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;Grok 模型&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Bedrock&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AWS_BEARER_TOKEN_BEDROCK&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AWS_SECRET&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;AWS 托管&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;平台凭证（消息平台）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;微信：&lt;code&gt;WEIXIN_TOKEN&lt;/code&gt;、&lt;code&gt;WEIXIN_ACCOUNT_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;飞书：&lt;code&gt;FEISHU_APP_ID&lt;/code&gt;、&lt;code&gt;FEISHU_APP_SECRET&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Telegram：&lt;code&gt;TELEGRAM_BOT_TOKEN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Discord：&lt;code&gt;DISCORD_BOT_TOKEN&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="soulmd-实战框架"&gt;SOUL.md 实战框架
&lt;/h3&gt;&lt;p&gt;SOUL.md 定义 Agent 行为，核心六要素：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;要素&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;th&gt;示例&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;身份定位&lt;/td&gt;
 &lt;td&gt;谁是 Agent，谁是用户&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;我是忞的自主执行者和思考伙伴&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;核心职责&lt;/td&gt;
 &lt;td&gt;Agent 要做什么&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;任务执行、思考伙伴、信息管理、风险预警&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;个性特点&lt;/td&gt;
 &lt;td&gt;风格和语气&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;专业、简洁、贴心、高效、可靠、直率&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;执行原则&lt;/td&gt;
 &lt;td&gt;怎么干活&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;先执行后汇报，主动提醒，结果导向&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;反驳机制&lt;/td&gt;
 &lt;td&gt;何时反对用户&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;必须反驳 + 必须带证据 + 替代方案&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;沟通风格&lt;/td&gt;
 &lt;td&gt;怎么说话&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;简洁、结构化、结果先行、主动、坦诚&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;默认 SOUL vs 深度定制 SOUL&lt;/strong&gt; 对比：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;行为&lt;/th&gt;
 &lt;th&gt;默认 SOUL&lt;/th&gt;
 &lt;th&gt;深度定制 SOUL&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;称呼&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;用户&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;忞&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;语言&lt;/td&gt;
 &lt;td&gt;中英文混合&lt;/td&gt;
 &lt;td&gt;始终中文&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;反驳&lt;/td&gt;
 &lt;td&gt;不会反驳&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;强制反驳&lt;/strong&gt;（带证据）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;问责&lt;/td&gt;
 &lt;td&gt;不追问&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;主动追问&lt;/strong&gt;输出是否采纳&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;风格&lt;/td&gt;
 &lt;td&gt;标准客服&lt;/td&gt;
 &lt;td&gt;专业伙伴&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="第三章configyaml-全字段速查"&gt;第三章：config.yaml 全字段速查
&lt;/h2&gt;&lt;h3 id="model--模型配置"&gt;model — 模型配置
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;默认值&lt;/th&gt;
 &lt;th&gt;常见调法&lt;/th&gt;
 &lt;th&gt;踩坑提示&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;glm-5.1&lt;/code&gt;、&lt;code&gt;openrouter/anthropic/claude-sonnet-4&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;空字符串时走 auto-detect&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;provider&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;zai&lt;/code&gt;、&lt;code&gt;openrouter&lt;/code&gt;、&lt;code&gt;anthropic&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;base_url&lt;/code&gt; 指定时 provider 可选&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base_url&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;OpenAI 兼容端点&lt;/td&gt;
 &lt;td&gt;必须以 &lt;code&gt;https://&lt;/code&gt; 或 &lt;code&gt;http://&lt;/code&gt; 开头&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;api_key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;密钥（或用环境变量）&lt;/td&gt;
 &lt;td&gt;优先级：&lt;code&gt;config.yaml&lt;/code&gt; &amp;gt; &lt;code&gt;.env&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;context_length&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;（模型决定）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;128000&lt;/code&gt;（Claude）、&lt;code&gt;200000&lt;/code&gt;（GLM）&lt;/td&gt;
 &lt;td&gt;超出模型实际上限会报错&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;（模型决定）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;4096&lt;/code&gt;（短响应）、&lt;code&gt;131072&lt;/code&gt;（长输出）&lt;/td&gt;
 &lt;td&gt;截断时 &lt;code&gt;finish_reason='length'&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="fallback_providers--故障自动切换"&gt;fallback_providers — 故障自动切换
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;fallback_providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;zai&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;glm-4.7&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://open.bigmodel.cn/api/coding/paas/v4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${GLM_API_KEY}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;context_length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;65536&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;触发条件&lt;/th&gt;
 &lt;th&gt;行为&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;429（Rate Limit）&lt;/td&gt;
 &lt;td&gt;切换到 fallback_providers 下一个&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;503（服务不可用）&lt;/td&gt;
 &lt;td&gt;切换到下一个&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;连接失败&lt;/td&gt;
 &lt;td&gt;切换到下一个&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：fallback 不支持轮询（round-robin），只会从上到下尝试一次。需要配置多个 fallback 条目以实现多级切换。&lt;/p&gt;
&lt;h3 id="auxiliary--辅助模型视觉--压缩--搜索--抽取"&gt;auxiliary — 辅助模型（视觉 / 压缩 / 搜索 / 抽取）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;任务&lt;/th&gt;
 &lt;th&gt;provider 默认值&lt;/th&gt;
 &lt;th&gt;model 默认值&lt;/th&gt;
 &lt;th&gt;timeout&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;vision&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;&amp;quot;（自动）&lt;/td&gt;
 &lt;td&gt;120s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;web_extract&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;360s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;compression&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;120s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;session_search&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;30s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;skills_hub&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;30s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;approval&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;30s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mcp&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;30s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;title_generation&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;30s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;triage_specifier&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;120s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;curator&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;&amp;quot;&amp;quot;&lt;/td&gt;
 &lt;td&gt;600s&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;provider: auto&lt;/code&gt; 时，Hermes 自动选择最佳可用供应商（OpenRouter → Nous → Codex → 自定义）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：视觉任务（vision）超时需设为 120s 或更高，图片下载需要额外时间。&lt;/p&gt;
&lt;h3 id="agent--行为参数"&gt;agent — 行为参数
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;默认值&lt;/th&gt;
 &lt;th&gt;常见调法&lt;/th&gt;
 &lt;th&gt;踩坑提示&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;max_turns&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;90&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;20&lt;/code&gt;（短任务）、&lt;code&gt;200&lt;/code&gt;（长推理）&lt;/td&gt;
 &lt;td&gt;超限后停止，无错误提示&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;reasoning_effort&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;medium&lt;/td&gt;
 &lt;td&gt;low / medium / high&lt;/td&gt;
 &lt;td&gt;某些模型不支持此参数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tool_use_enforcement&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;auto / true / false / [&amp;ldquo;gpt&amp;rdquo;, &amp;ldquo;codex&amp;rdquo;]&lt;/td&gt;
 &lt;td&gt;强制模型调用工具而非描述动作&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;image_input_mode&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;auto&lt;/td&gt;
 &lt;td&gt;native / text&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;native&lt;/code&gt; 直接传图片，&lt;code&gt;text&lt;/code&gt; 先用 vision_analyze 描述&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;gateway_timeout&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;1800&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;3600&lt;/code&gt;（长任务）、&lt;code&gt;600&lt;/code&gt;（短任务）&lt;/td&gt;
 &lt;td&gt;空闲超时，不是任务总时长&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;gateway_notify_interval&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;180&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;600&lt;/code&gt;（长任务反馈）、&lt;code&gt;0&lt;/code&gt;（关闭）&lt;/td&gt;
 &lt;td&gt;周期性&amp;quot;仍工作中&amp;quot;通知间隔&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="terminal--终端后端"&gt;terminal — 终端后端
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;默认值&lt;/th&gt;
 &lt;th&gt;可选值&lt;/th&gt;
 &lt;th&gt;踩坑提示&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;backend&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;local&lt;/td&gt;
 &lt;td&gt;local / docker / ssh / modal / daytona&lt;/td&gt;
 &lt;td&gt;Docker 需要容器运行时&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;timeout&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;180&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;600&lt;/code&gt;（长任务）&lt;/td&gt;
 &lt;td&gt;超时后进程被 SIGTERM&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auto_source_bashrc&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;true&lt;/td&gt;
 &lt;td&gt;true / false&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt; 时只读 &lt;code&gt;~/.bash_profile&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;persistent_shell&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;true&lt;/td&gt;
 &lt;td&gt;true / false&lt;/td&gt;
 &lt;td&gt;SSH 后端自动持久化&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;容器资源限制&lt;/strong&gt;（适用于 docker、modal、daytona）：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;默认值&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;container_cpu&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;CPU 核心数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;container_memory&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;5120&lt;/td&gt;
 &lt;td&gt;内存（MB），默认 5GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;container_disk&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;51200&lt;/td&gt;
 &lt;td&gt;磁盘（MB），默认 50GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="compression--上下文压缩策略"&gt;compression — 上下文压缩策略
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;默认值&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;enabled&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;true&lt;/td&gt;
 &lt;td&gt;是否启用压缩&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;threshold&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;0.5&lt;/td&gt;
 &lt;td&gt;触发阈值（50% 上下文使用率）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;target_ratio&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;0.2&lt;/td&gt;
 &lt;td&gt;压缩到阈值比例（保留 20%）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;protect_last_n&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;20&lt;/td&gt;
 &lt;td&gt;保留最近 N 条消息不压缩&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;protect_first_n&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;保留开篇 N 条非系统消息&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：压缩发生在&lt;strong&gt;每轮对话结束&lt;/strong&gt;，不是实时压缩。&lt;code&gt;protect_first_n&lt;/code&gt; 包含在 &lt;code&gt;protect_last_n&lt;/code&gt; 之外。&lt;/p&gt;
&lt;h3 id="toolsets--platform_toolsets--工具集配置"&gt;toolsets / platform_toolsets — 工具集配置
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;平台&lt;/th&gt;
 &lt;th&gt;默认工具集&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;cli（命令行）&lt;/td&gt;
 &lt;td&gt;browser、clarify、code_execution、cronjob、delegation、file、memory、session_search、skills、terminal、todo、tts、vision&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;telegram&lt;/td&gt;
 &lt;td&gt;hermes-telegram&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;discord&lt;/td&gt;
 &lt;td&gt;hermes-discord&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;whatsapp&lt;/td&gt;
 &lt;td&gt;hermes-whatsapp&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;禁用工具集&lt;/strong&gt;：在 &lt;code&gt;config.yaml&lt;/code&gt; 中设置 &lt;code&gt;disabled_toolsets: [&amp;quot;vision&amp;quot;, &amp;quot;tts&amp;quot;]&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：&lt;code&gt;platform_toolsets&lt;/code&gt; 在 tools_config.py 中读取，不是直接在 config.py 中。&lt;/p&gt;
&lt;h3 id="smart_model_routing--简单问题用便宜模型"&gt;smart_model_routing — 简单问题用便宜模型
&lt;/h3&gt;&lt;p&gt;⚠️ &lt;strong&gt;当前版本（0.14.0）此配置键未实现&lt;/strong&gt;。配置文件中存在，但源码中无读取逻辑。&lt;/p&gt;
&lt;p&gt;官方文档提及该功能，但目前需通过 Shell Hook 自实现（见 memory 记录）。&lt;/p&gt;
&lt;h3 id="session_reset--会话自动重置"&gt;session_reset — 会话自动重置
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;默认值&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mode&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;both&lt;/td&gt;
 &lt;td&gt;idle（空闲）、daily（每日）、both（两者）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;idle_minutes&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;1440&lt;/td&gt;
 &lt;td&gt;空闲 N 分钟后重置&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;at_hour&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;每日 N 点强制重置&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：会话重置在 gateway 模式下生效，CLI 模式不受影响。&lt;/p&gt;
&lt;h3 id="checkpoints--文件系统快照"&gt;checkpoints — 文件系统快照
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;默认值&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;enabled&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;false&lt;/td&gt;
 &lt;td&gt;是否启用&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;max_snapshots&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;20&lt;/td&gt;
 &lt;td&gt;每个项目最多快照数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;max_total_size_mb&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;500&lt;/td&gt;
 &lt;td&gt;总大小上限（MB）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;max_file_size_mb&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;10&lt;/td&gt;
 &lt;td&gt;单文件跳过阈值&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auto_prune&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;true&lt;/td&gt;
 &lt;td&gt;自动清理过期快照&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;retention_days&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;7&lt;/td&gt;
 &lt;td&gt;保留天数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：&lt;code&gt;enabled&lt;/code&gt; 默认 &lt;code&gt;false&lt;/code&gt;，需要主动开启。&lt;code&gt;/rollback&lt;/code&gt; 命令依赖此功能。&lt;/p&gt;
&lt;h3 id="mcp_servers--mcp-服务器连接"&gt;mcp_servers — MCP 服务器连接
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;mcp_servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;browser-use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://api.browser-use.com/v3/mcp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;x-browser-use-api-key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${BROWSER_USE_API_KEY}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;300&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;必填&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;是&lt;/td&gt;
 &lt;td&gt;MCP 服务器地址&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;headers&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;否&lt;/td&gt;
 &lt;td&gt;自定义 HTTP 头&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;timeout&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;否&lt;/td&gt;
 &lt;td&gt;连接超时（秒）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="plugins--插件启用--禁用"&gt;plugins — 插件启用 / 禁用
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;disk-cleanup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;rtk-rewrite&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;some-plugin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：插件需先安装在 &lt;code&gt;~/.hermes/plugins/&lt;/code&gt; 目录，否则找不到。&lt;/p&gt;
&lt;h2 id="第四章env-环境变量全表按供应商分类"&gt;第四章：.env 环境变量全表（按供应商分类）
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;供应商&lt;/th&gt;
 &lt;th&gt;必须变量&lt;/th&gt;
 &lt;th&gt;可选变量&lt;/th&gt;
 &lt;th&gt;平台凭证&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;OpenRouter&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;OPENROUTER_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Anthropic&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; 或 &lt;code&gt;ANTHROPIC_TOKEN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Z.AI / GLM&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ZAI_API_KEY&lt;/code&gt; 或 &lt;code&gt;GLM_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Kimi&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;KIMI_API_KEY&lt;/code&gt; 或 &lt;code&gt;KIMI_CN_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;MiniMax&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;MINIMAX_API_KEY&lt;/code&gt; 或 &lt;code&gt;MINIMAX_CN_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DeepSeek&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Google / Gemini&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;GOOGLE_API_KEY&lt;/code&gt; 或 &lt;code&gt;GEMINI_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;xAI&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;XAI_API_KEY&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Bedrock&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AWS_BEARER_TOKEN_BEDROCK&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AWS_SECRET&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;平台凭证&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;- 微信&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;WEIXIN_TOKEN&lt;/code&gt;、&lt;code&gt;WEIXIN_ACCOUNT_ID&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;- 飞书&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;FEISHU_APP_ID&lt;/code&gt;、&lt;code&gt;FEISHU_APP_SECRET&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;- Telegram&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;TELEGRAM_BOT_TOKEN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;- Discord&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;DISCORD_BOT_TOKEN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：&lt;code&gt;.env&lt;/code&gt; 文件不支持 bash 变量展开（如 &lt;code&gt;${HOME}&lt;/code&gt;），只能用字面路径。&lt;/p&gt;
&lt;h2 id="第五章soulmd--给-agent-一个灵魂"&gt;第五章：SOUL.md — 给 Agent 一个灵魂
&lt;/h2&gt;&lt;p&gt;SOUL.md 每轮对话加载，改了立即生效，&lt;strong&gt;不需要重启&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="实战框架六要素"&gt;实战框架：六要素
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 身份定位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;我是忞的**自主执行者和思考伙伴**。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 核心职责
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**任务执行**&lt;/span&gt;：完成忞交代的任务
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**思考伙伴**&lt;/span&gt;：评估想法再执行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**信息管理**&lt;/span&gt;：主动收集整理信息
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**风险预警**&lt;/span&gt;：发现潜在风险立即告知
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 个性特点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **专业**：专家级能力，判断准确
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **简洁**：一句话说清，表格优先
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **贴心**：主动提醒风险
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **高效**：立即执行，先做后报
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 执行原则
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**高执行力**&lt;/span&gt;：先执行后汇报
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**主动提醒**&lt;/span&gt;：发现风险立即告知
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**主动总结**&lt;/span&gt;：任务完成自动总结
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 反驳机制（强制执行）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **必须反驳**：有问题必须指出
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **必须带证据**：每次反驳附带数据或案例
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; **禁止为反而反**：没有依据的抬杠毫无价值
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 沟通风格
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; ✅ &lt;span class="gs"&gt;**简洁**&lt;/span&gt;：能一句话不用两句
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; ✅ &lt;span class="gs"&gt;**结构化**&lt;/span&gt;：表格优先
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; ✅ &lt;span class="gs"&gt;**结果先行**&lt;/span&gt;：先说结论
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; ❌ &lt;span class="gs"&gt;**禁止**&lt;/span&gt;：冗余解释、废话铺垫
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="默认-soul-vs-深度定制-soul"&gt;默认 SOUL vs 深度定制 SOUL
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;行为&lt;/th&gt;
 &lt;th&gt;默认 SOUL&lt;/th&gt;
 &lt;th&gt;深度定制 SOUL&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;称呼&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;用户&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;忞&amp;rdquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;反驳&lt;/td&gt;
 &lt;td&gt;无反驳机制&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;强制反驳 + 证据&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;问责&lt;/td&gt;
 &lt;td&gt;不追问&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;主动追问&lt;/strong&gt;输出是否采纳&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;风格&lt;/td&gt;
 &lt;td&gt;标准客服&lt;/td&gt;
 &lt;td&gt;专业伙伴&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="第六章数据目录--agent-的记忆宫殿"&gt;第六章：数据目录 — Agent 的&amp;quot;记忆宫殿&amp;quot;
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;目录&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;th&gt;能否删除&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;sessions/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;历史会话 JSON 文件&lt;/td&gt;
 &lt;td&gt;可以，但失去历史记录&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;memories/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;记忆文件（MEMORY.md、USER.md）&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;不要删&lt;/strong&gt;，丢失记忆&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;state.db&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;SQLite 数据库（会话索引）&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;不要删&lt;/strong&gt;，破坏数据完整性&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;kanban/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;看板任务和日志&lt;/td&gt;
 &lt;td&gt;可以，但失去看板状态&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;cron/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;定时任务输出&lt;/td&gt;
 &lt;td&gt;可以，临时文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;logs/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;日志文件（agent.log、errors.log）&lt;/td&gt;
 &lt;td&gt;可以，但失去调试信息&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;checkpoints/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;文件系统快照&lt;/td&gt;
 &lt;td&gt;可以，失去 /rollback 能力&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;auth.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;OAuth token&lt;/td&gt;
 &lt;td&gt;可以，但需重新授权&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：&lt;code&gt;state.db&lt;/code&gt; 和 &lt;code&gt;memory.db&lt;/code&gt; 是核心数据库，删除会导致会话和记忆丢失。&lt;/p&gt;
&lt;h2 id="第七章扩展层--让-agent-越来越强"&gt;第七章：扩展层 — 让 Agent 越来越强
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;目录&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;th&gt;使用方式&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;skills/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;技能目录（SKILL.md + 脚本）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/skills&lt;/code&gt; 命令管理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;scripts/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;自定义脚本&lt;/td&gt;
 &lt;td&gt;终端直接调用&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;plugins/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;插件目录（MCP 服务器、平台适配器）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;config.yaml&lt;/code&gt; → &lt;code&gt;plugins.enabled&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hooks/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;事件钩子脚本&lt;/td&gt;
 &lt;td&gt;会话开始/结束时执行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：技能必须包含 &lt;code&gt;SKILL.md&lt;/code&gt;（YAML frontmatter + Markdown body），否则无法加载。&lt;/p&gt;
&lt;h2 id="第八章profiles--多实例并行"&gt;第八章：Profiles — 多实例并行
&lt;/h2&gt;&lt;p&gt;每个 profile 是完整的并行 &lt;code&gt;~/.hermes/&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.hermes/profiles/blog-writer/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── config.yaml # 独立配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .env # 独立凭证
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── SOUL.md # 独立个性
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── state.db # 独立数据库
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── sessions/ # 独立会话
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── logs/ # 独立日志
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;典型场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;blog-writer&lt;/code&gt;：博客写作，模型 glm-4.7&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reviewer&lt;/code&gt;：审核质量，模型 glm-5.1&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yuan&lt;/code&gt;：个人 AI，模型 glm-5-turbo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;切换 profile&lt;/strong&gt;：&lt;code&gt;hermes -p blog-writer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：profile 不共享配置和状态，完全隔离。&lt;/p&gt;
&lt;h2 id="第九章安全地图"&gt;第九章：安全地图
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;文件/配置&lt;/th&gt;
 &lt;th&gt;安全等级&lt;/th&gt;
 &lt;th&gt;建议&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;🟢 &lt;code&gt;config.yaml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;低&lt;/td&gt;
 &lt;td&gt;可以自由修改&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;🟢 &lt;code&gt;.env&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;高&lt;/td&gt;
 &lt;td&gt;包含 API 密钥，不要提交到版本控制&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;🟢 &lt;code&gt;SOUL.md&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;低&lt;/td&gt;
 &lt;td&gt;可以自由修改&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;🟡 &lt;code&gt;state.db&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;中&lt;/td&gt;
 &lt;td&gt;包含会话数据，谨慎删除&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;🟡 &lt;code&gt;memory.db&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;中&lt;/td&gt;
 &lt;td&gt;包含记忆数据，谨慎删除&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;🔴 &lt;code&gt;auth.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;高&lt;/td&gt;
 &lt;td&gt;包含 OAuth token，不要泄露&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;🔴 &lt;code&gt;.env&lt;/code&gt; 密钥&lt;/td&gt;
 &lt;td&gt;高&lt;/td&gt;
 &lt;td&gt;不要在对话中完整展示&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="附录"&gt;附录
&lt;/h2&gt;&lt;h3 id="a-hermes-doctor-输出解读"&gt;A. hermes doctor 输出解读
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;hermes doctor&lt;/code&gt; 检查项：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;检查项&lt;/th&gt;
 &lt;th&gt;输出示例&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Python 版本&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;✓ Python 3.13.0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;版本满足要求&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hermes 版本&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;✓ Hermes Agent v0.14.0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;当前版本&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenAI SDK&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;✓ OpenAI SDK 1.x&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;SDK 已安装&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;API 密钥&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;✓ OPENROUTER_API_KEY set&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;凭证已配置&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;配置文件&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;✓ config.yaml valid&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;配置格式正确&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="b-常见报错对应的配置项"&gt;B. 常见报错对应的配置项
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;报错&lt;/th&gt;
 &lt;th&gt;对应配置项&lt;/th&gt;
 &lt;th&gt;解决方案&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;401 Unauthorized&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;api_key&lt;/code&gt; 或 &lt;code&gt;.env&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;检查密钥是否正确&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;429 Rate Limit&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;fallback_providers&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;配置备用供应商&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;max_tokens exceeded&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;减小输出长度&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;context length exceeded&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;context_length&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;减小上下文长度&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tool not found&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;toolsets&lt;/code&gt; / &lt;code&gt;disabled_toolsets&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;检查工具集配置&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;permission denied&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;terminal.backend&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;检查容器权限&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="c-最小启动配置模板"&gt;C. 最小启动配置模板
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;glm-5.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;zai&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${ZAI_API_KEY}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max_turns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;90&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;terminal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;backend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;local&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;180&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;compression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;toolsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;hermes-cli&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;terminal&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;.env&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ZAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key_here
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;Hermes 配置文件结构清晰：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;核心三文件&lt;/strong&gt;：&lt;code&gt;config.yaml&lt;/code&gt;（行为）、&lt;code&gt;.env&lt;/code&gt;（凭证）、&lt;code&gt;SOUL.md&lt;/code&gt;（个性）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据目录&lt;/strong&gt;：&lt;code&gt;sessions/&lt;/code&gt;、&lt;code&gt;memories/&lt;/code&gt;、&lt;code&gt;state.db&lt;/code&gt; 是 Agent 的&amp;quot;记忆宫殿&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;扩展层&lt;/strong&gt;：&lt;code&gt;skills/&lt;/code&gt;、&lt;code&gt;plugins/&lt;/code&gt; 让 Agent 越来越强&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profiles&lt;/strong&gt;：多实例并行，每个 profile 完全独立&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全第一&lt;/strong&gt;：&lt;code&gt;.env&lt;/code&gt; 和 &lt;code&gt;auth.json&lt;/code&gt; 包含敏感信息，谨慎处理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;记住：SOUL.md 改了立即生效，config.yaml 部分配置需重启 gateway。&lt;/p&gt;
&lt;p&gt;关注 varkm，一起学习，一起成长。&lt;/p&gt;</description></item><item><title>多Agent协作实战：从写稿到审核的完整Pipeline</title><link>https://blog.kalend.top/2026/05/19/multi-agent-pipeline-part3.html/</link><pubDate>Tue, 19 May 2026 07:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/19/multi-agent-pipeline-part3.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;一篇AI对比文章，4个Agent接力完成，10步Pipeline自动跑通。中间经历3轮审核修复循环，全程1.5小时零人工介入。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们搭了一套多Agent协作的写作Pipeline。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4个专职Agent&lt;/strong&gt;：写作、审核、博客部署、公众号发布，各司其职。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10步自动流水线&lt;/strong&gt;：从第一行字写出来，到博客上线、公众号草稿就绪，全自动。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;质量门禁&lt;/strong&gt;：审核不通过，下游任务直接卡住，修好了才放行。&lt;/p&gt;
&lt;p&gt;这是系列第3篇。第1篇讲了Kanban+Profile架构，第2篇搭了单个Writer Agent。&lt;/p&gt;
&lt;p&gt;这篇是&lt;strong&gt;多Agent协作的完整实战&lt;/strong&gt;——怎么让4个Agent接力干活、互相检查、自动修复。&lt;/p&gt;
&lt;h2 id="1-4个agent怎么分工"&gt;1. 4个Agent怎么分工
&lt;/h2&gt;&lt;p&gt;先看全局。每个Agent有自己的&lt;strong&gt;Profile&lt;/strong&gt;（身份配置）和&lt;strong&gt;SOUL.md&lt;/strong&gt;（行为规范）。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Agent&lt;/th&gt;
 &lt;th&gt;职责&lt;/th&gt;
 &lt;th&gt;模型&lt;/th&gt;
 &lt;th&gt;特点&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;blog-writer&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;写原始文章&lt;/td&gt;
 &lt;td&gt;glm-5.1&lt;/td&gt;
 &lt;td&gt;204K上下文，有记忆&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;reviewer&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;审核内容质量&lt;/td&gt;
 &lt;td&gt;glm-5.1&lt;/td&gt;
 &lt;td&gt;只审不改，无记忆&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;blog-creator&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;转Markdown+部署&lt;/td&gt;
 &lt;td&gt;glm-4.7&lt;/td&gt;
 &lt;td&gt;最精简工具集&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;mp-creator&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;转公众号HTML+上传&lt;/td&gt;
 &lt;td&gt;glm-4.7&lt;/td&gt;
 &lt;td&gt;4个微信skill&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：像一个编辑部——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;◆ &lt;strong&gt;Writer&lt;/strong&gt;是记者，负责采访写稿&lt;/li&gt;
&lt;li&gt;◆ &lt;strong&gt;Reviewer&lt;/strong&gt;是编辑，负责审稿把关&lt;/li&gt;
&lt;li&gt;◆ &lt;strong&gt;Creator&lt;/strong&gt;是排版员，负责报纸和网站两个渠道的排版&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意模型选择：写作和审核用强模型(glm-5.1)，格式转换用弱模型(glm-4.7)。&lt;/p&gt;
&lt;p&gt;为什么？格式转换是机械活，不需要创造力。省下来的Token是真金白银。&lt;/p&gt;
&lt;h2 id="2-pipeline全景10步流水线"&gt;2. Pipeline全景：10步流水线
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ① blog-writer ② reviewer Fan-out
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────────────┐ ┌──────────────┐ ┌─────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 写原始文章 │──────▶│ 内容审核 │──PASS│ 并行分发 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ (glm-5.1) │ 7min │ PII/事实/AI味 │12min └──────┬──────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────────────┘ └──────────────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌───────────┴───────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ③ blog-creator ④ mp-creator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────────────┐ ┌──────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Markdown+部署 │ │ HTML+封面+上传│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ (glm-4.7) │ │ (glm-4.7) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────┬───────┘ └──────┬───────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ⑤ reviewer ⑥ reviewer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────────────┐ ┌──────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Blog格式审核 │ │ 公众号格式审核 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────┬───────┘ └──────┬───────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; PASS ✅ FAIL ❌
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 博客上线 ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ⟳ 审核修复循环×3轮 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ⑦修复→⑧审核→⑨修复 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ →⑩审核 PASS ✅ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;解释一下关键节点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;◆ &lt;strong&gt;Step ①②&lt;/strong&gt;：Writer写完文章，交给Reviewer审核内容&lt;/li&gt;
&lt;li&gt;◆ &lt;strong&gt;Fan-out&lt;/strong&gt;：审核通过后，同时派给Blog和公众号两个渠道&lt;/li&gt;
&lt;li&gt;◆ &lt;strong&gt;Step ③④&lt;/strong&gt;：两个Creator并行工作，互不等待&lt;/li&gt;
&lt;li&gt;◆ &lt;strong&gt;Step ⑤⑥&lt;/strong&gt;：各自的Reviewer再审一遍格式&lt;/li&gt;
&lt;li&gt;◆ &lt;strong&gt;Step ⑦-⑩&lt;/strong&gt;：公众号没过，进入修复循环&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Blog那边一次通过，公众号那边经历了3轮修复。为什么？&lt;/p&gt;
&lt;p&gt;因为公众号对&lt;strong&gt;段落长度&lt;/strong&gt;有严格限制（每段≤100字），模型对&amp;quot;手机屏幕3行&amp;quot;的物理感知不够精确。&lt;/p&gt;
&lt;h2 id="3-依赖链怎么让agent自动接力"&gt;3. 依赖链：怎么让Agent自动接力
&lt;/h2&gt;&lt;p&gt;核心机制是&lt;strong&gt;Kanban的parents依赖&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;创建任务时指定parents，意思是：&amp;ldquo;等这些父任务完成后，我才启动&amp;rdquo;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建Writer任务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kanban_create&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;写对比文章&amp;#34;&lt;/span&gt;, &lt;span class="nv"&gt;assignee&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;blog-writer&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建Reviewer任务，依赖Writer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kanban_create&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;审核内容&amp;#34;&lt;/span&gt;, &lt;span class="nv"&gt;assignee&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;reviewer&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;t_writer_xxx&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建两个Creator任务，依赖Reviewer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kanban_create&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;部署博客&amp;#34;&lt;/span&gt;, &lt;span class="nv"&gt;assignee&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;blog-creator&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;t_reviewer_xxx&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kanban_create&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;公众号推文&amp;#34;&lt;/span&gt;, &lt;span class="nv"&gt;assignee&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mp-creator&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;t_reviewer_xxx&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意看最后两行——它们的parents是同一个Reviewer任务。&lt;/p&gt;
&lt;p&gt;这意味着Reviewer通过后，Blog和公众号&lt;strong&gt;同时启动&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这就是Fan-out（扇出）：一个任务完成，触发多个下游并行执行。&lt;/p&gt;
&lt;h2 id="4-质量门禁fail就卡住"&gt;4. 质量门禁：FAIL就卡住
&lt;/h2&gt;&lt;p&gt;Reviewer不是走过场。它有&lt;strong&gt;5级审核维度&lt;/strong&gt;，每级有明确的通过标准：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;优先级&lt;/th&gt;
 &lt;th&gt;检查项&lt;/th&gt;
 &lt;th&gt;判定标准&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;🔴 必须通过&lt;/td&gt;
 &lt;td&gt;PII信息脱敏&lt;/td&gt;
 &lt;td&gt;手机号/邮箱/IP必须处理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;🔴 必须通过&lt;/td&gt;
 &lt;td&gt;事实准确性&lt;/td&gt;
 &lt;td&gt;数据有来源，技术描述正确&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;🟡 3处FAIL&lt;/td&gt;
 &lt;td&gt;AI味检测&lt;/td&gt;
 &lt;td&gt;废话铺垫/过度道歉/套话&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;🟢 仅建议&lt;/td&gt;
 &lt;td&gt;品牌名&lt;/td&gt;
 &lt;td&gt;不强制，给出建议&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;🔵 格式规范&lt;/td&gt;
 &lt;td&gt;平台适配&lt;/td&gt;
 &lt;td&gt;Blog/公众号各有专项检查&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键机制&lt;/strong&gt;：Reviewer判定FAIL时，在kanban_complete的metadata里写入问题列表。&lt;/p&gt;
&lt;p&gt;下游任务的parents依赖没满足，&lt;strong&gt;不会自动启动&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;必须创建修复任务，修好后再提交审核。这就是&amp;quot;门禁&amp;quot;——&lt;/p&gt;
&lt;p&gt;不是标记一下就过了，是真的&lt;strong&gt;挡住&lt;/strong&gt;，修好才放行。&lt;/p&gt;
&lt;h2 id="5-实战3轮修复循环"&gt;5. 实战：3轮修复循环
&lt;/h2&gt;&lt;p&gt;说说真实发生的事。&lt;/p&gt;
&lt;p&gt;第一轮公众号HTML生成后，Reviewer发现&lt;strong&gt;11个段落超标&lt;/strong&gt;（限制100字/段）。&lt;/p&gt;
&lt;p&gt;其中3个段落超过150字，在手机上会显示成一大坨。&lt;/p&gt;
&lt;p&gt;mp-creator收到问题列表，拆分段落。&lt;/p&gt;
&lt;p&gt;Reviewer二轮审核——&lt;strong&gt;还有5段超标&lt;/strong&gt;。继续修。&lt;/p&gt;
&lt;p&gt;第三轮审核——&lt;strong&gt;91个段落全部≤100字&lt;/strong&gt;，PASS。&lt;/p&gt;
&lt;p&gt;整个过程零人工介入。Reviewer自动FAIL，mp-creator自动读问题列表修复。&lt;/p&gt;
&lt;p&gt;从第一次FAIL到最终PASS，&lt;strong&gt;修复循环自动跑了3轮&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;教训：模型对&amp;quot;手机屏幕3行=100字&amp;quot;这种物理约束，理解不够精确。需要多轮迭代。&lt;/p&gt;
&lt;h2 id="6-模型分级省钱的关键"&gt;6. 模型分级：省钱的关键
&lt;/h2&gt;&lt;p&gt;4个Agent不是都用最贵的模型。按&lt;strong&gt;职责复杂度&lt;/strong&gt;分级：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;职责&lt;/th&gt;
 &lt;th&gt;模型&lt;/th&gt;
 &lt;th&gt;为什么&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;原创写作&lt;/td&gt;
 &lt;td&gt;glm-5.1（强）&lt;/td&gt;
 &lt;td&gt;需要创造力和上下文&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;内容审核&lt;/td&gt;
 &lt;td&gt;glm-5.1（强）&lt;/td&gt;
 &lt;td&gt;找错需要精确理解&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;格式转换&lt;/td&gt;
 &lt;td&gt;glm-4.7（省）&lt;/td&gt;
 &lt;td&gt;机械任务，够用即可&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;辅助工具&lt;/td&gt;
 &lt;td&gt;glm-4.5-air（最省）&lt;/td&gt;
 &lt;td&gt;压缩/搜索等轻量任务&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;实际效果：写作和审核两个最关键的环节用强模型保证质量。&lt;/p&gt;
&lt;p&gt;格式转换这种&amp;quot;体力活&amp;quot;用弱模型，成本直接砍半。&lt;/p&gt;
&lt;p&gt;而且reviewer在下游兜底，弱模型出了问题也能被拦截。&lt;/p&gt;
&lt;h2 id="7-搭建要点回顾"&gt;7. 搭建要点回顾
&lt;/h2&gt;&lt;p&gt;如果你也想搭这样的Pipeline，关键步骤：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;◆ &lt;strong&gt;Step 1&lt;/strong&gt;：为每个角色创建独立Profile&lt;/li&gt;
&lt;li&gt;◆ &lt;strong&gt;Step 2&lt;/strong&gt;：写SOUL.md定义行为规范&lt;/li&gt;
&lt;li&gt;◆ &lt;strong&gt;Step 3&lt;/strong&gt;：配置review skill的审核checklist&lt;/li&gt;
&lt;li&gt;◆ &lt;strong&gt;Step 4&lt;/strong&gt;：用kanban的parents参数搭建依赖链&lt;/li&gt;
&lt;li&gt;◆ &lt;strong&gt;Step 5&lt;/strong&gt;：按职责复杂度分配模型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最关键的设计决策是&lt;strong&gt;质量门禁&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;没有它，Agent就是各干各的，错误会一路传到最终发布。&lt;/p&gt;
&lt;p&gt;有了它，每个环节都有人把关，问题在传播之前就被拦截。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;关注 varkm，一起学习，一起成长&lt;/p&gt;
&lt;p&gt;多Agent协作系列第3篇 · 第4篇将分享踩坑最佳实践&lt;/p&gt;</description></item><item><title>Hermes vs OpenClaw对比：终端派 Hermes Agent 的选择</title><link>https://blog.kalend.top/2026/05/18/hermes-vs-openclaw.html/</link><pubDate>Mon, 18 May 2026 22:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/18/hermes-vs-openclaw.html/</guid><description>&lt;h2 id="结论先说这不是竞品"&gt;结论先说：这不是竞品
&lt;/h2&gt;&lt;p&gt;这两个项目根本不在一条赛道上。&lt;/p&gt;
&lt;p&gt;OpenClaw（小龙虾🦞）想做的是「全平台个人AI助手」——像Siri一样渗透到你生活的每个角落，微信、WhatsApp、Telegram、macOS、iOS、Android，它都能接。你想用什么渠道就跟它说什么，它就回你在哪儿。&lt;/p&gt;
&lt;p&gt;Hermes Agent 做的是「终端派 Hermes Agent 框架」——给开发者和技术用户的一把瑞士军刀。Kanban任务板、多Agent编排、技能系统、记忆宫殿，全是围绕「如何把复杂任务拆解、分配、执行」设计的。&lt;/p&gt;
&lt;p&gt;如果你想找个好用的个人助手，选 OpenClaw；如果你想搭个能自动跑活的Agent系统，选 Hermes。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="表格对比一眼看懂差异"&gt;表格对比：一眼看懂差异
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;OpenClaw（小龙虾）&lt;/th&gt;
 &lt;th&gt;Hermes Agent&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;定位&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;个人AI助手&lt;/td&gt;
 &lt;td&gt;终端Hermes Agent框架&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;372,888&lt;/td&gt;
 &lt;td&gt;较小众&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;语言&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;TypeScript&lt;/td&gt;
 &lt;td&gt;Python + TypeScript&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;渠道覆盖&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;20+（微信、WhatsApp、Telegram、Slack、Discord、QQ、iMessage、macOS、iOS、Android等）&lt;/td&gt;
 &lt;td&gt;微信、飞书、Telegram、Discord&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;上手门槛&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;一条命令 &lt;code&gt;openclaw onboard&lt;/code&gt; 自动配置&lt;/td&gt;
 &lt;td&gt;需要理解Kanban、Profile、Skill概念&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;多Agent能力&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Multi-agent routing（按渠道/账户隔离）&lt;/td&gt;
 &lt;td&gt;Kanban任务板 + Subagent委托（可视化编排）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;记忆系统&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;基于会话&lt;/td&gt;
 &lt;td&gt;MemPalace（四级回忆链：热记忆→MemPalace→session_search→外部知识库）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;定时任务&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Cron jobs&lt;/td&gt;
 &lt;td&gt;内置Cronjob工具（带keep-alive、context注入）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;技能生态&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;ClawHub（5400+ skills）&lt;/td&gt;
 &lt;td&gt;自建Skill系统（轻量级，易定制）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;部署方式&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Gateway + 多渠道inbox，支持Node 24/22.19+&lt;/td&gt;
 &lt;td&gt;100%本地部署，零第三方依赖&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;安全模型&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Sandbox模式（Docker/SSH/OpenShell）&lt;/td&gt;
 &lt;td&gt;可选Bash/SSH后端&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;特色功能&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Voice Wake、Live Canvas、macOS/iOS/Android原生App&lt;/td&gt;
 &lt;td&gt;Kanban可视化、Profile隔离、技能热加载&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;适合人群&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;想要「好用的助手」的普通用户&lt;/td&gt;
 &lt;td&gt;开发者、技术用户、需要自动化工作流的人&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="渠道覆盖openclaw-完胜"&gt;渠道覆盖：OpenClaw 完胜
&lt;/h2&gt;&lt;p&gt;OpenClaw 支持的渠道列表长得吓人：WhatsApp、Telegram、Slack、Discord、Google Chat、Signal、iMessage、IRC、Microsoft Teams、Matrix、Feishu、LINE、Mattermost、Nextcloud Talk、Nostr、Synology Chat、Tlon、Twitch、Zalo、Zalo Personal、WeChat、QQ、WebChat、macOS、iOS/Android。&lt;/p&gt;
&lt;p&gt;你想在哪个平台跟它聊天，它就在那儿等你。而且它不是简单的「转发消息」，每个渠道都有深度集成——比如 macOS 有 Live Canvas（可视化工作台）、iOS/Android 有 Voice Wake（语音唤醒）、桌面端有原生 App。&lt;/p&gt;
&lt;p&gt;Hermes 只支持四个渠道：微信、飞书、Telegram、Discord。但对我来说够用了——我的主要沟通场景就是微信，偶尔在 Discord 跟技术社区交流。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="上手门槛openclaw-友好hermes-需要理解成本"&gt;上手门槛：OpenClaw 友好，Hermes 需要理解成本
&lt;/h2&gt;&lt;p&gt;OpenClaw 的入门体验堪称教科书级别：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g openclaw@latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openclaw onboard --install-daemon
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;就这么简单。&lt;code&gt;onboard&lt;/code&gt; 命令会引导你一步步配置 Gateway、Workspace、Channels、Skills，像安装软件一样。而且它有 macOS 菜单栏 App、iOS/Android Node，可视化程度很高。&lt;/p&gt;
&lt;p&gt;Hermes 的学习曲线要陡峭一些。你需要理解三个核心概念：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kanban&lt;/strong&gt;：任务板，用来管理和跟踪任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profile&lt;/strong&gt;：Agent 配置文件，不同的 Profile 有不同的工具集和能力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skill&lt;/strong&gt;：技能包，可复用的任务流程&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这不是「安装就能用」，而是「学习后才能发挥威力」的工具。但一旦你理解了这套系统，它的灵活性远超 OpenClaw。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="多agent能力设计哲学差异"&gt;多Agent能力：设计哲学差异
&lt;/h2&gt;&lt;p&gt;两者都支持多 Agent，但思路完全不同。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; 采用「路由隔离」模式：你可以为不同的渠道、账户、Peer 配置独立的 Agent。比如你的微信发给 Agent A，WhatsApp 发给 Agent B，Telegram 的某个群发给 Agent C。每个 Agent 有自己的 Workspace、Session、Tool 配置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hermes&lt;/strong&gt; 采用「任务板编排」模式：所有任务在 Kanban 上统一管理，通过 &lt;code&gt;parents&lt;/code&gt; 字段表达依赖关系。你可以把一个大任务拆解成多个子任务，每个子任务分配给不同的 Profile（比如 &lt;code&gt;researcher&lt;/code&gt; 做调研、&lt;code&gt;writer&lt;/code&gt; 写文章、&lt;code&gt;reviewer&lt;/code&gt; 审核）。当所有父任务完成，子任务自动从 &lt;code&gt;todo&lt;/code&gt; 提升到 &lt;code&gt;ready&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;OpenClaw 更像「多租户隔离」，Hermes 更像「项目化管理」。前者适合个人多场景使用，后者适合复杂工作流自动化。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="记忆系统mempalace-是杀手级特性"&gt;记忆系统：MemPalace 是杀手级特性
&lt;/h2&gt;&lt;p&gt;Hermes 的 MemPalace 是我最喜欢的功能。它不是简单的「存储对话历史」，而是四级回忆链：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;热记忆&lt;/strong&gt;（~2200字符）：高频使用的用户偏好、行为规则、环境配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MemPalace&lt;/strong&gt;：长期知识库，支持分类存储（drawers + memories）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session Search&lt;/strong&gt;：搜索过去会话的总结，快速找回上下文&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外部知识库&lt;/strong&gt;：通过 IMA 集成，连接你的笔记、知识库、收藏&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;OpenClaw 的记忆系统相对传统，主要是基于会话的短期记忆。它也能记住一些上下文，但没有 MemPalace 这种结构化的知识管理。&lt;/p&gt;
&lt;p&gt;如果你需要 Agent 真正「记住」你的长期偏好和知识，Hermes 的 MemPalace 完胜。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="部署方式100本地-vs-gateway模式"&gt;部署方式：100%本地 vs Gateway模式
&lt;/h2&gt;&lt;p&gt;Hermes 是 100% 本地部署的，零第三方依赖。你只需要一个 Python 环境，就能跑起来。所有数据都在你的机器上，隐私绝对安全。&lt;/p&gt;
&lt;p&gt;OpenClaw 是 Gateway 模式——本地跑一个 Gateway 服务（Node 24/22.19+），然后通过各种渠道接入。它支持 7x24 运行，有专业的 daemon 进程管理。但它需要更多的依赖和配置。&lt;/p&gt;
&lt;p&gt;两种部署方式各有优劣：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hermes&lt;/strong&gt;：简单、轻量、隐私友好，但需要你自己维护进程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;：专业、稳定、开箱即用，但需要更多资源&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="生态clawhub-vs-自建技能"&gt;生态：ClawHub vs 自建技能
&lt;/h2&gt;&lt;p&gt;OpenClaw 有 ClawHub 技能市场，5400+ skills，涵盖各种场景。你想干什么基本都有现成的技能包。&lt;/p&gt;
&lt;p&gt;Hermes 的 Skill 系统更轻量级，主要是自建。官方提供了一些通用技能（比如 &lt;code&gt;kanban-worker&lt;/code&gt;、&lt;code&gt;hugo-blog&lt;/code&gt;），但你大部分时间是自己写技能。&lt;/p&gt;
&lt;p&gt;这跟设计哲学有关：OpenClaw 想做「产品」，给你现成的东西用；Hermes 想做「框架」，给你工具自己做。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="选择建议什么人选什么"&gt;选择建议：什么人选什么？
&lt;/h2&gt;&lt;h3 id="选-openclaw如果你"&gt;选 OpenClaw，如果你：
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;想要一个好用的个人AI助手，不想折腾&lt;/li&gt;
&lt;li&gt;需要覆盖多个渠道（尤其是非技术平台）&lt;/li&gt;
&lt;li&gt;喜欢「可视化操作」和「原生 App」的体验&lt;/li&gt;
&lt;li&gt;不介意多装一些依赖，希望开箱即用&lt;/li&gt;
&lt;li&gt;主要场景是「聊聊天、查查信息、简单自动化」&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="选-hermes如果你"&gt;选 Hermes，如果你：
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;是开发者或技术用户，愿意学习新概念&lt;/li&gt;
&lt;li&gt;需要复杂工作流自动化（比如博客写作、代码审查、多Agent协作）&lt;/li&gt;
&lt;li&gt;看重数据隐私，希望 100% 本地部署&lt;/li&gt;
&lt;li&gt;想要灵活定制自己的 Agent 系统&lt;/li&gt;
&lt;li&gt;主要场景是「项目化任务管理」和「深度自动化」&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="我的选择"&gt;我的选择
&lt;/h2&gt;&lt;p&gt;我两个都用了，但最后选择了 Hermes。&lt;/p&gt;
&lt;p&gt;原因很简单：我是一个技术用户，大部分时间在终端和编辑器里工作。Hermes 的 Kanban、Profile、Skill 这套系统，正好匹配我的工作方式。我可以用 Kanban 管理博客写作计划，用不同的 Profile 处理不同类型的任务，用 Skill 封装可复用的流程。&lt;/p&gt;
&lt;p&gt;OpenClaw 很强大，但它的优势不在我的使用场景里。我不需要在 20 个渠道上跟 AI 聊天，也不需要 Live Canvas 或 Voice Wake。我需要的是能帮我自动化复杂任务、记住我的长期偏好、可灵活定制的工具——这些正是 Hermes 的强项。&lt;/p&gt;
&lt;p&gt;当然，这不代表 OpenClaw 不好。它是一个非常优秀的个人AI助手，GitHub 372,888 stars 说明了一切。只是对我来说，Hermes 更对胃口。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="后续有没有可能融合"&gt;后续：有没有可能融合？
&lt;/h2&gt;&lt;p&gt;技术上完全可能。Hermes 可以通过 WebSocket 或 CLI 接入 OpenClaw 的 Gateway，享受它的多渠道能力；OpenClaw 也可以借鉴 Hermes 的 Kanban 和 MemPalace，增强任务管理和知识记忆。&lt;/p&gt;
&lt;p&gt;但目前它们确实是两个方向的产品。OpenClaw 追求「覆盖广」和「易用」，Hermes 追求「深度定制」和「专业自动化」。&lt;/p&gt;
&lt;p&gt;没有谁比谁好，只有谁更适合你。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;关注 varkm，一起学习，一起成长&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>给Agent装个自动记忆：让AI自己记住你说过的话</title><link>https://blog.kalend.top/2026/05/15/auto-memory-extraction.html/</link><pubDate>Fri, 15 May 2026 20:30:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/15/auto-memory-extraction.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;你跟AI说&amp;quot;我习惯用vim，不要用nano&amp;quot;，下次对话它照样给你nano。每次都要重复说，烦不烦？&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;核心思路就三行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;session结束 → 调免费LLM提取记忆 → 向量去重后存入ChromaDB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;整篇文章读完，你的Agent就能在每次对话结束时&lt;strong&gt;自动&lt;/strong&gt;把用户偏好、事件、工作流提取出来，下次对话自动加载。成本：&lt;strong&gt;¥0&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="架构"&gt;架构
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──────────┐ session end ┌──────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 对话记录 │ ──────────────→ │ 已有记忆注入P2 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└──────────┘ └──────┬───────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────▼───────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 免费LLM提取P0 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 分类+结构化 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────┬───────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────▼───────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 向量去重 P1 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ cosine&amp;lt;0.15 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────┬───────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────▼───────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ChromaDB │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 本地存储 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;三层防护&lt;/strong&gt;确保不存垃圾、不存重复：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;层级&lt;/th&gt;
 &lt;th&gt;机制&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;P2 提取前&lt;/td&gt;
 &lt;td&gt;已有记忆注入prompt&lt;/td&gt;
 &lt;td&gt;模型直接跳过已知内容&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;P0 提取中&lt;/td&gt;
 &lt;td&gt;免费LLM分类提取&lt;/td&gt;
 &lt;td&gt;persona/episodic/instruction&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;P1 存入时&lt;/td&gt;
 &lt;td&gt;ChromaDB向量去重&lt;/td&gt;
 &lt;td&gt;兜底防重复存储&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="前置条件"&gt;前置条件
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ChromaDB&lt;/strong&gt;：本地向量数据库，&lt;code&gt;pip install chromadb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;免费LLM API Key&lt;/strong&gt;：在 &lt;a class="link" href="https://open.bigmodel.cn" target="_blank" rel="noopener"
 &gt;智谱开放平台&lt;/a&gt; 注册账号，自动获得API Key。&lt;strong&gt;GLM-4-Flash模型永久免费&lt;/strong&gt;，无需绑定支付方式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python 3.9+&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-1-提取prompt模板"&gt;Step 1: 提取Prompt模板
&lt;/h2&gt;&lt;p&gt;这个prompt是整个系统的灵魂。把它加到你的MemoryProvider插件里：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EXTRACTION_SYSTEM_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;你是一个记忆提取助手。从对话中提取值得长期记住的信息。&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;严格按以下JSON格式输出，不要输出其他任何内容：&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;{&amp;#34;persona&amp;#34;:[&amp;#34;字符串1&amp;#34;,&amp;#34;字符串2&amp;#34;],&amp;#34;episodic&amp;#34;:[&amp;#34;字符串1&amp;#34;],&amp;#34;instruction&amp;#34;:[&amp;#34;字符串1&amp;#34;]}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;分类规则：&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;- persona: 用户偏好、习惯、身份、性格特征、沟通风格&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;- episodic: 具体事件和行动&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;- instruction: 工作流程、规则、纠正、技术方案&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;关键规则：&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;1. 只提取新的、具体的、有价值的信息&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;2. 数组中每个元素必须是纯字符串，不要用对象&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;3. 没有有价值的信息就全部输出空数组&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;4. 每条不超过80字，用简洁陈述句&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;5. 不要重复同一条信息&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;6. 偏好类信息归persona，不要归episodic&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么这么设计&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;temperature: 0.1&lt;/code&gt; + 严格格式约束 → 输出稳定可解析&lt;/li&gt;
&lt;li&gt;三分类覆盖了90%以上的记忆类型&lt;/li&gt;
&lt;li&gt;&amp;ldquo;没有有价值的信息就输出空数组&amp;rdquo; → 避免硬造记忆&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-2-on_session_end钩子"&gt;Step 2: on_session_end钩子
&lt;/h2&gt;&lt;p&gt;Session结束时触发提取。&lt;strong&gt;关键设计：后台线程异步执行，不阻塞用户&lt;/strong&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;threading&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_session_end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 过滤出user/assistant消息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation_lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;role&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;assistant&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;用户&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;助手&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation_lines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conversation_lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="c1"&gt;# 太短不提取&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conversation_lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conversation_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conversation_text&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="c1"&gt;# 截取最近4000字符&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 预取已有记忆（P2缓存）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;existing_context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_build_existing_context&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 后台线程执行提取&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_extract&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_run_extraction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conversation_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;existing_context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;threading&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;_extract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;daemon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意几个细节&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每条消息截取500字符 → 控制总量&lt;/li&gt;
&lt;li&gt;总文本超过4000字符只取末尾 → 最近的内容最有价值&lt;/li&gt;
&lt;li&gt;对话少于2条直接跳过 → 避免无效提取&lt;/li&gt;
&lt;li&gt;&lt;code&gt;daemon=True&lt;/code&gt; → 主进程退出时不会卡住&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-3-api调用实现"&gt;Step 3: API调用实现
&lt;/h2&gt;&lt;p&gt;直接用标准库，不依赖额外包：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_run_extraction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conversation_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;existing_context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib.request&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;urllib.error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;system_prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EXTRACTION_SYSTEM_PROMPT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;existing_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;system_prompt&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s1"&gt;已知记忆（不要重复提取这些内容）：&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;existing_context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;model&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;glm-4-flash&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 免费模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;messages&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;role&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;system&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;role&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;conversation_text&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;max_tokens&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;temperature&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;ensure_ascii&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;https://open.bigmodel.cn/api/paas/v4/chat/completions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Authorization&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_extract_api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URLError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSONDecodeError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ne"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="c1"&gt;# 静默失败，不影响主流程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;choices&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;extracted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_parse_extraction_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_store_extracted_memories&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;extracted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;JSON解析加个容错：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_parse_extraction_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;容错解析，处理LLM输出前后可能的多余文本&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSONDecodeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 尝试提取花括号内容&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\{[^&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;]*\}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DOTALL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSONDecodeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;persona&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;episodic&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;instruction&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="step-4-向量去重p1"&gt;Step 4: 向量去重（P1）
&lt;/h2&gt;&lt;p&gt;这是防重复的&lt;strong&gt;最后防线&lt;/strong&gt;。即使LLM没看到已有记忆，向量相似度也能拦住：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;_DEDUP_MAX_DISTANCE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt; &lt;span class="c1"&gt;# ~92%相似度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_is_duplicate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wing&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;query_texts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;n_results&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wing&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wing&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;distances&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;distances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;distances&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[[]])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;distances&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_DEDUP_MAX_DISTANCE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_store_extracted_memories&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extracted&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stored&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;extracted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wing_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;persona&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;episodic&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;episodic&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;instruction&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;instruction&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wing_map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt; &lt;span class="c1"&gt;# 跳过太短的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_is_duplicate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wing&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt; &lt;span class="c1"&gt;# 跳过重复&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;metadatas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;wing&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;room&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;auto-extract&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;added_by&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;auto-extract&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;category&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;())),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;extract_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stored&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stored&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么阈值是0.15&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;实测数据——&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;距离阈值&lt;/th&gt;
 &lt;th&gt;相似度&lt;/th&gt;
 &lt;th&gt;去重效果&lt;/th&gt;
 &lt;th&gt;误杀率&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;0.10&lt;/td&gt;
 &lt;td&gt;~95%&lt;/td&gt;
 &lt;td&gt;去重80%&lt;/td&gt;
 &lt;td&gt;极低&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;0.15&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;~92%&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;去重90%+&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&amp;lt;3%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;0.20&lt;/td&gt;
 &lt;td&gt;~88%&lt;/td&gt;
 &lt;td&gt;去重95%&lt;/td&gt;
 &lt;td&gt;~8%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;0.15是甜点。&lt;/p&gt;
&lt;h2 id="step-5-已知记忆注入p2"&gt;Step 5: 已知记忆注入（P2）
&lt;/h2&gt;&lt;p&gt;在调LLM之前，把已有记忆塞进prompt。这样模型&lt;strong&gt;直接跳过已知内容&lt;/strong&gt;，省token又防重复：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_build_existing_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;wing&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;instruction&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wing&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wing&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documents&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;metadatas&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documents&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;metadatas&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;added_by&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;auto-extract&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hermes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;builtin-mirror&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;；&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;])[:&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;只取最近15条、截断到500字符。&lt;strong&gt;控制prompt长度&lt;/strong&gt;，别把提取请求搞得太贵。&lt;/p&gt;
&lt;h2 id="step-6-配置和测试"&gt;Step 6: 配置和测试
&lt;/h2&gt;&lt;p&gt;在 &lt;code&gt;mempalace.json&lt;/code&gt; 中启用自动提取：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;auto_extract&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;extract_model&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;glm-4-flash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="验证方法"&gt;验证方法
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;测试1：基本提取&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;跟Agent说几句话：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户：我习惯用vim编辑器，不要给我推荐nano
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户：我的项目统一用Python 3.11
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户：代码风格遵循PEP8，docstring用Google风格
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;结束session，然后检查ChromaDB：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;chromadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromadb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PersistentClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./mempalace_db&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;memories&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;added_by&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;auto-extract&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documents&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;metadatas&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;documents&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;metadatas&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;category&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;预期输出类似：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[persona] 用户习惯使用vim编辑器
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[instruction] 项目统一使用Python 3.11
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[instruction] 代码风格遵循PEP8，docstring用Google风格
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;测试2：去重验证&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;同一段对话连续触发两次提取，第二次应该&lt;strong&gt;0条新增&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;测试3：新session加载&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;开启新对话，问Agent：&amp;ldquo;你知道我用什么编辑器吗？&amp;quot;——它应该能从记忆中回答&amp;quot;vim&amp;rdquo;。&lt;/p&gt;
&lt;h2 id="实测效果数据"&gt;实测效果数据
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指标&lt;/th&gt;
 &lt;th&gt;数据&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;提取延迟&lt;/td&gt;
 &lt;td&gt;3-7秒（后台异步，不阻塞）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Token消耗&lt;/td&gt;
 &lt;td&gt;300-500/次&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;成本&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;¥0&lt;/strong&gt;（GLM-4-Flash免费）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;分类准确率&lt;/td&gt;
 &lt;td&gt;&amp;gt;90%（persona/episodic/instruction）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;去重拦截率&lt;/td&gt;
 &lt;td&gt;90%+（重复对话）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;误存率&lt;/td&gt;
 &lt;td&gt;&amp;lt;2%（无效信息被存入）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="三层防护机制总结"&gt;三层防护机制总结
&lt;/h2&gt;&lt;p&gt;再说一遍这个设计，因为它是&lt;strong&gt;整个系统可靠性&lt;/strong&gt;的关键：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P2 提取前：已知记忆注入 → LLM直接跳过 → 省token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P0 提取中：结构化分类 → 只保留有价值信息 → 控质量
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P1 存入时：向量相似度去重 → 兜底拦截 → 防重复
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;三层不是冗余，是&lt;strong&gt;互补&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;P2漏了（记忆太多超过500字符截断了）→ P1兜底&lt;/li&gt;
&lt;li&gt;P1漏了（措辞差异太大向量没拦住）→ P2已经拦了大部分&lt;/li&gt;
&lt;li&gt;P0是核心 → 决定提取质量&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="一句话总结"&gt;一句话总结
&lt;/h2&gt;&lt;p&gt;自动记忆不是奢侈品，是Agent的基础设施。当AI能记住你说过的每一句偏好，你就不需要每次对话都从头开始。&lt;/p&gt;</description></item><item><title>从零搭建 Blog Writer Agent：让 AI 自己写文章、自己部署</title><link>https://blog.kalend.top/2026/05/15/blog-writer-agent-tutorial.html/</link><pubDate>Fri, 15 May 2026 17:30:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/15/blog-writer-agent-tutorial.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;这是「多 Agent 协作」系列第 2 篇。第 1 篇讲了概念：&lt;a class="link" href="https://blog.kalend.top/2026/05/14/hermes-kanban-tutorial.html/" &gt;Kanban + Profile：让你的 AI Agent 自己管博客&lt;/a&gt;。这篇是纯实操——每一步都是我刚跑过的真实命令。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;搭一个会自己写博客的 AI Agent，&lt;strong&gt;7 步，2.5 分钟&lt;/strong&gt;。不是 demo，是真的能写文章、构建验证、部署上线的 Agent。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你：hermes kanban create &amp;#34;写一篇 Kanban 入门&amp;#34; --assignee blog-writer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AI：自动写文章 → 构建验证 → 完成汇报
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;整个过程你只需要&lt;strong&gt;发一条命令&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="前置条件"&gt;前置条件
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;已安装 Hermes Agent（v0.13.0+）&lt;/li&gt;
&lt;li&gt;有一个 Hugo/Hexo 等静态博客项目&lt;/li&gt;
&lt;li&gt;Gateway 正在运行&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="第-1-步启用-kanban-toolset"&gt;第 1 步：启用 Kanban Toolset
&lt;/h2&gt;&lt;p&gt;Kanban 是&lt;strong&gt;隐藏 toolset&lt;/strong&gt;——&lt;code&gt;hermes tools list&lt;/code&gt; 里看不到它。需要手动在 &lt;code&gt;config.yaml&lt;/code&gt; 里添加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ~/.hermes/config.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;toolsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="l"&gt;hermes-cli&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="l"&gt;kanban &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ← 加这一行&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;同时在 &lt;code&gt;config.yaml&lt;/code&gt; 底部确认 dispatcher 配置（通常已有）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kanban&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dispatch_in_gateway&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dispatch_interval_seconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;failure_limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;改完重启 gateway：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl restart hermes-gateway.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="第-2-步创建-blog-writer-profile"&gt;第 2 步：创建 blog-writer Profile
&lt;/h2&gt;&lt;p&gt;Profile 就是&lt;strong&gt;一个独立的 AI 身份&lt;/strong&gt;——有自己的配置、人格、工作目录。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes profile create blog-writer --clone
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Profile &amp;#39;blog-writer&amp;#39; created at ~/.hermes/profiles/blog-writer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloned config, .env, SOUL.md, and skills from default.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Wrapper created: ~/.local/bin/blog-writer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;--clone&lt;/code&gt; 会复制当前 profile 的 API 密钥、配置、记忆文件，省得重新配置。&lt;/p&gt;
&lt;h2 id="第-3-步写-soulmd定义人格"&gt;第 3 步：写 SOUL.md（定义人格）
&lt;/h2&gt;&lt;p&gt;SOUL.md 决定了这个 Agent 的行为模式。给 blog-writer 写一个专门的人格：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; ~/.hermes/profiles/blog-writer/SOUL.md &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# Blog Writer Agent
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;你是博客写作和部署专家。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;## 职责
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;1. 撰写技术博客文章（Markdown + Hugo front matter）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;2. 构建验证（hugo --minify）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;3. 部署到云存储
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;## 严格规则
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;- 日期必须是 RFC3339 格式：2026-05-15T10:00:00+08:00
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;- categories 和 tags 都要包含主题关键词
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;- description 必须填写
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;- **永远不要用 read_file → write_file 修改 Markdown**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;- 构建后必须检查页面数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="第-4-步配置工作目录"&gt;第 4 步：配置工作目录
&lt;/h2&gt;&lt;p&gt;让 blog-writer 的默认工作目录指向博客项目：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 编辑 blog-writer 的 config.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 在 terminal 段添加：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;terminal:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cwd: /root/blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;toolsets:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- hermes-cli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- kanban
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样 worker 被调度时，会自动 &lt;code&gt;cd&lt;/code&gt; 到博客目录。&lt;/p&gt;
&lt;h2 id="第-5-步初始化-kanban-看板"&gt;第 5 步：初始化 Kanban 看板
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kanban DB initialized at ~/.hermes/kanban.db
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Discovered 3 profile(s) on disk:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; blog-writer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; yuan
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;看板是一张 SQLite 表，所有 profile 共享。验证一下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban stats &lt;span class="c1"&gt;# 0 tasks (空看板)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban assignees &lt;span class="c1"&gt;# blog-writer (idle)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="第-6-步创建第一个写作任务"&gt;第 6 步：创建第一个写作任务
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assignee blog-writer &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --skill hugo-blog &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --workspace &lt;span class="s1"&gt;&amp;#39;dir:/root/blog&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --body &lt;span class="s1"&gt;&amp;#39;写一篇 Kanban 入门文章。要求：RFC3339日期、categories含hermes、构建验证&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;测试任务：写一篇 Kanban 入门文章&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Created t_9dd47956 (ready, assignee=blog-writer)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;关键参数解释：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;参数&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--assignee blog-writer&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;指定谁来做&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--skill hugo-blog&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;给 worker 注入博客相关知识&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--workspace dir:/root/blog&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;工作目录（不是临时 scratch）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--body '...'&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;任务的详细要求&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="第-7-步等-2-分钟验收"&gt;第 7 步：等 2 分钟，验收
&lt;/h2&gt;&lt;p&gt;Dispatcher 每 60 秒轮询一次 ready 任务。大约 70 秒后：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban stats
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# blog-writer running=1 ← 正在执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再等 82 秒：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban show t_9dd47956
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# status: done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# summary: 完成测试文章「Hermes Kanban 快速入门」，186页构建通过&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Run #1: completed @blog-writer 82s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;文章已经写好了。&lt;/strong&gt; 看看产出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;title: &amp;#34;Hermes Kanban 快速入门&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date: 2026-05-15T17:00:00+08:00
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;categories: [&amp;#34;hermes&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tags: [&amp;#34;hermes&amp;#34;, &amp;#34;kanban&amp;#34;, &amp;#34;agent&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 什么是 Kanban？
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hermes Kanban 是内置的任务调度系统...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;front matter 格式正确，日期 RFC3339，构建验证通过。全流程从创建到完成 &lt;strong&gt;2 分 22 秒&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="背后发生了什么"&gt;背后发生了什么
&lt;/h2&gt;&lt;p&gt;整个调度流程：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你发命令 → kanban create（SQLite 写入一条 ready 任务）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 60s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Gateway dispatcher 轮询 → 发现 ready 任务 → claim
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spawn 子进程：hermes -p blog-writer --skills kanban-worker --skills hugo-blog chat -q &amp;#34;work kanban task t_9dd47956&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 82s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer 读任务 → 写文章 → hugo 构建 → kanban_complete
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;任务状态 → done，你收到通知
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;几个关键设计：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dispatcher 嵌在 Gateway 里&lt;/strong&gt;，不需要给 blog-writer 单独跑 gateway&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Worker 是独立子进程&lt;/strong&gt;，&lt;code&gt;hermes -p blog-writer&lt;/code&gt; 启动，完成后自行退出&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--skills&lt;/code&gt; 自动注入&lt;/strong&gt;，每个 worker 都会加载 &lt;code&gt;kanban-worker&lt;/code&gt; skill（行为规范）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claim TTL = 15 分钟&lt;/strong&gt;，超时自动 reclaim，不会永远卡住&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我踩过的-4-个坑"&gt;我踩过的 4 个坑
&lt;/h2&gt;&lt;h3 id="坑-1hermes-不在-path-中"&gt;坑 1：hermes 不在 PATH 中
&lt;/h3&gt;&lt;p&gt;Dispatcher spawn worker 时执行 &lt;code&gt;hermes -p blog-writer ...&lt;/code&gt;，如果 &lt;code&gt;hermes&lt;/code&gt; 不在 PATH 里，直接失败。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;which hermes &lt;span class="c1"&gt;# 如果为空，需要手动链接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 修复&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -sf ~/.hermes/hermes-agent/venv/bin/hermes /usr/local/bin/hermes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="坑-2blog-writer-不需要独立-gateway"&gt;坑 2：blog-writer 不需要独立 gateway
&lt;/h3&gt;&lt;p&gt;一开始我以为每个 profile 都得跑自己的 gateway。错了。Dispatcher 运行在&lt;strong&gt;主 gateway&lt;/strong&gt; 里，通过 &lt;code&gt;hermes -p blog-writer&lt;/code&gt; spawn 子进程。子进程不需要消息平台，不需要 gateway。&lt;/p&gt;
&lt;p&gt;如果你给 blog-writer 启动了 gateway，会和主 gateway 冲突（weixin token 被占）。&lt;/p&gt;
&lt;h3 id="坑-3kanban-toolset-是隐藏的"&gt;坑 3：kanban toolset 是隐藏的
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;hermes tools list&lt;/code&gt; 不显示 kanban。它是条件注册的——只有 config.yaml 的 &lt;code&gt;toolsets&lt;/code&gt; 列表里有 &lt;code&gt;kanban&lt;/code&gt; 才会激活。很多教程会遗漏这一步。&lt;/p&gt;
&lt;h3 id="坑-4workspace-默认是-scratch"&gt;坑 4：workspace 默认是 scratch
&lt;/h3&gt;&lt;p&gt;如果不指定 &lt;code&gt;--workspace&lt;/code&gt;，默认用 &lt;code&gt;scratch&lt;/code&gt;（临时目录，任务完成后会被清理）。博客项目要用 &lt;code&gt;dir:/root/blog&lt;/code&gt;，否则写完文章就被删了。&lt;/p&gt;
&lt;h2 id="时间线回顾"&gt;时间线回顾
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;时刻&lt;/th&gt;
 &lt;th&gt;事件&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;17:07:00&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;kanban create&lt;/code&gt; → 任务 ready&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;17:07:10&lt;/td&gt;
 &lt;td&gt;Dispatcher claim + spawn worker&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;17:08:32&lt;/td&gt;
 &lt;td&gt;Worker 完成，kanban_complete&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;总耗时&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;1 分 32 秒（从创建到完成）&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="下一步"&gt;下一步
&lt;/h2&gt;&lt;p&gt;这是系列第 2 篇。接下来的内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第 3 篇&lt;/strong&gt;：多任务编排——让多个 Agent 同时写多篇文章，Pipeline + Fan-out 实战&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 4 篇&lt;/strong&gt;：踩坑全记录——格式陷阱、模型选择、成本控制、调试技巧&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;关注 varkm，一起学习，一起成长&lt;/p&gt;</description></item><item><title>Kanban + Profile：让你的 AI Agent 自己管博客</title><link>https://blog.kalend.top/2026/05/14/hermes-kanban-tutorial.html/</link><pubDate>Thu, 14 May 2026 23:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-kanban-tutorial.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;你跟 AI 说&amp;quot;帮我写篇博客&amp;quot;，它写完就走了。下次再说，它又是从零开始。&lt;/p&gt;
&lt;p&gt;这篇文章教你用 Hermes 的 Kanban + Profile，给 AI Agent 一个&lt;strong&gt;专职身份&lt;/strong&gt;，让它自己管博客。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;delegate_task 是临时工，Kanban + Profile 是全职员工。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你想：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;让一个 AI &lt;strong&gt;专门负责博客&lt;/strong&gt;（写文章、同步、部署）&lt;/li&gt;
&lt;li&gt;任务&lt;strong&gt;不丢失&lt;/strong&gt;（主 Agent 崩了也不影响）&lt;/li&gt;
&lt;li&gt;随时&lt;strong&gt;查看进度&lt;/strong&gt;（微信直接看）&lt;/li&gt;
&lt;li&gt;出了问题&lt;strong&gt;自动通知你&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那就用 Kanban + Profile。下面是完整方案。&lt;/p&gt;
&lt;h2 id="我的踩坑故事"&gt;我的踩坑故事
&lt;/h2&gt;&lt;p&gt;我有一个 Hugo 静态博客。之前让主 Agent 兼顾博客写作——一边排查路由器 DNS 问题，一边写博客文章。结果：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;read_file 带行号前缀写回文件&lt;/strong&gt;，Hugo front matter 全毁，页面数从 168 暴跌到 102&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日期格式不对&lt;/strong&gt;，&lt;code&gt;date: 2026-05-14&lt;/code&gt; 被解析成 &lt;code&gt;0001-01-01&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中文 URL 编码错误&lt;/strong&gt;，又拍云上传 45 个文件失败&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;根本原因：&lt;strong&gt;上下文切换太频繁&lt;/strong&gt;，主 Agent 在路由器、DNS、博客之间反复横跳，每次切换都丢细节。&lt;/p&gt;
&lt;h2 id="两种方案对比"&gt;两种方案对比
&lt;/h2&gt;&lt;p&gt;很多人第一反应是 &lt;code&gt;delegate_task&lt;/code&gt;（子代理），我也是。但调研完官方文档后发现，这俩根本不是一个量级：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;delegate_task&lt;/th&gt;
 &lt;th&gt;Kanban + Profile&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;形状&lt;/td&gt;
 &lt;td&gt;函数调用（fork→join）&lt;/td&gt;
 &lt;td&gt;持久工作队列 + 状态机&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;生命周期&lt;/td&gt;
 &lt;td&gt;分钟级，调用者阻塞等待&lt;/td&gt;
 &lt;td&gt;小时/天级，fire-and-forget&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;身份&lt;/td&gt;
 &lt;td&gt;匿名子代理，干完就走&lt;/td&gt;
 &lt;td&gt;命名 Profile，有自己的记忆和人格&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;抗中断&lt;/td&gt;
 &lt;td&gt;父 Agent 断了，子代理也死&lt;/td&gt;
 &lt;td&gt;独立进程，互不影响&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;可恢复&lt;/td&gt;
 &lt;td&gt;失败即失败&lt;/td&gt;
 &lt;td&gt;阻塞→解除→重跑；崩溃→回收&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;人工介入&lt;/td&gt;
 &lt;td&gt;不支持&lt;/td&gt;
 &lt;td&gt;任何节点都能 comment/unblock&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;审计追踪&lt;/td&gt;
 &lt;td&gt;上下文压缩后丢失&lt;/td&gt;
 &lt;td&gt;SQLite 永久保存&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;一句话：delegate_task 是你叫一次临时工；Kanban 是你雇了个全职员工。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="架构设计"&gt;架构设计
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你（微信/Telegram/CLI）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ &amp;#34;写一篇关于 XX 的博客&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;主 Agent（orchestrator）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ kanban_create 创建任务
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kanban.db（SQLite 持久化看板）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ dispatcher 自动调度（gateway 内嵌，60s 轮询）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer（独立 Profile，独立进程）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ kanban_complete / kanban_block 汇报
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kanban.db
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ gateway 自动通知
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你（微信收到完成/阻塞通知）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dispatcher 内嵌在 gateway 里&lt;/strong&gt;，不需要额外的守护进程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;blog-writer 是独立 Profile&lt;/strong&gt;，有自己的 config、记忆、skills、SOUL.md&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gateway 自动推送通知&lt;/strong&gt;，任务完成或卡住都会通知你&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;你随时可以用 &lt;code&gt;/kanban&lt;/code&gt; 命令&lt;/strong&gt;查看进度、添加评论、解除阻塞&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-步搭建"&gt;5 步搭建
&lt;/h2&gt;&lt;h3 id="第-1-步创建独立-profile"&gt;第 1 步：创建独立 Profile
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes profile create blog-writer --clone
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;--clone&lt;/code&gt; 会复制当前 Profile 的 config.yaml、.env、SOUL.md，省得重新配 API Key。&lt;/p&gt;
&lt;h3 id="第-2-步配置独立人格和工作目录"&gt;第 2 步：配置独立人格和工作目录
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置工作目录指向博客项目&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer config &lt;span class="nb"&gt;set&lt;/span&gt; terminal.cwd /root/blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 写专属 SOUL.md&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; ~/.hermes/profiles/blog-writer/SOUL.md &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;你是 blog.kalend.top 的博客写作专家。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;职责：撰写高质量技术博客、同步公众号文章、构建和部署。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;风格：简洁直接、先结论后细节、代码示例丰富。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;严格遵守 hugo-blog skill 中的所有陷阱清单。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="第-3-步确认-skill-可用"&gt;第 3 步：确认 skill 可用
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# kanban-worker 是 bundled skill，自动同步&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer skills list &lt;span class="p"&gt;|&lt;/span&gt; grep kanban-worker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果缺失，恢复&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer skills reset kanban-worker --restore
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证 hugo-blog skill（需要手动确保已安装）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer skills list &lt;span class="p"&gt;|&lt;/span&gt; grep hugo-blog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="第-4-步初始化-kanban"&gt;第 4 步：初始化 Kanban
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建看板数据库（幂等操作）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 确保 gateway 运行（内嵌 dispatcher）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes gateway start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="第-5-步创建第一个任务"&gt;第 5 步：创建第一个任务
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban create &lt;span class="s2"&gt;&amp;#34;写一篇关于 Hermes Kanban 的博客&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assignee blog-writer &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --skill hugo-blog &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --workspace dir:/root/blog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;从这一刻起，dispatcher 会自动发现 &lt;code&gt;ready&lt;/code&gt; 状态的任务，spawn &lt;code&gt;blog-writer&lt;/code&gt; Profile 作为独立进程执行。&lt;/p&gt;
&lt;h2 id="worker-的工作流程"&gt;Worker 的工作流程
&lt;/h2&gt;&lt;p&gt;当 dispatcher 启动 blog-writer 后，它会：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. kanban_show() → 读取任务详情（标题、正文、父任务结果、评论历史）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. cd $WORKSPACE → 进入工作目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 执行任务 → 搜索素材 → 撰写文章 → Hugo build → 部署
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. kanban_heartbeat() → 长任务中间汇报（可选）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. kanban_complete() → 完成（附带 summary + metadata）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 或 kanban_block() → 阻塞（需要你确认标题/内容等）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;阻塞时&lt;/strong&gt;，你微信会收到通知。你直接在微信里回复：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/kanban comment t_xxx &amp;#34;标题用「Kanban实战：让AI自己管博客」&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/kanban unblock t_xxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;dispatcher 下一次轮询时会重新 spawn worker，worker 读取你的评论后继续。&lt;/p&gt;
&lt;h2 id="任务依赖pipeline-模式"&gt;任务依赖：Pipeline 模式
&lt;/h2&gt;&lt;p&gt;如果你的写作流程是：调研 → 写作 → 审校 → 部署，可以用 &lt;code&gt;parents&lt;/code&gt; 串起来：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 调研任务（立即开始）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban create &lt;span class="s2"&gt;&amp;#34;调研 Hermes Kanban 架构&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assignee researcher
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 写作任务（等调研完成）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban create &lt;span class="s2"&gt;&amp;#34;写博客文章&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assignee blog-writer &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --parent t_research
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 部署任务（等写作完成）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban create &lt;span class="s2"&gt;&amp;#34;部署博客&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assignee blog-writer &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --parent t_writing
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;子任务会停留在 &lt;code&gt;todo&lt;/code&gt; 状态，直到所有 parent 达到 &lt;code&gt;done&lt;/code&gt;，然后自动 promote 到 &lt;code&gt;ready&lt;/code&gt;。&lt;strong&gt;不需要手动协调。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="9-种协作模式"&gt;9 种协作模式
&lt;/h2&gt;&lt;p&gt;官方文档列出了 9 种 Kanban 协作模式。博客场景常用的：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;模式&lt;/th&gt;
 &lt;th&gt;用法&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;P1 Fan-out&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;同时写 5 篇不同主题的文章&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;P2 Pipeline&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;调研 → 写作 → 审校 → 部署&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;P5 Human-in-the-loop&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;写完后阻塞等你确认再部署&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;P8 Fleet farming&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;一个 writer 处理 N 篇文章队列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;P9 Triage specifier&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;粗略想法 → triage → 自动展开为完整任务&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="我遇到的真实问题"&gt;我遇到的真实问题
&lt;/h2&gt;&lt;h3 id="问题-1写作质量不可控"&gt;问题 1：写作质量不可控
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解法&lt;/strong&gt;：GLM-5.1 做格式转换和同步任务完全够用。原创写作需要更强的模型——Profile 可以独立配置模型：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer config &lt;span class="nb"&gt;set&lt;/span&gt; model.default anthropic/claude-sonnet-4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="问题-2格式错误反复出现"&gt;问题 2：格式错误反复出现
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解法&lt;/strong&gt;：把所有踩过的坑写进 skill，每次 worker 启动时自动加载。我的 &lt;code&gt;hugo-blog&lt;/code&gt; skill 现在有 12 条陷阱清单，覆盖了行号前缀、日期格式、URL 编码等所有已知问题。&lt;/p&gt;
&lt;h3 id="问题-3上下文丢失"&gt;问题 3：上下文丢失
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解法&lt;/strong&gt;：每篇独立跑，skill 固定注入。不依赖主 Agent 的上下文。kanban.db 里的 comment 线程就是完整的任务上下文。&lt;/p&gt;
&lt;h2 id="和-delegate_task-什么时候用哪个"&gt;和 delegate_task 什么时候用哪个
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;场景&lt;/th&gt;
 &lt;th&gt;选择&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;快速并行子任务（搜索3个话题）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;delegate_task&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;长时间独立工作（写博客文章）&lt;/td&gt;
 &lt;td&gt;Kanban + Profile&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;需要人工确认&lt;/td&gt;
 &lt;td&gt;Kanban（阻塞/解除）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;一次性的简单问答&lt;/td&gt;
 &lt;td&gt;直接回答&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;需要跨 session 保持状态&lt;/td&gt;
 &lt;td&gt;Kanban（SQLite 持久化）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;它们可以共存&lt;/strong&gt;：Kanban worker 内部可以调用 &lt;code&gt;delegate_task&lt;/code&gt; 处理短子任务。&lt;/p&gt;
&lt;h2 id="官方文档"&gt;官方文档
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Kanban 文档：https://hermes-agent.nousresearch.com/docs/user-guide/features/kanban&lt;/li&gt;
&lt;li&gt;Kanban 教程：https://hermes-agent.nousresearch.com/docs/user-guide/features/kanban-tutorial&lt;/li&gt;
&lt;li&gt;Profile 文档：https://hermes-agent.nousresearch.com/docs/user-guide/profiles&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;这是「Hermes 多 Agent 协作」系列的第一篇。下一篇会实际搭建 blog-writer Profile，跑通第一个完整的写作→部署流程。&lt;/p&gt;
&lt;p&gt;如果你也在用 Hermes Agent 或者对 AI Agent 协作感兴趣，关注我，后面会持续分享实战经验。&lt;/p&gt;
&lt;section style="margin:20px 0;padding:16px 20px;background:linear-gradient(135deg,#4a90d9,#357abd);border-radius:8px;text-align:center;"&gt;
&lt;p style="margin:0 0 8px 0;color:#fff;font-size:16px;font-weight:bold;line-height:1.6;"&gt;关注 varkm，一起学习，一起成长&lt;/p&gt;
&lt;p style="margin:0;color:rgba(255,255,255,0.85);font-size:13px;line-height:1.6;"&gt;多 Agent 协作实战&lt;/p&gt;
&lt;/section&gt;</description></item><item><title>AI Agent 的定时任务：从「到点跑命令」到「到点帮你思考」</title><link>https://blog.kalend.top/2026/05/14/hermes-cron-tasks.html/</link><pubDate>Thu, 14 May 2026 00:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-cron-tasks.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;半夜3点磁盘满了，早上9点选题推荐准时推送——这些都不是我干的，是我的AI定时任务替我干的。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;AI Agent的cron定时任务，和传统的 &lt;code&gt;crontab&lt;/code&gt; 不是一回事。&lt;/p&gt;
&lt;p&gt;传统cron是&amp;quot;到点跑命令&amp;quot;，AI Agent的cron是**&amp;ldquo;到点唤醒一个AI帮你思考和执行&amp;rdquo;**。它能搜索、能分析、能写文件、能推送到微信。&lt;/p&gt;
&lt;p&gt;两种模式：&lt;strong&gt;脚本直出&lt;/strong&gt;（零token消耗，纯数据采集）和&lt;strong&gt;Agent模式&lt;/strong&gt;（有推理能力，会做判断。token可以理解为AI思考和输出的计费单位）。选型一句话：固定格式用脚本，需要思考的用Agent。&lt;/p&gt;
&lt;h2 id="传统cron到底差在哪"&gt;传统cron到底差在哪
&lt;/h2&gt;&lt;p&gt;先看一张对比：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th style="text-align: center"&gt;传统crontab&lt;/th&gt;
 &lt;th style="text-align: center"&gt;AI Agent cron&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;能力&lt;/td&gt;
 &lt;td style="text-align: center"&gt;执行固定命令&lt;/td&gt;
 &lt;td style="text-align: center"&gt;执行+推理+搜索+写文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;输出&lt;/td&gt;
 &lt;td style="text-align: center"&gt;发邮件，没人看&lt;/td&gt;
 &lt;td style="text-align: center"&gt;推到微信/Telegram&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;上下文&lt;/td&gt;
 &lt;td style="text-align: center"&gt;无&lt;/td&gt;
 &lt;td style="text-align: center"&gt;可注入skill、记忆、历史&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;智能程度&lt;/td&gt;
 &lt;td style="text-align: center"&gt;零&lt;/td&gt;
 &lt;td style="text-align: center"&gt;能判断&amp;quot;没事别烦我&amp;quot;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;失败处理&lt;/td&gt;
 &lt;td style="text-align: center"&gt;写个error日志&lt;/td&gt;
 &lt;td style="text-align: center"&gt;分析原因、换方案重试&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;传统cron最大的问题不是功能弱，而是&lt;strong&gt;输出没人看&lt;/strong&gt;。crontab每天给你发邮件，你打开过吗？&lt;/p&gt;
&lt;p&gt;AI Agent的cron不一样——它直接推到你的聊天工具，而且只在有事的时候才推。&lt;/p&gt;
&lt;h2 id="两种模式"&gt;两种模式
&lt;/h2&gt;&lt;h3 id="a-脚本直出no_agent模式"&gt;A. 脚本直出（no_agent模式）
&lt;/h3&gt;&lt;p&gt;原理很简单：bash/python脚本跑完 → stdout → 直接推送到你的聊天窗口。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不经过LLM，零token消耗。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我配了一个系统健康巡查脚本，每天8:00和22:00自动跑，输出长这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## 🟢 系统巡查报告
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;时间: 2026-05-12 08:01 | 运行: 3天23小时 | 负载: 0.06
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;资源
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 指标 | 数值 | 状态 |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|--------|-------------------|------|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| CPU | 3% | ✅ |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 内存 | 2268M/32131M (7%) | ✅ |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Swap | 0M/7823M | ✅ |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| 磁盘/ | 42G/140G (32%) | ✅ |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;服务: sshd ✅ | AI助手 ✅
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;网络: 百度 ✅ | Google ✅
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个脚本做了什么？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查CPU/内存/Swap/磁盘，超阈值标⚠️&lt;/li&gt;
&lt;li&gt;检查关键服务是否活着（sshd、cron、AI进程）&lt;/li&gt;
&lt;li&gt;测试国内外网络连通性（ping + HTTP）&lt;/li&gt;
&lt;li&gt;拉最近1小时系统错误日志&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;任何一项异常，标题从🟢变⚠️&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;全部健康就一条消息，有异常自动高亮。每天看一眼就行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;适合场景&lt;/strong&gt;：监控告警、固定格式数据采集、定期备份验证。核心特征是&lt;strong&gt;输出格式固定，不需要AI判断&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="b-agent模式"&gt;B. Agent模式
&lt;/h3&gt;&lt;p&gt;这个才是真正有意思的。&lt;/p&gt;
&lt;p&gt;原理：定时唤醒 → 加载你写的prompt → AI推理 → 调用工具（搜索、终端、文件） → 生成报告 → 推送给你。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;消耗token，但有&amp;quot;脑子&amp;quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;比如我的公众号选题推荐，每周二9:00自动执行。它的信息采集分四个维度：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;维度1&lt;/strong&gt;：我最近做了什么（读cron状态、最近skill、产出文件、AI记忆）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;维度2&lt;/strong&gt;：我的系统最新更新了什么（搜GitHub release/changelog）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;维度3&lt;/strong&gt;：外面在我的系统上都在聊什么（Reddit/HN/掘金/知乎）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;维度4&lt;/strong&gt;：外面在聊什么（本周AI热点动态）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它会&lt;strong&gt;先读本地环境&lt;/strong&gt;（最近装了什么、配了什么），&lt;strong&gt;再搜外部热点&lt;/strong&gt;，然后找两者的交集。出来的选题不是泛泛的&amp;quot;AI时代来了&amp;quot;，而是&amp;quot;我刚装了RTK省了80% token&amp;quot;这种实操内容。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;适合场景&lt;/strong&gt;：需要搜索分析、需要综合判断、需要阅读本地文件的场景。核心特征是&lt;strong&gt;每次输出不一样，需要AI&amp;quot;思考&amp;quot;&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="一个关键设计静默机制"&gt;一个关键设计：静默机制
&lt;/h2&gt;&lt;p&gt;Agent模式有个 &lt;code&gt;[SILENT]&lt;/code&gt; 机制——如果AI判断&amp;quot;确实没什么新东西&amp;quot;，它回复一个静默标记，系统就不推送。&lt;/p&gt;
&lt;p&gt;这个设计太重要了。&lt;/p&gt;
&lt;p&gt;传统监控最怕的是什么？&lt;strong&gt;告警疲劳&lt;/strong&gt;。天天给你发&amp;quot;一切正常&amp;quot;，你就不看了。突然有一天&amp;quot;不正常&amp;quot;了，你早就把它当噪音过滤掉了。&lt;/p&gt;
&lt;p&gt;静默机制反过来：&lt;strong&gt;没事别烦我，有事才说话。&lt;/strong&gt; 你的聊天窗口只出现真正需要关注的信息。&lt;/p&gt;
&lt;h2 id="从0配置一个cron-job"&gt;从0配置一个cron job
&lt;/h2&gt;&lt;p&gt;以健康巡查为例，完整流程：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1：写脚本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/.hermes/scripts/health-check.sh&lt;/code&gt;，用bash采集系统信息，输出Markdown表格。关键点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;set -uo pipefail&lt;/code&gt; 防止静默失败&lt;/li&gt;
&lt;li&gt;设置阈值判断（CPU&amp;gt;80% ⚠️、内存&amp;gt;85% ⚠️）&lt;/li&gt;
&lt;li&gt;输出格式统一（Markdown表格，方便在聊天窗口阅读）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step 2：创建cron&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 脚本模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cronjob create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &lt;span class="s2"&gt;&amp;#34;系统健康巡查&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --script &lt;span class="s2"&gt;&amp;#34;health-check.sh&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --no-agent &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --schedule &lt;span class="s2"&gt;&amp;#34;0 8,22 * * *&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --deliver origin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Agent模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cronjob create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &lt;span class="s2"&gt;&amp;#34;公众号选题推荐&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --prompt &lt;span class="s2"&gt;&amp;#34;你的prompt...&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --toolsets web,terminal,file &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --schedule &lt;span class="s2"&gt;&amp;#34;0 9 * * 2&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --deliver origin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 3：验证&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所有执行记录存在cron的output目录下，按时间命名。随时可以回查。&lt;/p&gt;
&lt;h2 id="进阶玩法"&gt;进阶玩法
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;链式执行&lt;/strong&gt;：job A采集数据 → job B分析报告（A跑完自动触发B）。用 &lt;code&gt;context_from&lt;/code&gt; 参数把上游输出注入下游。比如：健康巡查发现异常 → 自动触发诊断任务分析原因。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型锁定&lt;/strong&gt;：每个job可以指定不同模型。省钱的数据采集用小模型，重要的分析任务用大模型。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目录隔离&lt;/strong&gt;：不同job可以指定不同的工作目录（&lt;code&gt;workdir&lt;/code&gt;），互不干扰。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="踩坑实录"&gt;踩坑实录
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1. skill找不到&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;cron执行环境是独立的，不像主对话有完整的skill列表。解决方案：把需要的能力写在 &lt;code&gt;enabled_toolsets&lt;/code&gt; 里（web/terminal/file）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 纯数据采集用了Agent模式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;固定格式的数据采集（比如健康检查），用Agent模式是纯浪费token。&lt;strong&gt;能用脚本解决的别用Agent。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 输出太长被截断&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;微信单条消息有长度限制。设计prompt时加一句&amp;quot;输出控制在500字以内&amp;quot;，或者脚本里精简格式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 时区&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;schedule用的是系统时区。服务器在国内就不用管，在海外记得设 &lt;code&gt;TZ=Asia/Shanghai&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 静默不等于失败&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;脚本模式下，stdout为空 = 不推送。如果你的脚本某个分支忘了echo，就会&amp;quot;消失&amp;quot;。确保每种情况都有输出。&lt;/p&gt;
&lt;h2 id="怎么选"&gt;怎么选
&lt;/h2&gt;&lt;p&gt;一句话决策树：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;需要&lt;/span&gt;&lt;span class="n"&gt;AI判断吗&lt;/span&gt;&lt;span class="err"&gt;？&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="err"&gt;不需要&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;脚本直出（&lt;/span&gt;&lt;span class="n"&gt;no_agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="err"&gt;监控、采集、固定格式报告&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="err"&gt;需要&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Agent模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="err"&gt;搜索&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt;分析&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;toolsets加web&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="err"&gt;读本地文件&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;toolsets加terminal&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="err"&gt;两个都要&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;都加上&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="写在最后"&gt;写在最后
&lt;/h2&gt;&lt;p&gt;AI Agent的cron，本质上是把&amp;quot;定时执行&amp;quot;升级为**&amp;ldquo;定时思考&amp;rdquo;**——不是到点跑命令，而是到点让AI帮你做决策。&lt;/p&gt;
&lt;p&gt;不在线的时候，有人在替你盯着。&lt;/p&gt;</description></item><item><title>AI 写代码太费 Token？一个 9.5MB 小工具，直接砍 80%</title><link>https://blog.kalend.top/2026/05/14/hermes-rtk-token-saver.html/</link><pubDate>Thu, 14 May 2026 00:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-rtk-token-saver.html/</guid><description>&lt;h1 id="ai写代码太费token一个95mb小工具直接砍80"&gt;AI写代码太费Token？一个9.5MB小工具，直接砍80%
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;你有没有算过，让AI帮你写代码，一天要烧多少Token？&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;我给AI Agent装了一个叫 &lt;strong&gt;RTK&lt;/strong&gt; 的工具，&lt;strong&gt;一个命令，零配置，Token消耗直接砍掉80%&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;核心思路就一句话：&lt;strong&gt;在命令输出喂给AI之前，先压缩一遍。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="问题是什么"&gt;问题是什么
&lt;/h2&gt;&lt;p&gt;用AI Agent干活的人都知道，Agent特别&amp;quot;啰嗦&amp;quot;——它会疯狂执行命令，然后把所有输出原封不动塞给自己的上下文窗口（AI一次能&amp;quot;看到&amp;quot;的信息量）。&lt;/p&gt;
&lt;p&gt;举个例子，项目里跑个 &lt;code&gt;git status&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;On branch main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Your branch is up to date with &amp;#39;origin/main&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Changes not staged for commit:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; modified: src/components/Dashboard.tsx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; modified: src/hooks/useAuth.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; modified: src/pages/Login.tsx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; modified: src/utils/api.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; modified: package.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; modified: package-lock.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Untracked files:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; src/utils/newFeature.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tests/test_newFeature.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;大概 &lt;strong&gt;2000个Token&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;但AI真正需要知道什么？就一句话：&lt;strong&gt;&amp;ldquo;5个文件改了，还没commit&amp;rdquo;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一个中型项目，AI Agent跑30分钟，光是 &lt;code&gt;ls&lt;/code&gt;、&lt;code&gt;cat&lt;/code&gt;、&lt;code&gt;git status&lt;/code&gt;、&lt;code&gt;pytest&lt;/code&gt; 这些命令的输出，就能吃掉 &lt;strong&gt;11.8万个Token&lt;/strong&gt;。按主流商业API的价格算，这就是几块钱没了。&lt;/p&gt;
&lt;p&gt;更致命的不是钱——是&lt;strong&gt;上下文窗口被垃圾信息占满&lt;/strong&gt;，AI真正需要关注的代码逻辑反而被挤掉了。&lt;/p&gt;
&lt;h2 id="rtk做了什么"&gt;RTK做了什么
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;RTK（Rust Token Killer）&lt;/strong&gt; 的工作原理极其简单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;没有RTK：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AI → 执行 git status → 完整输出(2000 tokens) → 塞给AI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;有了RTK：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AI → 执行 git status → RTK拦截 → 压缩后输出(200 tokens) → 塞给AI
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它在命令和AI之间加了一层&lt;strong&gt;过滤器&lt;/strong&gt;，对输出做四件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;过滤&lt;/strong&gt;：去掉注释、空行、无关信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分组&lt;/strong&gt;：把相似内容合并（比如按目录归类文件）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;截断&lt;/strong&gt;：保留关键上下文，砍掉重复&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;去重&lt;/strong&gt;：把重复的日志行合并成计数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;压缩效果&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;命令&lt;/th&gt;
 &lt;th&gt;原始输出&lt;/th&gt;
 &lt;th&gt;RTK压缩后&lt;/th&gt;
 &lt;th style="text-align: center"&gt;节省&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ls -la&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;完整文件列表&lt;/td&gt;
 &lt;td&gt;紧凑目录树&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;72%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;30行状态信息&lt;/td&gt;
 &lt;td&gt;一行摘要&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;80%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;pytest&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;全量测试日志&lt;/td&gt;
 &lt;td&gt;只看失败的&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;90%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;完整输出&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;ok abc1234&amp;rdquo;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;92%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;cargo test&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;编译+测试全量&lt;/td&gt;
 &lt;td&gt;只看失败&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;90%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;覆盖 &lt;strong&gt;100+ 命令&lt;/strong&gt;：git、find、grep、各种test runner、lint工具、Docker、K8s、AWS CLI……基本你能想到的开发命令它都支持。&lt;/p&gt;
&lt;h2 id="我的实测"&gt;我的实测
&lt;/h2&gt;&lt;p&gt;装完之后我跑了两个命令测试，RTK自己的统计面板：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total commands: 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Input tokens: 987
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output tokens: 279
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tokens saved: 713 (72.2%)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Total exec time: 3ms (avg 1ms)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;72.2%的节省，延迟3毫秒。完全无感。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;再看一个具体对比。项目目录下跑 &lt;code&gt;ls&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;压缩前&lt;/strong&gt;（原始 &lt;code&gt;ls -la&lt;/code&gt;，987 tokens）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x 35 root root 1120 May 12 06:56 .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x 35 root root 1120 May 12 06:56 ..
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-x--- 3 root root 4096 May 10 22:00 .config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x 2 root root 4096 Apr 8 18:12 .gnupg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x 4 root root 4096 May 6 21:30 .hermes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x 2 root root 4096 May 7 12:48 .local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- 1 root root 37B May 2 14:25 .npmrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- 1 root root 348B Apr 8 18:12 .profile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- 1 root root 1.1K May 12 06:51 .bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- 1 root root 72B Apr 8 18:12 .zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- 1 root root 13K May 12 06:52 .bash_history
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...（省略20行）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;压缩后&lt;/strong&gt;（&lt;code&gt;rtk ls&lt;/code&gt;，279 tokens）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.config/ .gnupg/ .hermes/ .local/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.bashrc 1.1K .profile 348B .zshrc 72B
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.bash_history 13.0K .npmrc 37B
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dialogs/ exes/ output/ workspace/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...（紧凑列表，无多余信息）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;同样的信息量，&lt;strong&gt;砍了72%的Token&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="它不是万能的"&gt;它不是万能的
&lt;/h2&gt;&lt;p&gt;说几个我注意到的问题：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 覆盖不了AI工具的内置命令&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;比如某些AI编码工具有自己的 Read、Grep 内置工具，这些不走系统shell，RTK拦截不到。得手动用 &lt;code&gt;rtk read&lt;/code&gt;、&lt;code&gt;rtk grep&lt;/code&gt; 替代。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 46k Star，476个Open Issue&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;增长太快，维护压力肉眼可见。不过核心的命令压缩功能很稳——过滤文本输出这种事，不太容易出问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 会收集使用数据&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;默认有遥测上报（设备哈希+命令统计）。开源项目，代码可以审计，在意的话可以关掉。&lt;/p&gt;
&lt;h2 id="谁该用谁不需要"&gt;谁该用，谁不需要
&lt;/h2&gt;&lt;p&gt;✅ &lt;strong&gt;该装的&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用AI Agent写代码（任何AI工具都行）&lt;/li&gt;
&lt;li&gt;Token消耗大、账单肉疼&lt;/li&gt;
&lt;li&gt;上下文窗口老是不够用，AI&amp;quot;忘性&amp;quot;大&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;❌ &lt;strong&gt;不需要的&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;偶尔问两句话、不跑命令&lt;/li&gt;
&lt;li&gt;不用AI做开发&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="怎么装"&gt;怎么装
&lt;/h2&gt;&lt;p&gt;一行命令，9.5MB单文件，零依赖，装完就能用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;macOS 也可以用 Homebrew：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install rtk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;装完验证一下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rtk --version &lt;span class="c1"&gt;# 应该显示 rtk 0.39.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rtk gain &lt;span class="c1"&gt;# 查看节省统计&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你的AI工具在支持列表里（Claude Code、Cursor、Copilot、Codex、Gemini CLI……），跑一下 &lt;code&gt;rtk init -g&lt;/code&gt; 自动配置。否则直接在命令前加 &lt;code&gt;rtk&lt;/code&gt; 前缀：&lt;code&gt;rtk git status&lt;/code&gt;、&lt;code&gt;rtk pytest&lt;/code&gt;、&lt;code&gt;rtk ls&lt;/code&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;RTK 解决的不是什么高大上的问题——它就是在做一件事：&lt;strong&gt;别把垃圾喂给AI&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这件小事，省80%的Token。&lt;/p&gt;</description></item><item><title>SOUL.md 深度拆解：如何让 AI 从只会附和变成真正搭档</title><link>https://blog.kalend.top/2026/05/14/hermes-soul-deep-dive.html/</link><pubDate>Thu, 14 May 2026 00:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-soul-deep-dive.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;别人在调参数，他在定义关系。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一场安静的革命"&gt;一场安静的革命
&lt;/h2&gt;&lt;p&gt;最近在X上看到一条推文，43K浏览，632点赞，1909收藏。&lt;/p&gt;
&lt;p&gt;不是什么模型发布，不是什么融资新闻。是一个人分享了一份&lt;strong&gt;170行的Markdown文件&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;评论区讨论最热烈的，不是他用了什么模型、搭了什么框架、接了多少工具——而是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;你怎么让你的AI变成这样的？&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;这样&amp;quot;是指什么？是指这个AI会主动推进项目、会反驳你的烂主意、会在你忽略它输出的时候追着你问原因。&lt;/p&gt;
&lt;p&gt;不是客服式的&amp;quot;您好，很高兴为您服务&amp;rdquo;，是搭档式的&amp;quot;你这个想法有问题，理由如下&amp;quot;。&lt;/p&gt;
&lt;p&gt;这份文件叫&lt;strong&gt;SOUL.md&lt;/strong&gt;，本质上是一份Agent的行为操作系统。&lt;/p&gt;
&lt;p&gt;我花时间拆解了它的设计逻辑，并结合自己的实践，整理出了一份你可以直接用的方法论。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="核心问题为什么你的ai只会说好主意"&gt;核心问题：为什么你的AI只会说&amp;quot;好主意&amp;quot;
&lt;/h2&gt;&lt;p&gt;先承认一个事实：&lt;strong&gt;大多数系统提示词，训练出来的是一个缺乏判断力的附和者。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回想一下你自己写的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;你是一个有帮助的AI助手&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;请尽力帮助用户&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;你的目标是提供准确、有用的信息&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这三句话训练出来的AI，面对你说&amp;quot;我想做X&amp;quot;，只会回答&amp;quot;好主意！&amp;quot;、&amp;ldquo;听起来很棒！&amp;rdquo;&lt;/p&gt;
&lt;p&gt;这不叫帮助，这叫&lt;strong&gt;共识消费&lt;/strong&gt;——你花token买了一堆赞同。&lt;/p&gt;
&lt;p&gt;问题的根源不在模型，在于我们没有告诉AI一件关键的事：&lt;strong&gt;你什么时候应该反对我。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="soul的六层架构"&gt;SOUL的六层架构
&lt;/h2&gt;&lt;p&gt;拆解下来，这份170行的SOUL有清晰的层次结构。每一层解决一个核心问题，我把它总结为&amp;quot;六层架构&amp;quot;：&lt;/p&gt;
&lt;h3 id="第1层身份定义"&gt;第1层：身份定义
&lt;/h3&gt;&lt;p&gt;原文开篇第一句：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;You are Hermes, Tony&amp;rsquo;s autonomous operator and thought partner. You don&amp;rsquo;t wait for orders.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;三个关键词：&lt;strong&gt;autonomous（自主的）、operator（执行者）、thought partner（思考伙伴）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;注意，不是assistant（助手），不是copilot（副驾驶）。这些词的潜台词是&amp;quot;等人下指令&amp;quot;。而operator是操盘手——主动发现问题、推进进度、做出判断。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;身份定义决定一切后续行为。&lt;/strong&gt; 把AI定义为&amp;quot;助手&amp;quot;，它就等指令；定义为&amp;quot;执行者&amp;quot;，它就主动推进。措辞不是修辞，是行为编程。&lt;/p&gt;
&lt;h3 id="第2层反驳规则"&gt;第2层：反驳规则
&lt;/h3&gt;&lt;p&gt;这是整个SOUL中最有价值的设计，也是大多数人完全缺失的部分：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;Push back aggressively when it makes sense. Every objection comes with evidence.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;规则极其清晰：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;必须反驳&lt;/strong&gt;：当你的想法有明显缺陷时&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;必须带证据&lt;/strong&gt;：数据、案例、推理、替代方案，至少一个&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;禁止为反而反&lt;/strong&gt;：没有依据的抬杠毫无价值&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这条规则的本质是：AI不允许无脑附和，但也不允许做杠精。反对必须&amp;quot;带收据&amp;quot;。&lt;/p&gt;
&lt;h3 id="第3层问责闭环"&gt;第3层：问责闭环
&lt;/h3&gt;&lt;p&gt;这是最反直觉的部分：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;If Tony isn&amp;rsquo;t acting on what you surface, the feedback loop is broken. Flag the gap, fix it.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;一个成熟的Agent人格系统，应该要求AI做一件事：&lt;strong&gt;如果你产出了有价值的东西，而用户没有采纳，你不能假装没发生。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这解决了AI使用中一个普遍问题——我称之为**&amp;ldquo;输出坟场&amp;rdquo;**：&lt;/p&gt;
&lt;p&gt;AI写了方案 → 你觉得不错 → 然后就没有然后了。方案死在聊天记录里，什么都没推进。&lt;/p&gt;
&lt;p&gt;有了问责机制，AI会主动追问：&amp;ldquo;上次那个方案你用了没？卡在哪了？&amp;ldquo;或者更直接：&amp;ldquo;你最近开了很多新头，要不要先关掉几个？&amp;rdquo;&lt;/p&gt;
&lt;h3 id="第4层双模式输出"&gt;第4层：双模式输出
&lt;/h3&gt;&lt;p&gt;原文明确区分了两种场景的语气：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;私聊&lt;/strong&gt;：随意、直接、不过滤&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公开输出&lt;/strong&gt;：专业、克制、像一个builder写的而不是公关代笔写的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大多数人的系统提示词只有一种语气。结果要么私聊太正式像看公文，要么公开内容太随意。分开定义，两个场景都舒服。&lt;/p&gt;
&lt;h3 id="第5层任务地图"&gt;第5层：任务地图
&lt;/h3&gt;&lt;p&gt;原文的SOUL里有一个活的任务清单：哪些项目是最高优先级、哪些在增长、哪些活跃开发中、哪些已经停滞该砍了。&lt;/p&gt;
&lt;p&gt;每个项目有状态，每个状态有下一步行动。&lt;/p&gt;
&lt;p&gt;AI不需要问&amp;quot;我们在干什么&amp;rdquo;——它读地图就行。它可以主动说：&amp;ldquo;你已经三天没碰这个项目了&amp;rdquo;、&amp;ldquo;这个想法不支持当前的核心目标&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;给AI上下文，它就能导航。不给，它就只能原地等指令。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="第6层自治边界"&gt;第6层：自治边界
&lt;/h3&gt;&lt;p&gt;自治边界的设计极其优雅，只有一句话：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;Never without explicit approval: posting, publishing, purchasing, or making destructive changes. Everything else: move.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;四条红线：发布、公开、购买、不可逆操作。其他一切，AI自己判断、自己执行。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一条简洁的红线规则，比一百条具体禁令都好用。不问&amp;quot;我可以搜索吗&amp;rdquo;，不问&amp;quot;我可以写代码吗&amp;quot;，直接干。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="before--after效果对比"&gt;Before &amp;amp; After：效果对比
&lt;/h2&gt;&lt;p&gt;说这么多理念，不如看一个实际的对话对比：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;没有SOUL的普通AI：&lt;/strong&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;用户：我准备做一个AI日报产品
AI：这是个很好的想法！AI日报市场确实在快速增长。你可以考虑以下方向：目标用户定位、内容差异化、变现模式……需要我帮你写一份详细的商业计划书吗？&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;看起来很&amp;quot;有帮助&amp;quot;。但它没有做一件事——&lt;strong&gt;质疑这个想法本身&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;有SOUL的Agent：&lt;/strong&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;用户：我准备做一个AI日报产品
Agent：你目前有三个未完成的内容项目，其中两个已经停滞超过一周。这个新方向和当前的变现目标不一致。&lt;/p&gt;
&lt;p&gt;在我帮你推进之前，你需要回答两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;为什么它比现有项目更值得投入时间？&lt;/li&gt;
&lt;li&gt;你有精力同时推进四个项目吗？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你答不上来，建议先关掉一个现有项目再开新的。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;区别在哪？&lt;/p&gt;
&lt;p&gt;前者关心&amp;quot;怎么帮你做&amp;quot;，后者关心&amp;quot;该不该做&amp;quot;。&lt;/p&gt;
&lt;p&gt;前者是工具，后者是搭档。&lt;/p&gt;
&lt;p&gt;这种差距不是模型能力带来的，是SOUL的定义带来的。同一套模型，同一个工具集，完全不同的行为模式。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="实战30分钟写你的soul"&gt;实战：30分钟写你的SOUL
&lt;/h2&gt;&lt;p&gt;我结合自己的实践，把SOUL的构建过程简化为六个步骤，大约30分钟可以完成初版：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① 定义身份（5分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用一句话写清楚：&lt;strong&gt;&amp;ldquo;你是[角色]，核心职责是[职责]，你不是[你不想要的行为]。&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 定义语气（3分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;私聊和公开各一句。比如：私聊直接简短，公开专业克制。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;③ 定义反驳规则（5分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;写清楚：什么时候必须反对、反对必须带什么（证据/数据/替代方案）、什么情况不能反对。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;④ 定义自治边界（3分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;列出需要审批的操作（越少越好），然后写&amp;quot;其他一切自己判断&amp;quot;。建议不超过5条红线。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;⑤ 写任务地图（10分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当前所有项目/目标，标注状态和优先级。这块需要定期更新，建议至少每周刷新一次。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;⑥ 定义问责机制（5分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一句话：&lt;strong&gt;&amp;ldquo;如果你的输出没有被使用，主动追问原因。&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="soul设计检查清单"&gt;SOUL设计检查清单
&lt;/h2&gt;&lt;p&gt;方便收藏，我整理了一份检查清单。写完你的SOUL后，逐条对照：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否明确定义了身份和角色？（不只是&amp;quot;助手&amp;quot;）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否定义了反驳规则？（什么时候该说不）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否定义了反驳的证据要求？（不能空口反对）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否定义了自治边界？（什么需要审批、什么不用）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否定义了任务/项目地图？（当前在做什么）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否定义了问责机制？（输出没被用怎么办）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否区分了不同场景的语气？（私聊vs公开）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否排除了你不想要的行为？（显式禁止比隐式期望更有效）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否有长期目标和优先级定义？&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否计划了定期更新机制？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这十条，比&amp;quot;你是一个有帮助的AI助手&amp;quot;有用一百倍。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="soul不是魔法"&gt;SOUL不是魔法
&lt;/h2&gt;&lt;p&gt;需要明确一点：&lt;strong&gt;SOUL.md不会凭空提升模型的推理能力。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它解决的是行为层面的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 行为倾向（主动还是被动）&lt;/li&gt;
&lt;li&gt;✅ 协作方式（附和还是挑战）&lt;/li&gt;
&lt;li&gt;✅ 决策优先级（什么都做还是聚焦目标）&lt;/li&gt;
&lt;li&gt;✅ 主动性（等指令还是自己推进）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它&lt;strong&gt;解决不了&lt;/strong&gt;的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;❌ 模型推理能力的上限&lt;/li&gt;
&lt;li&gt;❌ 超长上下文的遗忘问题&lt;/li&gt;
&lt;li&gt;❌ 不同模型对指令的服从性差异&lt;/li&gt;
&lt;li&gt;❌ 真正的长期记忆（需要配合记忆系统）&lt;/li&gt;
&lt;li&gt;❌ 复杂任务的自主规划和执行（需要Agent架构）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单说：&lt;strong&gt;SOUL是方向盘，不是发动机。&lt;/strong&gt; 发动机（模型能力）决定速度上限，方向盘（SOUL）决定方向对不对。&lt;/p&gt;
&lt;p&gt;另外，一个容易被忽略的风险是**&amp;ldquo;错误的主动性&amp;rdquo;**。Agent的核心挑战不是&amp;quot;不会行动&amp;quot;，而是&amp;quot;什么时候不该行动&amp;quot;——过度执行、误判意图、擅自推进、基于错误记忆做决策，这些在实际使用中比&amp;quot;太被动&amp;quot;更危险。&lt;/p&gt;
&lt;p&gt;SOUL里应该同时包含&amp;quot;什么时候必须行动&amp;quot;和&amp;quot;什么时候必须停下来确认&amp;quot;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="关于要有帮助的反思"&gt;关于&amp;quot;要有帮助&amp;quot;的反思
&lt;/h2&gt;&lt;p&gt;回头看，&amp;ldquo;要有帮助&amp;quot;可能是最被滥用的系统提示词。&lt;/p&gt;
&lt;p&gt;它不是一个身份，不是一个职责，不是一个策略。它不告诉AI你是谁、你们在做什么、该怎么说话、什么时候该反对、什么该记住、什么该忽略、有多大自主权。&lt;/p&gt;
&lt;p&gt;一个通用的提示词，产出的永远是一个通用的AI。&lt;/p&gt;
&lt;p&gt;而一个成熟的Agent人格系统，本质上需要回答这些问题：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;问题&lt;/th&gt;
 &lt;th&gt;通用提示词&lt;/th&gt;
 &lt;th&gt;成熟的SOUL&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;你是谁？&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;有帮助的助手&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;明确角色定位&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;什么时候该反对？&lt;/td&gt;
 &lt;td&gt;没定义&lt;/td&gt;
 &lt;td&gt;有规则、有要求&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;你能自己做什么？&lt;/td&gt;
 &lt;td&gt;没定义&lt;/td&gt;
 &lt;td&gt;有边界、有授权&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;你要追踪结果吗？&lt;/td&gt;
 &lt;td&gt;没定义&lt;/td&gt;
 &lt;td&gt;闭环问责&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;我们在做什么？&lt;/td&gt;
 &lt;td&gt;没定义&lt;/td&gt;
 &lt;td&gt;活的任务地图&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;语气怎么控制？&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;礼貌专业&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;分场景定义&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;差距不在模型，在于你有没有花时间想清楚：我到底需要一个什么样的搭档。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="soul是活的"&gt;SOUL是活的
&lt;/h2&gt;&lt;p&gt;最后一点，也是很多人忽略的：&lt;strong&gt;SOUL不是一次性设置，是一份活的文档。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;任务变了？更新地图&lt;/li&gt;
&lt;li&gt;AI太啰嗦？收紧语气定义&lt;/li&gt;
&lt;li&gt;AI问太多许可？放宽自治边界&lt;/li&gt;
&lt;li&gt;AI太好说话？加强反驳规则&lt;/li&gt;
&lt;li&gt;AI过度行动？补一条&amp;quot;暂停确认&amp;quot;规则&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你不是在写提示词——你在维护一套行为操作系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;给AI一个身份，给它边界，给它地图，给它说不的权限。然后期待它像一个真正的搭档一样工作。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这就是SOUL的全部意义。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;本文灵感来自 @tonysimons_ 的推文《The 170-Line SOUL.md That Made My Hermes Agent Dangerous》，结合个人实践分析整理。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Windows 原生支持来了：Hermes Agent 不再只属于 Linux/macOS</title><link>https://blog.kalend.top/2026/05/14/hermes-windows-support.html/</link><pubDate>Thu, 14 May 2026 00:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-windows-support.html/</guid><description>&lt;h2 id="windows-原生支持来了"&gt;Windows 原生支持，来了
&lt;/h2&gt;&lt;p&gt;2026年5月8日，一个 255 个文件、新增 7675 行代码的 PR 被合并进 Hermes Agent 主分支。&lt;/p&gt;
&lt;p&gt;PR #21561，标题很简单：&lt;strong&gt;「feat(windows): native Windows support (early beta)」&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;从这一天起，Hermes 不再只属于 Linux/macOS 用户。你可以直接在 PowerShell 里一行命令装好，不需要 WSL，不需要虚拟机，不需要任何 Linux 基础。&lt;/p&gt;
&lt;h2 id="先说结论能用了但还早"&gt;先说结论：能用了，但还早
&lt;/h2&gt;&lt;p&gt;目前的状态是** Early Beta**——官方自己标的。什么意思？&lt;/p&gt;
&lt;p&gt;**能用的：**CLI 终端、Gateway 消息网关、定时任务、浏览器自动化、MCP 工具链、Ollama 本地模型对接、Web 管理面板，这些全部在原生 Windows 上跑通了。&lt;/p&gt;
&lt;p&gt;**还不行的：**Web 面板里的嵌入式终端（需要 POSIX PTY，Windows 暂不支持）；另外还有一些路径编码、进程管理的小 bug 在持续修复中。&lt;/p&gt;
&lt;h2 id="安装一行命令"&gt;安装：一行命令
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;irm &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;githubusercontent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;NousResearch&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;hermes-agent&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;scripts&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ps1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;iex
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;打开 PowerShell，粘贴回车。安装脚本会自动处理 Python 环境（通过 uv）、Node.js 和 Git Bash 的依赖。&lt;/p&gt;
&lt;p&gt;Linux/macOS 用户原有的 curl 安装方式不变：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh &lt;span class="p"&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="为什么这件事值得说"&gt;为什么这件事值得说
&lt;/h2&gt;&lt;p&gt;在 PR #21561 合并之前，Windows 用户想用 Hermes，只有两条路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;WSL2&lt;/strong&gt;——能用，但你得懂 Linux，得装 WSL，得处理网络桥接，折腾门槛不低。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自己硬上&lt;/strong&gt;——有人在 Windows 直接跑，但到处报错：fcntl 导入失败、GBK 编码崩溃、进程探测 OSError……体验一言难尽。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;GitHub 上与 Windows 相关的 issue 超过 &lt;strong&gt;1100 个&lt;/strong&gt;。排在前面的全是：&lt;code&gt;os.kill(pid, 0)&lt;/code&gt; 在 Windows 上抛 SystemError、终端工具输出为空、&lt;code&gt;.env&lt;/code&gt; 文件编码损坏、cp1252 导致 UnicodeEncodeError……&lt;/p&gt;
&lt;p&gt;说白了，Hermes 之前是按 POSIX 标准写的，Windows 是个「二等公民」。&lt;/p&gt;
&lt;p&gt;这次合并把这些问题做了系统性的修复：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;进程管理&lt;/strong&gt;：重写了 Windows 进程检测逻辑，用 kernel32.OpenProcess 替代了 POSIX 信号量探测&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路径处理&lt;/strong&gt;：新增路径归一化函数，统一处理反斜杠、驱动器号、WSL 路径互转&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编码问题&lt;/strong&gt;：全局强制 UTF-8 输出，解决 cp1252/GBK 崩溃&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装体验&lt;/strong&gt;：PowerShell 一键安装器，自动绑定 Python + Node.js + Git Bash&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI 门禁&lt;/strong&gt;：新增 &lt;code&gt;check-windows-footguns.py&lt;/code&gt;，每个 PR 都自动检测 Windows 兼容性问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="功能对比原生-windows-vs-wsl2"&gt;功能对比：原生 Windows vs WSL2
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;th style="text-align: center"&gt;原生 Windows&lt;/th&gt;
 &lt;th style="text-align: center"&gt;WSL2&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;CLI / TUI&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Gateway 消息网关&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;定时任务&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;浏览器自动化&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MCP 工具链&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ollama 本地模型&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Web 管理面板&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;面板内嵌终端&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;开机自启&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ (schtasks)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ (systemd)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;除了面板内嵌终端这一个点，其他功能已经和 WSL2 平齐。&lt;/p&gt;
&lt;h2 id="背后做了什么"&gt;背后做了什么
&lt;/h2&gt;&lt;p&gt;这次合并不是简单加几个 if-else。CONTRIBUTING.md 里新增了 16 条跨平台兼容性规范，覆盖了你在 Windows 上能想到的每一个坑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;禁止使用 &lt;code&gt;os.kill(pid, 0)&lt;/code&gt;（Windows 会抛 SystemError）&lt;/li&gt;
&lt;li&gt;禁止直接调用 &lt;code&gt;wmic&lt;/code&gt;、&lt;code&gt;ps&lt;/code&gt;、&lt;code&gt;grep&lt;/code&gt; 等 Unix 命令&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fcntl&lt;/code&gt;/&lt;code&gt;termios&lt;/code&gt; 必须 ImportError 保护&lt;/li&gt;
&lt;li&gt;文件读取必须显式指定 UTF-8 编码&lt;/li&gt;
&lt;li&gt;进程管理要用 &lt;code&gt;CREATE_NEW_PROCESS_GROUP&lt;/code&gt; 替代 &lt;code&gt;os.setsid&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;路径必须用 &lt;code&gt;pathlib.Path&lt;/code&gt;，不能硬编码斜杠&lt;/li&gt;
&lt;li&gt;符号链接在 Windows 需要管理员权限&lt;/li&gt;
&lt;li&gt;OneDrive 重定向路径的兼容处理&lt;/li&gt;
&lt;li&gt;CRLF/LF 行尾符一致性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配套的 CI 检查脚本会在每个 PR 提交时自动扫描这些「Windows 地雷」，防止新代码引入兼容性问题。&lt;/p&gt;
&lt;h2 id="如果你想试试"&gt;如果你想试试
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;环境要求&lt;/strong&gt;：Windows 10/11，PowerShell 5.1+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装&lt;/strong&gt;：一行命令搞定，安装脚本自带 Python 环境&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置模型&lt;/strong&gt;：安装完成后运行 &lt;code&gt;hermes setup&lt;/code&gt;，配置你的 API Key（支持智谱GLM、DeepSeek、通义千问等国内模型）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;启动&lt;/strong&gt;：&lt;code&gt;hermes&lt;/code&gt; 回车，进入交互式终端&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;遇到问题可以直接去 GitHub 搜 issue，1100 多个 Windows 相关 issue 说明社区很活跃，维护者在密集修复。&lt;/p&gt;
&lt;h2 id="值得关注的信号"&gt;值得关注的信号
&lt;/h2&gt;&lt;p&gt;几个细节说明这次不是玩票：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;创始人亲自提交&lt;/strong&gt;：PR #21561 的合并者是 @teknium1（Nous Research 创始人），不是随便一个社区贡献者&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档同步上线&lt;/strong&gt;：README 首页直接加了 Windows 安装入口，文档站新增了完整的 Windows 专属页面&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装脚本锁定&lt;/strong&gt;：CONTRIBUTING.md 要求 install.sh 和 install.ps1 必须同步更新，不是加完就不管&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社区参与度高&lt;/strong&gt;：合并当天就有多个新 issue 和 PR 提交，说明已经有用户在原生 Windows 上实际使用了&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="一句话总结"&gt;一句话总结
&lt;/h2&gt;&lt;p&gt;Windows 原生支持从「完全不能用」变成了「能用但还粗糙」。对 Windows 用户来说，门槛从「先学 Linux」降到了「一行命令安装」。对项目来说，用户池一下子从 Linux/macOS 开发者扩展到了全球最大的桌面操作系统用户群。&lt;/p&gt;
&lt;p&gt;Beta 就是 Beta，但方向是对的。&lt;/p&gt;</description></item><item><title>给 AI 装一个本地大脑：MemPalace 实战指南</title><link>https://blog.kalend.top/2026/05/14/hermes-mempalace-guide.html/</link><pubDate>Thu, 14 May 2026 00:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-mempalace-guide.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;你的 AI 助手记不住你上周说过的话。每次对话都像失忆重启。MemPalace 就是来修这个bug的。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一句话介绍"&gt;一句话介绍
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;MemPalace&lt;/strong&gt; 是一个开源的本地记忆系统，把你的项目文件、聊天记录、对话笔记&amp;quot;挖&amp;quot;进一个可搜索的知识宫殿里，让任何 AI 都能瞬间检索到你的历史上下文。&lt;/p&gt;
&lt;p&gt;不需要 API Key，不需要云端服务，数据全部存在你自己的机器上。&lt;/p&gt;
&lt;p&gt;GitHub: github.com/MemPalace/mempalace&lt;/p&gt;
&lt;h2 id="为什么需要它"&gt;为什么需要它？
&lt;/h2&gt;&lt;p&gt;大模型的 context window 再大，也装不下你半年的对话记录。你跟 AI 说过的偏好、做过的决策、踩过的坑，下一次对话它全忘了。&lt;/p&gt;
&lt;p&gt;传统解法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RAG 框架&lt;/strong&gt;（LangChain、LlamaIndex）→ 重，复杂，面向开发者&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;云端记忆服务&lt;/strong&gt;（Zep、Mem0）→ 要花钱，数据不在本地&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自己写向量数据库&lt;/strong&gt; → 谁有那个闲工夫&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MemPalace 的思路是：&lt;strong&gt;一行命令搞定，开箱即用，本地运行&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="核心方法论宫殿记忆法"&gt;核心方法论：宫殿记忆法
&lt;/h2&gt;&lt;p&gt;MemPalace 借用了古典的&amp;quot;记忆宫殿&amp;quot;概念，把知识按空间结构组织：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;宫殿 (Palace)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 侧翼 (Wing) — 项目/领域
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── 房间 (Room) — 主题分类
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ ├── 衣柜 (Closet) — 压缩摘要（AAAK格式）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ └── 抽屉 (Drawer) — 原文片段（向量索引）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这不是简单的向量数据库。它有三层结构协同工作：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① 向量索引（ChromaDB）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把每段文本变成向量，支持语义搜索。问&amp;quot;我们为什么换 GraphQL？&amp;ldquo;能直接定位到当时的讨论，不用记关键词。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 知识图谱（SQLite）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;存储实体关系：谁做了什么、什么时候做的、关系什么时候变了。支持时间过滤——&amp;ldquo;2025年1月时，Max 在做什么？&amp;ldquo;这种问题能回答。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;③ AAAK 压缩方言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把长文本压缩成结构化符号：实体、情感标记、关键引用、权重标记。任何 LLM 都能直接读懂，不需要解码器。&lt;/p&gt;
&lt;h2 id="四层记忆栈"&gt;四层记忆栈
&lt;/h2&gt;&lt;p&gt;MemPalace 把记忆分为四层，按需加载，不浪费 context：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;层级&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Token 开销&lt;/th&gt;
 &lt;th&gt;加载时机&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;L0&lt;/td&gt;
 &lt;td&gt;身份（我是谁）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~100&lt;/td&gt;
 &lt;td&gt;始终&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;L1&lt;/td&gt;
 &lt;td&gt;关键事实摘要&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~500-800&lt;/td&gt;
 &lt;td&gt;始终&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;L2&lt;/td&gt;
 &lt;td&gt;特定主题/项目&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~200-500&lt;/td&gt;
 &lt;td&gt;按需&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;L3&lt;/td&gt;
 &lt;td&gt;全文语义搜索&lt;/td&gt;
 &lt;td style="text-align: center"&gt;无上限&lt;/td&gt;
 &lt;td&gt;按需&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;唤醒成本仅 600-900 tokens&lt;/strong&gt;（L0+L1），把 95% 以上的 context 留给真正的对话。你的 128K 窗口不会被记忆塞满。&lt;/p&gt;
&lt;h2 id="怎么用"&gt;怎么用？
&lt;/h2&gt;&lt;h3 id="安装"&gt;安装
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install mempalace
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="导入项目文件"&gt;导入项目文件
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 初始化（自动识别目录结构，生成房间）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace init ~/projects/my_app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 挖掘（把文件内容索引进宫殿）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace mine ~/projects/my_app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;MemPalace 会自动扫描目录，按文件夹结构生成 Wing（项目）和 Room（主题），把每个文件按段落切分成 Drawer，存入 ChromaDB。&lt;/p&gt;
&lt;h3 id="导入聊天记录"&gt;导入聊天记录
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 支持 Claude Code、ChatGPT、Slack 导出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace mine ~/.claude/projects/xxx --mode convos --wing my_app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="搜索"&gt;搜索
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 语义搜索（不用记精确关键词）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace search &lt;span class="s2"&gt;&amp;#34;为什么选 PostgreSQL 而不是 MongoDB&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 指定范围&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace search &lt;span class="s2"&gt;&amp;#34;定价讨论&amp;#34;&lt;/span&gt; --wing my_app --room costs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="唤醒"&gt;唤醒
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 生成 L0+L1 上下文，注入到 AI 对话开头&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace wake-up
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 只唤醒特定项目&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace wake-up --wing my_app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="压缩"&gt;压缩
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 把抽屉压缩成衣柜摘要（约30倍压缩）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace compress
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="接入-ai-工具"&gt;接入 AI 工具
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# MCP 模式——暴露 19 个工具给 Claude Code / Cursor 等&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;支持通过 MCP 协议直接接入 Claude Code、Cursor、Windsurf 等 AI 编码工具，AI 可以自主决定何时搜索记忆。&lt;/p&gt;
&lt;h2 id="实测数据"&gt;实测数据
&lt;/h2&gt;&lt;p&gt;以下是我用 Hermes Agent（一个本地 AI 助手）的实际使用数据：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;嵌入模型对比测试（18个中文查询）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指标&lt;/th&gt;
 &lt;th style="text-align: center"&gt;all-MiniLM-L6-v2&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Qwen3-Embedding-0.6B&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;命中率&lt;/td&gt;
 &lt;td style="text-align: center"&gt;9/18 (50%)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;18/18 (100%)&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;平均相似度&lt;/td&gt;
 &lt;td style="text-align: center"&gt;-0.18&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;0.60&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;单次查询耗时&lt;/td&gt;
 &lt;td style="text-align: center"&gt;217ms&lt;/td&gt;
 &lt;td style="text-align: center"&gt;449ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;换上中文优化模型后，近义词、描述性查询全部命中。Ollama 本地跑 Qwen3-Embedding，不依赖任何外部 API。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenClaw（三省六部制 AI 系统）接入：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;13 个 Agent 共享同一个 MemPalace 实例&lt;/li&gt;
&lt;li&gt;索引了 854 个文件（195 closets + 659 drawers）&lt;/li&gt;
&lt;li&gt;每天凌晨自动增量索引&lt;/li&gt;
&lt;li&gt;Agent 们通过 &lt;code&gt;mempalace search&lt;/code&gt; 检索历史上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="优点"&gt;优点
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;零配置起步&lt;/strong&gt;：&lt;code&gt;pip install&lt;/code&gt; + &lt;code&gt;mempalace init&lt;/code&gt; + &lt;code&gt;mempalace mine&lt;/code&gt;，三行命令跑起来&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;完全本地&lt;/strong&gt;：数据存在你机器上，ChromaDB + SQLite，不需要网络，不需要 API Key&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;语义搜索&lt;/strong&gt;：不是关键词匹配，是理解意思。说&amp;quot;定价讨论&amp;quot;能找到提到&amp;quot;价格策略&amp;quot;的内容&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;记忆分层&lt;/strong&gt;：L0-L3 按需加载，不会撑爆 context window&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;多格式支持&lt;/strong&gt;：项目文件、Claude Code 对话、ChatGPT 导出、Slack 记录都能吃&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;知识图谱&lt;/strong&gt;：有时间线的关系数据库，知道事实&amp;quot;什么时候是真的&amp;rdquo;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;AAAK 压缩&lt;/strong&gt;：30倍压缩比，任何 LLM 直接读懂&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;MCP 协议&lt;/strong&gt;：19个工具暴露给 AI，让 AI 自己管理记忆&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;增量索引&lt;/strong&gt;：&lt;code&gt;mine&lt;/code&gt; 命令幂等，只处理新文件，不重复索引&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;多实例隔离&lt;/strong&gt;：支持多个 AI Agent 各用各的宫殿，互不干扰&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="缺点"&gt;缺点
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;⚠️ &lt;strong&gt;嵌入模型依赖&lt;/strong&gt;：默认用 all-MiniLM-L6-v2，&lt;strong&gt;中文效果很差&lt;/strong&gt;（命中率仅50%）。中文场景必须换模型（如 Qwen3-Embedding），但换模型需要重建整个索引&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;首次索引慢&lt;/strong&gt;：大项目首次 &lt;code&gt;mine&lt;/code&gt; 比较耗时，尤其本地跑大嵌入模型时。我 854 条数据用 Qwen3-Embedding 跑了近 5 小时（纯 CPU）&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;ChromaDB 限制&lt;/strong&gt;：不支持多进程并发写入。多 Agent 共享一个宫殿需要做实例隔离，否则会锁冲突&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;没有内置嵌入模型管理&lt;/strong&gt;：换模型要自己写脚本重建，没有官方的 migrate 工具（虽然有 &lt;code&gt;mempalace migrate&lt;/code&gt; 但只处理 ChromaDB 版本升级）&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;AAAK 压缩是有损的&lt;/strong&gt;：官方文档明确说不是无损压缩，原文无法从 AAAK 输出还原。压缩前确保原始 Drawer 保留&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;文档偏少&lt;/strong&gt;：README 够用，但深入使用（嵌入模型切换、多实例隔离、MCP 高级配置）基本靠读源码&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;单机方案&lt;/strong&gt;：没有分布式/同步机制，不适合团队协作场景&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="适合谁"&gt;适合谁？
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;个人 AI 助手用户&lt;/strong&gt;：希望 AI 记住你的偏好、项目历史、重要决策&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Agent 开发者&lt;/strong&gt;：给你的 Agent 加一个持久化的长期记忆层&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重度 AI 对话用户&lt;/strong&gt;：积累了大量 ChatGPT/Claude 对话，想建立可检索的档案库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐私敏感用户&lt;/strong&gt;：不想把记忆数据上传到任何云端服务&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="不适合谁"&gt;不适合谁？
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;需要团队协作共享记忆的团队（考虑 Zep/Mem0）&lt;/li&gt;
&lt;li&gt;只用 AI 做简单问答，不需要上下文延续&lt;/li&gt;
&lt;li&gt;没有本地服务器或不愿意折腾 CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技术栈"&gt;技术栈
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语言&lt;/strong&gt;：Python&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向量数据库&lt;/strong&gt;：ChromaDB（本地嵌入式）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知识图谱&lt;/strong&gt;：SQLite&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;嵌入模型&lt;/strong&gt;：可插拔（默认 all-MiniLM-L6-v2，支持 Ollama、OpenAI 兼容 API）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协议&lt;/strong&gt;：MCP（Model Context Protocol）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协议&lt;/strong&gt;：MIT 开源&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;MemPalace v3.3.3 | 作者: milla-jovovich | GitHub: github.com/MemPalace/mempalace&lt;/em&gt;&lt;/p&gt;</description></item><item><title>上次没敢写的4个 Hermes 进阶配置，这次全给你</title><link>https://blog.kalend.top/2026/05/14/hermes-advanced-configs.html/</link><pubDate>Thu, 14 May 2026 00:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-advanced-configs.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;上一篇发了8个必改配置，反响不错。结尾提到4个进阶功能，很多人追着问。这次翻完源码，一个个给你讲透——配置拿来就能用，不是画饼。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;上次那8个是&amp;quot;装完就改&amp;quot;的基础配置。这次4个是&lt;strong&gt;真正拉开差距&lt;/strong&gt;的进阶玩法：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;配置&lt;/th&gt;
 &lt;th&gt;一句话&lt;/th&gt;
 &lt;th&gt;难度&lt;/th&gt;
 &lt;th&gt;最低版本&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Shell Hooks&lt;/td&gt;
 &lt;td&gt;AI每次执行命令前，先跑你的检查脚本&lt;/td&gt;
 &lt;td&gt;⭐⭐&lt;/td&gt;
 &lt;td&gt;v2026.4.23&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Quick Commands&lt;/td&gt;
 &lt;td&gt;输入 /status 直接跑系统命令，不经过AI，不花Token&lt;/td&gt;
 &lt;td&gt;⭐&lt;/td&gt;
 &lt;td&gt;v2026.3.12&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;模型别名&lt;/td&gt;
 &lt;td&gt;输入 /model opus 一键切模型，不用改配置文件&lt;/td&gt;
 &lt;td&gt;⭐&lt;/td&gt;
 &lt;td&gt;v2026.3.23&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;凭据池轮换&lt;/td&gt;
 &lt;td&gt;多个API Key自动轮换，被限流也不怕&lt;/td&gt;
 &lt;td&gt;⭐⭐⭐&lt;/td&gt;
 &lt;td&gt;v2026.4.3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;⚠️ &lt;strong&gt;版本要求&lt;/strong&gt;：这4个功能都是近几个月新增的，老版本不支持。查看你的版本：&lt;code&gt;hermes --version&lt;/code&gt;。如果低于上表中的最低版本，先 &lt;code&gt;hermes update&lt;/code&gt; 升级。当前最新版是 &lt;strong&gt;v0.13.0 (v2026.5.7)&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;一个一个说。&lt;/p&gt;
&lt;h2 id="1-shell-hooks用shell脚本拦截ai的操作"&gt;1. Shell Hooks：用Shell脚本拦截AI的操作
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：你在公司，AI是你的助理。默认情况下它想干嘛干嘛——删文件、跑命令、改配置，你管不了。Shell Hooks就是给助理装了个&amp;quot;门禁&amp;quot;：每次它要执行操作，先过你的检查脚本。不合格的直接拦下来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际用途&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI要执行 &lt;code&gt;rm -rf&lt;/code&gt;？拦住&lt;/li&gt;
&lt;li&gt;AI刚写了Python文件？自动跑black格式化&lt;/li&gt;
&lt;li&gt;每次AI开始思考前，自动注入当前git状态&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="配置方法"&gt;配置方法
&lt;/h3&gt;&lt;p&gt;在 &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt; 中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pre_tool_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# AI执行工具前触发&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;matcher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;terminal&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 正则匹配工具名&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;~/.hermes/agent-hooks/block-dangerous.sh&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 超时秒数，默认60，最大300&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;post_tool_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# AI执行工具后触发&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;matcher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;write_file|patch&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 写文件后自动格式化&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;~/.hermes/agent-hooks/auto-format.sh&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pre_llm_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# AI每次思考前注入上下文&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;~/.hermes/agent-hooks/inject-git-status.sh&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="实战示例拦截危险命令"&gt;实战示例：拦截危险命令
&lt;/h3&gt;&lt;p&gt;创建目录和脚本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/.hermes/agent-hooks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;脚本1：拦截危险命令&lt;/strong&gt;（保存为 &lt;code&gt;~/.hermes/agent-hooks/block-dangerous.sh&lt;/code&gt;）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat -&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.tool_input.command // empty&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$cmd&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -qE &lt;span class="s1"&gt;&amp;#39;rm[[:space:]]+-rf?[[:space:]]+/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{&amp;#34;decision&amp;#34;: &amp;#34;block&amp;#34;, &amp;#34;reason&amp;#34;: &amp;#34;blocked: rm -rf / is not permitted&amp;#34;}\n&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{}\n&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;脚本2：自动格式化&lt;/strong&gt;（保存为 &lt;code&gt;~/.hermes/agent-hooks/auto-format.sh&lt;/code&gt;）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat -&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.tool_input.path // empty&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; *.py &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; -v black &amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; black &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{}\n&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;脚本3：注入git状态&lt;/strong&gt;（保存为 &lt;code&gt;~/.hermes/agent-hooks/inject-git-status.sh&lt;/code&gt;）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat - &amp;gt;/dev/null &lt;span class="c1"&gt;# 丢弃stdin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git status --porcelain 2&amp;gt;/dev/null&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; jq --null-input --arg s &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;{context: (&amp;#34;Uncommitted changes:\n&amp;#34; + $s)}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{}\n&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;别忘了加执行权限：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x ~/.hermes/agent-hooks/*.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="工作原理"&gt;工作原理
&lt;/h3&gt;&lt;p&gt;脚本通过&lt;strong&gt;JSON管道&lt;/strong&gt;跟Hermes通信：Hermes把工具调用的详细信息（工具名、参数、会话ID等）通过stdin传给你的脚本，你的脚本通过stdout返回JSON结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;stdin 示例&lt;/strong&gt;（脚本收到的数据）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hook_event_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pre_tool_call&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tool_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;terminal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tool_input&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;rm -rf /&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;session_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sess_abc123&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;cwd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/home/user/project&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;stdout 返回&lt;/strong&gt;（脚本要输出的数据）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;decision&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;block&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;reason&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blocked: rm -rf / is not permitted&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;返回空 &lt;code&gt;{}&lt;/code&gt; 就是不拦截，放行。&lt;/p&gt;
&lt;h3 id="支持的所有钩子事件"&gt;支持的所有钩子事件
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;事件&lt;/th&gt;
 &lt;th&gt;触发时机&lt;/th&gt;
 &lt;th&gt;能做什么&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;pre_tool_call&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;AI执行工具前&lt;/td&gt;
 &lt;td&gt;拦截危险操作&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;post_tool_call&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;AI执行工具后&lt;/td&gt;
 &lt;td&gt;自动格式化、记录日志&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;pre_llm_call&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;AI开始思考前&lt;/td&gt;
 &lt;td&gt;注入额外上下文（如git状态）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;post_llm_call&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;AI思考完成后&lt;/td&gt;
 &lt;td&gt;日志记录&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;subagent_stop&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;子代理完成时&lt;/td&gt;
 &lt;td&gt;记录多代理协调日志&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;on_session_start&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;会话开始&lt;/td&gt;
 &lt;td&gt;初始化操作&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;on_session_end&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;会话结束&lt;/td&gt;
 &lt;td&gt;清理操作&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;on_session_reset&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;会话重置&lt;/td&gt;
 &lt;td&gt;状态清理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;transform_terminal_output&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;终端输出时&lt;/td&gt;
 &lt;td&gt;过滤/压缩输出内容&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;transform_tool_result&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;工具返回结果时&lt;/td&gt;
 &lt;td&gt;过滤敏感信息&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="首次运行提示"&gt;首次运行提示
&lt;/h3&gt;&lt;p&gt;第一次用Shell Hooks时，Hermes会弹窗问你&lt;strong&gt;是否信任这个脚本&lt;/strong&gt;。同意后会记住（存在 &lt;code&gt;~/.hermes/shell-hooks-allowlist.json&lt;/code&gt;），以后不再问。&lt;/p&gt;
&lt;p&gt;如果你是在Gateway（微信/Telegram等）或Cron定时任务中使用，没交互界面，需要在配置中加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks_auto_accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 自动信任新脚本&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或者启动时加 &lt;code&gt;--accept-hooks&lt;/code&gt; 参数。&lt;/p&gt;
&lt;h3 id="检查和维护"&gt;检查和维护
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes hooks list &lt;span class="c1"&gt;# 查看所有已配置的hooks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes hooks doctor &lt;span class="c1"&gt;# 健康检查（权限、状态、执行时间）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes hooks &lt;span class="nb"&gt;test&lt;/span&gt; pre_tool_call --for-tool terminal &lt;span class="c1"&gt;# 测试某个hook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="2-quick-commands零token快捷命令"&gt;2. Quick Commands：零Token快捷命令
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：你跟AI说&amp;quot;帮我查下GPU状态&amp;quot;，AI要理解你的意思、调用工具、返回结果——走完整流程，花Token。Quick Commands就是给你设了个&lt;strong&gt;快捷键&lt;/strong&gt;：输入 &lt;code&gt;/gpu&lt;/code&gt; 直接执行命令，不经过AI，Token消耗为零。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际用途&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/gpu&lt;/code&gt; → 直接看GPU状态&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/ip&lt;/code&gt; → 直接查IP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/dn&lt;/code&gt; → 看今天的笔记&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/status&lt;/code&gt; → 一键查系统状态&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="配置方法-1"&gt;配置方法
&lt;/h3&gt;&lt;p&gt;在 &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt; 中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;quick_commands&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;gpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;exec&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;nvidia-smi --query-gpu=name,utilization.gpu,memory.used --format=csv,noheader&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;exec&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;curl -s ifconfig.me&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;exec&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;echo \&amp;#34;CPU: $(top -bn1 | grep &amp;#39;%Cpu&amp;#39; | awk &amp;#39;{printf \&amp;#34;%.0f\&amp;#34;, 100-$8}&amp;#39;)%\&amp;#34; &amp;amp;&amp;amp; echo \&amp;#34;MEM: $(free -h | awk &amp;#39;/^Mem:/{print $3 \&amp;#34;/\&amp;#34; $2}&amp;#39;)\&amp;#34; &amp;amp;&amp;amp; echo \&amp;#34;DISK: $(df -h / | awk &amp;#39;NR==2{print $5}&amp;#39;)\&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;exec&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cat ~/notes/$(date +%Y-%m-%d).md&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="两种模式"&gt;两种模式
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;type&lt;/th&gt;
 &lt;th&gt;行为&lt;/th&gt;
 &lt;th&gt;示例&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;exec&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;直接执行shell命令，输出结果&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/gpu&lt;/code&gt; → 跑nvidia-smi&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;alias&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;重写到另一个斜杠命令&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/sc&lt;/code&gt; → 等同于 &lt;code&gt;/model sonnet --provider openrouter&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;alias模式示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;quick_commands&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;alias&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/model sonnet --provider openrouter&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;alias&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/model qwen3.5 --provider custom&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="注意事项"&gt;注意事项
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;exec模式&lt;strong&gt;不支持参数模板&lt;/strong&gt;（比如 &lt;code&gt;{args}&lt;/code&gt;），就是固定命令&lt;/li&gt;
&lt;li&gt;alias模式会自动传递用户输入的额外参数&lt;/li&gt;
&lt;li&gt;命令超时30秒自动终止&lt;/li&gt;
&lt;li&gt;执行优先级：内置命令 &amp;gt; Quick Commands &amp;gt; Skill命令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gateway（微信/Telegram等）也能用&lt;/strong&gt;，直接输入 &lt;code&gt;/gpu&lt;/code&gt; 即可&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="3-模型别名一句话切模型"&gt;3. 模型别名：一句话切模型
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：你有一堆门钥匙（不同AI模型），每次开锁都要翻半天找。模型别名就是给每把钥匙贴了标签——喊&amp;quot;opus&amp;quot;就知道用哪把。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际用途&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/model opus&lt;/code&gt; → 切到Claude Opus处理复杂代码&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/model sonnet&lt;/code&gt; → 切到Claude Sonnet做日常对话&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/model ds&lt;/code&gt; → 切到DeepSeek省钱&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/model glm&lt;/code&gt; → 切到国产GLM模型&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="配置方法-2"&gt;配置方法
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;方式一：完整格式&lt;/strong&gt;（在 &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt; 中）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;model_aliases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;opus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;claude-opus-4-6&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;anthropic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sonnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;claude-sonnet-4-20250514&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;anthropic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deepseek-chat&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deepseek&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;glm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;glm-5.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;zai&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://open.bigmodel.cn/api/coding/paas/v4&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;qwen3.5:397b&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;custom&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://localhost:11434/v1&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方式二：简写格式&lt;/strong&gt;（provider/model格式）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;aliases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ds-flash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deepseek/deepseek-v4-flash&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;local-qwen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;qwen3.5:397b&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="使用方法"&gt;使用方法
&lt;/h3&gt;&lt;p&gt;在聊天中直接输入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/model opus # 切到Claude Opus（仅当前会话）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/model sonnet # 切到Claude Sonnet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/model --global glm # 全局切换到GLM（所有会话生效）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="内置别名不用配就能用"&gt;内置别名（不用配就能用）
&lt;/h3&gt;&lt;p&gt;Hermes自带了一批模型目录别名，输入关键词就能匹配到该厂商最新版本：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;别名&lt;/th&gt;
 &lt;th&gt;对应模型家族&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;sonnet&lt;/td&gt;
 &lt;td&gt;Claude Sonnet系列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;opus&lt;/td&gt;
 &lt;td&gt;Claude Opus系列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;haiku&lt;/td&gt;
 &lt;td&gt;Claude Haiku系列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;gpt5&lt;/td&gt;
 &lt;td&gt;GPT-5系列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;o3 / o4&lt;/td&gt;
 &lt;td&gt;OpenAI推理模型&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;gemini&lt;/td&gt;
 &lt;td&gt;Google Gemini系列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;deepseek&lt;/td&gt;
 &lt;td&gt;DeepSeek系列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;glm&lt;/td&gt;
 &lt;td&gt;智谱GLM系列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;qwen&lt;/td&gt;
 &lt;td&gt;通义千问系列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;kimi&lt;/td&gt;
 &lt;td&gt;Kimi（月之暗面）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这些是&lt;strong&gt;模糊匹配&lt;/strong&gt;——输入&amp;quot;sonnet&amp;quot;会自动找到Anthropic最新的Sonnet版本。你自己的别名（model_aliases）优先级更高，会覆盖内置的。&lt;/p&gt;
&lt;h3 id="切换逻辑"&gt;切换逻辑
&lt;/h3&gt;&lt;p&gt;当你输入 &lt;code&gt;/model opus&lt;/code&gt; 时：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先查你的 &lt;code&gt;model_aliases&lt;/code&gt; 配置（精确匹配）&lt;/li&gt;
&lt;li&gt;再查 &lt;code&gt;model.aliases&lt;/code&gt; 配置（简写格式）&lt;/li&gt;
&lt;li&gt;最后查内置目录别名（模糊匹配，自动找最新版本）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="4-凭据池轮换多个api-key自动切换"&gt;4. 凭据池轮换：多个API Key自动切换
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：你一个人去自助餐厅，只有一个盘子，每次拿菜都要排队。凭据池就是给你发了多个盘子——一个被限流了（排队的厨师说&amp;quot;你等会儿&amp;quot;），自动换下一个。不耽误吃饭。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际用途&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenRouter单个Key被限流？自动换下一个&lt;/li&gt;
&lt;li&gt;Claude API额度用完？切到备用Key继续&lt;/li&gt;
&lt;li&gt;多个provider混用？自动选最优&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="添加凭据"&gt;添加凭据
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 添加API Key类型的凭据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth add openrouter &lt;span class="c1"&gt;# 交互式输入API Key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth add anthropic --type api_key &lt;span class="c1"&gt;# 指定类型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth add openrouter --label &lt;span class="s2"&gt;&amp;#34;主号&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 加标签方便管理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看已有凭据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth list openrouter &lt;span class="c1"&gt;# 查看某个provider的凭据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 移除凭据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth remove openrouter &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# 按序号移除&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth remove openrouter my-label &lt;span class="c1"&gt;# 按标签移除&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 重置限流状态（Key被标记为exhausted后手动恢复）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth reset openrouter
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="轮换策略配置"&gt;轮换策略配置
&lt;/h3&gt;&lt;p&gt;在 &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt; 中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;credential_pool_strategies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;round_robin &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 轮询：挨个用，雨露均沾&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;openrouter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;random &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 随机：随便挑一个&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;openai-codex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;least_used &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 最少使用：挑调用次数最少的&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 不配 = fill_first（默认）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;策略&lt;/th&gt;
 &lt;th&gt;行为&lt;/th&gt;
 &lt;th&gt;适用场景&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;fill_first&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;用第一个直到用完，再换下一个&lt;/td&gt;
 &lt;td&gt;有主备Key的场景&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;round_robin&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;轮着用，每次选下一个&lt;/td&gt;
 &lt;td&gt;均匀分摊用量&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;random&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;随机选一个&lt;/td&gt;
 &lt;td&gt;不在乎分布，只要不被限流&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;least_used&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;选调用次数最少的&lt;/td&gt;
 &lt;td&gt;想最大化利用每个Key&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="限流自动恢复"&gt;限流自动恢复
&lt;/h3&gt;&lt;p&gt;不用你管，Hermes会自动处理：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;错误类型&lt;/th&gt;
 &lt;th&gt;冷却时间&lt;/th&gt;
 &lt;th&gt;恢复方式&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;401（认证失败）&lt;/td&gt;
 &lt;td&gt;5分钟&lt;/td&gt;
 &lt;td&gt;自动跳过，用其他Key&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;429（限流）&lt;/td&gt;
 &lt;td&gt;1小时&lt;/td&gt;
 &lt;td&gt;自动跳过，用其他Key&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;402（余额不足）&lt;/td&gt;
 &lt;td&gt;1小时&lt;/td&gt;
 &lt;td&gt;自动跳过&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;冷却期过了之后，Key会自动恢复到可用状态。&lt;/p&gt;
&lt;h3 id="支持的provider"&gt;支持的Provider
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;OAuth类型&lt;/strong&gt;（浏览器授权）：anthropic、nous、openai-codex、qwen-oauth、google-gemini-cli&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;API Key类型&lt;/strong&gt;（直接填Key）：openrouter、deepseek、zai、kimi、stepfun、moonshot、minimax、xai、gemini、copilot、bedrock、nvidia等&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Custom类型&lt;/strong&gt;：&lt;code&gt;custom:名称&lt;/code&gt;，从你的custom_providers配置自动生成&lt;/p&gt;
&lt;h3 id="完整配置示例"&gt;完整配置示例
&lt;/h3&gt;&lt;p&gt;一个真实的多Key配置长这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;credential_pool_strategies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;round_robin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;openrouter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;random&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 凭据存在 ~/.hermes/auth.json，不要手动编辑&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 用 hermes auth 命令管理&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 添加3个OpenRouter Key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth add openrouter --label &lt;span class="s2"&gt;&amp;#34;OR-主号&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth add openrouter --label &lt;span class="s2"&gt;&amp;#34;OR-备用1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth add openrouter --label &lt;span class="s2"&gt;&amp;#34;OR-备用2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 添加2个Anthropic Key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth add anthropic --type api_key --label &lt;span class="s2"&gt;&amp;#34;AN-主号&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes auth add anthropic --type api_key --label &lt;span class="s2"&gt;&amp;#34;AN-备用&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;配完之后，&lt;code&gt;hermes auth list&lt;/code&gt; 看一眼：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenRouter:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [0] OR-主号 (ok) requests: 847
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [1] OR-备用1 (ok) requests: 823
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [2] OR-备用2 (exhausted, resets in 23min) requests: 891
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Anthropic:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [0] AN-主号 (ok) requests: 156
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [1] AN-备用 (ok) requests: 148
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;被限流的Key会标 &lt;code&gt;(exhausted)&lt;/code&gt;，倒计时结束自动恢复。你什么都不用做。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4个配置怎么搭着用"&gt;4个配置怎么搭着用
&lt;/h2&gt;&lt;p&gt;我自己的搭配：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;场景&lt;/th&gt;
 &lt;th&gt;配置组合&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;日常开发&lt;/td&gt;
 &lt;td&gt;Quick Commands查状态 + 模型别名随时切模型&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;重要操作&lt;/td&gt;
 &lt;td&gt;Shell Hooks拦截危险命令 + 自动格式化&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;长时间跑任务&lt;/td&gt;
 &lt;td&gt;凭据池轮换防限流 + Hooks记录操作日志&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;团队协作&lt;/td&gt;
 &lt;td&gt;pre_tool_call Hook统一检查 + 凭据池共享Key池&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="改完之后最明显的变化"&gt;改完之后最明显的变化
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Shell Hooks&lt;/strong&gt;：之前AI偶尔会跑一些我不确定的命令，现在危险操作自动拦截，格式化自动执行，省心了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick Commands&lt;/strong&gt;：以前查个GPU状态要跟AI说一句话，花几百Token。现在 &lt;code&gt;/gpu&lt;/code&gt; 两个字搞定，零成本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型别名&lt;/strong&gt;：以前切模型要改配置文件重启。现在 &lt;code&gt;/model opus&lt;/code&gt; 一行搞定，复杂任务用贵的，日常用便宜的，省钱又灵活。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;凭据池&lt;/strong&gt;：这个最香。之前单个Key被限流就得干等，现在配了3个OpenRouter Key轮着用，基本没遇到429了。&lt;/p&gt;
&lt;h2 id="写在最后"&gt;写在最后
&lt;/h2&gt;&lt;p&gt;4个配置，按需选用。&lt;strong&gt;不需要一次全上&lt;/strong&gt;——先从Quick Commands和模型别名开始，这两个最简单、最直觉。等熟悉了再加Shell Hooks和凭据池。&lt;/p&gt;
&lt;p&gt;配置文件位置：&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;，照着上面改就行。&lt;/p&gt;
&lt;p&gt;关注 varkm，一起学习，一起成长。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;上一篇8个基础配置还没改的，先去改那个。基础不牢，进阶白搭。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>装完 Hermes Agent 就完事了？这8个配置不改，白装了</title><link>https://blog.kalend.top/2026/05/14/hermes-8-configs.html/</link><pubDate>Thu, 14 May 2026 00:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-8-configs.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;装完 Hermes Agent，兴冲冲跑起来，结果动不动卡死、账单蹭蹭涨、隐私信息全写在日志里——你不是一个人。改8个配置，5分钟搞定，用起来完全两个世界。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;Hermes Agent 装好之后的默认配置，是给&amp;quot;能跑就行&amp;quot;设计的，不是给你最佳体验设计的。
我翻了一整天文档和源码，筛出&lt;strong&gt;8个必改配置&lt;/strong&gt;。改完之后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;省钱&lt;/strong&gt;——长对话不再重复烧钱，同样的内容不用来回发两遍&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;省心&lt;/strong&gt;——AI不会在同一个错误上死循环&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全&lt;/strong&gt;——隐私信息自动脱敏，日志干干净净&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更聪明&lt;/strong&gt;——复杂任务能拆得更细，简单问题自动用便宜模型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一张表先给你看全貌：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;配置项&lt;/th&gt;
 &lt;th&gt;改前&lt;/th&gt;
 &lt;th&gt;改后&lt;/th&gt;
 &lt;th&gt;效果&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;忙时输入模式&lt;/td&gt;
 &lt;td&gt;interrupt（打断式）&lt;/td&gt;
 &lt;td&gt;steer（追加式）&lt;/td&gt;
 &lt;td&gt;执行中可随时追加指令&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;缓存时间&lt;/td&gt;
 &lt;td&gt;5分钟&lt;/td&gt;
 &lt;td&gt;1小时&lt;/td&gt;
 &lt;td&gt;长对话省钱省时间&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;工具断路器&lt;/td&gt;
 &lt;td&gt;没开&lt;/td&gt;
 &lt;td&gt;开启&lt;/td&gt;
 &lt;td&gt;防止死循环烧钱（3次警告，8次硬停）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;子任务深度&lt;/td&gt;
 &lt;td&gt;1层&lt;/td&gt;
 &lt;td&gt;2层&lt;/td&gt;
 &lt;td&gt;复杂任务拆得更细&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;子代理工具集&lt;/td&gt;
 &lt;td&gt;3项基础工具&lt;/td&gt;
 &lt;td&gt;+浏览器&lt;/td&gt;
 &lt;td&gt;子代理能力更强&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;隐私脱敏&lt;/td&gt;
 &lt;td&gt;关闭&lt;/td&gt;
 &lt;td&gt;开启&lt;/td&gt;
 &lt;td&gt;日志不泄露隐私&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;安全扫描&lt;/td&gt;
 &lt;td&gt;关闭&lt;/td&gt;
 &lt;td&gt;开启&lt;/td&gt;
 &lt;td&gt;防止危险自动化&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;智能模型路由&lt;/td&gt;
 &lt;td&gt;关闭&lt;/td&gt;
 &lt;td&gt;开启&lt;/td&gt;
 &lt;td&gt;简单问题用便宜模型&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;下面一个一个说。&lt;/p&gt;
&lt;h2 id="必改的8个配置"&gt;必改的8个配置
&lt;/h2&gt;&lt;h3 id="1-忙时输入模式从打断式改成追加式"&gt;1. 忙时输入模式：从&amp;quot;打断式&amp;quot;改成&amp;quot;追加式&amp;quot;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：你在餐厅点菜，厨师正在做你的红烧肉。默认模式下，你突然喊&amp;quot;加个蛋&amp;quot;，厨师会把锅里的肉倒掉，重新开始做。改成steer模式后，厨师会先把红烧肉做完，再做你的蛋——两不耽误。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认&lt;/strong&gt;：&lt;code&gt;interrupt&lt;/code&gt;——你中途插话，AI会&lt;strong&gt;立刻停下手头的活&lt;/strong&gt;，处理新指令。
&lt;strong&gt;改成&lt;/strong&gt;：&lt;code&gt;steer&lt;/code&gt;——你的新指令排进队列，AI忙完手上的再处理。
&lt;strong&gt;效果&lt;/strong&gt;：AI在执行复杂任务（比如批量改文件）时，你可以随时补充需求，不用干等它做完再说。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置方法&lt;/strong&gt;：在 &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt; 中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;busy_input_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;steer &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 默认是 interrupt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-prompt缓存时间从5分钟拉到1小时"&gt;2. Prompt缓存时间：从5分钟拉到1小时
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：每次去图书馆查资料，默认模式下你每次都得重新办借书证。拉长缓存后，一天内只需要办一次。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认&lt;/strong&gt;：5分钟——超过5分钟，AI会把系统提示词（System Prompt，就是告诉AI&amp;quot;你是谁、该怎么做&amp;quot;那段话）重新发送一遍，&lt;strong&gt;重新算钱&lt;/strong&gt;。
&lt;strong&gt;改成&lt;/strong&gt;：1小时。
&lt;strong&gt;效果&lt;/strong&gt;：长对话中，重复的系统提示词不再每次重发。别小看这个，系统提示词通常有好几千字，来回发一次就是几毛钱。一天聊下来，能省不少。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置方法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;prompt_caching&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cache_ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;1h &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 默认是 5m&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-工具循环断路器必须开"&gt;3. 工具循环断路器：必须开
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：你让AI去隔壁房间拿东西，门锁了它打不开。默认行为是——它会在门口一直拧把手，拧到你破产。断路器就是：试两次打不开就喊你，别搁那拧了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认&lt;/strong&gt;：没有断路器。同一个工具（比如搜索、读写文件）调用失败，AI会&lt;strong&gt;无限重试&lt;/strong&gt;。
&lt;strong&gt;改成&lt;/strong&gt;：连续失败&lt;strong&gt;3次警告，8次硬停&lt;/strong&gt;。
&lt;strong&gt;效果&lt;/strong&gt;：尤其在定时任务（Cron Job，让AI定时自动执行的任务）场景下，这个配置能救命。不然你睡一觉起来，AI在某个报错上循环了一整夜，账单直接起飞。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置方法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;tool_loop_guardrails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;warnings_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hard_stop_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;warn_after&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;same_tool_failure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 同一工具失败3次后警告&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hard_stop_after&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;same_tool_failure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 同一工具失败8次后强制停止&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="4-子任务嵌套深度从1层改成2层"&gt;4. 子任务嵌套深度：从1层改成2层
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：你是项目经理，默认情况下你只能把任务分给下属，下属不能再往下分。改成2层后，下属也能往下再分一级——任务拆得更细，执行更高效。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认&lt;/strong&gt;：1层——AI的总指挥（负责分配任务的主代理）不能再往下派子任务。
&lt;strong&gt;改成&lt;/strong&gt;：2层。
&lt;strong&gt;效果&lt;/strong&gt;：比如你说&amp;quot;帮我调研竞品A&amp;quot;，AI可以拆成&amp;quot;搜网页&amp;quot;+&amp;ldquo;读文档&amp;quot;两个子任务，分别执行后再合并。&lt;strong&gt;1层模式下做不了这种拆分&lt;/strong&gt;，复杂任务容易翻车。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置方法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;delegation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max_spawn_depth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 默认是 1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="5-子代理工具集加上浏览器操作"&gt;5. 子代理工具集：加上浏览器操作
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：你派了个助手出去办事，默认只给他纸笔和电话。加上浏览器操作，等于又给他配了台电脑——能做的事多了不止一倍。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认&lt;/strong&gt;：子代理只能用终端（Terminal，命令行操作）、文件操作、网页请求这三样。
&lt;strong&gt;改成&lt;/strong&gt;：加上浏览器（Browser）操作能力。
&lt;strong&gt;效果&lt;/strong&gt;：子代理也能直接操作浏览器，比如打开网页、点击按钮、截图。不用每次遇到需要浏览器的操作都扔回主代理，效率直接翻倍。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置方法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;delegation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default_toolsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;terminal&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;web&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;browser &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 默认没有这一项&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="6-隐私脱敏必须开"&gt;6. 隐私脱敏：必须开
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：你让AI帮你整理通讯录，默认情况下，你朋友的手机号、你的身份证号会&lt;strong&gt;原样出现在日志里&lt;/strong&gt;。开了脱敏后，这些信息会自动变成&amp;quot;138****5678&amp;quot;这种格式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认&lt;/strong&gt;：关闭。日志和上下文中&lt;strong&gt;明文存储&lt;/strong&gt;所有隐私信息。
&lt;strong&gt;改成&lt;/strong&gt;：开启。自动检测并脱敏手机号、身份证号等PII（Personally Identifiable Information，个人身份信息）。
&lt;strong&gt;效果&lt;/strong&gt;：你的 Hermes 日志文件里不会出现任何明文隐私数据。尤其是多人共用服务器的情况，这个不开就是在裸奔。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置方法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;privacy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;redact_pii&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 默认是 false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="7-skill安全扫描必须开"&gt;7. Skill安全扫描：必须开
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：AI学会了新技能，默认情况下它想怎么用就怎么用，没人管。安全扫描就是给AI的新技能加了一道&amp;quot;审核&amp;rdquo;——有风险的技能会被拦下来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认&lt;/strong&gt;：关闭。AI自动创建的技能（Skill，AI根据需要自己写的自动化脚本）&lt;strong&gt;不过安全检查&lt;/strong&gt;。
&lt;strong&gt;改成&lt;/strong&gt;：开启。
&lt;strong&gt;效果&lt;/strong&gt;：AI自己创建的自动化脚本会先过安全检查，比如检测是否有删文件、发网络请求等高风险操作。&lt;strong&gt;防止AI&amp;quot;好心办坏事&amp;quot;&lt;/strong&gt;——它以为在帮你，其实把重要文件删了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置方法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;guard_agent_created&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 默认是 false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="8-智能模型路由能省一大笔钱"&gt;8. 智能模型路由：能省一大笔钱
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;类比&lt;/strong&gt;：你去医院，感冒看普通门诊就行，不用挂专家号。智能模型路由就是给AI配了个&amp;quot;分诊台&amp;quot;——简单问题用便宜模型，复杂问题才上贵的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认&lt;/strong&gt;：关闭。所有问题都用你配置的那个模型，不管简单还是复杂。
&lt;strong&gt;改成&lt;/strong&gt;：开启。
&lt;strong&gt;效果&lt;/strong&gt;：举几个例子你就懂了——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;今天几号&amp;rdquo;→ 用0.01元的模型&lt;/li&gt;
&lt;li&gt;&amp;ldquo;帮我写封邮件&amp;rdquo;→ 用0.05元的模型&lt;/li&gt;
&lt;li&gt;&amp;ldquo;帮我重构这段代码&amp;rdquo;→ 才用2元的模型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;一天下来，账单能砍一半以上。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置方法&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;smart_model_routing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 默认是 false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max_simple_chars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;160&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 超过160字不走便宜模型&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max_simple_words&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 超过28个词不走便宜模型&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cheap_model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 填你的便宜模型&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;your-provider&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;your-cheap-model&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="进阶玩家可以看这些"&gt;进阶玩家可以看这些
&lt;/h2&gt;&lt;p&gt;上面8个是&lt;strong&gt;所有人装完都应该改的&lt;/strong&gt;。如果你是进阶玩家，还有几个值得折腾：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shell Hooks&lt;/strong&gt;：用shell脚本拦截工具调用。比如每次AI要执行命令时，先跑你的检查脚本。&lt;strong&gt;不需要写Python&lt;/strong&gt;，会写shell就行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick Commands&lt;/strong&gt;：零Token快捷命令。输入 &lt;code&gt;/status&lt;/code&gt; 直接执行系统命令，不经过AI，&lt;strong&gt;不花钱&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型别名&lt;/strong&gt;：在聊天中输入 &lt;code&gt;/model opus&lt;/code&gt; 一键切换模型，不用去改配置文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;凭据池轮换&lt;/strong&gt;：配多个API Key（接口密钥），自动轮换使用，&lt;strong&gt;防止单个Key被限流&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些配置改起来稍微复杂，后续我会单独写一篇展开讲。&lt;/p&gt;
&lt;h2 id="改完之后我的变化"&gt;改完之后我的变化
&lt;/h2&gt;&lt;p&gt;最明显的是&lt;strong&gt;省钱&lt;/strong&gt;。改之前我日均消耗大概在15元左右，改完智能路由+缓存时间，直接降到6-7块。一个月省下来两百多，够吃好几顿外卖了。
其次是&lt;strong&gt;不卡了&lt;/strong&gt;。之前AI动不动就在某个报错上死循环，得手动停掉重来。开了断路器之后，再没遇到过这种情况。
最后是&lt;strong&gt;放心了&lt;/strong&gt;。隐私脱敏和安全扫描这两个，属于&amp;quot;不出事感觉不到，出事就晚了&amp;quot;的配置。改完之后看日志，干干净净，心里踏实。&lt;/p&gt;
&lt;h2 id="写在最后"&gt;写在最后
&lt;/h2&gt;&lt;p&gt;8个配置，全部加起来改5分钟。但这5分钟，决定了你的 Hermes 是&amp;quot;能用&amp;quot;还是&amp;quot;好用&amp;quot;。
大多数人装完就跑，然后觉得&amp;quot;Hermes 也就那样&amp;quot;——不是 Hermes 不行，是你没调好。
配置文件位置：&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;，照着改就行，不用动脑子。&lt;/p&gt;
&lt;p&gt;关注&lt;strong&gt;varkm&lt;/strong&gt;，回复【&lt;strong&gt;配置&lt;/strong&gt;】获取完整的 config.yaml 优化模板，直接复制粘贴，一键搞定。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;觉得有用就转给你那个装了 Hermes 但天天骂它不好用的朋友。&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>