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 流式输出也会崩:Gemini reasoning-only delta 的 .content 空洞只有思考没有正文,Hermes 流式输出也会崩:Gemini reasoning-only delta 的 .content 空洞

Gemini Code Assist streaming 中 reasoning-only delta 先于正文到达,Hermes 旧版 _make_stream_chunk 没有补 content=None,导致 downstream 访问 delta.content 时报 AttributeError。本文复盘 #24974:为什么流式 chunk schema 必须稳定。

Discord 免 @ 频道变成 thread 工厂:Hermes free-response 为什么每条消息都新开线程Discord 免 @ 频道变成 thread 工厂:Hermes free-response 为什么每条消息都新开线程

Hermes Discord free-response channel 本应免 @ 并 inline reply,但旧代码只跳过 mention 检查,没有把 is_free_channel 传给 auto-thread gate,导致每条消息都新开 thread。本文复盘 #25310。

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 修复方向。