Всё выше, плюс постоянный контейнер Ubuntu, где агент может выполнить apt/pip/npm install
Установщик завиток | bash сам управляет Python, Node и зависимостями. Nix flake заменяет всё это — собственная Python-зависимость является Nix-производной, построенной с помощью uv2nix, инструментов времени выполнения (Node.js, git, ripgrep, ffmpeg), встроенных в бинарник PATH. Нет пакета времени выполнения, нет активации venv, нет npm install.
Для пользователей, отличных от NixOS это меняется только на шаге установки. Всё после (hermes setup, hermesшлюз install, редактирование конфига) работает идентично настроено установка.
Для пользователей модуля NixOS весь жизненный цикл другой: изменение находится в configuration.nix, секреты идут через sops-nix/agenix, сервис — это systemd-юнит, а CLI-команды конфигурации заблокированы. Вы управляете Hermes так же, как и любым другим NixOS-сервисом.
Предварительные требования
Nix с включенными флейками — рекомендуется Determinate Nix (включает флейки по умолчанию)
API-ключи для сервисов, которые вы хотите использовать (как минимум: ключ OpenRouter или Anthropic)
Быстрый старт (любой пользователь Nix)
Клонирование не требуется. Никс загружает, собирает и запускает всё:
# Запуск напрямую (собирается при первом использовании, затем кэшируется)
nixrungithub:NousResearch/hermes-agent--setup
nixrungithub:NousResearch/hermes-agent--chat
# Или установите постоянно
nixprofileinstallgithub:NousResearch/hermes-agent
hermessetup
hermeschat
После установки профиля nix hermes, hermes-agent и hermes-acp меняются в вашем PATH. Требуется рабочий процесс, идентичный стандартной установке — hermes setup проведет через выбор провайдера, hermes Gateway install настраивает launchd (macOS) или пользователя systemd-service, конфигурация находится в ~/.hermes/.
Flake экспортирует nixosModules.default — полноценный сервисный модуль NixOS, который декларативно управляет созданием пользователей, директориями, генерацией конфига, секретами, документами и жизненным циклом сервиса.:::примечание
Для этого модуля требуется NixOS. Для систем, не основанных на NixOS (macOS, других дистрибутивах Linux), используйте nix Profile install и стандартный CLI-рабочий процесс выше.
Вот и всё. nixos-rebuild switch создает пользователя hermes, последовательно config.yaml, включает секреты и запускает шлюз — долго работающий сервис, который соединяет агента с платформами обмена сообщениями (Telegram, Discord и т.д.) и прослушивает входящие сообщения.:::предупреждение Секреты обязательны
Строка environmentFiles выше предполагает, что у вас настроены sops-nix или agenix. Файл должен сохранять как минимум один ключ LLM-провайдера (например, OPENROUTER_API_KEY=sk-or-...). См. Управление секретами для полной настройки. Если у вас еще нет менеджера секретов, вы можете использовать обычный файл в качестве отправной точки — просто убедитесь, что он не читается всеми:
Пользователи, перечисленные в hostUsers, автоматически подключаются к hermes для доступа к нескольким файлам.
Пользователи Podman: Сервис NixOS запускает контейнер от root. Пользователи Docker получают доступ через сокет группы docker, но корневые-контейнеры Podman требуют sudo. Предоставьте sudo без пароля для вашего контейнерного времени выполнения:
CLI автоматически определяет, когда требуется sudo, и использует его прозрачность. Без этого вам придется запускать sudo Hermes Chat вручную.
Проверка работы
После nixos-rebuild switch проверьте, что сервис запущен:
# Проверка статуса сервиса
systemctlstatushermes-agent
# Просмотр логов (Ctrl+C для остановки)
journalctl-uhermes-agent-f
# Если addToSystemPackages = true, протестируйте CLI
hermesversion
hermesconfig# показывает сгенерированный конфиг
Выбор режима развертывания
Модуль питания двух режимов, управляемых container.enable:
Нативный (по умолчанию)
Контейнер
Как работает
Защищенный systemd-сервис на хосте
Постоянный контейнер Ubuntu с привязкой /nix/store
Безопасность
NoNewPrivileges, ProtectSystem=strict, PrivateTmp
Изоляция контейнера, работает как непривилегированный пользователь внутри
Агент может сам хранить пакеты
Нет — только инструменты из Nix-предоставленного PATH
Да — apt, pip, npm установка приоритета между перезапусками
Оба глубоко сливаются во время оценки. Ключи, объявленные в Nix, всегда побеждают ключи в существующем config.yaml на диске, но ключи, добавленные пользователем, которых Nix не трогает, очередь. Это означает, что если агент или ручное редактирование добавляет ключи, такие как 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, и подтвердите их собственные идентификаторы моделей (например, `claude-sonnet-4-20250514'). Если base_url не установлен, Hermes по умолчанию использует OpenRouter.:::
💡 Tip
Обнаружение доступных ключей конфигурации
Запустите nix build.#configKeys && cat result, чтобы увидеть каждый файл с ключом конфигурации, полученным из Python DEFAULT_CONFIG. Вы можете вставить существующий config.yaml в attrset settings — структура отображается 1:1.
<подробности>
Полный пример: часто настраиваемые параметры
Никогда не помещайте API-ключи в settings или environment
Значения в Nix-выражениях используются в /nix/store, которые доступны для чтения всем. Всегда используйте environmentFiles с менеджером секретов.
environment (несекретные переменные) и environmentFiles (секретные файлы) объединяются в $HERMES_HOME/.env во время активации (nixos-rebuild переключатель). Гермес читает этот файл при каждом запуске, поэтому изменения вступают в силу после systemctl restart hermes-agent — без пересоздания контейнера.
Для платформ, требующих OAuth (например, Discord), используйте authFile для начального заполнения учетных данных при первом развертывании:
{
services.hermes-agent={authFile= config.sops.secrets."hermes/auth.json".path;# authFileForceOverwrite = true; # перезаписывать при каждой активации};}
Файл копируется только в том случае, если auth.json еще не существует (если только authFileForceOverwrite = true). Обновления OAuth-токенов во время выполнения параметра в директории состояния и определения между пересборками.
Документы
Опция documents устанавливает файлы в директорию рабочего агента ("workingDirectory", агент читает как свое игровое пространство). Hermes ищет оригинальные имена файлов по соглашению:
USER.md — контекст пользователя, с которым взаимодействует агент.
Любые другие файлы, которые вы сюда поместите, будут считаться агентом как файлы рабочего пространства.
Файл идентичности агента отдельного: Hermes загружает свой основной SOUL.md из $HERMES_HOME/SOUL.md, который в модуле NixOS находится в ${services.hermes-agent.stateDir}/.hermes/SOUL.md. Помещение SOUL.md в documents создает только файл рабочего пространства и не заменяет основной файл личности.
{
services.hermes-agent.documents={"USER.md"=./documents/USER.md;# ссылка на путь, копируется из Nix store};}
Значения могут быть связаны строками или ссылками на пути. Файлы прилагаются к каждому nixos-rebuild switch.
MCP-серверы
Опция mcpServers декларативно настраивает MCP (Model Context Protocol) серверы. Каждый сервер использует либо stdio (локальную команду), либо HTTP (удаленный URL-адрес).
Токены хранятся в $HERMES_HOME/mcp-tokens/<имя-сервера>.json и располагаются между перезапусками и пересборками.
<подробности>
Первоначальная авторизация OAuth на headless-серверах
Первая авторизация OAuth требует согласования через браузер. При безголовом развертывании Hermes выводит URL-адрес авторизации в стандартный вывод/логики вместо открытия браузера.
Вариант A: Интерактивная начальная загрузка — выполнить поток один раз через docker exec (контейнер) или sudo -u hermes (родной):
# Режим контейнера
dockerexec-ithermes-agent\hermesmcpaddmy-oauth-server--urlhttps://mcp.example.com/mcp--authoauth
# Нативный режим
sudo-uhermesHERMES_HOME=/var/lib/hermes/.hermes\hermesmcpaddmy-oauth-server--urlhttps://mcp.example.com/mcp--authoauth
Контейнер использует --network=host, поэтому прослушиватель OAuth-колбэка на 127.0.0.1 доступен из браузера хоста.
Вариант Б: Предварительное заполнение токенов — завершите поток на рабочей станции, затем скопируйте токены:
Когда Hermes работает через модуль NixOS, следующие CLI-команды заблокируются с описательной ошибкой, указывающей на configuration.nix:
Заблокированная команда
Почему
настройка Гермеса
Конфигурация декларативная — отредактируйте настройки в вашей Nix-конфигурации
редактирование конфигурации Гермеса
Конфигурация последовательно из settings
набор конфигурации Hermes <ключ> <значение>
Конфигурация последовательно из settings
установка шлюза Гермес
systemd-сервис управляется NixOS
удаление шлюза Гермеса
systemd-сервис управляется NixOS
Это свое перемещение между тем, что объявляет Никс, и тем, что находится на диске. Обнаружение использует два сигнала:
Переменная окружения HERMES_MANAGED=true — устанавливается systemd-сервисом, вид на шлюз процесса
Файл-маркер .managed в HERMES_HOME — настроенный скриптом активации, видимый интерактивным включениям (например, docker exec -it hermes-agent hermes config set... также заблокирован)
Чтобы изменить конфигурацию, отредактируйте вашу Nix-конфигурацию и выполните sudo nixos-rebuild switch.
Архитектура контейнера:::информация
Этот раздел актуален только в том случае, если вы используете container.enable = true. Пропустите его для развертывания в собственном режиме.
Когда режим контейнера включен, Hermes работает внутри постоянного контейнера Ubuntu с Nix-собранным бинарником, смонтированным только для чтения хоста:
Nix-собранный бинарник работает внутри контейнера Ubuntu, потому что /nix/store смонтирован — он порождает свой собственный интерпретатор и все зависит, поэтому не зависит от контейнера системных библиотек. Точка входа в контейнер разрешается через симлинк current-package: /data/current-package/bin/hermesgateway run --replace. При nixos-rebuild switch обновляется только симлинк — контейнер продолжает работать.
Что сохраняется при каких-либо событиях
Событие
Контейнер пересоздается?
/data (состояние)
/домой/гермес
Записываемый слой (apt/pip/npm)
systemctl перезапустите агент Гермеса
Нет
Сохраняется
Сохраняется
Сохраняется
nixos-rebuild switch (изменение кода)
Нет (симлинк обновлен)
Сохраняется
Сохраняется
Сохраняется
Перезагрузка хоста
Нет
Сохраняется
Сохраняется
Сохраняется
nix-сбор мусора
Нет (корень GC)
Сохраняется
Сохраняется
Сохраняется
Изменение образа (container.image)
Да
Сохраняется
Сохраняется
Потерян
Изменение томов/опций
Да
Сохраняется
Сохраняется
Потерян
Изменение environment/environmentFiles
Нет
Сохраняется
Сохраняется
Сохраняется
Контейнер пересоздается только при хранении его идентификационного хэша. Хэш раскрывает: версию схемы, образ, extraVolumes, extraOptions и скрипт точки входа. Изменения окружения, настроек, документов или самого пакета Hermes не вызывает пересоздание.:::предупреждение Потеря записываемого слоя
Когда определяющий хэш меняется (обновление образа, новый том, новые опции контейнера), контейнер уничтожается и пересоздается из свежего образа container.image. Любые пакеты apt install, pip install или npm install в записываемом состоянии требуются. Состояние в /data и /home/hermes сохраняется (это привязка-монтирования).
Если агент подает на установку пакетов, рассмотрите возможность встраивания их в пользовательский образ (container.image = "my-registry/hermes-base:latest") или скриптования их установки в агенте SOUL.md.
Защита GC Root
Скрипт preStart создает корень GC в ${stateDir}/.gc-root, указывающий на текущий пакет hermes. Это собственное удаление работающего бинарника команды nix-collect-garbage. Если корень GC по какой-то причине сломается, перезапустите его в сервисном центре.
Плагины
Модуль NixOS поддерживает декларативную установку плагинов — без необходимости обязательной установки плагинов Hermes.
Директорийные плагины (extraPlugins)
Для плагинов, которые представляют собой просто исходники дерева с plugin.yaml + __init__.py (например, hermes-lcm):
Плагины симлинкуются в $HERMES_HOME/plugins/ во время активации. Гермес обнаруживает их с помощью обычных директорий сканирования. Удаление плагина из списка и выполнение nixos-rebuild switch удаление симлинка.
Плагины с точкой входа (extraPythonPackages)
Для плагинов pip-пакетов, которые регистрируются через [project.entry-points."hermes_agent.plugins"] (например, rtk-hermes):
Пакет site-packages добавляется в PYTHONPATH в обертке Hermes. importlib.metadata обнаруживает точку входа при запуске сессии.
Опциональные группы зависимостей (extraDependencyGroups)
Для дополнительных опций, уже объявленных в pyproject.toml, hermes-agent (например, провайдеров памяти, таких как hindsight или honcho), используйте extraDependencyGroups, чтобы включить их в изолированный венв во время сборки:
Это разрешено uv вместе с возможными зависимостями за один проход — без патчинга PYTHONPATH, без критериев риска. Доступные группы соответствуют ключам [project.optional-dependents] в pyproject.toml (например, "hindsight","honcho", "voice","matrix", "mistral","bedrock"`).
Когда что использовать:
Нужно
Опция
Включить дополнительное дополнение из pyproject.toml
extraDependencyGroups
Добавить внешний Python-плагин, отсутствующий в pyproject.toml
extraPythonPackages
Добавить системный бинарник (pandoc, jq и т.д.)
дополнительные пакеты
Добавить дерево исходников каталога
дополнительные плагины
Комбинирование верхних этажей
Директорический плагин с сторонней зависимостью от Python требует наличия опций:
services.hermes-agent={extraPlugins=[ my-plugin-src ];# исходник плагинаextraPythonPackages=[ pkgs.python312Packages.redis ];# его Python-зависимостьextraPackages=[ pkgs.redis ];# системный бинарник, который ему нужен};
Использование наложения
Внешние хлопья могут переопределить пакет напрямую:
Плагины все еще необходимо включить в config.yaml. Добавьте их через декларативные настройки:
services.hermes-agent.settings.plugins.enabled=["hermes-lcm""rtk-rewrite"];```:::примечаниеПроверкаконфликтоввовремясборкизеленогопереопределенияпакетовплагиновосновныхзависимостейГермеса.Еслиплагинпредоставляетпакет,уженаходящийсявизолированномвенве,`nixos-rebuild`завершитсясявнойошибкой.</div>---## Разработка### Оболочка для разработчиков
Flake предоставляетоболочкудляразработкис Python 3.12, uv, Node.js ивсемиинструментамивременивыполнения:```bash
cd hermes-agent
nix develop
# Оболочка предоставляет:# - Python 3.12 + uv (зависимости устанавливаются в.venv при первом входе)# - Node.js 22, ripgrep, git, openssh, ffmpeg в PATH# - Оптимизация stamp-файла: повторный вход почти мгновенный, если зависимости не изменились
hermes setup
hermes chat
direnv (рекомендуется)
Включенный .envrc автоматически активирует оболочку разработчика:
cdhermes-agent
direnvallow# однократно# Последующие входы почти мгновенны (stamp-файл пропускает установку зависимостей)
Проверки Flake
Flake включает проверки времени сборки, которые выполняются в CI и локально:
# Запустить все проверки
nixflakecheck
# Отдельные проверки
nixbuild.#checks.x86_64-linux.package-contents# бинарники существуют + версия
nixbuild.#checks.x86_64-linux.entry-points-sync# синхронизация pyproject.toml ↔ Nix-пакет
nixbuild.#checks.x86_64-linux.cli-commands# подкоманды gateway/config
nixbuild.#checks.x86_64-linux.managed-guard# HERMES_MANAGED блокирует мутации
nixbuild.#checks.x86_64-linux.bundled-skills# навыки присутствуют в пакете
nixbuild.#checks.x86_64-linux.config-roundtrip# скрипт слияния сохраняет пользовательские ключи
Что проверяет каждая проверка
| Проверка | Что тестирует |
|---|---|
| `package-contents` | Бинарники `hermes` и `hermes-agent` существуют, и `hermes version` выполняется |
| `entry-points-sync` | Каждая запись `[project.scripts]` в `pyproject.toml` имеет обернутый бинарник в Nix-пакете |
| `cli-commands` | `hermes --help` показывает подкоманды `gateway` и `config` |
| `managed-guard` | `HERMES_MANAGED=true hermes config set...` выводит ошибку NixOS |
| `bundled-skills` | Директория навыков существует, содержит файлы SKILL.md, `HERMES_BUNDLED_SKILLS` установлен в обертке |
| `config-roundtrip` | 7 сценариев слияния: чистая установка, переопределение Nix, сохранение пользовательских ключей, смешанное слияние, аддитивное слияние MCP, вложенное глубокое слияние, идемпотентность |
Справочник опций
Основные
Опция
Тип
По умолчанию
Описание
enable
bool
false
Включить сервис hermes-agent
package
package
hermes-agent
Используемый пакет hermes-agent
user
str
"hermes"
Системный пользователь
group
str
"hermes"
Системная группа
createUser
bool
true
Автоматически создать пользователя/группу
stateDir
str
"/var/lib/hermes"
Директория состояния (родительская для HERMES_HOME)
workingDirectory
str
"${stateDir}/workspace"
Рабочая директория агента (MESSAGING_CWD)
addToSystemPackages
bool
false
Добавить CLI hermes в системный PATH и установить HERMES_HOME общесистемно
Конфигурация
Опция
Тип
По умолчанию
Описание
settings
attrs (глубокое слияние)
{}
Декларативная конфигурация, преобразуемая в config.yaml. Поддерживает произвольную вложенность; несколько определений сливаются через lib.recursiveUpdate
configFile
null или path
null
Путь к существующему config.yaml. Полностью переопределяет settings, если установлен
Секреты и окружение
Опция
Тип
По умолчанию
Описание
environmentFiles
listOf str
[]
Пути к env-файлам с секретами. Объединяются в $HERMES_HOME/.env во время активации
environment
attrsOf str
{}
Несекретные переменные окружения. Видимы в Nix store — не помещайте сюда секреты
authFile
null или path
null
Начальное заполнение OAuth-учетных данных. Копируется только при первом развертывании
authFileForceOverwrite
bool
false
Всегда перезаписывать auth.json из authFile при активации
Документы
Опция
Тип
По умолчанию
Описание
documents
attrsOf (either str path)
{}
Файлы рабочего пространства. Ключи — имена файлов, значения — встроенные строки или пути. Устанавливаются в workingDirectory при активации
MCP-серверы
Опция
Тип
По умолчанию
Описание
mcpServers
attrsOf submodule
{}
Определения MCP-серверов, объединяются в settings.mcp_servers
Метод аутентификации. "oauth" включает OAuth 2.1 PKCE
mcpServers.<name>.enabled
bool
true
Включить или отключить этот сервер
mcpServers.<name>.timeout
null или int
null
Таймаут вызова инструмента в секундах (по умолчанию: 120)
mcpServers.<name>.connect_timeout
null или int
null
Таймаут подключения в секундах (по умолчанию: 60)
mcpServers.<name>.tools
null или submodule
null
Фильтрация инструментов (списки include/exclude)
mcpServers.<name>.sampling
null или submodule
null
Конфигурация сэмплинга для инициированных сервером LLM-запросов
Поведение сервиса
Опция
Тип
По умолчанию
Описание
extraArgs
listOf str
[]
Дополнительные аргументы для hermes gateway
extraPackages
listOf package
[]
Дополнительные пакеты, доступные агенту. Добавляются в профиль пользователя hermes, так что терминальные команды, навыки и cron-задания видят их
extraPlugins
listOf package
[]
Пакеты директорийных плагинов для симлинкования в $HERMES_HOME/plugins/. Каждый должен содержать plugin.yaml
extraPythonPackages
listOf package
[]
Python-пакеты, добавляемые в PYTHONPATH для обнаружения плагинов с точкой входа. Собирайте с помощью python312Packages
extraDependencyGroups
listOf str
[]
Опциональные экстра из pyproject.toml для включения в изолированный venv (например, ["hindsight"]). Разрешаются uv — без конфликтов
restart
str
"always"
Политика systemd Restart=
restartSec
int
5
Значение systemd RestartSec=
Контейнер
Опция
Тип
По умолчанию
Описание
container.enable
bool
false
Включить режим OCI-контейнера
container.backend
enum ["docker" "podman"]
"docker"
Контейнерный runtime
container.image
str
"ubuntu:24.04"
Базовый образ (загружается во время выполнения)
container.extraVolumes
listOf str
[]
Дополнительные монтирования томов (host:container:mode)
container.extraOptions
listOf str
[]
Дополнительные аргументы, передаваемые в docker create
container.hostUsers
listOf str
[]
Интерактивные пользователи, которые получают симлинк ~/.hermes на stateDir сервиса и автоматически добавляются в группу hermes
Структура директорий
Нативный режим
/var/lib/hermes/# stateDir (принадлежит hermes:hermes, 0750)├──.hermes/# HERMES_HOME│├──config.yaml# Сгенерировано Nix (глубокое слияние при каждой пересборке)│├──.managed# Маркер: мутация CLI-конфига заблокирована│├──.env# Объединено из environment + environmentFiles│├──auth.json# OAuth-учетные данные (начальное заполнение, затем самоуправление)│├──gateway.pid│├──state.db│├──mcp-tokens/# OAuth-токены для MCP-серверов│├──sessions/│├──memories/│├──skills/│├──cron/│└──logs/├──home/# HOME агента└──workspace/# MESSAGING_CWD├──SOUL.md# Из опции documents└──(файлы,созданныеагентом)
Режим контейнера
Та же конструкция, смонтирована в контейнере:
Положить в контейнер
Путь на хосте
Режим
Примечания
/nix/store
/nix/store
ро
Бинарник Hermes + все Nix-зависимости
/данные
/var/lib/hermes
рв
Всё состояние, конфиг, рабочее пространство
/домой/гермес
${stateDir}/home
рв
Постоянный HOME агент — pip install --user, кэши инструменты
/usr, /usr/local, /tmp
(записываемый слой)
рв
Установки apt/pip/npm — приоритет между перезапусками, требуется при пересоздании
В режиме контейнера симлинк current-package обновляется, и агент подхватывает новый бинарник при перезапуске. Без пересоздания контейнера, без потери стандартной упаковки.
Устранение неполадок:::совет Пользователи Подман
Все команды «докера» ниже работают так же с «подманом». Замените соответствующим образом, если вы установили container.backend = "podman".
Логи сервис
# Оба режима используют один и тот же systemd-юнит
journalctl-uhermes-agent-f
# Режим контейнера: также доступно напрямую
dockerlogs-fhermes-agent