Hermes Agent v0.21.1
Overview
v0.21.1 — The Consolidation Release(整合精简版)。 发布于 2026 年 9 月 7 日。自 v0.21.0 以来 约 5,139 个提交 · 改动约 4,364 个文件(+601,014 / −768,419)· 合并约 632 个 PR。
这个版本窗口没有一个单独的头条功能——它是一次整合瘦身,而最大的新闻恰恰是看不见的:整个代码库被分解重构,源码体量缩减约 34%,行为零变化(#102117)。围绕这次深度清理,面向用户的变化都落在重度用户最有体感的地方:委派(delegation)更快更稳(每个子代理一跑完结果就立刻返回,子代理还能把后台进程交接回给你)、MCP 服务器支持设备码授权(没有浏览器可开的机器也能登录)、OpenRouter 的供应商锁定支持按模型配置、模型选择器每 20 分钟自动刷新、本地 search_files 直跑 ripgrep 快 5-6 倍、压缩在编码会话中跨重建保住前缀缓存、cron 不再让静默 tick 抹掉 continuity、错过触发的补跑也会如实标出。
这是补丁版本:官方说明从简,完整梳理的文档随 v0.22.0 发布。本页覆盖这个窗口最有价值的部分。
Highlights
1. 深度清理:源码 −34%,行为零变化
这个窗口最大的内部工程是整库简化(#102117,9 月 4 日合并):源码从 1,063,826 行减到 698,363 行(−34.4%)。所有巨型文件都被拆解——超过 5,000 行的文件从 37 个降到 6 个;gateway/run.py 从 34,847 行减到 5,512 行,cli.py 从 22,426 行减到 4,656 行;超过 300 行的函数从 192 个降到 2 个,最高的圈复杂度从 1,075 降到 84。原文件保留为薄薄的公共入口,行为完全不变:工具 JSON schema、系统提示词文本、配置默认值与线上格式逐字节一致,并经过全套测试对拍验证。对用户而言,你得到的是一个让 agent 更容易导航、加载更快、更好维护的代码库——你这边无需改任何配置或命令。
2. delegate_task:每个子任务跑完即返回
后台扇出(fan-out)不再苦等最慢的子代理。delegate_task 现在每个任务一完成就单独返回结果,共享可选 group 字符串的任务则合并成一条消息一起返回(#104299):
{
"tasks": [
{ "goal": "check api latency", "group": "bench" },
{ "goal": "check db latency", "group": "bench" },
{ "goal": "scan the changelog" }
]
}
两个 bench 任务会作为一组返回;changelog 扫描一跑完就单独落地——再也不用为了等一个卡住的孩子而几个结果一起干等。未分组任务各自独立占一个 unit,但整次调用仍然只占 delegation.max_concurrent_children 的一个名额。
3. 子代理把后台进程交接回父会话
子代理退出前可以把长跑的后台进程移交给你:process_manage(action="handoff", session_id=<id>, data="<purpose>") 会把进程所有权转给父会话,完成通知带着用途说明落到你的对话里(#105125)。孩子遗留的任何进程都会在父会话的委派总结里明确标出“已随子代理终止”,而不是被悄悄杀掉;子代理也会事先被告知它的 notify=true 并不是承诺——编排器再也不会为一个永远到不了的完成通知空等几小时。
4. 没有浏览器也能登录 MCP:设备码授权
支持 RFC 8628 的 MCP 服务器现在可以完全在终端里完成授权,不再需要浏览器回调监听(#104891)——以前必须找一台有浏览器的机器才能做的流程,现在任何无头主机都能做:
hermes mcp login <server> --flow device
Hermes 会发现服务器通告的设备端点、打印验证 URI 和用户码,然后轮询等待你在任意设备上批准。在 MCP 服务器配置里写 oauth.flow: device 即可让设备码成为登录与重授权默认方式(整体默认仍是浏览器 PKCE;--flow browser 可对单次登录覆盖配置)。被拒绝或过期的授权绝不会替换已有凭据。
5. OpenRouter 按模型锁定供应商 + 不过时的模型选择器
provider_routing.models.<model-id> 现在可以为每个模型分别指定 OpenRouter 供应商集合,路由规则再也不会悄悄把某个模型发给你没选过的供应商(#104159):
provider_routing:
sort: price
models:
"openai/gpt-6-astra": { only: [openai] }
"anthropic/claude-fable-5.1": { only: [anthropic] }
按模型条目在所有请求路径都经过的同一个咽喉点生效,因此 CLI、网关、桌面端、cron、/model 和委派子代理全部遵守。与此同时 /model 选择器不再过期:目录现在每 20 分钟刷新一次(原来是 1 小时 TTL),网关后台循环会保持目录温热,即使没人打开选择器(#101319)。Meta Model API 供应商现在把它的实时 /v1/models 响应当作权威目录,并排除 muse-image-*、muse-voice-* 等非聊天前缀(#101503)。
6. 本地文件与搜索操作大幅提速
本地 POSIX 主机上的 search_files 现在直接以子进程方式运行 ripgrep,不再每次调用都经过两层 bash(#104502):内容搜索从约 85 ms 降到约 15 ms,按文件名搜索从约 73 ms 降到约 12 ms(工具侧延迟降低 5-6 倍,结果一致;设 HERMES_NATIVE_FILE_READ=0 可回到 shell 路径)。另外两个配套改动帮你在长编码会话里省 token:压缩重建现在按会话固定工作区快照,不再每次都重新探测 git status,跨压缩边界保住提示词前缀缓存(#104455);跑完的子代理会把 transcript 从父进程堆里释放掉,子代理内容也不再写入 trigram FTS 索引(schema v30)——此前一次 1,320 个子代理的运行会留下 1.9 GB 的父进程堆和约 1 GB 的影子表(#102032)。
Improvements
- 启动:
hermes serve(桌面端每次冷启动都会拉起这个命令)现在走独立的精简解析器直接派发,跳过构建约 40 个子命令的 argparse 树(遇到 help、未知参数与容器路由时回退到完整解析器)(#101265)。 - Cron 可见性:
hermes cron list现在为每个任务打印一行Dispatch:,hermes cron status增加迟到任务提示——错过触发后的补跑会显示⚠ catch-up after missed fire,不再伪装成准时成功(#100445)。 - 委派配置:锁定了供应商/模型的子代理失败时不再悄悄走父级的 fallback 链;
delegation.fallback_providers让子代理拥有自己的链([]表示禁用;未配置且未锁定时继承父级)(#105347)。子代理也不再继承父级 1 小时的 prompt-cache 档位——它们按实际使用的 5 分钟档写入,避免为根本用不到的保留期付出 2 倍缓存写入费(#104168)。 - Token 卫生:
write_file现在会在“整文件重写但绝大部分内容磁盘上本来就有”时(≥20k 字符、≥80% 行未变化)给出提示,引导 agent 用小改动改用patch——一次重构运行中就被抓出 661 次这类写入(约 2,490 万字符,约 155 美元的输出 token)(#103551)。 - 桌面端:两种主题下 transcript 时间戳恢复清晰可读;新增 Message Bubble 滑杆(Settings → Appearance),可把你的气泡从不透明调到只剩描边(#103146)。
Fixes
approvals.deny规则现在在隔离的 Docker/云端沙箱内同样生效——此前容器快路径会跳过它,即使在--yolo或approvals.mode: off下,deny 列表也可能被沙箱 shell 绕过;hermes approvals test已同步修正后的判定顺序(#103649)。- Cron:静默的监控/脚本门控 tick 不再用空 stub 覆盖有用的 continuity 上下文——输出选择现在从最新文件开始遍历并跳过空文档与静默审计文档,同时保留错误文档用于恢复上下文(#104877)。cron 事件与记事本存储也能在升级残留旧执行模块缓存的情况下正常导入(#104939)。
Upgrade
hermes update
升级后运行 hermes doctor 校验安装,并重启网关(hermes gateway)让平台变更生效。这次结构性重构保留了所有公共入口,第三方插件与既有配置无需改动即可继续使用。想先看下次更新会动什么:hermes update --plan。