Hermes Agent Windows 原生版深度指南:早期 Beta 版本的全流程解析与实战

「本文核心问题:在没有 WSL、Cygwin 或 Docker 的情况下,如何在 Windows 10/11 上原生安装、配置并稳定运行 Hermes Agent?」

Hermes Agent 现已支持在 Windows 10 和 Windows 11 上原生运行。这意味着你不再需要依赖 WSL(Windows Subsystem for Linux)、Cygwin 或 Docker 容器环境。这是一个重要的里程碑,但作为早期 Beta 版本,它在子进程处理、路径特性以及非 ASCII 控制台输出方面可能还存在一些“粗糙的边缘”。本文将深入剖析原生 Windows 版本的技术细节、安装机制、架构逻辑以及常见问题的排查方法,帮助技术人员在 Windows 环境下顺利部署 Hermes。


一、原生的价值:为什么要选择 Windows 原生版?

「本节核心问题:Windows 原生版与 WSL2 版本相比,功能差异在哪里?」

对于许多开发者而言,WSL2 已经成为 Windows 上开发 Linux 应用的标准配置。然而,Hermes 推出原生 Windows 版本的初衷是消除中间层,直接在 Windows 系统上运行,减少资源开销,并简化文件系统的交互。

1.1 功能矩阵对比

并不是所有功能在原生 Windows 和 WSL2 上都完全一致。通过下表,你可以清晰地判断应该选择哪条路径。

功能特性 原生 Windows 支持情况 WSL2 支持情况 备注
「CLI 命令行工具」 ✓ 完全支持 ✓ 完全支持 包括 hermes chat, setup, gateway
「交互式 TUI」 ✓ 完全支持 ✓ 完全支持 hermes --tui 模式
「消息网关」 ✓ 完全支持 ✓ 完全支持 支持 Telegram, Discord, Slack, WhatsApp 等 15+ 平台
「Cron 调度器」 ✓ 完全支持 ✓ 完全支持 定时任务支持
「浏览器工具」 ✓ 完全支持 ✓ 完全支持 基于 Node.js 驱动 Chromium
「MCP 服务器」 ✓ 完全支持 ✓ 完全支持 支持 stdio 和 HTTP 模式
「本地模型服务」 ✓ 完全支持 ✓ 完全支持 支持 Ollama / LM Studio / llama-server
「Web 仪表盘」 ✓ 完全支持 ✓ 完全支持 查看会话、任务、指标和配置
「仪表盘嵌入式终端」 ✗ 不支持 ✓ 支持 原生版缺乏 POSIX PTY 支持
「登录时自启动」 ✓ 支持 ✓ 支持 原生版通过任务计划程序实现

「深度解析:仪表盘嵌入式终端的限制」
原生 Windows 版本目前唯一缺失的功能是仪表盘中的嵌入式终端面板。这是因为该功能依赖于 POSIX PTY(伪终端)接口,而 Windows 原生环境没有直接等价的原语。虽然 Windows 有 ConPTY,但这需要单独的实现逻辑,目前开发团队将其列为后续工作。因此,如果你严重依赖仪表盘中的终端交互功能,WSL2 版本可能更适合你;除此之外,其他所有核心功能均已原生支持。

「图片来源:Unsplash」


二、安装机制深度剖析:安装脚本背后做了什么?

「本节核心问题:执行一条安装命令后,系统环境具体发生了哪些变化?」

Hermes 的安装设计哲学是“零依赖、无管理员权限”。它不要求你预先安装 Python 或 Node.js,而是自带了一套完整的引导流程。

2.1 极速安装命令

打开 PowerShell 或 Windows Terminal,执行以下命令:

irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1 | iex

该命令无需管理员权限。安装程序会将所有文件放置在 %LOCALAPPDATA%\hermes\ 目录下,并将 hermes 命令添加到你的用户 PATH 环境变量中。安装完成后,你需要「关闭当前终端并重新打开」一个新的窗口,以便 PATH 生效。

2.2 安装流程的十个关键步骤

如果你希望了解安装脚本的具体逻辑,以下是它从头到尾执行的十个步骤。这有助于你在遇到问题时进行排查。

  1. 「引导安装 uv:安装脚本首先会部署 uv——由 Astral 开发的高速 Python 包管理器。它被安装到 %USERPROFILE%\.local\bin
  2. 「安装 Python 3.11」:通过 uv 自动安装 Python 3.11。这意味着即使你的系统没有预装 Python,也能正常运行。
  3. 「安装 Node.js 22」:脚本会检查 winget 是否可用。如果可用,则通过 winget 安装;否则,下载便携版 Node.js 压缩包解压到 %LOCALAPPDATA%\hermes\node。Node.js 是浏览器工具和 WhatsApp 桥接器的运行基础。
  4. 「安装便携版 Git」:如果系统 PATH 中没有 git,脚本会下载一个精简的、自包含的 PortableGit(约 45 MB)到 %LOCALAPPDATA%\hermes\git。这不会修改注册表,也不需要管理员权限,不会干扰系统中可能存在的其他 Git 版本。
  5. 「克隆代码仓库」:将 Hermes Agent 代码克隆到 %LOCALAPPDATA%\hermes\hermes-agent,并在其中创建虚拟环境。
  6. 「分层依赖安装」:这是保证安装健壮性的关键步骤。脚本首先尝试安装完整依赖 .[all]。如果因为 GitHub 速率限制导致某个 git+https 依赖下载失败,它会自动回退到更小的依赖集(如 [messaging,dashboard,ext] -> [messaging] -> .)。这种分层策略防止了“因单一依赖失败导致整体安装中断”的情况。
  7. 「自动安装消息 SDK」:脚本会检测 .env 文件中的配置。如果检测到 TELEGRAM_BOT_TOKENDISCORD_BOT_TOKEN 等变量,它会自动运行 pip install 安装对应平台的 SDK,确保消息网关功能可用。
  8. 「设置 Git Bash 路径」:设置环境变量 HERMES_GIT_BASH_PATH,确保 Hermes 在新的 Shell 会话中能准确找到 bash.exe
  9. 「更新用户 PATH」:将 %LOCALAPPDATA%\hermes\bin 添加到用户 PATH 变量中,使得 hermes 命令全局可用。
  10. 「运行配置向导」:执行 hermes setup,引导你选择模型、提供商和工具集。你可以通过参数 -SkipSetup 跳过此步骤。

2.3 高级安装参数

如果你需要对安装过程进行定制,可以使用脚本块形式传递参数:

& ([scriptblock]::Create((irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1))) -NoVenv -SkipSetup -Branch main
参数 默认值 用途说明
-Branch main 指定要克隆的代码分支,常用于测试特定的 PR。
-NoVenv 关闭 跳过虚拟环境创建(高级选项,意味着你需要自行管理 Python 环境)。
-SkipSetup 关闭 跳过安装后的 hermes setup 配置向导。
-HermesHome %LOCALAPPDATA%\hermes 覆盖默认的数据主目录。
-InstallDir ...\hermes-agent 覆盖默认的代码存放位置。

三、Windows 下的 Shell 命令执行策略

「本节核心问题:Hermes 如何在 Windows 上实现类似 Linux 的 Shell 命令执行能力?」

在 Windows 上运行类 Unix 工具链的一大挑战是 Shell 环境的差异。Hermes 的终端工具通过 「Git Bash」 来执行命令,这避免了为 Windows 重写每一个工具的繁琐工作。

3.1 Bash 的发现机制

Hermes 查找 bash.exe 的顺序如下,这确保了优先使用由安装程序管理的版本,同时也兼容用户已有的系统配置:

  1. 检查环境变量 HERMES_GIT_BASH_PATH 是否设置。
  2. 查找 %LOCALAPPDATA%\hermes\git\usr\bin\bash.exe(安装程序提供的 PortableGit 路径)。
  3. 查找 %LOCALAPPDATA%\hermes\git\bin\bash.exe(旧版 Git-for-Windows 的目录结构)。
  4. 查找系统安装的 Git-for-Windows(如 %ProgramFiles%\Git\bin\bash.exe)。
  5. 最后尝试在 PATH 中查找 MSYS2、Cygwin 或其他 bash.exe

「作者反思:」
这种设计非常巧妙。它没有试图在 Windows 上重新发明轮子(比如强行用 PowerShell 解析 Bash 脚本),而是利用了广泛存在的 Git Bash 环境。通过环境变量显式指定路径,解决了“新终端会话找不到 Bash”的经典 Windows 痛点。这也提醒我们,在 Windows 上开发跨平台工具时,利用现有的 POSIX 兼容层(如 Git Bash)往往比硬移植更高效。

3.2 避坑指南:MinGit 与 Busybox

如果你手动解压 MinGit,请注意选择正确的变体。

  • 「错误选择」MinGit-*-busybox*.zip。Busybox 构建版本提供的是 ash 而不是 bash,且缺少许多核心工具。
  • 「正确选择」MinGit-*-64-bit.zip。确保 Bash 位于 usr\bin\bash.exe

四、控制台 UTF-8 编码问题解决方案

「本节核心问题:如何防止 Windows 控制台在输出中文或特殊字符时崩溃?」

Windows 控制台默认使用的代码页(通常是 cp1252 或 cp437)与现代 Unicode 环境格格不入。Hermes 的界面元素(如 Banner、工具描述)包含大量 Unicode 字符,如果不处理,直接抛出 UnicodeEncodeError

4.1 自动修复机制

Hermes 在启动入口点(如 cli.py::main)会调用 configure_windows_stdio() 函数,执行以下修复:

  1. 「切换代码页」:调用 kernel32.SetConsoleCP 将控制台代码页设置为 CP_UTF8 (65001)。
  2. 「重配置标准流」:将 sys.stdoutsys.stderrsys.stdin 强制重配置为 UTF-8 编码,错误处理模式设为 replace
  3. 「环境变量继承」:设置 PYTHONIOENCODING=utf-8PYTHONUTF8=1,确保子 Python 进程也能继承 UTF-8 设置。
  4. 「默认编辑器」:如果未设置 EDITORVISUAL,默认设置为 notepad

4.2 实际场景:中文乱码排查

如果你在 CLI 中看到中文、日文或阿拉伯字符显示为问号 ?,通常是因为 UTF-8 垫片未生效。

  • 「检查环境变量」:确认 HERMES_DISABLE_WINDOWS_UTF8 「未」设置为 1。
  • 「终端兼容性」:非常旧的 cmd.exe 可能不支持 UTF-8。建议升级到 「Windows Terminal」,它对现代控制台特性的支持远超传统控制台主机。

五、编辑器集成与快捷键优化

「本节核心问题:如何在 Windows 上配置编辑器以支持多行输入?」

在命令行中输入复杂的 Prompt 时,单行输入往往不够用。Hermes 支持 Ctrl-X Ctrl-E 快捷键呼出外部编辑器,这在 Windows 上曾是一个痛点。

5.1 默认行为与配置

早期版本中,由于 prompt_toolkit 硬编码了 POSIX 路径(如 /usr/bin/vi),导致该功能在 Windows 上无效。现在的版本默认将 EDITOR 设为 notepad。记事本虽然是阻塞模式,但足以满足基本需求。

「推荐配置:VS Code」
对于习惯使用 VS Code 的开发者,建议在 PowerShell 配置文件中设置:

# 编辑 $PROFILE
$env:EDITOR = "code --wait"

关键在于 --wait 参数。如果没有这个参数,VS Code 会立即返回,导致 Hermes 接收到一个空缓冲区。配置完成后,在 Hermes CLI 中按下 Ctrl-X Ctrl-E,VS Code 会弹出一个临时文件,编辑保存并关闭后,内容会自动回传到 CLI。

5.2 Ctrl+Enter 支持

在现代终端(如 Windows Terminal、VS Code 集成终端)中,Ctrl+Enter 被映射为“插入新行”。这让你可以直接在 CLI 中输入多行文本,而不需要先按 Esc 再按 Enter


六、网关服务与进程管理

「本节核心问题:如何让 Hermes Gateway 在后台静默运行并在登录时自动启动?」

在 Linux 上,我们习惯用 systemd 管理服务。在 Windows 上,Hermes 利用了「任务计划程序」而非传统的 Windows 服务。

6.1 为什么不用 Windows Service?

Windows 服务需要管理员权限安装,且其生命周期绑定于“机器启动”而非“用户登录”。对于 Hermes 这种个人助手工具,用户的需求通常是:“我登录了,助手开始工作;我注销了,助手随之停止”。任务计划程序配合 ONLOGON 触发器完美符合这一需求,且全程无需 UAC 提权。

6.2 安装与管理命令

「安装网关服务:」

hermes gateway install

「内部执行逻辑:」

  1. 执行 schtasks /Create /SC ONLOGON /RL LIMITED,创建一个以当前用户权限运行的任务。
  2. 如果组策略阻止 schtasks,则回退到在“启动”文件夹中创建快捷方式。
  3. 使用 pythonw.exe 而非 python.exe 启动进程。pythonw.exe 不附加控制台窗口,这能防止它被其他进程的 CTRL_C_EVENT 信号意外终止。

「管理命令:」

hermes gateway status    # 查看状态(整合了任务计划、启动项、PID)
hermes gateway start     # 立即启动任务
hermes gateway stop      # 优雅停止
hermes gateway restart
hermes gateway uninstall # 移除任务计划条目和启动项

6.3 进程管理的底层陷阱(开发者必读)

在 Windows 上进行进程管理有一个著名的坑:os.kill(pid, 0)
在 POSIX 中,这是一个无害的探活操作。但在 Windows Python 中,信号 0 会映射为 CTRL_C_EVENT,这会向整个控制台进程组广播 Ctrl+C 信号。
「后果」:本来只是想“看看这个进程还在不在”,结果把整个进程组里的程序都杀死了。Hermes 已经将所有相关代码迁移至 psutil.pid_exists(),并在 CI 中引入了 check-windows-footguns.py 脚本,严禁新代码使用 os.kill(pid, 0)


七、数据布局与卸载

「本节核心问题:Hermes 的文件分布在哪里?如何彻底清理?」

理解数据布局有助于备份配置和排查磁盘空间问题。

7.1 目录结构

路径 内容说明 删除建议
%LOCALAPPDATA%\hermes\hermes-agent\ Git 代码库 + Python 虚拟环境 可随时删除并重装。
%LOCALAPPDATA%\hermes\git\ 便携版 Git 仅由安装程序管理。
%LOCALAPPDATA%\hermes\node\ 便携版 Node.js 仅由安装程序管理。
%LOCALAPPDATA%\hermes\bin\ hermes.cmd 启动脚本 添加在 PATH 中。
%USERPROFILE%\.hermes\ 「用户数据」:配置、认证、技能、会话、日志 「重装时请保留」

这种设计将“基础设施”与“用户数据”分离。%LOCALAPPDATA% 下的内容是可抛弃的运行环境,而 %USERPROFILE%\.hermes 才是你需要备份的核心资产。你可以通过设置 HERMES_HOME 环境变量来改变数据目录的位置。

7.2 卸载流程

标准卸载命令:

hermes uninstall

这会清理任务计划、启动项和代码目录,但「保留」 .hermes 用户数据。
如果你希望彻底清除所有痕迹:

hermes uninstall
Remove-Item -Recurse -Force "$env:USERPROFILE\.hermes"
Remove-Item -Recurse -Force "$env:LOCALAPPDATA\hermes"

八、浏览器工具与常见故障排查

「本节核心问题:为什么浏览器工具报错?如何解决常见的环境冲突?」

8.1 浏览器工具的运行机制

Hermes 使用 agent-browser(一个 Node.js 辅助程序)来驱动 Chromium。
在 Windows 上,由于 CreateProcessW 无法直接执行无扩展名的 Shebang 脚本,Hermes 必须调用 .cmd 包装器。安装程序已通过 npm 将 agent-browser 添加到了 PATH 中。首次运行时,Playwright 会自动下载 Chromium 浏览器内核。

8.2 常见故障排查清单

「场景一:安装后找不到命令」

  • 「错误」hermes: command not found
  • 「原因」:PATH 变量更新未生效。
  • 「解决」「关闭并重新打开」 PowerShell 窗口。不要手动拼接 PATH,新窗口会自动读取用户环境变量。

「场景二:工具执行报错 “Not a valid Win32 application”」

  • 「错误」WinError 193
  • 「原因」:直接调用了 Node 脚本而非 .cmd 包装器。
  • 「解决」:确保命令行中调用的是 npx.cmd 而非 npx。Hermes 内部通过 shutil.which 处理了这个问题,如果你在编写插件,请务必注意这一点。

「场景三:网关无法发送 Telegram 图片」

  • 「错误」BadRequest: payload contains invalid characters
  • 「原因」:JSON 请求体中包含了未转义的 Windows 反斜杠路径。
  • 「解决」:这通常出现在自定义插件中。请使用 Hermes 提供的规范化路径对象,不要直接使用 str(Path(...)) 拼接原始用户输入,以免引入反斜杠转义问题。

「场景四:Git Pull 后编码异常」

  • 「现象」:配置文件报错,YAML 解析失败。
  • 「原因」:在旧版记事本或特定中文输入法环境下编辑文件,保存时意外添加了 UTF-8 BOM(字节顺序标记)。
  • 「解决」:使用现代编辑器(如 VS Code)将文件重新保存为“无 BOM 的 UTF-8”格式。Hermes 虽然容忍 BOM,但在某些 YAML 折叠标量块中,BOM 会导致解析静默失败。

九、实用摘要与操作清单

为了方便落地执行,以下汇总了核心操作要点。

9.1 安装与验证清单

  1. 「安装」:打开新 PowerShell,执行 irm ... | iex
  2. 「验证」:关闭终端,重新打开,运行 hermes --version
  3. 「配置」:运行 hermes setup,配置 API Key 和模型。
  4. 「启动服务」:运行 hermes gateway install 设置开机自启。

9.2 核心环境变量速查表

变量名 作用 推荐值/备注
HERMES_GIT_BASH_PATH 指定 Bash 路径 通常由安装程序自动设置。
EDITOR 指定外部编辑器 推荐 code --wait
HERMES_HOME 指定数据目录 默认为 ~/.hermes
HERMES_DISABLE_WINDOWS_UTF8 禁用 UTF-8 垫片 调试乱码时设为 1,平时保持未设置。

十、一页速览

「Hermes Agent Windows 原生版关键点:」

  • 「状态」:早期 Beta,核心功能已可用,唯独仪表盘嵌入式终端不支持。
  • 「架构」:不依赖 WSL,使用便携版 Python/Node/Git,数据隔离在用户目录。
  • 「Shell」:通过 Git Bash 桥接 POSIX 命令,无需重写工具链。
  • 「编码」:启动时强制控制台为 UTF-8,解决乱码根源。
  • 「服务」:利用任务计划程序实现用户级自启动,无需管理员权限。
  • 「避坑」:注意 .cmd 后缀调用、BOM 编码问题以及 os.kill 的 Windows 特性。

常见问答 (FAQ)

「Q1:Hermes 原生 Windows 版需要我预先安装 Python 或 Node.js 吗?」
不需要。安装脚本内置了引导程序,会自动安装隔离的 Python 3.11 和 Node.js 22 环境,不会影响系统现有环境。

「Q2:为什么我在仪表盘的“终端”标签页看到“请使用 WSL2”的提示?」
因为 Windows 原生缺少 POSIX PTY 接口,目前仪表盘的嵌入式终端仅支持在 WSL2 环境下使用。其他所有仪表盘功能在原生 Windows 下均正常。

「Q3:安装后运行 hermes 提示找不到命令怎么办?」
这是环境变量未刷新导致的。请完全关闭当前 PowerShell 或 Windows Terminal 窗口,重新打开一个新的窗口即可识别命令。

「Q4:我想用 VS Code 编辑多行 Prompt,该怎么设置?」
在 PowerShell 中执行 $env:EDITOR = "code --wait",或将其添加到 $PROFILE 配置文件中。注意必须包含 --wait 参数,否则编辑内容无法回传。

「Q5:我的 CLI 输出中文乱码,全是问号怎么办?」
首先确认未设置 HERMES_DISABLE_WINDOWS_UTF8 环境变量。如果仍有问题,请放弃旧版 cmd.exe,改用 Windows Terminal,后者对 UTF-8 支持更完善。

「Q6:Hermes Gateway 为什么不设计成 Windows 服务?」
Windows 服务绑定的是“机器启动”,且需要管理员权限。Hermes 作为个人助手,设计为“用户登录后启动”更符合使用场景,且利用任务计划程序可以免除 UAC 提权的繁琐。

「Q7:如何彻底卸载 Hermes?」
运行 hermes uninstall 后,若要删除所有数据,还需手动执行删除命令:Remove-Item -Recurse -Force "$env:USERPROFILE\.hermes"Remove-Item -Recurse -Force "$env:LOCALAPPDATA\hermes"