<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>技术 on Kalend's Blog</title><link>https://blog.kalend.top/categories/%E6%8A%80%E6%9C%AF/</link><description>Recent content in 技术 on Kalend's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Fri, 29 May 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://blog.kalend.top/categories/%E6%8A%80%E6%9C%AF/index.xml" rel="self" type="application/rss+xml"/><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>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>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>上次没敢写的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>