Nix & NixOS 安装配置#
Hermes Agent 提供了一个 Nix flake,支持三个层级的集成:| 层级 | 适用对象 | 提供内容 |
|---|
nix run / nix profile install | 任意 Nix 用户(macOS、Linux) | 包含所有依赖的预构建二进制文件——然后使用标准 CLI 工作流 |
| NixOS 模块(原生) | NixOS 服务器部署 | 声明式配置、加固的 systemd 服务、托管密钥 |
| NixOS 模块(容器) | 需要自我修改能力的 Agent | 以上所有功能,加上一个持久化 Ubuntu 容器,Agent 可在其中执行 apt/pip/npm install |
curl | bash 安装程序自行管理 Python、Node 及依赖项。Nix flake 替代了所有这些——每个 Python 依赖都是由 uv2nix 构建的 Nix derivation,运行时工具(Node.js、git、ripgrep、ffmpeg)已封装进二进制文件的 PATH 中。不需要运行时 pip,不需要激活 venv,不需要 npm install。对于非 NixOS 用户,这只影响安装步骤。之后的操作(hermes setup、hermes gateway install、编辑配置)与标准安装完全相同。对于 NixOS 模块用户,整个生命周期有所不同:配置存放在 configuration.nix 中,密钥通过 sops-nix/agenix 管理,服务是一个 systemd 单元,CLI 配置命令被屏蔽。管理 hermes 的方式与管理其他 NixOS 服务相同。前提条件#
API 密钥,用于你想使用的服务(至少需要一个 OpenRouter 或 Anthropic 密钥)
快速开始(任意 Nix 用户)#
无需克隆仓库。Nix 会自动获取、构建并运行所有内容:执行 nix profile install 后,hermes、hermes-agent 和 hermes-acp 将出现在你的 PATH 中。之后的工作流与标准安装完全相同——hermes setup 引导你完成提供商选择,hermes gateway install 设置 launchd(macOS)或 systemd 用户服务,配置存放在 ~/.hermes/。从本地克隆构建
NixOS 模块#
该 flake 导出 nixosModules.default——一个完整的 NixOS 服务模块,以声明式方式管理用户创建、目录、配置生成、密钥、文档和服务生命周期。此模块需要 NixOS。对于非 NixOS 系统(macOS、其他 Linux 发行版),请使用 nix profile install 和上述标准 CLI 工作流。
添加 Flake 输入#
最小化配置#
就这些。nixos-rebuild switch 会创建 hermes 用户、生成 config.yaml、连接密钥并启动 gateway——这是一个长期运行的服务,将 Agent 连接到消息平台(Telegram、Discord 等)并监听传入消息。上面的 environmentFiles 行假设你已配置 sops-nix 或 agenix。该文件至少应包含一个 LLM 提供商密钥(例如 OPENROUTER_API_KEY=sk-or-...)。完整设置请参阅密钥管理。如果你还没有密钥管理器,可以先使用普通文件——只需确保它不是全局可读的: 设置 addToSystemPackages = true 有两个作用:将 hermes CLI 添加到系统 PATH,并在系统范围内设置 HERMES_HOME,使交互式 CLI 与 gateway 服务共享状态(会话、技能、cron)。不设置此项时,在 shell 中运行 hermes 会创建独立的 ~/.hermes/ 目录。
容器感知 CLI#
当 container.enable = true 且 addToSystemPackages = true 时,主机上的所有 hermes 命令都会自动路由到托管容器中执行。这意味着你的交互式 CLI 会话在与 gateway 服务相同的环境中运行——可以访问所有容器内安装的包和工具。路由是透明的:hermes chat、hermes sessions list、hermes version 等命令都会在底层 exec 进容器
如果容器未运行,CLI 会短暂重试(交互式使用时显示 5 秒 spinner,脚本中静默等待 10 秒),然后以明确的错误退出——不会静默回退
对于在 hermes 代码库上工作的开发者,设置 HERMES_DEV=1 可绕过容器路由,直接运行本地检出版本
设置 container.hostUsers 可创建 ~/.hermes 到服务状态目录的符号链接,使主机 CLI 和容器共享会话、配置和记忆:hostUsers 中列出的用户会自动加入 hermes 组以获得文件权限访问。Podman 用户: NixOS 服务以 root 身份运行容器。Docker 用户通过 docker 组 socket 获得访问权限,但 Podman 的 rootful 容器需要 sudo。为你的容器运行时授予免密 sudo:CLI 会自动检测何时需要 sudo 并透明地使用它。没有此配置,你需要手动运行 sudo hermes chat。 验证运行状态#
执行 nixos-rebuild switch 后,检查服务是否正在运行:选择部署模式#
模块支持两种模式,由 container.enable 控制: | 原生(默认) | 容器 |
|---|
| 运行方式 | 主机上加固的 systemd 服务 | 持久化 Ubuntu 容器,/nix/store 以只读方式绑定挂载 |
| 安全性 | NoNewPrivileges、ProtectSystem=strict、PrivateTmp | 容器隔离,内部以非特权用户运行 |
| Agent 可自行安装包 | 否——仅限 Nix 提供的 PATH 上的工具 | 是——apt、pip、npm 安装的包在重启后持久保留 |
| 配置界面 | 相同 | 相同 |
| 适用场景 | 标准部署、最高安全性、可重现性 | Agent 需要运行时安装包、可变环境、实验性工具 |
容器模式通过 mkDefault 自动启用 virtualisation.docker.enable。如果你使用 Podman,请设置 container.backend = "podman" 并将 virtualisation.docker.enable 设为 false。
声明式设置#
settings 选项接受任意 attrset,并将其渲染为 config.yaml。它支持跨多个模块定义的深度合并(通过 lib.recursiveUpdate),因此你可以将配置拆分到多个文件中:两者在求值时深度合并。Nix 声明的键始终优先于磁盘上现有 config.yaml 中的键,但 Nix 未涉及的用户添加键会被保留。这意味着如果 Agent 或手动编辑添加了 skills.disabled 或 streaming.enabled 等键,它们在 nixos-rebuild switch 后仍会保留。settings.model.default 使用你的提供商所期望的模型标识符。使用 OpenRouter(默认)时,格式如 "anthropic/claude-sonnet-4" 或 "google/gemini-3-flash"。如果直接使用提供商(Anthropic、OpenAI),请将 settings.model.base_url 指向其 API,并使用其原生模型 ID(例如 "claude-sonnet-4-20250514")。未设置 base_url 时,Hermes 默认使用 OpenRouter。运行 nix build .#configKeys && cat result 可查看从 Python DEFAULT_CONFIG 中提取的所有叶配置键。你可以将现有的 config.yaml 粘贴到 settings attrset 中——结构是 1:1 对应的。
完整示例:所有常用自定义设置
逃生舱:自带配置文件#
如果你希望完全在 Nix 之外管理 config.yaml,请使用 configFile:这会完全绕过 settings——不合并,不生成。每次激活时,该文件会原样复制到 $HERMES_HOME/config.yaml。自定义速查表#
| 我想要... | 选项 | 示例 |
|---|
| 更改 LLM 模型 | settings.model.default | "anthropic/claude-sonnet-4" |
| 使用不同的提供商端点 | settings.model.base_url | "https://openrouter.ai/api/v1" |
| 添加 API 密钥 | environmentFiles | [ config.sops.secrets."hermes-env".path ] |
| 给 Agent 设置个性 | ${services.hermes-agent.stateDir}/.hermes/SOUL.md | 直接管理该文件 |
| 添加 MCP 工具服务器 | mcpServers.<name> | 参见 MCP 服务器 |
|