在 Windows 上离线运行 Hermes Agent:从零构建一个 700MB 的便携包

在 Windows 上离线运行 Hermes Agent:从零构建一个 700MB 的便携包

在 Windows 上离线运行 Hermes Agent:从零构建一个 700MB 的便携包

前言

Hermes Agent 是 NousResearch 开源的 AI Agent 框架,支持代码执行、浏览器自动化、定时任务、多平台消息网关等丰富功能。但官方安装流程依赖 curl | bash 和系统级 Python/Node.js,在 Windows 环境下部署一直是个痛点。

本文记录将 Hermes Agent v0.13.0 完整封装为 Windows 离线便携包 的全过程。最终产物是一个 687MB 的自解压 EXE,双击安装即可在任意 Windows 10/11 机器上运行,无需管理员权限,无需预先安装任何运行时。

一、为什么需要便携包

1.1 官方安装的局限性

官方 install.ps1 脚本虽然是用户级安装(无需管理员),但仍存在以下问题:

依赖系统 Python 3.11+ 和 Node.js 22+

需要联网下载大量依赖(pip + npm)

better-sqlite3 等原生模块需要 Visual Studio Build Tools

安装路径散落在 ~/.hermes、~/.local、AppData 等多个目录

换机器需要重新走完整安装流程

1.2 便携包的设计目标

目标

实现方式

零依赖

嵌入式 Python 3.11 + Node.js 22 + PortableGit 全部内置

离线可用

所有 pip/npm 依赖预装,Playwright Chromium 预下载

任意目录

启动时自动修复 pyvenv.cfg 和 launcher shebang 路径

无管理员

纯用户级运行,不写注册表,不碰系统目录

可迁移

整个目录复制到新机器即可使用

二、目录结构

Hermes-Portable/

├── app/hermes-agent/ # 源码 + venv + node_modules (~1GB)

│ ├── venv/ # Python 虚拟环境

│ ├── node_modules/ # npm 依赖

│ ├── ui-tui/ # TUI 组件

│ └── hermes_cli/ # CLI 入口包

├── runtime/ # 运行时环境 (~1.3GB)

│ ├── python/ # Python 3.11.9 嵌入式

│ ├── nodejs/ # Node.js 22.22.2

│ ├── git/ # PortableGit 2.54.0

│ └── playwright-browsers/ # Chromium 引擎 (~670MB)

├── hermes/ # 用户数据(可备份)

│ ├── .env # API 密钥

│ ├── config.yaml # 主配置

│ ├── SOUL.md # 人格设定

│ ├── sessions/ # 聊天记录

│ └── skills/ # 自定义技能

├── scripts/fix-paths.ps1 # 路径自动修复 + 缓存

├── start.bat # 启动 CLI(通用入口)

├── setup.bat # 首次配置向导

├── gateway.bat # 启动消息网关

├── set-model.bat # 设置模型

├── clean.bat # 恢复出厂设置

└── README.md

三、关键技术实现

3.1 嵌入式 Python + virtualenv

Python 官方提供的 python-3.11.9-embed-amd64.zip 是精简版,不包含 venv 模块。需要先用 get-pip.py 安装 pip,再安装 virtualenv:

# 安装 pip

runtime\python\python.exe get-pip.py

# 安装 virtualenv(embedded Python 没有 venv)

runtime\python\python.exe -m pip install virtualenv

# 创建虚拟环境

runtime\python\python.exe -m virtualenv app\hermes-agent\venv

这里有一个坑:清华镜像源的 get-pip.py 404,最终使用官方源才成功:

Invoke-WebRequest -Uri "https://bootstrap.pypa.io/get-pip.py" -OutFile "get-pip.py"

3.2 四级依赖降级策略

Hermes 的 pyproject.toml 定义了大量 extras,[all] 安装可能会失败。实际采用四级降级:

# Tier 1: 全量安装(大概率失败)

venv\Scripts\pip install -e ".[all]"

# Tier 2: 常用 extras(推荐)

venv\Scripts\pip install -e ".[web,mcp,cron,cli,voice,messaging,slack,dev,pty,homeassistant,sms,tts-premium,honcho,google,mistral,bedrock,dingtalk,feishu,modal,daytona,vercel]"

# Tier 3: 核心功能

venv\Scripts\pip install -e ".[web,mcp,cron,cli,messaging,dev]"

# Tier 4: 裸包(保底)

venv\Scripts\pip install -e "."

3.3 npm install 的陷阱

TUI 组件依赖 better-sqlite3,这是一个原生 C++ 模块,需要 VS Build Tools。在便携包环境中没有 Build Tools,初次安装会报错:

npm ERR! gyp ERR! find VS could not find a copy of Visual Studio

解决方案是 --ignore-scripts 跳过 postinstall:

cd app\hermes-agent

npm install --ignore-scripts

cd ui-tui

npm install --ignore-scripts

等安装完 VS Build Tools 后,可以重新跑完整 npm install 让 better-sqlite3 正确编译。

3.4 Launcher Shebang 硬编码问题(Critical)

这是整个项目中最隐蔽的 bug。

setuptools 生成的 hermes.exe launcher 是一个 PE 可执行文件,文件尾部嵌入了 shebang:

#!E:\Hermes-Portable\app\hermes-agent\venv\Scripts\python.exe

当用户把包解压到 D:\ 时,launcher 仍然尝试调用 E:\... 的 Python,报错:

Fatal error in launcher: Unable to create process using '"E:\Hermes-Portable\..."'

修复方案:彻底绕过 launcher

所有 BAT 脚本不再调用 hermes.exe,改用直接调用 Python 模块:

:: 修改前(已废弃)

hermes chat

:: 修改后(推荐)

"%ROOT%\app\hermes-agent\venv\Scripts\python.exe" -m hermes_cli.main chat

同时保留 fix-paths.ps1 对 .exe launcher 的 shebang 修复作为兜底:

# 扫描 .exe 文件尾部 2KB 区域的所有 "#!" 标记

# 匹配后面跟着盘符路径 + python 的 shebang

# 用新路径原地替换(同长度)或填充 null(新路径更短)

3.5 PYTHONPATH 缺失问题

绕过 launcher 后,又遇到新问题:

Error while finding module specification for 'hermes_cli.main'

ModuleNotFoundError: No module named 'hermes_cli'

原因是 hermes_cli 是本地包(位于 app/hermes-agent/hermes_cli),venv 的 Python 默认搜索路径不包含它。需要在 BAT 中显式设置 PYTHONPATH:

set "PYTHONPATH=%ROOT%\app\hermes-agent"

3.6 启动缓存优化

fix-paths.ps1 每次启动都要扫描 50+ 个 .exe launcher 修复 shebang,耗时 2-5 秒。这对用户体验是不可接受的。

优化方案:.pathfix_cache

$cacheFile = Join-Path $PortableRoot "hermes\.pathfix_cache"

if (Test-Path $cacheFile) {

$cachedRoot = Get-Content $cacheFile

if ($cachedRoot -eq $PortableRoot) {

# 路径未变,跳过所有修复

exit 0

}

}

# ... 完整修复逻辑 ...

$PortableRoot | Out-File $cacheFile

效果:首次启动 ~2s(完整修复),后续启动 24ms(直接跳过)。

3.7 便携包自动检测

即使 BAT 脚本设置了 HERMES_HOME,如果用户从 PowerShell 直接运行 python -m hermes_cli.main,HERMES_HOME 未设置,数据会泄露到 C:\Users\<用户名>\.hermes。

修复:修改 hermes_constants.py

def get_hermes_home():

val = os.environ.get("HERMES_HOME", "").strip()

if val:

return Path(val)

# 便携包自动检测

try:

import sys

exe = Path(sys.executable).resolve()

parts = exe.parts

for i, part in enumerate(parts):

if "hermes-portable" in part.lower():

portable_root = Path(*parts[:i + 1])

hermes_home = portable_root / "hermes"

if hermes_home.is_dir():

return hermes_home

except Exception:

pass

# fallback: ~/.hermes

return Path.home() / ".hermes"

四、制作自解压 EXE

使用 7-Zip SFX 模块制作安装包:

# 1. 压缩(-mx=1 最快级别,减少打包时间)

7z.exe a -t7z -mx=1 -mmt=on -y "Hermes-Portable.7z" "Hermes-Portable"

# 2. SFX 配置

$config = @"

;!@Install@!UTF-8!

Title="Hermes Agent Portable v0.13.0"

BeginPrompt="即将安装 Hermes Agent v0.13.0 便携版到 D:\Hermes-Portable"

InstallPath="D:\Hermes-Portable"

OverwriteMode="2"

GUIFlags="8+32"

GUIMode="1"

;!@InstallEnd@!

"@

# 3. 合并

cmd /c "copy /b 7z.sfx + sfx-config.txt + Hermes-Portable.7z Hermes-Agent-Setup.exe"

最终产物:

原始包:2.3GB(解压后)

7z 压缩包:687MB

自解压 EXE:687MB

五、打包前安全检查(Mandatory)

真实踩坑:首次打包时遗漏了 .env 中的 MINIMAX_CN_API_KEY,导致分发包中包含真实 API 密钥。

打包前必须执行的安全清单:

# 1. 终止占用进程(防止 state.db 被锁定)

Get-Process | Where-Object {

$_.Modules | Where-Object { $_.FileName -like "*Hermes-Portable*" }

} | Stop-Process -Force

# 2. 删除敏感文件

$files = @("auth.json", "auth.lock", "state.db", "state.db-shm", "state.db-wal",

".hermes_history", ".skills_prompt_snapshot.json", "models_dev_cache.json",

"memory_store.db", "kanban.db")

foreach ($f in $files) {

Remove-Item "hermes/$f" -Force -ErrorAction SilentlyContinue

}

# 3. 重置配置为模板

copy .env.example her\.env

copy cli-config.yaml.example hermes\config.yaml

# 4. 清空数据目录

Remove-Item hermes\sessions\* -Recurse -Force

Remove-Item hermes\logs\* -Recurse -Force

Remove-Item hermes\memories\* -Recurse -Force

# 5. 删除自定义 skills(保留 .bundled_manifest)

Get-ChildItem hermes\skills -Directory | Remove-Item -Recurse -Force

六、P0 测试验证

打包完成后运行自动化验证脚本,全部通过方可分发:

测试项

验证内容

结果

路径修复

手动破坏 pyvenv.cfg,验证自动修复

✅ PASS

启动

start.bat version 输出版本号

✅ PASS

诊断

start.bat doctor 42+ pass, 0 fail

✅ PASS

可移动性

复制到新目录,验证仍能启动

✅ PASS

编码

所有 .bat 无 UTF-8 BOM

✅ PASS

Launcher 绕过

BAT 脚本使用 python.exe -m,不调用 hermes.exe

✅ PASS

缓存

.pathfix_cache 使二次启动 < 100ms

✅ PASS

敏感数据

hermes/ 目录无 auth.json, state.db 等

✅ PASS

七、快速开始

7.1 安装

下载 Hermes-Agent-v0.13.0-Win-Early-Beta-Setup.exe(687MB)

双击运行,点击 Install

自动解压到 D:\Hermes-Portable

7.2 配置

cd D:\Hermes-Portable

setup.bat

按提示配置 API Key(推荐 OpenRouter)。

7.3 启动

start.bat

或执行子命令:

start.bat doctor # 运行诊断

start.bat skills list # 列出技能

start.bat sessions # 查看会话历史

八、总结

本文完整记录了 Hermes Agent Windows 便携包的构建过程,涵盖:

嵌入式 Python + virtualenv 隔离方案

npm 原生模块编译的绕过策略

setuptools launcher shebang 硬编码问题的根治方案

启动缓存优化(2-5s → 24ms)

便携包自动检测防止数据泄露

7-Zip SFX 自解压安装包制作

打包前敏感数据清理清单

最终产物是一个 687MB 的自解压 EXE,在 Windows 10/11 上双击即用,无需任何预先安装。

参考链接

Hermes Agent 官方仓库:https://github.com/NousResearch/hermes-agent

Python 嵌入式发行版:https://www.python.org/downloads/windows/

7-Zip SFX 文档:https://www.7-zip.org/7z.html

本文涉及的完整构建脚本:https://github.com/your-repo/hermes-portable-tool

下载

夸克网盘:https://pan.quark.cn/s/9973b9c3312a

文件名:Hermes-Agent-v0.13.0-Win-Early-Beta-Setup.exe

SHA256:9AEC77AD1BEC0719630AE3C334688B607F3BFD9F5B2BDE6CFE4A2BC18888C55D


相关推荐

全球最顶级的6大汽车音响,你知道多少?B&O仅排第三
梦琪名字寓意,梦琪名字的含义,梦琪取名的寓意和含义是什么
谷歌账号登录失败?10大原因及解决方法详解
《喜欢你》电影高清完整版在线观看
2023年国产入耳式耳机4款,不超过300也有好音质
360手机官方刷机教程(N5系列通用)