v0.21.4 没配发布说明,但里面塞了 1,812 个 PR:先看这十件事


周六早上你敲下 hermes update,版本号从 v0.21.3 跳到 v0.21.4。你习惯性地打开 release notes,想搞清楚这次到底改了什么——正文只有几段,最后一句写着:完整梳理会随 v0.22.0 一起发布。这不是官方偷懒:v0.21 阶段的补丁 tag 是给 Docker 镜像、Hermes Cloud 和托管部署切的稳定锚点,真正的文档留在下一个 minor 版本里。麻烦的是,你机器上已经生效的行为变化不会等 v0.22.0。

这篇文章把这个窗口里已经合进 main、也确实随这个 tag 发出去的十件事挑出来,每一条都给到可以直接敲的命令或可以直接抄的配置。它们都不是“内部重构”:三条会改变你的网关拓扑,两条会改变你的账单或输出格式,其余几条能立刻省下你的时间。

先看清楚这个 tag 的账:它为什么存在

官方说明写得很直白:这是补丁 tag,把 v0.21.3 之后合并的改动滚成一个稳定版本,供下游消费者(Docker 镜像、Hermes Cloud、托管部署)使用,完整策展说明留给 v0.22.0。以提交 4b8a8134009a8727a289bcabeb0019fedd353128 为基准统计:

指标 数值(自 v0.21.3 起)
非合并提交 5,071
改动文件 5,169(+312,961 / −62,855)
已合并 PR 1,812
已关闭 issue 2,116

Docker 用户可以按 tag 拉取:nousresearch/hermes-agent:v2026.9.21;git 安装仍然是 hermes update。下面按“会改变你日常操作”的顺序排列。

十件已经生效的事

1. 一台机器上的网关,从“每个 profile 一个”变成“只有一个”

这是这个窗口最大的一次架构收敛:每个 OS 用户、每台机器只有一个 hermes gateway run 进程,它服务所有 profile。生命周期动词的语义也跟着改了——hermes -p X gateway run 在宿主网关活着的时候不再启动第二个进程,而是附着上去(打印宿主 PID 和被服务的 profile 列表,退出码 0);hermes gateway start --all / restart --all 现在指的是“那一个宿主多路复用器”,不会再扫掉别人正在跑的网关。

老开关 gateway.multiplex_profiles: false 已经退役:它照样能被解析,但不再能钉住第二个网关进程,行为等同于未设置,并打一行警告指向迁移命令。如果你是从旧版本升上来的,先看计划再动手:

hermes gateway migrate --multiplex --dry-run   # 打印计划、阻塞项与将要发生的重启
hermes gateway migrate --multiplex             # 真正收敛(非交互环境加 --yes)

从旧拓扑升级的具体步骤、三个真实事故(包括一个会把另一个 profile 的 MEMORY.md 删掉的 P1)以及自查清单,我单独写了一篇:一台机器一个网关:multiplex-only 迁移与踩坑清单。另有早前那篇 多路复用 profile 默认开启 记录了这项能力最初落地时的样子。

2. 连接器:在对话里让 Agent 把应用连上

以前“连一个应用”意味着你去翻配置、去开浏览器、去粘贴密钥。现在用户直接在对话里说“把 Notion 连上”,后端负责完成整次连接:收集需要的字段、给出登录链接、装好之后在同一个回合里就能调用新工具。三个交互客户端看到的是同一个设置步骤——桌面端是对话框,hermes --tui 是 callout,经典 CLI 是面板。仓库里自带一份 65 个已审核 MCP 服务器的目录,其中 55 个声明了 auth.type: oauth。

3. --format stream-json:给 CI 用的结构化输出

一次性运行现在可以输出机器可读的 JSONL:

hermes chat -q "Summarize this repository" --format stream-json

stdout 每行一个 JSON 对象(system / text / tool_use / tool_result / result),诊断信息和 session_id: 留在 stderr,末尾的 result 记录带 exit_code、token 统计和耗时。它要求配 -q(或 --query-file)、隐含 quiet 模式、拒绝与 --tui 组合。完整的事件字段表、退出码语义(0 / 1 / 130,以及 Kanban worker 的 75)和 CI 里的消费写法在这篇:让 CI 读懂 Hermes:stream-json 事件流。

4. skills.auto_load:把技能钉进每个新会话

在 config.yaml 里写三行,这些技能就会在每次新会话开始时被完整加载(不只是列在技能目录里):

skills:
  auto_load:
    - release-notes
    - qa-multilingual

CLI、TUI、网关、cron、API agent 全都生效,作用域是 profile 级。它按“每个 agent 只渲染一次”的方式注入——模型切换、上下文压缩、静态前缀恢复都复用同一段渲染结果,所以不会把你的 prompt 缓存打破。详细的取舍(什么时候不该用、和 --skills 怎么去重)在这篇:把技能钉进每个会话:skills.auto_load。

5. mcp.discovery_concurrency:启动时不再一次拉起所有 MCP 服务器

之前 MCP 发现阶段是一个不限并发的 asyncio.gather:你有 8 个 stdio 服务器,开机瞬间就有 8 棵子进程树同时起来;多 profile 场景更明显,每个被服务的 profile 各跑一轮。现在并发连接受 mcp.discovery_concurrency 约束,默认 4,0 表示不限:

hermes config set mcp.discovery_concurrency 2   # 慢机器/低内存场景可以再压

官方 PR 里的实测(8 个 stdio 服务器):默认并发从峰值 8 降到 4,整轮耗时 4.0s → 5.6s;设成 2 时峰值 2、耗时 13.2s;设成 0 恢复峰值 8、耗时 3.5s。代价是启动更慢一点,换的是开机那一刻不再有进程风暴。

6. hermes sessions set-journal-mode:把 state.db 在 WAL 与 DELETE 之间离线转换

如果你在配置里写了 database.journal_mode: delete,但 state.db 已经处于 WAL 模式,Hermes 永远不会在打开时现场降级它——网关、dashboard、cron 可能正握着未 checkpoint 的提交,降级会把它们毁掉。以前的唯一出路是手动跑一条 PRAGMA。现在有了正式命令:

hermes sessions set-journal-mode delete                          # WAL -> rollback journal
hermes sessions set-journal-mode wal                             # 改回 WAL
hermes sessions set-journal-mode delete --db ~/.hermes/kanban.db # 其他 Hermes 存储

它会先扫描持有者,任何进程(或 -wal/-shm 边车文件)还开着就拒绝执行并逐个列出 pid — 命令: 路径;转换完成后回读文件头字节验证模式。注意它拒绝在 Windows 上无扫描依据地执行、也拒绝在跨 VM 文件系统(virtiofs/9p)上开启 WAL。更多背景见 doctor 与 WAL 活跃写入者 和 Docker 里的 state.db WAL。

7. 未授权私聊可以“礼貌拒绝”,而不是只做配对

网关原本对未授权私聊只有两种态度:pair(走配对流程)和 ignore(不理)。现在多了第三档 decline,配合可自定义的话术:

gateway:
  unauthorized_dm_behavior: decline
  unauthorized_dm_decline_message: "This bot is private. Ask the owner for an invite."

也可以按平台在对应平台的 extra 里单独覆盖。对于公开频道的个人助手,这一档比“沉默”更专业——对方知道消息被看到了、也知道为什么没得到答复。

8. session_search 多了时间窗和一轮放宽重试

跨会话检索现在接受 after / before 两个边界,既可以是 ISO 日期,也可以是相对时长(7d、24h、2w):

  • after="7d":只看最近一周内开始的会话;
  • before="2026-09-01":只看到 9 月 1 日为止的历史(日期按 UTC 零点解释);
  • 相对形式的 before="7d" 表示“比一周更早”,不是“最近一周”——这点很容易记反。

同时,召回在严格匹配失败时会放宽成 OR 条件重试一次,所以“我上次好像提过部署的事”这种模糊回忆比过去更容易命中。索引层之前重构成了无 LLM 的快速路径(见 会话边界),这次是把时间维度补齐。

9. 桌面端一堆小东西

  • 聊天/界面字体选择:可以给对话区和界面各挑字体,包括 OpenDyslexic 这类可读性字体;
  • 最小化到托盘:可选开关,最小化只隐藏窗口、不销毁渲染进程也不停掉正在跑的工作;Close / Alt+F4 / Cmd+Q 行为不变,托盘里是“显示 Hermes”和“退出 Hermes”;
  • 修饰键轻点唤起 HUD:macOS 上连按 Cmd+Option、Windows/Linux X11 上连按 Ctrl+Alt 就能从别的应用里把 HUD 叫到前台(默认关闭,按设备保存,两键需在 500ms 内松开);
  • 每个会话自己的状态栈抽屉:composer 上方的小横条可以把状态栈和 git 行一起收起,选择按会话保存;
  • 插件中心支持卸载、本地引擎一键更新。

10. 目录侧的更新:视频模型与插件索引页

FAL 视频族里补进了 LTX 2.5(Lightricks 开源音视频模型,原生音频、i2v 最高 20s / 4K、带运镜预设)和 Kling O3 Standard(快手,多镜头原生叙事、可选音频、3–15s);插件目录里新增了一批社区插件(tailscale、ssh、shodan、terminal、rss、resetwatch、done-bell、kiwi、cognee 等),并且每个目录插件与作者都有了独立网页(README 钉在已审核提交上)。

还有这些,值得知道但不用现在动手

同一个窗口里还修/加了一批更窄的东西:hermes -p X update 现在整台机器只重启一次宿主网关,重启通知会送达每个被服务的 profile(#118108);桌面端不再为每个 profile 起一个后端,而是附着到运行中的宿主后端(#118246);命名 profile 重新读取根 profile 的 auth.json,修掉了升级后 No Codex credentials stored 那类故障(#118373);更新后给某个从未连接的平台发的通知不再每 2 秒重试到天荒地老(#118312);image_generate/FAL 视频遇到网关 429 会被当成限流并重试一次,而不是叫你去换模型或配 FAL_KEY(#118311);自建单槽本地模型上自动起标题不再抢答(#117494)。

升级后花五分钟自查

hermes version                        # 期望 v0.21.4(tag v2026.9.21)
hermes doctor                         # 先看有没有 storage / gateway 拓扑告警
hermes gateway status                 # 谁在服务哪些 profile
hermes gateway migrate --multiplex --dry-run   # 从旧拓扑升上来的,先看计划

如果你的机器上有两个以上 profile,第 4 条最值得花时间——它同时是安全边界(profile 之间不再互相读凭据)和可用性边界(升级后只重启一次网关)。

小结

补丁 tag 不配策展说明很正常,但“没有发布说明”不等于“没有变化”。这个窗口里最值得你花时间的是网关拓扑的收敛和profile 隔离修复:前者改变你机器上跑几个进程,后者决定一个 profile 能不能读到另一个 profile 的密钥和记忆。其余的(结构化输出、钉住的技能、MCP 启动并发、存储日志模式)都是那种“知道了就能立刻用上”的小改动。完整的策展说明会随 v0.22.0 发布,届时从 v0.21.0 起的所有内容都会被补齐——想先看这个 tag 本身,可以翻我们网站上的 v0.21.4 发版记录。