DeepAI Paper Hermes Agent 教程 自动安装最怕半路要密码:Hermes 在 Playwright 步骤卡住 sudo 的半成品安装坑

自动安装最怕半路要密码:Hermes 在 Playwright 步骤卡住 sudo 的半成品安装坑

自动安装脚本最怕的不是失败,而是停在一个没人能输入的密码提示上。

NousResearch/hermes-agent issue #25816 讲的就是这个问题:用户在 Debian 上用一个专门的非 sudo 系统用户 hermes 安装 Hermes,安装器跑到 Playwright Chromium 依赖步骤时突然要求输入 sudo 密码。

日志停在这里:

✓ Node.js dependencies installed
→ Installing browser engine (Playwright Chromium)...
→ Playwright may request sudo to install browser system dependencies (shared libraries).
→ This is standard Playwright setup — Hermes itself does not require root access.
Installing dependencies...
Switching to root user to install dependencies...
[sudo] password for hermes:

问题是:这个 hermes 用户本来就是专门用于跑服务的非 sudo 用户。

它没有 sudo 密码,也不该有 sudo 权限。

于是安装器直接卡死。


表面问题:Playwright 要装 Chromium 依赖

Hermes 安装流程里有一步:

install_node_deps

其中会执行类似:

npx playwright install --with-deps chromium

--with-deps 在 Debian / Ubuntu 这类系统上可能会调用 apt 安装浏览器系统依赖。

这一步需要 root 权限。

如果当前用户没有免密 sudo,就会出现:

[sudo] password for hermes:

对交互式普通用户来说,这可能只是输入密码。

但对 dedicated service user 来说,这就是死局。


真正严重的点:它卡在 setup_path 之前

这个 issue 最值得写的地方,不是 Playwright 安装失败。

而是安装顺序。

issue 中指出,main() 的调用顺序大概是:

install_deps
install_node_deps      # 卡在这里
setup_path             # 还没执行

这意味着 Playwright 这个浏览器相关的可选步骤卡住后,后面的 setup_path() 根本没有机会运行。

结果是:

1. hermes 命令没有被放进 PATH; 2. 用户不能运行 hermes doctor; 3. 直接跑原始入口可能绕过 venv launcher; 4. 最后出现看似不相关的 Python 依赖错误。

例如:

ModuleNotFoundError: No module named 'dotenv'

用户可能会误以为是 Python 包没装好。

但真正原因是安装流程前面被可选浏览器步骤卡断,launcher shim 没创建。


为什么这是安装器设计问题?

浏览器能力通常是增强功能,不应该阻断核心 CLI 安装。

换句话说:

没有 Chromium,Hermes 可以先安装好;
没有 hermes 命令,用户连排查入口都没有。

所以更合理的优先级应该是:

1. 先保证核心命令可用; 2. 再安装可选浏览器能力; 3. 如果浏览器依赖装不了,给出清晰手动命令; 4. 不要让非 sudo 用户停在 sudo prompt 上。


这个问题为什么常见于服务用户安装?

很多生产环境会创建一个专门用户:

useradd --system --create-home hermes

然后把服务、配置、数据目录都放在这个用户下。

这样做的好处是:

  • 权限最小化;
  • 不用 root 跑 Agent;
  • 日志和数据归属清楚;
  • systemd 服务更容易隔离。

但这种用户通常:

  • 没有 shell 登录密码;
  • 不在 sudoers;
  • 不能执行 apt install
  • 也不应该被要求安装系统包。

所以安装脚本遇到这种环境时,不能假设用户能完成 sudo prompt。


更合理的行为:先检测 sudo -n

issue 里提到,Hermes 的其他安装步骤已经有类似思路:

sudo -n true

这条命令的意义是:

检查当前用户是否可以免交互 sudo。

如果不行,就不要进入会卡住的 sudo prompt。

对 Playwright 步骤也应该类似:

  • 如果有 passwordless sudo:可以自动安装系统依赖;
  • 如果没有:跳过 --with-deps,提示用户手动安装;
  • 如果没有 TTY:默认跳过,不要阻塞;
  • 如果有 TTY:可以询问是否安装浏览器引擎。

用户侧怎么判断自己踩中了这个坑?

如果你的安装卡在:

Installing browser engine (Playwright Chromium)

然后出现:

[sudo] password for hermes:

同时你使用的是:

  • Debian / Ubuntu;
  • dedicated service user;
  • 非 sudo 用户;
  • systemd 服务账号;

那基本就是这个问题。

另一个典型信号是:中断安装后发现:

hermes doctor

不存在。

这说明安装还没跑到 PATH / launcher 配置阶段。


临时规避方案

在修复版本前,可以考虑几种方式。

方案一:先用有 sudo 权限的管理员安装系统依赖

让管理员手动安装 Playwright 所需依赖,然后服务用户只安装 Hermes 本体。

这符合权限分离:系统包由管理员装,服务用户只跑应用。

方案二:跳过浏览器步骤,先保证 Hermes CLI 可用

如果安装器支持环境变量或参数跳过 Playwright,优先跳过浏览器工具。

核心目标是先拿到:

hermes
hermes doctor

浏览器能力可以稍后补。

方案三:不要用非 sudo 用户跑全自动安装器

如果安装器当前没有 graceful fallback,可以先用普通管理用户完成安装,再调整运行用户和服务权限。

这不是最优雅,但比半安装状态更可控。

方案四:升级到包含相关 PR 的版本

评论里指出这是 #22152 的重复问题,并提到:

  • PR #25814
  • PR #23500

都在处理这个方向。

升级时重点看安装器是否已经:

  • 避免卡在 sudo prompt;
  • 把 Playwright 设为可选步骤;
  • 在非交互环境下跳过浏览器安装;
  • 保证 setup_path() 不被可选步骤阻断。

对 DeepAI API 中转站用户的边界说明

这篇问题发生在 Hermes 安装器和 Playwright 浏览器依赖步骤,不在模型 API 层。

DeepAI API 中转站能帮你解决的是:

  • OpenAI-compatible Base URL;
  • API Key 管理;
  • 模型调用入口统一;
  • 在支持自定义 Base URL 的客户端中切换模型。

但它不能修复:

  • 安装器卡在 sudo prompt;
  • systemd 服务用户没有 sudo 权限;
  • Playwright 系统依赖安装;
  • PATH launcher 没创建。

所以排查这类问题时,要先分层:

安装器 / 系统依赖 / PATH

和:

模型 API / Base URL / API Key

不是同一层。


FAQ

为什么 Hermes 安装要装 Playwright?

Playwright 用于浏览器相关能力,例如网页自动化或浏览器工具。它是增强能力,不应该阻断核心 CLI 安装。

为什么非 sudo 用户会卡住?

因为 npx playwright install --with-deps chromium 可能调用系统包管理器,需要 root 权限。非 sudo 用户无法完成密码提示。

为什么中断后 hermes doctor 不存在?

因为安装流程卡在 install_node_deps,还没执行后面的 setup_path(),launcher shim 没创建。

ModuleNotFoundError: No module named dotenv 是根因吗?

通常不是。它可能是你绕过 launcher 直接运行原始入口导致系统 Python 被使用。根因仍是安装未完成。

最理想修复是什么?

Playwright 浏览器步骤应可选、可跳过、非致命;在没有免密 sudo 或没有 TTY 时,不应阻塞整个安装。


总结

#25816 的核心教训是:

可选浏览器步骤,不应该卡死核心安装流程。

对安装器来说,最重要的不是把所有增强能力一次装完,而是保证失败可恢复、命令可用、诊断入口存在。

如果一个非 sudo 服务用户因为 Playwright 的 sudo prompt 卡住,最后连 hermes doctor 都没有,那问题就不只是 Playwright,而是安装器的容错顺序需要调整。

Related Post

Hermes 的 Custom Endpoint 和 API Server 不是一回事:接 DeepAI 前先别搞反Hermes 的 Custom Endpoint 和 API Server 不是一回事:接 DeepAI 前先别搞反

Hermes 里有两个 OpenAI-compatible:Custom Endpoint 用来接 DeepAI 这样的上游模型,API Server 用来让 Open WebUI、LobeChat 等前端连接 Hermes。本文讲清 Base URL、API Key 和链路区别。

Telegram 一直提示 Interrupting current task?Hermes Gateway busy lock 卡死排查Telegram 一直提示 Interrupting current task?Hermes Gateway busy lock 卡死排查

Hermes Telegram 反复提示 Interrupting current task,但 /stop 又说 No active task to stop?这通常是 Gateway adapter._active_sessions 与 runner._running_agents 状态分裂导致的 stale busy lock。本文解释症状、/restart 临时恢复和 #14513 修复方向。

Hermes 命令一跑就卡死:install.sh 重跑后为什么把 CLI 入口改成了自我调用Hermes 命令一跑就卡死:install.sh 重跑后为什么把 CLI 入口改成了自我调用

重跑 Hermes install.sh 后,hermes doctor 没报错也没输出,只是一直卡住?本文复盘 #21454:旧版 ~/.local/bin/hermes symlink 被新版 cat > wrapper 穿透覆盖,导致 venv/bin/hermes 变成自我 exec 的无限循环。