# Hermes Agent v0.5.0 (v2026.3.28)
**发布日期:** 2026年3月28日
> 本次为强化版本 — 新增 Hugging Face 提供商、`/model` 命令重构、Telegram 私聊话题功能、原生 Modal SDK、插件生命周期钩子、GPT 模型工具调用强化、Nix flake 支持,以及 50 多项安全性和可靠性修复,并完成了全面的供应链审计。
---
## ✨ 主要亮点
- **Nous Portal 现已支持 400+ 模型** — Nous Research 推理门户大幅扩展,Hermes Agent 用户可通过单一提供商端点访问超过 400 个模型。
- **Hugging Face 作为一级推理提供商** — 与 HF Inference API 全面集成,包括精选的智能模型选择器(映射至 OpenRouter 类似模型)、实时 `/models` 端点探测和设置向导流程 ([#3419](https://github.com/NousResearch/hermes-agent/pull/3419), [#3440](https://github.com/NousResearch/hermes-agent/pull/3440))。
- **Telegram 私聊话题** — 基于项目的对话,每个话题可绑定功能技能,实现在单个 Telegram 聊天中隔离工作流 ([#3163](https://github.com/NousResearch/hermes-agent/pull/3163))。
- **原生 Modal SDK 后端** — 用原生 Modal SDK (`Sandbox.create.aio` + `exec.aio`) 替换 swe-rex 依赖,消除隧道并简化 Modal 终端后端 ([#3538](https://github.com/NousResearch/hermes-agent/pull/3538))。
- **插件生命周期钩子激活** — `pre_llm_call`、`post_llm_call`、`on_session_start` 和 `on_session_end` 钩子现已在代理循环及 CLI/网关中触发,完成插件钩子系统 ([#3542](https://github.com/NousResearch/hermes-agent/pull/3542))。
- **提升 OpenAI 模型可靠性** — 新增 `GPT_TOOL_USE_GUIDANCE` 防止 GPT 模型描述预期操作而非调用工具,并自动从对话历史中剥离过时的预算警告(该警告曾导致模型在多轮对话中避免使用工具)([#3528](https://github.com/NousResearch/hermes-agent/pull/3528))。
- **Nix flake** — 完整的 uv2nix 构建、带持久容器模式的 NixOS 模块、从 Python 源码自动生成的配置键、以及面向代理友好的后缀 PATH 支持 ([#20](https://github.com/NousResearch/hermes-agent/pull/20), [#3274](https://github.com/NousResearch/hermes-agent/pull/3274), [#3061](https://github.com/NousResearch/hermes-agent/pull/3061)),由 @alt-glitch 贡献。
- **供应链强化** — 移除被入侵的 `litellm` 依赖,固定所有依赖版本范围,重新生成带哈希的 `uv.lock`,添加扫描 PR 供应链攻击模式的 CI 工作流,并升级依赖以修复 CVE ([#2796](https://github.com/NousResearch/hermes-agent/pull/2796), [#2810](https://github.com/NousResearch/hermes-agent/pull/2810), [#2812](https://github.com/NousResearch/hermes-agent/pull/2812), [#2816](https://github.com/NousResearch/hermes-agent/pull/2816), [#3073](https://github.com/NousResearch/hermes-agent/pull/3073))。
- **Anthropic 输出限制修复** — 用各模型原生输出限制替换硬编码的 16K `max_tokens`(Opus 4.6 为 128K,Sonnet 4.6 为 64K),修复直接使用 Anthropic API 时的“响应截断”和思维预算耗尽问题 ([#3426](https://github.com/NousResearch/hermes-agent/pull/3426), [#3444](https://github.com/NousResearch/hermes-agent/pull/3444))。
---
## 🏗️ 核心代理与架构
### 新提供商:Hugging Face
- 一级 Hugging Face Inference API 集成,支持认证、设置向导和模型选择器 ([#3419](https://github.com/NousResearch/hermes-agent/pull/3419))。
- 精选模型列表,将 OpenRouter 的智能默认模型映射到 HF 等效模型 — 拥有 8 个以上精选模型的提供商将跳过实时 `/models` 探测以提升速度 ([#3440](https://github.com/NousResearch/hermes-agent/pull/3440))。
- 向 Z.AI 提供商模型列表添加 glm-5-turbo ([#3095](https://github.com/NousResearch/hermes-agent/pull/3095))。
### 提供商与模型改进
- **`/model` 命令重构** — 为 CLI 和网关提取共享的 `switch_model()` 流程,支持自定义端点,提供商感知路由 ([#2795](https://github.com/NousResearch/hermes-agent/pull/2795), [#2799](https://github.com/NousResearch/hermes-agent/pull/2799))。
- 从 CLI 和网关中移除 `/model` 斜杠命令,改为 `hermes model` 子命令 ([#3080](https://github.com/NousResearch/hermes-agent/pull/3080))。
- 保留 `custom` 提供商,而非静默重映射到 `openrouter` ([#2792](https://github.com/NousResearch/hermes-agent/pull/2792))。
- 从 config.yaml 读取根级别 `provider` 和 `base_url` 到模型配置中 ([#3112](https://github.com/NousResearch/hermes-agent/pull/3112))。
- 使 Nous Portal 模型别名与 OpenRouter 命名对齐 ([#3253](https://github.com/NousResearch/hermes-agent/pull/3253))。
- 修复 Alibaba 提供商默认端点和模型列表 ([#3484](https://github.com/NousResearch/hermes-agent/pull/3484))。
- 允许 MiniMax 用户覆盖 `/v1` → `/anthropic` 自动修正 ([#3553](https://github.com/NousResearch/hermes-agent/pull/3553))。
- 将 OAuth 令牌刷新迁移到 `platform.claude.com` 并添加回退机制 ([#3246](https://github.com/NousResearch/hermes-agent/pull/3246))。
### 代理循环与对话
- **提升 OpenAI 模型可靠性** — `GPT_TOOL_USE_GUIDANCE` 防止 GPT 模型描述操作而非调用工具,并自动从历史中剥离预算警告 ([#3528](https://github.com/NousResearch/hermes-agent/pull/3528))。
- ** surfaced 生命周期事件** — 所有重试、回退和压缩事件现在均以格式化消息形式呈现给用户 ([#3153](https://github.com/NousResearch/hermes-agent/pull/3153))。
- **Anthropic 输出限制** — 使用各模型原生输出限制而非硬编码的 16K `max_tokens` ([#3426](https://github.com/NousResearch/hermes-agent/pull/3426))。
- **思维预算耗尽检测** — 当模型将所有输出令牌用于推理时,跳过无用的继续重试 ([#3444](https://github.com/NousResearch/hermes-agent/pull/3444))。
- 始终优先使用 API 调用的流式传输,防止子代理挂起 ([#3120](https://github.com/NousResearch/hermes-agent/pull/3120))。
- 在流失败后恢复安全的非流式回退 ([#3020](https://github.com/NousResearch/hermes-agent/pull/3020))。
- 为子代理分配独立的迭代预算 ([#3004](https://github.com/NousResearch/hermes-agent/pull/3004))。
- 在 `_try_activate_fallback` 中更新子代理认证的 `api_key` ([#3103](https://github.com/NousResearch/hermes-agent/pull/3103))。
- 达到最大重试次数时优雅返回,而非使线程崩溃 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 压缩重启计入重试限制 ([#3070](https://github.com/NousResearch/hermes-agent/pull/3070))。
- 在预flight 估算中包含工具令牌,保护上下文探测持久性 ([#3164](https://github.com/NousResearch/hermes-agent/pull/3164))。
- 回退激活后更新上下文压缩限制 ([#3305](https://github.com/NousResearch/hermes-agent/pull/3305))。
- 验证空用户消息,防止 Anthropic API 400 错误 ([#3322](https://github.com/NousResearch/hermes-agent/pull/3322))。
- GLM 仅推理和最大长度处理 ([#3010](https://github.com/NousResearch/hermes-agent/pull/3010))。
- 将 API 超时默认值从 900 秒提高到 1800 秒,以适应慢思考模型 ([#3431](https://github.com/NousResearch/hermes-agent/pull/3431))。
- 为 Claude/OpenRouter 发送 `max_tokens` 并重试 SSE 连接错误 ([#3497](https://github.com/NousResearch/hermes-agent/pull/3497))。
- 防止网关模式下的 AsyncOpenAI/httpx 跨循环死锁 ([#2701](https://github.com/NousResearch/hermes-agent/pull/2701)),由 @ctlst 贡献。
### 流式与推理
- **通过新的 schema v6 列(`reasoning`、`reasoning_details`、`codex_reasoning_items`)跨网关会话轮次持久化推理** ([#2974](https://github.com/NousResearch/hermes-agent/pull/2974))。
- 检测并终止陈旧的 SSE 连接 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 修复导致虚假 `RemoteProtocolError` 的陈旧流检测竞争条件 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 跳过流式传输期间 `推理的重复回调 ([#3116](https://github.com/NousResearch/hermes-agent/pull/3116))。
- 在 `rewrite_transcript` 中保留推理字段 ([#3311](https://github.com/NousResearch/hermes-agent/pull/3311))。
- 在流式工具调用中保留 Gemini 思维签名 ([#2997](https://github.com/NousResearch/hermes-agent/pull/2997))。
- 确保推理更新期间触发第一个增量 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
### 会话与记忆
- **会话搜索最近会话模式** — 省略查询以浏览带标题、预览和时间戳的最近会话 ([#2533](https://github.com/NousResearch/hermes-agent/pull/2533))。
- **在 `/new`、`/reset` 和自动重置上显示会话配置** ([#3321](https://github.com/NousResearch/hermes-agent/pull/3321))。
- **第三方会话隔离** — 用于按来源隔离会话的 `--source` 标志 ([#3255](https://github.com/NousResearch/hermes-agent/pull/3255))。
- 添加 `/resume` CLI 处理程序、会话日志截断保护、`reopen_session` API ([#3315](https://github.com/NousResearch/hermes-agent/pull/3315))。
- 在 `/clear` 和 `/new` 时清除压缩器摘要和轮次计数器 ([#3102](https://github.com/NousResearch/hermes-agent/pull/3102))。
- surfaced 导致会话数据丢失的静默 SessionDB 故障 ([#2999](https://github.com/NousResearch/hermes-agent/pull/2999))。
- 会话搜索在摘要失败时的回退预览 ([#3478](https://github.com/NousResearch/hermes-agent/pull/3478))。
- 防止刷新代理覆盖陈旧记忆 ([#2687](https://github.com/NousResearch/hermes-agent/pull/2687))。
### 上下文压缩
- 用基于比例的缩放替换失效的 `summary_target_tokens` ([#2554](https://github.com/NousResearch/hermes-agent/pull/2554))。
- 在 `DEFAULT_CONFIG` 中公开 `compression.target_ratio`、`protect_last_n` 和 `threshold` ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 恢复合理的默认值并将摘要限制在 12K 令牌 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 在 `/compress` 和卫生压缩时保留文字记录 ([#3556](https://github.com/NousResearch/hermes-agent/pull/3556))。
- 压缩后更新上下文压力警告和令牌估算 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
### 架构与依赖
- **移除 mini-swe-agent 依赖** — 内联 Docker 和 Modal 后端 ([#2804](https://github.com/NousResearch/hermes-agent/pull/2804))。
- **用原生 Modal SDK 替换 swe-rex** 用于 Modal 后端 ([#3538](https://github.com/NousResearch/hermes-agent/pull/3538))。
- **插件生命周期钩子** — `pre_llm_call`、`post_llm_call`、`on_session_start`、`on_session_end` 现已在代理循环中触发 ([#3542](https://github.com/NousResearch/hermes-agent/pull/3542))。
- 修复插件工具集在 `hermes tools` 和独立进程中不可见的问题 ([#3457](https://github.com/NousResearch/hermes-agent/pull/3457))。
- 合并 `get_hermes_home()` 和 `parse_reasoning_effort()` ([#3062](https://github.com/NousResearch/hermes-agent/pull/3062))。
- 移除未使用的 Hermes 原生 PKCE OAuth 流程 ([#3107](https://github.com/NousResearch/hermes-agent/pull/3107))。
- 在 55 个文件中移除约 100 个未使用的导入 ([#3016](https://github.com/NousResearch/hermes-agent/pull/3016))。
- 修复 154 个 f-strings,简化 getattr/URL 模式,移除死代码 ([#3119](https://github.com/NousResearch/hermes-agent/pull/3119))。
---
## 📱 消息平台(网关)
### Telegram
- **私聊话题** — 基于项目的对话,每个话题可绑定功能技能,实现在单个 Telegram 聊天中隔离工作流 ([#3163](https://github.com/NousResearch/hermes-agent/pull/3163))。
- **通过 DNS-over-HTTPS 自动发现回退 IP**,当 `api.telegram.org` 不可用时 ([#3376](https://github.com/NousResearch/hermes-agent/pull/3376))。
- **可配置的回复线程模式** ([#2907](https://github.com/NousResearch/hermes-agent/pull/2907))。
- 在“未找到消息线程”BadRequest 时回退到无 `thread_id` ([#3390](https://github.com/NousResearch/hermes-agent/pull/3390))。
- 在 `start_polling` 因 502 失败后自调度重连 ([#3268](https://github.com/NousResearch/hermes-agent/pull/3268))。
### Discord
- 代理回合完成后停止幻影输入指示器 ([#3003](https://github.com/NousResearch/hermes-agent/pull/3003))。
### Slack
- 将工具调用进度消息发送到正确的 Slack 线程 ([#3063](https://github.com/NousResearch/hermes-agent/pull/3063))。
- 将进度线程回退范围限定为仅 Slack ([#3488](https://github.com/NousResearch/hermes-agent/pull/3488))。
### WhatsApp
- 从消息下载文档、音频和视频媒体 ([#2978](https://github.com/NousResearch/hermes-agent/pull/2978))。
### Matrix
- 在 `PLATFORMS` 字典中添加缺失的 Matrix 条目 ([#3473](https://github.com/NousResearch/hermes-agent/pull/3473))。
- 强化 e2ee 访问令牌处理 ([#3562](https://github.com/NousResearch/hermes-agent/pull/3562))。
- 为同步循环中的 `SyncError` 添加退避机制 ([#3280](https://github.com/NousResearch/hermes-agent/pull/3280))。
### Signal
- 将 SSE 保持活动注释跟踪为连接活动 ([#3316](https://github.com/NousResearch/hermes-agent/pull/3316))。
### Email
- 防止 EmailAdapter 中 `_seen_uids` 无限制增长 ([#3490](https://github.com/NousResearch/hermes-agent/pull/3490))。
### 网关核心
- **消息平台可配置的 `/verbose` 命令** — 从聊天中切换工具输出详细程度 ([#3262](https://github.com/NousResearch/hermes-agent/pull/3262))。
- **发送到用户聊天的后台审查通知** ([#3293](https://github.com/NousResearch/hermes-agent/pull/3293))。
- **重试瞬态发送失败** 并在耗尽时通知用户 ([#3288](https://github.com/NousResearch/hermes-agent/pull/3288))。
- 从挂起的代理中恢复 — `/stop` 强制终止会话锁 ([#3104](https://github.com/NousResearch/hermes-agent/pull/3104))。
- 线程安全的 `SessionStore` — 用 `threading.Lock` 保护 `_entries` ([#3052](https://github.com/NousResearch/hermes-agent/pull/3052))。
- 修复网关令牌与缓存代理的双重计数 — 使用绝对集合而非增量 ([#3306](https://github.com/NousResearch/hermes-agent/pull/3306), [#3317](https://github.com/NousResearch/hermes-agent/pull/3317))。
- 在代理缓存签名中指纹完整认证令牌 ([#3247](https://github.com/NousResearch/hermes-agent/pull/3247))。
- 静默后台代理终端输出 ([#3297](https://github.com/NousResearch/hermes-agent/pull/3297))。
- 在启动允许列表检查中包含每平台 `ALLOW_ALL` 和 `SIGNAL_GROUP` ([#3313](https://github.com/NousResearch/hermes-agent/pull/3313))。
- 在 systemd 单元 PATH 中包含用户本地 bin 路径 ([#3527](https://github.com/NousResearch/hermes-agent/pull/3527))。
- 在 `GatewayRunner` 中跟踪后台任务引用 ([#3254](https://github.com/NousResearch/hermes-agent/pull/3254))。
- 为 HA、Email、Mattermost、SMS 适配器添加请求超时 ([#3258](https://github.com/NousResearch/hermes-agent/pull/3258))。
- 为 Mattermost、Slack 和基础缓存添加媒体下载重试 ([#3323](https://github.com/NousResearch/hermes-agent/pull/3323))。
- 检测 virtualenv 路径而非硬编码 `venv/` ([#2797](https://github.com/NousResearch/hermes-agent/pull/2797))。
- 对上下文文件发现使用 `TERMINAL_CWD`,而非进程 cwd ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 停止将 hermes 仓库 AGENTS.md 加载到网关会话(浪费约 10k 令牌)([#2891](https://github.com/NousResearch/hermes-agent/pull/2891))。
---
## 🖥️ CLI 与用户体验
### 交互式 CLI
- **可配置的忙碌输入模式** + 修复 `/queue` 始终有效 ([#3298](https://github.com/NousResearch/hermes-agent/pull/3298))。
- **多行粘贴时保留用户输入** ([#3065](https://github.com/NousResearch/hermes-agent/pull/3065))。
- **工具生成回调** — 工具参数生成期间流式显示“正在准备终端…”更新 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 为实质性工具显示工具进度,而不仅是“准备中” ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 缓冲推理预览块并修复重复显示 ([#3013](https://github.com/NousResearch/hermes-agent/pull/3013))。
- 防止推理框在工具调用循环中渲染 3 次 ([#3405](https://github.com/NousResearch/hermes-agent/pull/3405))。
- 消除空闲时的“事件循环已关闭”/“按 ENTER 继续” — 三层修复:`neuter_async_httpx_del()`、自定义异常处理器和陈旧客户端清理 ([#3398](https://github.com/NousResearch/hermes-agent/pull/3398))。
- 修复状态栏对尾随零的令牌计数显示 26K 而非 260K ([#3024](https://github.com/NousResearch/hermes-agent/pull/3024))。
- 修复状态栏在长会话中重复和降级 ([#3291](https://github.com/NousResearch/hermes-agent/pull/3291))。
- 在后台任务输出前刷新 TUI 以防止状态栏重叠 ([#3048](https://github.com/NousResearch/hermes-agent/pull/3048))。
- 在 `patch_stdout` 下抑制 KawaiiSpinner 动画 ([#2994](https://github.com/NousResearch/hermes-agent/pull/2994))。
- 当 TUI 处理工具进度时跳过 KawaiiSpinner ([#2973](https://github.com/NousResearch/hermes-agent/pull/2973))。
- 通过 `_is_tty` 属性防护 `isatty()` 防止关闭的流 ([#3056](https://github.com/NousResearch/hermes-agent/pull/3056))。
- 确保工具生成期间流式框的单一关闭 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 在显示中将上下文压力百分比上限设为 100% ([#3480](https://github.com/NousResearch/hermes-agent/pull/3480))。
- 清理 CLI 显示中的 HTML 错误消息 ([#3069](https://github.com/NousResearch/hermes-agent/pull/3069))。
- 在 API 错误输出中显示 HTTP 状态码和 400 正文 ([#3096](https://github.com/NousResearch/hermes-agent/pull/3096))。
- 从 HTML 错误页面提取有用信息,达到最大重试时转储调试信息 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 防止启动时 `base_url` 为 None 的 TypeError ([#3068](https://github.com/NousResearch/hermes-agent/pull/3068))。
- 防止非 TTY 环境中的更新崩溃 ([#3094](https://github.com/NousResearch/hermes-agent/pull/3094))。
- 在会话删除/修剪确认提示中处理 EOFError ([#3101](https://github.com/NousResearch/hermes-agent/pull/3101))。
- 在退出和退出清理处理程序中捕获 `flush_memories` 期间的 KeyboardInterrupt ([#3025](https://github.com/NousResearch/hermes-agent/pull/3025), [#3257](https://github.com/NousResearch/hermes-agent/pull/3257))。
- 防护 `.strip()` 防止来自 YAML 配置的 None 值 ([#3552](https://github.com/NousResearch/hermes-agent/pull/3552))。
- 防护 `config.get()` 防止 YAML null 值以避免 AttributeError ([#3377](https://github.com/NousResearch/hermes-agent/pull/3377))。
- 存储 asyncio 任务引用以防止执行中途 GC ([#3267](https://github.com/NousResearch/hermes-agent/pull/3267))。
### 设置与配置
- 使用显式键映射进行返回用户菜单调度,而非位置索引 ([#3083](https://github.com/NousResearch/hermes-agent/pull/3083))。
- 在更新命令中使用 `sys.executable` 进行 pip 操作以修复 PEP 668 ([#3099](https://github.com/NousResearch/hermes-agent/pull/3099))。
- 强化 `hermes update` 以处理 diverged history、非 main 分支和网关边缘情况 ([#3492](https://github.com/NousResearch/hermes-agent/pull/3492))。
- OpenClaw 迁移覆盖默认值且设置向导跳过导入部分 — 已修复 ([#3282](https://github.com/NousResearch/hermes-agent/pull/3282))。
- 停止递归 AGENTS.md 遍历,仅加载顶层 ([#3110](https://github.com/NousResearch/hermes-agent/pull/3110))。
- 向浏览器和终端 PATH 解析添加 macOS Homebrew 路径 ([#2713](https://github.com/NousResearch/hermes-agent/pull/2713))。
- `tool_progress` 配置的 YAML 布尔处理 ([#3300](https://github.com/NousResearch/hermes-agent/pull/3300))。
- 将默认 SOUL.md 重置为基线身份文本 ([#3159](https://github.com/NousResearch/hermes-agent/pull/3159))。
- 拒绝容器终端后端的相对 cwd 路径 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 为 API 服务器平台添加显式 `hermes-api-server` 工具集 ([#3304](https://github.com/NousResearch/hermes-agent/pull/3304))。
- 重新排序设置向导提供商 — OpenRouter 优先 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
---
## 🔧 工具系统
### API 服务器
- **幂等性键支持**、正文大小限制和 OpenAI 错误封装 ([#2903](https://github.com/NousResearch/hermes-agent/pull/2903))。
- 允许幂等性键在 CORS 头中 ([#3530](https://github.com/NousResearch/hermes-agent/pull/3530))。
- 取消孤立代理并在 SSE 断开时真正中断 ([#3427](https://github.com/NousResearch/hermes-agent/pull/3427))。
- 修复代理进行工具调用时流式中断 ([#2985](https://github.com/NousResearch/hermes-agent/pull/2985))。
### 终端与文件操作
- 在 V4A 补丁解析器中处理仅添加的块 ([#3325](https://github.com/NousResearch/hermes-agent/pull/3325))。
- 持久 shell 轮询的指数退避 ([#2996](https://github.com/NousResearch/hermes-agent/pull/2996))。
- 为 `context_references` 中的子进程调用添加超时 ([#3469](https://github.com/NousResearch/hermes-agent/pull/3469))。
### 浏览器与视觉
- 在视觉工具中处理 402 积分不足错误 ([#2802](https://github.com/NousResearch/hermes-agent/pull/2802))。
- 修复 `browser_vision` 忽略 `auxiliary.vision.timeout` 配置 ([#2901](https://github.com/NousResearch/hermes-agent/pull/2901))。
- 通过 config.yaml 使浏览器命令超时可配置 ([#2801](https://github.com/NousResearch/hermes-agent/pull/2801))。
### MCP
- MCP 工具集解析用于运行时和配置 ([#3252](https://github.com/NousResearch/hermes-agent/pull/3252))。
- 添加 MCP 工具名称冲突保护 ([#3077](https://github.com/NousResearch/hermes-agent/pull/3077))。
### 辅助 LLM
- 防护辅助 LLM 调用防止 None 内容 + 推理回退 + 重试 ([#3449](https://github.com/NousResearch/hermes-agent/pull/3449))。
- 在视觉自动检测中捕获 `build_anthropic_client` 的 ImportError ([#3312](https://github.com/NousResearch/hermes-agent/pull/3312))。
### 其他工具
- 为 `send_message_tool` HTTP 调用添加请求超时 ([#3162](https://github.com/NousResearch/hermes-agent/pull/3162)),由 @memosr 贡献。
- 自动修复包含无效控制字符的 `jobs.json` ([#3537](https://github.com/NousResearch/hermes-agent/pull/3537))。
- 为 Claude/OpenRouter 启用细粒度工具流式传输 ([#3497](https://github.com/NousResearch/hermes-agent/pull/3497))。
---
## 🧩 技能生态系统
### 技能系统
- **技能和用户配置的环境变量透传** — 技能可声明要透传的环境变量 ([#2807](https://github.com/NousResearch/hermes-agent/pull/2807))。
- 使用共享 `skill_utils` 模块缓存技能提示以加快 TTFT ([#3421](https://github.com/NousResearch/hermes-agent/pull/3421))。
- 避免在提示构建器中为技能条件重复读取文件 ([#2992](https://github.com/NousResearch/hermes-agent/pull/2992))。
- 使用 Git Trees API 防止安装期间静默子目录丢失 ([#2995](https://github.com/NousResearch/hermes-agent/pull/2995))。
- 修复深层嵌套仓库结构的 skills-sh 安装 ([#2980](https://github.com/NousResearch/hermes-agent/pull/2980))。
- 处理技能 frontmatter 中的 null 元数据 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 保留 skills-sh 标识符的信任并减少解析开销 ([#3251](https://github.com/NousResearch/hermes-agent/pull/3251))。
- 代理创建的技能曾被错误地视为不受信任的社区内容 — 已修复 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
### 新技能
- **G0DM0D3 godmode 越狱技能** + 文档 ([#3157](https://github.com/NousResearch/hermes-agent/pull/3157))。
- **Docker 管理技能** 添加到 optional-skills ([#3060](https://github.com/NousResearch/hermes-agent/pull/3060))。
- **OpenClaw 迁移 v2** — 17 个新模块,终端回顾用于从 OpenClaw 迁移到 Hermes ([#2906](https://github.com/NousResearch/hermes-agent/pull/2906))。
---
## 🔒 安全与可靠性
### 安全强化
- **向 `browser_navigate` 添加 SSRF 保护** ([#3058](https://github.com/NousResearch/hermes-agent/pull/3058))。
- **向 `vision_tools` 和 `web_tools` 添加 SSRF 保护**(已强化)([#2679](https://github.com/NousResearch/hermes-agent/pull/2679))。
- **限制子代理工具集** 为父代理的启用集 ([#3269](https://github.com/NousResearch/hermes-agent/pull/3269))。
- **防止自更新中的 zip-slip 路径遍历** ([#3250](https://github.com/NousResearch/hermes-agent/pull/3250))。
- **防止 `_expand_path` 中的 shell 注入** 通过 `~user` 路径后缀 ([#2685](https://github.com/NousResearch/hermes-agent/pull/2685))。
- **危险命令检测前规范化输入** ([#3260](https://github.com/NousResearch/hermes-agent/pull/3260))。
- 使 tirith 阻止判决可批准而非硬阻止 ([#3428](https://github.com/NousResearch/hermes-agent/pull/3428))。
- 从依赖中移除被入侵的 `litellm`/`typer`/`platformdirs` ([#2796](https://github.com/NousResearch/hermes-agent/pull/2796))。
- 固定所有依赖版本范围 ([#2810](https://github.com/NousResearch/hermes-agent/pull/2810))。
- 重新生成带哈希的 `uv.lock`,在设置中使用 lockfile ([#2812](https://github.com/NousResearch/hermes-agent/pull/2812))。
- 升级依赖以修复 CVE + 重新生成 `uv.lock` ([#3073](https://github.com/NousResearch/hermes-agent/pull/3073))。
- 供应链审计 CI 工作流用于 PR 扫描 ([#2816](https://github.com/NousResearch/hermes-agent/pull/2816))。
### 可靠性
- **导致 TUI 冻结 15-20 秒的 SQLite WAL 写锁争用** — 已修复 ([#3385](https://github.com/NousResearch/hermes-agent/pull/3385))。
- **SQLite 并发强化** + 会话文字记录完整性 ([#3249](https://github.com/NousResearch/hermes-agent/pull/3249))。
- 防止网关崩溃/重启循环中重复触发的 cron 作业 ([#3396](https://github.com/NousResearch/hermes-agent/pull/3396))。
- 作业完成后将 cron 会话标记为已结束 ([#2998](https://github.com/NousResearch/hermes-agent/pull/2998))。
---
## ⚡ 性能
- **TTFT 启动优化** — 挽救易得的启动改进 ([#3395](https://github.com/NousResearch/hermes-agent/pull/3395))。
- 使用共享 `skill_utils` 模块缓存技能提示 ([#3421](https://github.com/NousResearch/hermes-agent/pull/3421))。
- 在提示构建器中避免技能条件的冗余文件重读 ([#2992](https://github.com/NousResearch/hermes-agent/pull/2992))。
---
## 🐛 值得注意的错误修复
- 修复网关令牌与缓存代理的双重计数 ([#3306](https://github.com/NousResearch/hermes-agent/pull/3306), [#3317](https://github.com/NousResearch/hermes-agent/pull/3317))。
- 修复空闲会话中的“事件循环已关闭”/“按 ENTER 继续” ([#3398](https://github.com/NousResearch/hermes-agent/pull/3398))。
- 修复工具调用循环中推理框渲染 3 次 ([#3405](https://github.com/NousResearch/hermes-agent/pull/3405))。
- 修复状态栏对令牌计数显示 26K 而非 260K ([#3024](https://github.com/NousResearch/hermes-agent/pull/3024))。
- 修复 `/queue` 无论配置如何始终有效 ([#3298](https://github.com/NousResearch/hermes-agent/pull/3298))。
- 修复代理回合后 Discord 幻影输入指示器 ([#3003](https://github.com/NousResearch/hermes-agent/pull/3003))。
- 修复 Slack 进度消息出现在错误线程中 ([#3063](https://github.com/NousResearch/hermes-agent/pull/3063))。
- 修复 WhatsApp 媒体下载(文档、音频、视频)([#2978](https://github.com/NousResearch/hermes-agent/pull/2978))。
- 修复 Telegram“未找到消息线程”导致进度消息失败 ([#3390](https://github.com/NousResearch/hermes-agent/pull/3390))。
- 修复 OpenClaw 迁移覆盖默认值 ([#3282](https://github.com/NousResearch/hermes-agent/pull/3282))。
- 修复返回用户设置菜单调度错误部分 ([#3083](https://github.com/NousResearch/hermes-agent/pull/3083))。
- 修复 `hermes update` PEP 668“外部管理环境”错误 ([#3099](https://github.com/NousResearch/hermes-agent/pull/3099))。
- 修复子代理通过共享预算过早达到 `max_iterations` ([#3004](https://github.com/NousResearch/hermes-agent/pull/3004))。
- 修复 `tool_progress` 配置的 YAML 布尔处理 ([#3300](https://github.com/NousResearch/hermes-agent/pull/3300))。
- 修复 `config.get()` 在 YAML null 值上崩溃 ([#3377](https://github.com/NousResearch/hermes-agent/pull/3377))。
- 修复来自 YAML 配置的 None 值上的 `.strip()` 崩溃 ([#3552](https://github.com/NousResearch/hermes-agent/pull/3552))。
- 修复网关上的挂起代理 — `/stop` 现在强制终止会话锁 ([#3104](https://github.com/NousResearch/hermes-agent/pull/3104))。
- 修复 `_custom` 提供商静默重映射到 `openrouter` ([#2792](https://github.com/NousResearch/hermes-agent/pull/2792))。
- 修复 Matrix 在 `PLATFORMS` 字典中缺失 ([#3473](https://github.com/NousResearch/hermes-agent/pull/3473))。
- 修复 Email 适配器 `_seen_uids` 无限制增长 ([#3490](https://github.com/NousResearch/hermes-agent/pull/3490))。
---
## 🧪 测试
- 固定 `agent-client-protocol` < 0.9 以处理破坏性上游发布 ([#3320](https://github.com/NousResearch/hermes-agent/pull/3320))。
- 在视觉自动检测测试中捕获 anthropic ImportError ([#3312](https://github.com/NousResearch/hermes-agent/pull/3312))。
- 更新重试耗尽测试以适应新的优雅返回行为 ([#3320](https://github.com/NousResearch/hermes-agent/pull/3320))。
- 添加 null 元数据 frontmatter 的回归测试 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
---
## 📚 文档
- 更新所有文档以反映 `/model` 命令重构和自定义提供商支持 ([#2800](https://github.com/NousResearch/hermes-agent/pull/2800))。
- 修复 18 个文件中的过时和不正确文档 ([#2805](https://github.com/NousResearch/hermes-agent/pull/2805))。
- 记录 9 个先前未记录的功能 ([#2814](https://github.com/NousResearch/hermes-agent/pull/2814))。
- 添加缺失的技能、CLI 命令和消息环境变量到文档 ([#2809](https://github.com/NousResearch/hermes-agent/pull/2809))。
- 修复 api-server 响应存储文档 — SQLite,而非内存 ([#2819](https://github.com/NousResearch/hermes-agent/pull/2819))。
- 为 pip install extras 加引号以修复 zsh 通配符错误 ([#2815](https://github.com/NousResearch/hermes-agent/pull/2815))。
- 统一钩子文档 — 将插件钩子添加到钩子页面,添加 `session:end` 事件 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 在 `session_search` 架构描述中澄清双模式行为 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
- 修复 Discord 公开机器人设置的 Discord 提供邀请链接 ([#3519](https://github.com/NousResearch/hermes-agent/pull/3519)),由 @mehmoodosman 贡献。
- 修订 v0.4.0 更新日志 — 修复功能归属,重新排序章节 ([未标记提交](https://github.com/NousResearch/hermes-agent))。
---
## 👥 贡献者
### 核心
- **@teknium1** — 157 个 PR,涵盖本发布全部范围
### 社区贡献者
- **@alt-glitch** (Siddharth Balyan) — 2 个 PR:带 uv2nix 构建的 Nix flake、NixOS 模块和持久容器模式 ([#20](https://github.com/NousResearch/hermes-agent/pull/20));自动生成配置键和 Nix 构建的后缀 PATHs ([#3061](https://github.com/NousResearch/hermes-agent/pull/3061), [#3274](https://github.com/NousResearch/hermes-agent/pull/3274))。
- **@ctlst** — 1 个 PR:防止网关模式下的 AsyncOpenAI/httpx 跨循环死锁 ([#2701](https://github.com/NousResearch/hermes-agent/pull/2701))。
- **@memosr** (memosr.eth) — 1 个 PR:为 `send_message_tool` HTTP 调用添加请求超时 ([#3162](https://github.com/NousResearch/hermes-agent/pull/3162))。
- **@mehmoodosman** (Osman Mehmood) — 1 个 PR:修复 Discord 文档中的公开机器人设置 ([#3519](https://github.com/NousResearch/hermes-agent/pull/3519))。
### 所有贡献者
@alt-glitch, @ctlst, @mehmoodosman, @memosr, @teknium1
---
**完整更新日志**:[v2026.3.23...v2026.3.28](https://github.com/NousResearch/hermes-agent/compare/v2026.3.23...v2026.3.28)
# Hermes Agent v0.5.0 (v2026.3.28)
**Release Date:** March 28, 2026
> The hardening release — Hugging Face provider, /model command overhaul, Telegram Private Chat Topics, native Modal SDK, plugin lifecycle hooks, tool-use enforcement for GPT models, Nix flake, 50+ security and reliability fixes, and a comprehensive supply chain audit.
---
## ✨ Highlights
- **Nous Portal now supports 400+ models** — The Nous Research inference portal has expanded dramatically, giving Hermes Agent users access to over 400 models through a single provider endpoint
- **Hugging Face as a first-class inference provider** — Full integration with HF Inference API including curated agentic model picker that maps to OpenRouter analogues, live `/models` endpoint probe, and setup wizard flow ([#3419](https://github.com/NousResearch/hermes-agent/pull/3419), [#3440](https://github.com/NousResearch/hermes-agent/pull/3440))
- **Telegram Private Chat Topics** — Project-based conversations with functional skill binding per topic, enabling isolated workflows within a single Telegram chat ([#3163](https://github.com/NousResearch/hermes-agent/pull/3163))
- **Native Modal SDK backend** — Replaced swe-rex dependency with native Modal SDK (`Sandbox.create.aio` + `exec.aio`), eliminating tunnels and simplifying the Modal terminal backend ([#3538](https://github.com/NousResearch/hermes-agent/pull/3538))
- **Plugin lifecycle hooks activated** — `pre_llm_call`, `post_llm_call`, `on_session_start`, and `on_session_end` hooks now fire in the agent loop and CLI/gateway, completing the plugin hook system ([#3542](https://github.com/NousResearch/hermes-agent/pull/3542))
- **Improved OpenAI Model Reliability** — Added `GPT_TOOL_USE_GUIDANCE` to prevent GPT models from describing intended actions instead of making tool calls, plus automatic stripping of stale budget warnings from conversation history that caused models to avoid tools across turns ([#3528](https://github.com/NousResearch/hermes-agent/pull/3528))
- **Nix flake** — Full uv2nix build, NixOS module with persistent container mode, auto-generated config keys from Python source, and suffix PATHs for agent-friendliness ([#20](https://github.com/NousResearch/hermes-agent/pull/20), [#3274](https://github.com/NousResearch/hermes-agent/pull/3274), [#3061](https://github.com/NousResearch/hermes-agent/pull/3061)) by @alt-glitch
- **Supply chain hardening** — Removed compromised `litellm` dependency, pinned all dependency version ranges, regenerated `uv.lock` with hashes, added CI workflow scanning PRs for supply chain attack patterns, and bumped deps to fix CVEs ([#2796](https://github.com/NousResearch/hermes-agent/pull/2796), [#2810](https://github.com/NousResearch/hermes-agent/pull/2810), [#2812](https://github.com/NousResearch/hermes-agent/pull/2812), [#2816](https://github.com/NousResearch/hermes-agent/pull/2816), [#3073](https://github.com/NousResearch/hermes-agent/pull/3073))
- **Anthropic output limits fix** — Replaced hardcoded 16K `max_tokens` with per-model native output limits (128K for Opus 4.6, 64K for Sonnet 4.6), fixing "Response truncated" and thinking-budget exhaustion on direct Anthropic API ([#3426](https://github.com/NousResearch/hermes-agent/pull/3426), [#3444](https://github.com/NousResearch/hermes-agent/pull/3444))
---
## 🏗️ Core Agent & Architecture
### New Provider: Hugging Face
- First-class Hugging Face Inference API integration with auth, setup wizard, and model picker ([#3419](https://github.com/NousResearch/hermes-agent/pull/3419))
- Curated model list mapping OpenRouter agentic defaults to HF equivalents — providers with 8+ curated models skip live `/models` probe for speed ([#3440](https://github.com/NousResearch/hermes-agent/pull/3440))
- Added glm-5-turbo to Z.AI provider model list ([#3095](https://github.com/NousResearch/hermes-agent/pull/3095))
### Provider & Model Improvements
- `/model` command overhaul — extracted shared `switch_model()` pipeline for CLI and gateway, custom endpoint support, provider-aware routing ([#2795](https://github.com/NousResearch/hermes-agent/pull/2795), [#2799](https://github.com/NousResearch/hermes-agent/pull/2799))
- Removed `/model` slash command from CLI and gateway in favor of `hermes model` subcommand ([#3080](https://github.com/NousResearch/hermes-agent/pull/3080))
- Preserve `custom` provider instead of silently remapping to `openrouter` ([#2792](https://github.com/NousResearch/hermes-agent/pull/2792))
- Read root-level `provider` and `base_url` from config.yaml into model config ([#3112](https://github.com/NousResearch/hermes-agent/pull/3112))
- Align Nous Portal model slugs with OpenRouter naming ([#3253](https://github.com/NousResearch/hermes-agent/pull/3253))
- Fix Alibaba provider default endpoint and model list ([#3484](https://github.com/NousResearch/hermes-agent/pull/3484))
- Allow MiniMax users to override `/v1` → `/anthropic` auto-correction ([#3553](https://github.com/NousResearch/hermes-agent/pull/3553))
- Migrate OAuth token refresh to `platform.claude.com` with fallback ([#3246](https://github.com/NousResearch/hermes-agent/pull/3246))
### Agent Loop & Conversation
- **Improved OpenAI model reliability** — `GPT_TOOL_USE_GUIDANCE` prevents GPT models from describing actions instead of calling tools + automatic budget warning stripping from history ([#3528](https://github.com/NousResearch/hermes-agent/pull/3528))
- **Surface lifecycle events** — All retry, fallback, and compression events now surface to the user as formatted messages ([#3153](https://github.com/NousResearch/hermes-agent/pull/3153))
- **Anthropic output limits** — Per-model native output limits instead of hardcoded 16K `max_tokens` ([#3426](https://github.com/NousResearch/hermes-agent/pull/3426))
- **Thinking-budget exhaustion detection** — Skip useless continuation retries when model uses all output tokens on reasoning ([#3444](https://github.com/NousResearch/hermes-agent/pull/3444))
- Always prefer streaming for API calls to prevent hung subagents ([#3120](https://github.com/NousResearch/hermes-agent/pull/3120))
- Restore safe non-streaming fallback after stream failures ([#3020](https://github.com/NousResearch/hermes-agent/pull/3020))
- Give subagents independent iteration budgets ([#3004](https://github.com/NousResearch/hermes-agent/pull/3004))
- Update `api_key` in `_try_activate_fallback` for subagent auth ([#3103](https://github.com/NousResearch/hermes-agent/pull/3103))
- Graceful return on max retries instead of crashing thread ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Count compression restarts toward retry limit ([#3070](https://github.com/NousResearch/hermes-agent/pull/3070))
- Include tool tokens in preflight estimate, guard context probe persistence ([#3164](https://github.com/NousResearch/hermes-agent/pull/3164))
- Update context compressor limits after fallback activation ([#3305](https://github.com/NousResearch/hermes-agent/pull/3305))
- Validate empty user messages to prevent Anthropic API 400 errors ([#3322](https://github.com/NousResearch/hermes-agent/pull/3322))
- GLM reasoning-only and max-length handling ([#3010](https://github.com/NousResearch/hermes-agent/pull/3010))
- Increase API timeout default from 900s to 1800s for slow-thinking models ([#3431](https://github.com/NousResearch/hermes-agent/pull/3431))
- Send `max_tokens` for Claude/OpenRouter + retry SSE connection errors ([#3497](https://github.com/NousResearch/hermes-agent/pull/3497))
- Prevent AsyncOpenAI/httpx cross-loop deadlock in gateway mode ([#2701](https://github.com/NousResearch/hermes-agent/pull/2701)) by @ctlst
### Streaming & Reasoning
- **Persist reasoning across gateway session turns** with new schema v6 columns (`reasoning`, `reasoning_details`, `codex_reasoning_items`) ([#2974](https://github.com/NousResearch/hermes-agent/pull/2974))
- Detect and kill stale SSE connections ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Fix stale stream detector race causing spurious `RemoteProtocolError` ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Skip duplicate callback for `<think>`-extracted reasoning during streaming ([#3116](https://github.com/NousResearch/hermes-agent/pull/3116))
- Preserve reasoning fields in `rewrite_transcript` ([#3311](https://github.com/NousResearch/hermes-agent/pull/3311))
- Preserve Gemini thought signatures in streamed tool calls ([#2997](https://github.com/NousResearch/hermes-agent/pull/2997))
- Ensure first delta is fired during reasoning updates ([untagged commit](https://github.com/NousResearch/hermes-agent))
### Session & Memory
- **Session search recent sessions mode** — Omit query to browse recent sessions with titles, previews, and timestamps ([#2533](https://github.com/NousResearch/hermes-agent/pull/2533))
- **Session config surfacing** on `/new`, `/reset`, and auto-reset ([#3321](https://github.com/NousResearch/hermes-agent/pull/3321))
- **Third-party session isolation** — `--source` flag for isolating sessions by origin ([#3255](https://github.com/NousResearch/hermes-agent/pull/3255))
- Add `/resume` CLI handler, session log truncation guard, `reopen_session` API ([#3315](https://github.com/NousResearch/hermes-agent/pull/3315))
- Clear compressor summary and turn counter on `/clear` and `/new` ([#3102](https://github.com/NousResearch/hermes-agent/pull/3102))
- Surface silent SessionDB failures that cause session data loss ([#2999](https://github.com/NousResearch/hermes-agent/pull/2999))
- Session search fallback preview on summarization failure ([#3478](https://github.com/NousResearch/hermes-agent/pull/3478))
- Prevent stale memory overwrites by flush agent ([#2687](https://github.com/NousResearch/hermes-agent/pull/2687))
### Context Compression
- Replace dead `summary_target_tokens` with ratio-based scaling ([#2554](https://github.com/NousResearch/hermes-agent/pull/2554))
- Expose `compression.target_ratio`, `protect_last_n`, and `threshold` in `DEFAULT_CONFIG` ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Restore sane defaults and cap summary at 12K tokens ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Preserve transcript on `/compress` and hygiene compression ([#3556](https://github.com/NousResearch/hermes-agent/pull/3556))
- Update context pressure warnings and token estimates after compaction ([untagged commit](https://github.com/NousResearch/hermes-agent))
### Architecture & Dependencies
- **Remove mini-swe-agent dependency** — Inline Docker and Modal backends directly ([#2804](https://github.com/NousResearch/hermes-agent/pull/2804))
- **Replace swe-rex with native Modal SDK** for Modal backend ([#3538](https://github.com/NousResearch/hermes-agent/pull/3538))
- **Plugin lifecycle hooks** — `pre_llm_call`, `post_llm_call`, `on_session_start`, `on_session_end` now fire in the agent loop ([#3542](https://github.com/NousResearch/hermes-agent/pull/3542))
- Fix plugin toolsets invisible in `hermes tools` and standalone processes ([#3457](https://github.com/NousResearch/hermes-agent/pull/3457))
- Consolidate `get_hermes_home()` and `parse_reasoning_effort()` ([#3062](https://github.com/NousResearch/hermes-agent/pull/3062))
- Remove unused Hermes-native PKCE OAuth flow ([#3107](https://github.com/NousResearch/hermes-agent/pull/3107))
- Remove ~100 unused imports across 55 files ([#3016](https://github.com/NousResearch/hermes-agent/pull/3016))
- Fix 154 f-strings, simplify getattr/URL patterns, remove dead code ([#3119](https://github.com/NousResearch/hermes-agent/pull/3119))
---
## 📱 Messaging Platforms (Gateway)
### Telegram
- **Private Chat Topics** — Project-based conversations with functional skill binding per topic, enabling isolated workflows within a single Telegram chat ([#3163](https://github.com/NousResearch/hermes-agent/pull/3163))
- **Auto-discover fallback IPs via DNS-over-HTTPS** when `api.telegram.org` is unreachable ([#3376](https://github.com/NousResearch/hermes-agent/pull/3376))
- **Configurable reply threading mode** ([#2907](https://github.com/NousResearch/hermes-agent/pull/2907))
- Fall back to no `thread_id` on "Message thread not found" BadRequest ([#3390](https://github.com/NousResearch/hermes-agent/pull/3390))
- Self-reschedule reconnect when `start_polling` fails after 502 ([#3268](https://github.com/NousResearch/hermes-agent/pull/3268))
### Discord
- Stop phantom typing indicator after agent turn completes ([#3003](https://github.com/NousResearch/hermes-agent/pull/3003))
### Slack
- Send tool call progress messages to correct Slack thread ([#3063](https://github.com/NousResearch/hermes-agent/pull/3063))
- Scope progress thread fallback to Slack only ([#3488](https://github.com/NousResearch/hermes-agent/pull/3488))
### WhatsApp
- Download documents, audio, and video media from messages ([#2978](https://github.com/NousResearch/hermes-agent/pull/2978))
### Matrix
- Add missing Matrix entry in `PLATFORMS` dict ([#3473](https://github.com/NousResearch/hermes-agent/pull/3473))
- Harden e2ee access-token handling ([#3562](https://github.com/NousResearch/hermes-agent/pull/3562))
- Add backoff for `SyncError` in sync loop ([#3280](https://github.com/NousResearch/hermes-agent/pull/3280))
### Signal
- Track SSE keepalive comments as connection activity ([#3316](https://github.com/NousResearch/hermes-agent/pull/3316))
### Email
- Prevent unbounded growth of `_seen_uids` in EmailAdapter ([#3490](https://github.com/NousResearch/hermes-agent/pull/3490))
### Gateway Core
- **Config-gated `/verbose` command** for messaging platforms — toggle tool output verbosity from chat ([#3262](https://github.com/NousResearch/hermes-agent/pull/3262))
- **Background review notifications** delivered to user chat ([#3293](https://github.com/NousResearch/hermes-agent/pull/3293))
- **Retry transient send failures** and notify user on exhaustion ([#3288](https://github.com/NousResearch/hermes-agent/pull/3288))
- Recover from hung agents — `/stop` hard-kills session lock ([#3104](https://github.com/NousResearch/hermes-agent/pull/3104))
- Thread-safe `SessionStore` — protect `_entries` with `threading.Lock` ([#3052](https://github.com/NousResearch/hermes-agent/pull/3052))
- Fix gateway token double-counting with cached agents — use absolute set instead of increment ([#3306](https://github.com/NousResearch/hermes-agent/pull/3306), [#3317](https://github.com/NousResearch/hermes-agent/pull/3317))
- Fingerprint full auth token in agent cache signature ([#3247](https://github.com/NousResearch/hermes-agent/pull/3247))
- Silence background agent terminal output ([#3297](https://github.com/NousResearch/hermes-agent/pull/3297))
- Include per-platform `ALLOW_ALL` and `SIGNAL_GROUP` in startup allowlist check ([#3313](https://github.com/NousResearch/hermes-agent/pull/3313))
- Include user-local bin paths in systemd unit PATH ([#3527](https://github.com/NousResearch/hermes-agent/pull/3527))
- Track background task references in `GatewayRunner` ([#3254](https://github.com/NousResearch/hermes-agent/pull/3254))
- Add request timeouts to HA, Email, Mattermost, SMS adapters ([#3258](https://github.com/NousResearch/hermes-agent/pull/3258))
- Add media download retry to Mattermost, Slack, and base cache ([#3323](https://github.com/NousResearch/hermes-agent/pull/3323))
- Detect virtualenv path instead of hardcoding `venv/` ([#2797](https://github.com/NousResearch/hermes-agent/pull/2797))
- Use `TERMINAL_CWD` for context file discovery, not process cwd ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Stop loading hermes repo AGENTS.md into gateway sessions (~10k wasted tokens) ([#2891](https://github.com/NousResearch/hermes-agent/pull/2891))
---
## 🖥️ CLI & User Experience
### Interactive CLI
- **Configurable busy input mode** + fix `/queue` always working ([#3298](https://github.com/NousResearch/hermes-agent/pull/3298))
- **Preserve user input on multiline paste** ([#3065](https://github.com/NousResearch/hermes-agent/pull/3065))
- **Tool generation callback** — streaming "preparing terminal…" updates during tool argument generation ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Show tool progress for substantive tools, not just "preparing" ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Buffer reasoning preview chunks and fix duplicate display ([#3013](https://github.com/NousResearch/hermes-agent/pull/3013))
- Prevent reasoning box from rendering 3x during tool-calling loops ([#3405](https://github.com/NousResearch/hermes-agent/pull/3405))
- Eliminate "Event loop is closed" / "Press ENTER to continue" during idle — three-layer fix with `neuter_async_httpx_del()`, custom exception handler, and stale client cleanup ([#3398](https://github.com/NousResearch/hermes-agent/pull/3398))
- Fix status bar shows 26K instead of 260K for token counts with trailing zeros ([#3024](https://github.com/NousResearch/hermes-agent/pull/3024))
- Fix status bar duplicates and degrades during long sessions ([#3291](https://github.com/NousResearch/hermes-agent/pull/3291))
- Refresh TUI before background task output to prevent status bar overlap ([#3048](https://github.com/NousResearch/hermes-agent/pull/3048))
- Suppress KawaiiSpinner animation under `patch_stdout` ([#2994](https://github.com/NousResearch/hermes-agent/pull/2994))
- Skip KawaiiSpinner when TUI handles tool progress ([#2973](https://github.com/NousResearch/hermes-agent/pull/2973))
- Guard `isatty()` against closed streams via `_is_tty` property ([#3056](https://github.com/NousResearch/hermes-agent/pull/3056))
- Ensure single closure of streaming boxes during tool generation ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Cap context pressure percentage at 100% in display ([#3480](https://github.com/NousResearch/hermes-agent/pull/3480))
- Clean up HTML error messages in CLI display ([#3069](https://github.com/NousResearch/hermes-agent/pull/3069))
- Show HTTP status code and 400 body in API error output ([#3096](https://github.com/NousResearch/hermes-agent/pull/3096))
- Extract useful info from HTML error pages, dump debug on max retries ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Prevent TypeError on startup when `base_url` is None ([#3068](https://github.com/NousResearch/hermes-agent/pull/3068))
- Prevent update crash in non-TTY environments ([#3094](https://github.com/NousResearch/hermes-agent/pull/3094))
- Handle EOFError in sessions delete/prune confirmation prompts ([#3101](https://github.com/NousResearch/hermes-agent/pull/3101))
- Catch KeyboardInterrupt during `flush_memories` on exit and in exit cleanup handlers ([#3025](https://github.com/NousResearch/hermes-agent/pull/3025), [#3257](https://github.com/NousResearch/hermes-agent/pull/3257))
- Guard `.strip()` against None values from YAML config ([#3552](https://github.com/NousResearch/hermes-agent/pull/3552))
- Guard `config.get()` against YAML null values to prevent AttributeError ([#3377](https://github.com/NousResearch/hermes-agent/pull/3377))
- Store asyncio task references to prevent GC mid-execution ([#3267](https://github.com/NousResearch/hermes-agent/pull/3267))
### Setup & Configuration
- Use explicit key mapping for returning-user menu dispatch instead of positional index ([#3083](https://github.com/NousResearch/hermes-agent/pull/3083))
- Use `sys.executable` for pip in update commands to fix PEP 668 ([#3099](https://github.com/NousResearch/hermes-agent/pull/3099))
- Harden `hermes update` against diverged history, non-main branches, and gateway edge cases ([#3492](https://github.com/NousResearch/hermes-agent/pull/3492))
- OpenClaw migration overwrites defaults and setup wizard skips imported sections — fixed ([#3282](https://github.com/NousResearch/hermes-agent/pull/3282))
- Stop recursive AGENTS.md walk, load top-level only ([#3110](https://github.com/NousResearch/hermes-agent/pull/3110))
- Add macOS Homebrew paths to browser and terminal PATH resolution ([#2713](https://github.com/NousResearch/hermes-agent/pull/2713))
- YAML boolean handling for `tool_progress` config ([#3300](https://github.com/NousResearch/hermes-agent/pull/3300))
- Reset default SOUL.md to baseline identity text ([#3159](https://github.com/NousResearch/hermes-agent/pull/3159))
- Reject relative cwd paths for container terminal backends ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Add explicit `hermes-api-server` toolset for API server platform ([#3304](https://github.com/NousResearch/hermes-agent/pull/3304))
- Reorder setup wizard providers — OpenRouter first ([untagged commit](https://github.com/NousResearch/hermes-agent))
---
## 🔧 Tool System
### API Server
- **Idempotency-Key support**, body size limit, and OpenAI error envelope ([#2903](https://github.com/NousResearch/hermes-agent/pull/2903))
- Allow Idempotency-Key in CORS headers ([#3530](https://github.com/NousResearch/hermes-agent/pull/3530))
- Cancel orphaned agent + true interrupt on SSE disconnect ([#3427](https://github.com/NousResearch/hermes-agent/pull/3427))
- Fix streaming breaks when agent makes tool calls ([#2985](https://github.com/NousResearch/hermes-agent/pull/2985))
### Terminal & File Operations
- Handle addition-only hunks in V4A patch parser ([#3325](https://github.com/NousResearch/hermes-agent/pull/3325))
- Exponential backoff for persistent shell polling ([#2996](https://github.com/NousResearch/hermes-agent/pull/2996))
- Add timeout to subprocess calls in `context_references` ([#3469](https://github.com/NousResearch/hermes-agent/pull/3469))
### Browser & Vision
- Handle 402 insufficient credits error in vision tool ([#2802](https://github.com/NousResearch/hermes-agent/pull/2802))
- Fix `browser_vision` ignores `auxiliary.vision.timeout` config ([#2901](https://github.com/NousResearch/hermes-agent/pull/2901))
- Make browser command timeout configurable via config.yaml ([#2801](https://github.com/NousResearch/hermes-agent/pull/2801))
### MCP
- MCP toolset resolution for runtime and config ([#3252](https://github.com/NousResearch/hermes-agent/pull/3252))
- Add MCP tool name collision protection ([#3077](https://github.com/NousResearch/hermes-agent/pull/3077))
### Auxiliary LLM
- Guard aux LLM calls against None content + reasoning fallback + retry ([#3449](https://github.com/NousResearch/hermes-agent/pull/3449))
- Catch ImportError from `build_anthropic_client` in vision auto-detection ([#3312](https://github.com/NousResearch/hermes-agent/pull/3312))
### Other Tools
- Add request timeouts to `send_message_tool` HTTP calls ([#3162](https://github.com/NousResearch/hermes-agent/pull/3162)) by @memosr
- Auto-repair `jobs.json` with invalid control characters ([#3537](https://github.com/NousResearch/hermes-agent/pull/3537))
- Enable fine-grained tool streaming for Claude/OpenRouter ([#3497](https://github.com/NousResearch/hermes-agent/pull/3497))
---
## 🧩 Skills Ecosystem
### Skills System
- **Env var passthrough** for skills and user config — skills can declare environment variables to pass through ([#2807](https://github.com/NousResearch/hermes-agent/pull/2807))
- Cache skills prompt with shared `skill_utils` module for faster TTFT ([#3421](https://github.com/NousResearch/hermes-agent/pull/3421))
- Avoid redundant file re-read for skill conditions ([#2992](https://github.com/NousResearch/hermes-agent/pull/2992))
- Use Git Trees API to prevent silent subdirectory loss during install ([#2995](https://github.com/NousResearch/hermes-agent/pull/2995))
- Fix skills-sh install for deeply nested repo structures ([#2980](https://github.com/NousResearch/hermes-agent/pull/2980))
- Handle null metadata in skill frontmatter ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Preserve trust for skills-sh identifiers + reduce resolution churn ([#3251](https://github.com/NousResearch/hermes-agent/pull/3251))
- Agent-created skills were incorrectly treated as untrusted community content — fixed ([untagged commit](https://github.com/NousResearch/hermes-agent))
### New Skills
- **G0DM0D3 godmode jailbreaking skill** + docs ([#3157](https://github.com/NousResearch/hermes-agent/pull/3157))
- **Docker management skill** added to optional-skills ([#3060](https://github.com/NousResearch/hermes-agent/pull/3060))
- **OpenClaw migration v2** — 17 new modules, terminal recap for migrating from OpenClaw to Hermes ([#2906](https://github.com/NousResearch/hermes-agent/pull/2906))
---
## 🔒 Security & Reliability
### Security Hardening
- **SSRF protection** added to `browser_navigate` ([#3058](https://github.com/NousResearch/hermes-agent/pull/3058))
- **SSRF protection** added to `vision_tools` and `web_tools` (hardened) ([#2679](https://github.com/NousResearch/hermes-agent/pull/2679))
- **Restrict subagent toolsets** to parent's enabled set ([#3269](https://github.com/NousResearch/hermes-agent/pull/3269))
- **Prevent zip-slip path traversal** in self-update ([#3250](https://github.com/NousResearch/hermes-agent/pull/3250))
- **Prevent shell injection** in `_expand_path` via `~user` path suffix ([#2685](https://github.com/NousResearch/hermes-agent/pull/2685))
- **Normalize input** before dangerous command detection ([#3260](https://github.com/NousResearch/hermes-agent/pull/3260))
- Make tirith block verdicts approvable instead of hard-blocking ([#3428](https://github.com/NousResearch/hermes-agent/pull/3428))
- Remove compromised `litellm`/`typer`/`platformdirs` from deps ([#2796](https://github.com/NousResearch/hermes-agent/pull/2796))
- Pin all dependency version ranges ([#2810](https://github.com/NousResearch/hermes-agent/pull/2810))
- Regenerate `uv.lock` with hashes, use lockfile in setup ([#2812](https://github.com/NousResearch/hermes-agent/pull/2812))
- Bump dependencies to fix CVEs + regenerate `uv.lock` ([#3073](https://github.com/NousResearch/hermes-agent/pull/3073))
- Supply chain audit CI workflow for PR scanning ([#2816](https://github.com/NousResearch/hermes-agent/pull/2816))
### Reliability
- **SQLite WAL write-lock contention** causing 15-20s TUI freeze — fixed ([#3385](https://github.com/NousResearch/hermes-agent/pull/3385))
- **SQLite concurrency hardening** + session transcript integrity ([#3249](https://github.com/NousResearch/hermes-agent/pull/3249))
- Prevent recurring cron job re-fire on gateway crash/restart loop ([#3396](https://github.com/NousResearch/hermes-agent/pull/3396))
- Mark cron session as ended after job completes ([#2998](https://github.com/NousResearch/hermes-agent/pull/2998))
---
## ⚡ Performance
- **TTFT startup optimizations** — salvaged easy-win startup improvements ([#3395](https://github.com/NousResearch/hermes-agent/pull/3395))
- Cache skills prompt with shared `skill_utils` module ([#3421](https://github.com/NousResearch/hermes-agent/pull/3421))
- Avoid redundant file re-read for skill conditions in prompt builder ([#2992](https://github.com/NousResearch/hermes-agent/pull/2992))
---
## 🐛 Notable Bug Fixes
- Fix gateway token double-counting with cached agents ([#3306](https://github.com/NousResearch/hermes-agent/pull/3306), [#3317](https://github.com/NousResearch/hermes-agent/pull/3317))
- Fix "Event loop is closed" / "Press ENTER to continue" during idle sessions ([#3398](https://github.com/NousResearch/hermes-agent/pull/3398))
- Fix reasoning box rendering 3x during tool-calling loops ([#3405](https://github.com/NousResearch/hermes-agent/pull/3405))
- Fix status bar shows 26K instead of 260K for token counts ([#3024](https://github.com/NousResearch/hermes-agent/pull/3024))
- Fix `/queue` always working regardless of config ([#3298](https://github.com/NousResearch/hermes-agent/pull/3298))
- Fix phantom Discord typing indicator after agent turn ([#3003](https://github.com/NousResearch/hermes-agent/pull/3003))
- Fix Slack progress messages appearing in wrong thread ([#3063](https://github.com/NousResearch/hermes-agent/pull/3063))
- Fix WhatsApp media downloads (documents, audio, video) ([#2978](https://github.com/NousResearch/hermes-agent/pull/2978))
- Fix Telegram "Message thread not found" killing progress messages ([#3390](https://github.com/NousResearch/hermes-agent/pull/3390))
- Fix OpenClaw migration overwriting defaults ([#3282](https://github.com/NousResearch/hermes-agent/pull/3282))
- Fix returning-user setup menu dispatching wrong section ([#3083](https://github.com/NousResearch/hermes-agent/pull/3083))
- Fix `hermes update` PEP 668 "externally-managed-environment" error ([#3099](https://github.com/NousResearch/hermes-agent/pull/3099))
- Fix subagents hitting `max_iterations` prematurely via shared budget ([#3004](https://github.com/NousResearch/hermes-agent/pull/3004))
- Fix YAML boolean handling for `tool_progress` config ([#3300](https://github.com/NousResearch/hermes-agent/pull/3300))
- Fix `config.get()` crashes on YAML null values ([#3377](https://github.com/NousResearch/hermes-agent/pull/3377))
- Fix `.strip()` crash on None values from YAML config ([#3552](https://github.com/NousResearch/hermes-agent/pull/3552))
- Fix hung agents on gateway — `/stop` now hard-kills session lock ([#3104](https://github.com/NousResearch/hermes-agent/pull/3104))
- Fix `_custom` provider silently remapped to `openrouter` ([#2792](https://github.com/NousResearch/hermes-agent/pull/2792))
- Fix Matrix missing from `PLATFORMS` dict ([#3473](https://github.com/NousResearch/hermes-agent/pull/3473))
- Fix Email adapter unbounded `_seen_uids` growth ([#3490](https://github.com/NousResearch/hermes-agent/pull/3490))
---
## 🧪 Testing
- Pin `agent-client-protocol` < 0.9 to handle breaking upstream release ([#3320](https://github.com/NousResearch/hermes-agent/pull/3320))
- Catch anthropic ImportError in vision auto-detection tests ([#3312](https://github.com/NousResearch/hermes-agent/pull/3312))
- Update retry-exhaust test for new graceful return behavior ([#3320](https://github.com/NousResearch/hermes-agent/pull/3320))
- Add regression tests for null metadata frontmatter ([untagged commit](https://github.com/NousResearch/hermes-agent))
---
## 📚 Documentation
- Update all docs for `/model` command overhaul and custom provider support ([#2800](https://github.com/NousResearch/hermes-agent/pull/2800))
- Fix stale and incorrect documentation across 18 files ([#2805](https://github.com/NousResearch/hermes-agent/pull/2805))
- Document 9 previously undocumented features ([#2814](https://github.com/NousResearch/hermes-agent/pull/2814))
- Add missing skills, CLI commands, and messaging env vars to docs ([#2809](https://github.com/NousResearch/hermes-agent/pull/2809))
- Fix api-server response storage documentation — SQLite, not in-memory ([#2819](https://github.com/NousResearch/hermes-agent/pull/2819))
- Quote pip install extras to fix zsh glob errors ([#2815](https://github.com/NousResearch/hermes-agent/pull/2815))
- Unify hooks documentation — add plugin hooks to hooks page, add `session:end` event ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Clarify two-mode behavior in `session_search` schema description ([untagged commit](https://github.com/NousResearch/hermes-agent))
- Fix Discord Public Bot setting for Discord-provided invite link ([#3519](https://github.com/NousResearch/hermes-agent/pull/3519)) by @mehmoodosman
- Revise v0.4.0 changelog — fix feature attribution, reorder sections ([untagged commit](https://github.com/NousResearch/hermes-agent))
---
## 👥 Contributors
### Core
- **@teknium1** — 157 PRs covering the full scope of this release
### Community Contributors
- **@alt-glitch** (Siddharth Balyan) — 2 PRs: Nix flake with uv2nix build, NixOS module, and persistent container mode ([#20](https://github.com/NousResearch/hermes-agent/pull/20)); auto-generated config keys and suffix PATHs for Nix builds ([#3061](https://github.com/NousResearch/hermes-agent/pull/3061), [#3274](https://github.com/NousResearch/hermes-agent/pull/3274))
- **@ctlst** — 1 PR: Prevent AsyncOpenAI/httpx cross-loop deadlock in gateway mode ([#2701](https://github.com/NousResearch/hermes-agent/pull/2701))
- **@memosr** (memosr.eth) — 1 PR: Add request timeouts to `send_message_tool` HTTP calls ([#3162](https://github.com/NousResearch/hermes-agent/pull/3162))
- **@mehmoodosman** (Osman Mehmood) — 1 PR: Fix Discord docs for Public Bot setting ([#3519](https://github.com/NousResearch/hermes-agent/pull/3519))
### All Contributors
@alt-glitch, @ctlst, @mehmoodosman, @memosr, @teknium1
---
**Full Changelog**: [v2026.3.23...v2026.3.28](https://github.com/NousResearch/hermes-agent/compare/v2026.3.23...v2026.3.28)