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

DeepSeek Anthropic-compatible API 第二轮 HTTP 400:为什么 thinking blocks 不能被一刀切剥掉?DeepSeek Anthropic-compatible API 第二轮 HTTP 400:为什么 thinking blocks 不能被一刀切剥掉?

Hermes 使用 DeepSeek Anthropic-compatible Messages API 且启用 reasoning_effort 时,多轮会话第二轮可能报 HTTP 400:content[].thinking must be passed back。本文客观复盘 #22313:convert_messages_to_anthropic 如何剥掉 thinking blocks,为什么 DeepSeek/Kimi 需要保留 unsigned thinking,以及 provider-aware adapter 的修复方向。

Hermes Docker 里读不到 GITHUB_TOKEN?~/.hermes/.env 环境变量转发排错指南Hermes Docker 里读不到 GITHUB_TOKEN?~/.hermes/.env 环境变量转发排错指南

Hermes config set GITHUB_TOKEN 后,Docker terminal 里仍读不到环境变量?这可能是 Docker exec 只转发当前 shell env,却没加载 ~/.hermes/.env。本文解释 GITHUB_TOKEN、docker_forward_env、~/.gitconfig 挂载和容器内 printenv 排查方法。

模型明明能用,菜单里却没有:Hermes Copilot /model 选择器为什么藏起新模型模型明明能用,菜单里却没有:Hermes Copilot /model 选择器为什么藏起新模型

Hermes Copilot /model 选择器只查 COPILOT_GITHUB_TOKEN / GH_TOKEN / GITHUB_TOKEN,没 fallback 到 auth.json 里的 OAuth access_token,导致 claude-opus-4.7、gpt-5.5 等模型能直接输入使用,却不出现在菜单里。本文复盘 #16708。