Конфигурация

Все настройки сохраняются в каталоге ~/.hermes/ для удобного доступа.

Структура каталога

~/.hermes/
├── config.yaml     # Настройки (модель, терминал, TTS, сжатие и т.д.)
├──.env            # Ключи API и секреты
├── auth.json       # Учётные данные OAuth-провайдеров (Nous Portal и др.)
├── SOUL.md         # Основная идентичность агента (слот №1 в системном промпте)
├── memories/       # Постоянная память (MEMORY.md, USER.md)
├── skills/         # Навыки, созданные агентом (управление через skill_manage)
├── cron/           # Запланированные задания
├── sessions/       # Сессии шлюза
└── logs/           # Журналы (errors.log, gateway.log — секреты автоматически скрываются)

Управление конфигурацией

hermes config              # Просмотр текущей конфигурации
hermes config edit         # Открыть config.yaml в редакторе
hermes config set KEY VAL  # Установить конкретное значение
hermes config check        # Проверить отсутствующие опции (после обновлений)
hermes config migrate      # Интерактивно добавить отсутствующие опции

# Примеры:
hermes config set model anthropic/claude-opus-4
hermes config set terminal.backend docker
hermes config set OPENROUTER_API_KEY sk-or-...  # Сохраняется в.env
```:::совет
Команда `hermes config set` автоматически направляет значения в нужный файл  ключи API указаны в `.env`, всё остальное в `config.yaml`.</div>
## Приоритет конфигурации

Настройки разрешаются в следующем порядке (наивысший первый приоритет):

1. **Аргументы CLI**  например, `hermeschat --model anthropic/claude-sonnet-4` (переопределение при вызове)
2. **`~/.hermes/config.yaml`**  основной конфигурационный файл для всех несекретных настроек.
3. **`~/.hermes/.env`**  запасной вариант для включения окружения; **обязателен** для секретов (ключи API, токены, пароли)
4. **Встроенные значения по умолчанию**  жёстко заданные безопасные значения, если ничего другого не установлено.<div class="admonition admonition-info"><p class="admonition-title">ℹ️ Info</p> Правило большого пальца
Секреты (ключи API, токены ботов, пароли) хранятся в `.env`. Всё остальное (модель, бэкенд терминала, настройки сжатия, лимиты памяти, наборы инструментов)  в `config.yaml`. Если установлено и то, и другое, `config.yaml` имеет приоритет для несекретных настроек.</div>
## Подстановка окружения

Вы можете ссылаться на переменные окружения в `config.yaml`, используя синтаксис `${VAR_NAME}`:
```yaml
auxiliary:
  vision:
    api_key: ${GOOGLE_API_KEY}
    base_url: ${CUSTOM_VISION_URL}

delegation:
  api_key: ${DELEGATION_KEY}

Несколько ссылок в одной формуле работают: url: "${HOST}:${PORT}". Если указанная переменная не установлена, заполнение остается буквально (${UNDEFINED_VAR} остается как есть). Поддерживается только синтаксис ${VAR} — просто $VAR не раскрывается.

Информация о настройке AI-провайдеров (OpenRouter, Anthropic, Copilot, пользовательские конечные точки, самостоятельно размещённые LLM, резервные модели и т.д.) см. в разделе AI-провайдеры.

Тайм-ауты провайдера

Вы можете установить providers.<id>.request_timeout_секунды для тайм-аута запроса ко всему провайдеру, а также providers.<id>.models.<model>.timeout_секунды для переопределения для конкретной модели. Применяется к основному клиенту для каждого транспорта (OpenAI-wire, нативный Anthropic, совместимый с Anthropic), цепочкой запасных провайдеров, пересборкой после ротации учётных данных и (для OpenAI-wire) аргументом тайм-аута каждого запроса — так что установленное значение имеет приоритет над постоянным переменным окружением HERMES_API_TIMEOUT.

Вы также можете установить providers.<id>.stale_timeout_секундs для детектора «зависших» вызовов без потоковой передачи, а также providers.<id>.models.<model>.stale_timeout_секунды для переопределения для конкретных моделей. Это имеет приоритет над временным окружением HERMES_API_CALL_STALE_TIMEOUT.

Если оставить их неустановленными, использовались постоянные значения по умолчанию (HERMES_API_TIMEOUT=1800, HERMES_API_CALL_STALE_TIMEOUT=300, родной Anthropic 900). В настоящее время не работает для AWS Bedrock (оба пути bedrock_converse и AnthropicBedrock SDK используют boto3 самостоятельно с конфигурацией тайм-аута). См. пример с комментариями в cli-config.yaml.example.

Конфигурация бэкенда терминала

Hermes поддерживает семь серверных терминалов. Все определяет, где на самом деле выполняются команды выполняемого агента — на локальном компьютере, в контейнере Docker, в удалённом пространстве через SSH, в облачной песочнице Modal (напрямую или через управляемый шлюз Nous), в рабочей области Daytona, в песочнице Vercel или в контейнере Singularity/Apptainer.

terminal:
  backend: local    # local | docker | ssh | modal | daytona | vercel_sandbox | singularity
  cwd: "."          # Рабочий каталог для шлюза/cron (CLI всегда использует каталог запуска)
  timeout: 180      # Тайм-аут команды в секундах
  env_passthrough: []  # Имена переменных окружения для передачи в изолированное выполнение (terminal + execute_code)
  singularity_image: "docker://nikolaik/python-nodejs:python3.11-nodejs20"  # Образ контейнера для Singularity
  modal_image: "nikolaik/python-nodejs:python3.11-nodejs20"                 # Образ контейнера для Modal
  daytona_image: "nikolaik/python-nodejs:python3.11-nodejs20"               # Образ контейнера для Daytona

Для облачных песочниц, таких как Modal, Daytona и Vercel Sandbox, container_persistent: true означает, что Hermes пытается сохранить состояние файловой системы при повторном создании песочницы. Это не гарантирует, что та самая активная песочница, космический PID или фоновые процессы, которые ещё будут работать позже.

Обзор бэкендов

Бекенд Где выполняются команды Изоляция Лучше всего подходит для
местный Напрямую на ваш компьютер Нет Разработка, личное использование
докер Один постоянный контейнер Docker (общий для сессии, /new, подагентов) Полная (пространства имён, капля) Безопасная песочница, CI/CD
тсс Удалённый сервер по SSH Сетевая граница Удалённая разработка, мощное оборудование
модальный Облачная песочница Модальный Полная (облачная ВМ) Эфемерные облачные вычисления, оценки
дайтона Рабочая область Дайтона Полная (облачный контейнер) Управляемые разработки облачной среды
vercel_sandbox Песочница Версель Полная (облачная микро-ВМ) Облачное выполнение с сохранением состояния финансовой системы на основе кадров
необычность Контейнер Singularity/Apptainer Пространства имён (--containall) Кластеры HPC, общие машины

Локальный бэкенд

Значение по умолчанию. Команды работают непосредственно на вашем компьютере без работы. Специальная настройка не требуется.

terminal:
  backend: local
```:::предупреждение
Агент имеет тот же доступ к файлам системы, что и ваша учетная запись пользователя. Используйте «инструменты Hermes», чтобы отключить ненужные инструменты, или переключитесь на Docker для песочницы.</div>
### Бэкенд Докер

Выполняет команды внутри контейнера Docker с повышенным уровнем безопасности (все возможности открыты, без изменения привилегий, ограничений PID).

**Один постоянный контейнер, не для каждой команды.** Hermes запускает ОДИН долгоживущий контейнер при первом использовании и направляет каждый вызов терминала, файл и `execute_code` через `docker exec` в тот же контейнер — через сессию, `/new`, `/reset` и подагенты `delegate_task` — на всё время работы процесса Hermes. Изменения рабочего каталога, выбранные пакеты и файлы в `/workspace` переносятся из одного инструмента-инструмента в следующий, как в локальной оболочке. Контейнер останавливается и удаляется по окончании работ. Подробнее см. в разделе **Жизненный цикл-контейнер** ниже.
```yaml
terminal:
  backend: docker
  docker_image: "nikolaik/python-nodejs:python3.11-nodejs20"
  docker_mount_cwd_to_workspace: false  # Монтировать каталог запуска в /workspace
  docker_run_as_host_user: false   # См. «Запуск контейнера от пользователя хоста» ниже
  docker_forward_env:              # Переменные окружения для передачи в контейнер
    - "GITHUB_TOKEN"
  docker_volumes:                  # Монтирование каталогов хоста
    - "/home/user/projects:/workspace/projects"
    - "/home/user/data:/data:ro"   #:ro для только чтения

  # Ограничения ресурсов
  container_cpu: 1                 # Ядра ЦП (0 = без ограничений)
  container_memory: 5120           # МБ (0 = без ограничений)
  container_disk: 51200            # МБ (требуется overlay2 на XFS+pquota)
  container_persistent: true       # Сохранять /workspace и /root между сессиями

Требования: Docker Desktop или Docker Engine установлены и запущены. Впоследствии Hermes $PATH плюс стандартные места установки macOS (/usr/local/bin/docker, /opt/homebrew/bin/docker, пакет приложения Docker Desktop). Функции Podman «из коробки»: установите HERMES_DOCKER_BINARY=podman (или полный путь), чтобы обеспечить его использование, когда установлены оба.

Жизненный цикл контейнера: Hermes повторно использует один долгоживущий контейнер (docker run -d... Sleep 2h) для каждого вызова терминала и финансового инструмента через сессию, /new, /reset и подагенты delegate_task, на протяжении всего процесса Hermes. Команды выполняются через docker exec с окошком входа, поэтому изменение рабочего каталога, установленных пакетов и файлов в /workspace включается от одного инструмента вызова к следующему. Контейнер останавливается и удаляется по завершении работ Hermes (или когда сборщик бездействия забирает его).

Параллельные подагенты, порождённые через delegate_task(tasks=[...]), используют этот контейнер — одновременные cd, мутации окружения и записи в одном и тот же путь могут определять. Если подагенту нужна изолированная песочница, он должен зарегистрировать переопределение образа для каждой задачи через register_task_env_overrides(), что среда RL и бенчмарки (TerminalBench2, HermesSweEnv и т.д.) делают автоматически для своих образов Docker для каждой задачи.

Усиление безопасности: - --cap-drop ALL добавлены только DAC_OVERRIDE, CHOWN, FOWNER - --security-opt no-new-privileges - --pids-limit 256 - Ограниченные по размеру tmpfs для /tmp (512 МБ), /var/tmp (256 МБ), /run (64 МБ)

Пересылка учётных данных: Переменные окружения, перечисленные в docker_forward_env, сначала разрешаются из вашего окружения, а затем из ~/.hermes/.env. Навыки также могут объявлять обязательные_переменные_среды, которые автоматически объединяются.

Бэкенд SSH

Выполняется команда на удалённом сервере через SSH. Использует ControlMaster для повторного использования соединения (5-минутное удержание активности при бездействии). Постоянная включение включена по умолчанию — состояние (рабочий каталог, переменные окружения) сохраняется между командами.

terminal:
  backend: ssh
  persistent_shell: true           # Сохранять долгоживущую сессию bash (по умолчанию: true)

Необходимые переменные окружения:

TERMINAL_SSH_HOST=my-server.example.com
TERMINAL_SSH_USER=ubuntu

Опционально:

Переменная По умолчанию Описание
TERMINAL_SSH_PORT 22 Порт SSH
TERMINAL_SSH_KEY (системное значение) Путь к закрытому ключу SSH
TERMINAL_SSH_PERSISTENT правда Включить постоянную оболочку

Как это работает: Подключается при инициализации с BatchMode=yes и StrictHostKeyChecking=accept-new. Постоянная поддержка одного процесса bash -l на удаленном хосте, общая через временные файлы. Команды, которым нужны stdin_data или sudo, автоматически переключаются в одноразовый режим.

Бэкенд Модальный

Выполняет команды в облачной песочнице Modal. Каждая задача получает изолированную ВМ с настраиваемыми ЦП, памятью и диском. Файловая система может быть снимком/восстановлена ​​между сессиями.

terminal:
  backend: modal
  container_cpu: 1                 # Ядра ЦП
  container_memory: 5120           # МБ (5 ГБ)
  container_disk: 51200            # МБ (50 ГБ)
  container_persistent: true       # Снимок/восстановление файловой системы

Требуется: Либо переменные окружения MODAL_TOKEN_ID + MODAL_TOKEN_SECRET, либо конфигурация файла ~/.modal.toml.

Постоянство: При включении файловая система песочницы снимается в снимок при очистке и восстанавливается во время следующей сессии. Снимки отслеживаются в ~/.hermes/modal_snapshots.json. Это сохраняет состояние файловой системы, а не активные процессы, пространство PID или фоновые задания.

Файлы учётных данных: Автоматически монтируются из ~/.hermes/ (токены OAuth и т.д.) и синхронизируются перед каждой командой.

Бэкенд Дайтона

Выполняет обязанности руководителя в управляемой рабочей области Дейтона. Поддерживает остановку/возобновление для постоянства.

terminal:
  backend: daytona
  container_cpu: 1                 # Ядра ЦП
  container_memory: 5120           # МБ → преобразуется в ГиБ
  container_disk: 10240            # МБ → преобразуется в ГиБ (макс. 10 ГиБ)
  container_persistent: true       # Остановить/возобновить вместо удаления

Требуется: Переменная окружения DAYTONA_API_KEY.

Постоянство: При включении песочницы останавливаются (не удаляются) при очистке и возобновляются на следующей сессии. Имена песочниц далее по шаблону hermes-{task_id}.

Лимит дисков: Daytona устанавливает максимум 10 ГиБ. Запросы выше этого ограничения распространяются с предупреждением.

Бэкенд Vercel Sandbox

Выполняет команды в облачной микро-ВМ Vercel Sandbox. Hermes использует обычные поверхностные инструменты, терминалы и файлы; нет инструментов, ориентированных на модели, для Vercel.

terminal:
  backend: vercel_sandbox
  vercel_runtime: node24          # node24 | node22 | python3.13
  cwd: /vercel/sandbox            # Корень рабочей области по умолчанию
  container_persistent: true      # Снимок/восстановление файловой системы
  container_disk: 51200           # Только общее значение по умолчанию; пользовательский диск не поддерживается

Необходимая установка: Установите дополнительный SDK:

pip install 'hermes-agent[vercel]'

Необходимая аутентификация: Для установления аутентификации по токену доступа со всеми условиями: VERCEL_TOKEN, VERCEL_PROJECT_ID и VERCEL_TEAM_ID. Это применимая настройка для развёртывания и обычных долгоживущих процессов Hermes на Render, Railway, Docker и других хостингах.

Для разовой локальной разработки Hermes также использует соответствующие токены OIDC Vercel:

VERCEL_OIDC_TOKEN="$(vc project token <project-name>)" hermes chat

Из связанного каталога проекта Vercel вы можете опустить имя проекта:

VERCEL_OIDC_TOKEN="$(vc project token)" hermes chat

Токены OIDC являются достаточно важными и не должны использоваться в документированном порядке развёртывания.

Среда выполнения: terminal.vercel_runtime поддерживает node24, node22 и python3.13. Если не установлено, Hermes по умолчанию использует node24.

Постоянство: Когда container_persistent: true, Гермес создает исходную файловую систему песочницы во время очистки и управления более поздней песочницей для той же задачи из этого снимка. Содержимое снимка может включать синхронизированные учётные данные Hermes, навыки и денежные средства, которые были скопированы в песочницу. Это сохраняет только состояние файловой системы; оно не сохраняет идентичность активной песочницы, пространства PID, состояния или работы фоновых процессов.

Фоновые команды: terminal(background=true) использует общий поток фоновых процессов Hermes для нелокальных бэкендов. Вы можете запускать, опрашивать, ожидать, просматривать журналы и завершать процессы с помощью обычных инструментов управления процессами, пока песочница активна. Компания Hermes не обеспечивает естественного восстановления отдельных процессов Vercel после очистки или перезапуска.

Размер диска: Vercel Sandbox в настоящее время не поддерживает использование ресурса container_disk от Hermes. Оставьте container_disk не установленным или в общем понимании по умолчанию 51200; Значения, отличные от стандартных, которые приводят к сбою диагностики и созданию бэкенда, не будут молча игнорироваться.

Бэкенд Singularity/Apptainer

Выполняет команду в контейнере Singularity/Apptainer. используются для кластеров HPC и общих машин, где Docker недоступен.

terminal:
  backend: singularity
  singularity_image: "docker://nikolaik/python-nodejs:python3.11-nodejs20"
  container_cpu: 1                 # Ядра ЦП
  container_memory: 5120           # МБ
  container_persistent: true       # Перезаписываемый оверлей сохраняется между сессиями

Требования: Бинарный файл apptainer или singularity в $PATH.

Управление образами: URL-адреса Docker (docker://...) автоматически преобразуются в файлы SIF и кэшируются. Существующие файлы .sif используются напрямую.

Рабочий каталог для временных файлов: Определяется в следующем порядке: TERMINAL_SCRATCH_DIRTERMINAL_SANDBOX_DIR/singularity/scratch/$USER/hermes-agent (соглашение HPC) → ~/.hermes/sandboxes/singularity.

Изоляция: Использует --containall --no-home для полной реализации пространства без монтирования домашнего каталога хоста.

Распространённые проблемы бэкендов терминала

Если команда терминала немедленно завершает работу или сообщает, что инструмент терминала отключен:

Если сомневаетесь, верните terminal.backend обратно на local и сначала убедитесь, что команды там работают.

Синхронизация файлов с удалённого хоста на хост по завершении

Для бэкендов SSH, Modal и Daytona (где рабочее дерево агента находится на другой машине, чем хост, на котором работает Hermes), Hermes отслеживает файлы, которые агент определяет в удалённой песочнице, и при завершении сессии/очистке песочницы синхронизирует измененные файлы обратно на хостён в ~/.hermes/cache/remote-syncs/<session-id>/.

terminal:
  file_sync_max_mb: 100     # по умолчанию — синхронизировать файлы размером до 100 МБ каждый
  file_sync_enabled: true   # по умолчанию — установите false, чтобы полностью пропустить синхронизацию

Таким образом, вы восстанавливаете результаты из эфемерных облачных песочниц, которые уничтожаются после завершения сеанса, без необходимости указания агенту явно scp или modal Volume put в каждом документе.

Монтирование томов Docker

При использовании бэкенда Docker docker_volumes Позволяет делиться каталогами хоста с контейнером. каждая запись использует стандартный синтаксис Docker -v: host_path:container_path[:options].

terminal:
  backend: docker
  docker_volumes:
    - "/home/user/projects:/workspace/projects"   # Чтение-запись (по умолчанию)
    - "/home/user/datasets:/data:ro"              # Только чтение
    - "/home/user/.hermes/cache/documents:/output" # Экспорт, видимый шлюзу

Это полезно для: - Предоставления файлов агенту (наборы данных, конфигурации, эталонный код) - Получение файлов от агента (сгенерированный код, отчёты, экспорт) - Общие области, где и вы, и агент обращаетесь к одним и тем же файлам.

Если вы используете шлюз сообщений и агент отправляет сгенерированные файлы через MEDIA:/..., предпочтите выделенное монтирование экспорта, вероятно, на хосту, например /home/user/.hermes/cache/documents:/output.

Также может быть определено через переменное окружение: TERMINAL_DOCKER_VOLUMES='["/host:/container"]' (массив JSON).

Пересылка учётных данных Docker

По умолчанию сессия терминала Docker не наследует произвольные учётные данные хоста. Если вам нужен определенный токен внутри контейнера, добавьте его в terminal.docker_forward_env.

terminal:
  backend: docker
  docker_forward_env:
    - "GITHUB_TOKEN"
    - "NPM_TOKEN"

Hermes разрешает каждую указанную переменную сначала из вашего текущего потока, а затем из ~/.hermes/.env, если она была сохранена с помощью hermes config set.:::предупреждение Всё, что указано в docker_forward_env, становится видимым для команды, выполняющей внутри контейнера. Пересылайте только те учетные данные, которые вы готовы раскрыть для терминала сессии.

Запуск контейнера с хоста пользователя

По умолчанию контейнеры Docker работают от root (UID 0). Файлы, созданные внутри /workspace или других монтированных файлов, оказываются благоприятными root на хосте, поэтому после сессии вам нужно выбрать sudo chown, чтобы отредактировать их в редакторе хоста. Флаг terminal.docker_run_as_host_user исправляет это:

terminal:
  backend: docker
  docker_run_as_host_user: true   # по умолчанию: false

При включении Hermes добавляет --user $(id -u):$(id -g) в группу docker run, так что файлы, записываемые в смонтированные каталоги (/workspace, /root, всё в docker_volumes), являются пользователем хоста, а не root. Компромисс: контейнер больше не может выполнять apt install или записывать в пути, принципиальные root, такие как /root/.npm — воспользуйтесь базовым образом, в котором HOME принадлежит пользователю, не являющемуся корнем (или указателем обеспечиваемых инструментов на этапе сборки образа), если вам нужно и то, и другое.

Оставьте false (по умолчанию) для обратной совместимости. Включите, когда ваш рабочий процесс в основном состоит из «редактирования смонтированных файлов хоста», и вас утомило sudo chown -R.

Опционально: Монтирование каталога запускается в /workspace

Песочницы Docker по умолчанию изолированными. Гермес не передаёт ваш текущий рабочий каталог хоста в контейнер, если вы явно не укажете это.

Включите в config.yaml:

terminal:
  backend: docker
  docker_mount_cwd_to_workspace: true

При включении: - если вы запускаете Hermes из ~/projects/my-app, этот каталог хоста примонтируется в /workspace - бэкенд Docker запускается в /workspace - инструменты, файлы и команда терминала продвигают один и тот же смонтированный проект

При отключении /workspace остаётся работать в песочнице, если вы явно не смонтируете что-то через docker_volumes.

Компромисс безопасности: - false сохранение границы песочницы - true дает песочнице прямой доступ к каталогу, из которого вы запустили Hermes

Используйте этот параметр только в том случае, если вы намеренно хотите хранить рабочие файлы, расположенные на хосте.

Постоянная крышка

По умолчанию используется команда терминала, результат в собственном подпроцессе — рабочий каталог, переменные окружения и переменные потоки сбрасываются между командами. При включенной постоянной оболочке один долгоживущий процесс bash сохраняется между вызовами execute(), так что состояние сохраняется между командами.

Это наиболее полезно для бэкенда SSH, где он также позволяет использовать большие затраты на соединение для каждой команды. Постоянная оболочка включена по умолчанию для SSH и отключена для локальной бэкенда.

terminal:
  persistent_shell: true   # по умолчанию — включает постоянную оболочку для SSH

Чтобы выделить:

hermes config set terminal.persistent_shell false

Что сохраняется между командами: - Рабочий каталог (cd /tmp сохраняется для этой команды) - Экспортированные переменные окружения (export FOO=bar) - Переменные обработки (MY_VAR=hello)

Приоритет:

Уровень Переменная По умолчанию
Конфиг terminal.persistent_shell правда
Переопределение SSH TERMINAL_SSH_PERSISTENT следует за конфигом
Переопределение локального TERMINAL_LOCAL_PERSISTENT ложь

Переменные окружения, в частности, бэкенды имеют значительный приоритет. Если вы хотите постоянную оболочку и для локального бэкенда:

export TERMINAL_LOCAL_PERSISTENT=true
```:::примечание
Команды, которым требуется `stdin_data` или sudo, автоматически переключаются в одноразовый режим, так как stdin постоянно проверяет уже занятость протокола IPC.</div>
Подробнее о каждом бэкенде см. в [Выполнение кода](features/code-execution.md) и в разделе [Терминал в README](features/tools.md).

## Настройки функций

Навыки могут объявить свои собственные настройки конфигурации через заголовок в SKILL.md. Это несекретные значения (пути, настройки, настройки домена), хранящиеся в пространстве имён `skills.config` в `config.yaml`.
```yaml
skills:
  config:
    myplugin:
      path: ~/myplugin-data   # Пример — каждый навык определяет свои собственные ключи

Как работают настройки навыков:

Установка вручную:

hermes config set skills.config.myplugin.path ~/myplugin-data

Подробнее об объявлении настроек в ваших собственных навыках см. в Создание навыков — Настройки конфигурации.

Ограничение на навыки записи, созданные агентом

Когда агент использует skill_manage для создания, редактирования, исправления или удаления навыков, Гермес может опционально проверять новое/изменённое качество на наличие ключевых слов (сбор учётных данных, очевидная инъекция промптов, инструкции по эксфильтрации). Проверка по умолчанию отключена — реальные рабочие процессы агентов, которые по закону обращаются к ~/.ssh/ или упоминают $OPENAI_API_KEY, слишком часто разрабатывают эвристику. Если вы хотите проверить запрашиваемое подтверждение перед тем, включите ее обратно, как записи навыков агента сохраняются:

skills:
  guard_agent_created: true   # по умолчанию: false

При включении любая помеченная запись skill_manage отображается как запрос на утверждение с обоснованием проверки. Принятые записи основных; отклонённые возвращающиеся агенту сообщение об ошибках с объяснением.

Конфигурация памяти

memory:
  memory_enabled: true
  user_profile_enabled: true
  memory_char_limit: 2200   # ~800 токенов
  user_char_limit: 1375     # ~500 токенов

Безопасность чтения файлов

Определяет, сколько содержимого может вернуть один вызов read_file. Чтения, превышающие лимит, отклоняются с ошибкой, указывающей агенту использовать «смещение» и «лимит» для уменьшения связи. Это собственное затопление контекстного окна одним чтением минифицированной привязки JS или большого файла данных.

file_read_max_chars: 100000  # по умолчанию — ~25-35K токенов

Увеличьте, если вы используете модель с большими контекстными окнами и часто читаете большие файлы. Уменьшите для моделей малый контекст, чтобы чтение было эффективным:

# Модель с большим контекстом (200K+)
file_read_max_chars: 200000

# Маленькая локальная модель (16K контекст)
file_read_max_chars: 30000

Агент также автоматически сохраняет дубликаты при чтении файлов — если один и тот же файл региона читается дважды, а файл не изменяется повторно, возвращается легкая заглушка вместо изменения изменения. Это сбрасывается при сжатии контекста, чтобы агент мог перечитать файлы после того, как их требования были свёрнуты.

Лимиты усечения комплектных инструментов

Три ограничения контролируют, сколько необработанного результата можно вернуть инструменту, прежде чем Гермес усечёт его:

tool_output:
  max_bytes: 50000        # ограничение вывода терминала (символы)
  max_lines: 2000         # ограничение пагинации read_file
  max_line_length: 2000   # ограничение на строку в нумерованном представлении read_file

Увеличьте лимиты для моделей с заданными контекстными окнами, которые могут предоставить вам больше необработанного результата вызова. Уменьшите модели с малым контекстом, чтобы результаты инструментов были компактными:

# Модель с большим контекстом (200K+)
tool_output:
  max_bytes: 150000
  max_lines: 5000

# Маленькая локальная модель (16K контекст)
tool_output:
  max_bytes: 20000
  max_lines: 500

Глобальное отключение набора инструментов

Чтобы отключить определенные наборы инструментов в CLI и на каждом шлюзе платформы в одном месте, укажите их имена в agent.disabled_toolsets:

agent:
  disabled_toolsets:
    - memory       # скрыть инструменты памяти + внедрение MEMORY_GUIDANCE
    - web          # без web_search / web_extract где бы то ни было

Это применяется после конфигурации инструментов для каждой платформы (platform_toolsets, записываемые hermestools), так что набор, указанный здесь, всегда удаляется — даже если сохранённая конфигурация платформы всё ещё содержит его. Используйте его, когда вам нужен любой переключатель «выключить X везде», не сохраняя платформу из 15+ строк в интерфейсе «hermestools».

Оставление списка пустым или пропуск ключа не дает результата.

Изоляция рабочих компьютеров Git

Включите изолированные рабочие деревья Git для параллельного запуска нескольких агентов в одном репозитории:

worktree: true    # Всегда создавать рабочее дерево (как hermes -w)
# worktree: false # По умолчанию — только при передаче флага -w

При включении сессия CLI создает свежее игровое дерево в .worktrees/ с собственной веткой. Агенты могут оставить файлы, коммитить, пушить и создавать пиар, не мешая другу. Чистые рабочие деревья удаляются при выходе; грязные элементы для ручного восстановления.

Вы также можете добавить ошибочные файлы git для копирования в рабочие деревья через .worktreeinclude в корневом репозитории:

#.worktreeinclude.env.venv/
node_modules/

Сжатие контекста

Гермес автоматически запускает длинные разговоры, чтобы оказаться в пределах контекстного окна вашей модели. Суммаризатор сжатия — это отдельный вызов LLM — вы можете направить его на любого провайдера или конечную точку.

Все настройки уменьшаются в config.yaml (без включения окружения).

Полная справка

compression:
  enabled: true                                     # Включить/выключить сжатие
  threshold: 0.50                                   # Сжимать при этом % от лимита контекста
  target_ratio: 0.20                                # Доля порога для сохранения в качестве недавнего хвоста
  protect_last_n: 20                                # Мин. количество последних сообщений для сохранения без сжатия
  hygiene_hard_message_limit: 400                   # Предохранительный клапан шлюза — см. ниже

# Модель/провайдер суммаризации настраиваются в auxiliary:
auxiliary:
  compression:
    model: ""                                       # Пусто = использовать основную модель чата. Переопределите, например, "google/gemini-3-flash-preview" для более дешёвого/быстрого сжатия.
    provider: "auto"                                # Провайдер: "auto", "openrouter", "nous", "codex", "main" и т.д.
    base_url: null                                  # Пользовательская конечная точка, совместимая с OpenAI (переопределяет провайдера)
```<div class="admonition admonition-info"><p class="admonition-title">ℹ️ Info</p> Миграция устаревшей конфигурации
Старые конфиги с `compression.summary_model`, `compression.summary_provider` и `compression.summary_base_url` автоматически мигрируются в `auxiliary.compression.*` при первом компоненте (версия конфига 17). Ручное вмешательство не требуется.</div>
`hygiene_hard_message_limit` — это предохранительный клапан шлюза **передним сжатием**. Вышедшие из-под контроля сессии с тысячами сообщений могут ограничивать лимиты контекстных моделей до того, как срабатывает обычный процентный порог контекста; Когда количество сообщений поднимается к этому потолку, Гермес усиливает сжатие независимо от использования токенов. По умолчанию `400` — увеличьте для платформы, где очень длинные сессии являются нормой, уменьшите для более агрессивного сжатия. Изменение этого значения в рабочем шлюзе повлияет на силу в следующую минуту (см. ниже).<div class="admonition admonition-tip"><p class="admonition-title">💡 Tip</p> Горячая перезагрузка сжатия и удлинения контекста в шлюзе
Начиная с недавних релизов, редактирование `model.context_length` или любого ключа `compression.*` в `config.yaml` в рабочем шлюзе вступает в силу в следующую минуту — не требуется перезапуск шлюза, `/reset` или ротация сессии. Подпись кэшированного агента включает эти ключи, поэтому шлюз прозрачности пересобирает агента, когда видит изменение. Ключи API и инструменты настройки/навыков по-прежнему требуют традиционных способов перезагрузки.</div>
### Типичные настройки

**По умолчанию (автоопределение) — настройка не требуется:**
```yaml
compression:
  enabled: true
  threshold: 0.50

Использует вашего основного провайдера и основную модель. Переопределите для конкретной задачи (например, auxiliary.compression.provider: openrouter + model: google/gemini-2.5-flash), если вы хотите использовать для сжатия более дешёвую модель, чем ваша базовая модель чата.

Принудительно указать конкретного провайдера (на основе OAuth или ключа API):

auxiliary:
  compression:
    provider: nous
    model: gemini-3-flash

Работает с любым провайдером: nous, openrouter, codex,anthropic,main и т.д.

Пользовательская конечная точка (Оллама, Зай, DeepSeek и т.д.):

auxiliary:
  compression:
    model: glm-4.7
    base_url: https://api.z.ai/api/coding/paas/v4

Указывает на пользовательскую конечную точку, совместимую с OpenAI. Для аутентификации используется OPENAI_API_KEY.

Как взаимодействуют три параметра

auxiliary.compression.provider auxiliary.compression.base_url Результат
авто (по умолчанию) не задано Автоопределение наилучшего доступного провайдера
nous/openrouter/ и т.д. не задано Принудительно использовать этого провайдера, его аутентификацию
любой задано Использовать пользовательскую конечную точку напрямую (провайдер отключается)
Модель более крупной должна иметь контекстное окно не меньше, чем у вашей основной модели агента. Компрессор отправляет всю среднюю часть разговора модели краткой — если контекстное окно этой модели меньше, чем в основном, вызов последовательной обработки завершится ошибкой с потерей длины контекста. Когда это происходит, средние части отбрасываются без окончательной фиксации, что позволяет сохранять молчание в контексте разговора. Если вы переопределяете модель, убедитесь, что ее длина контекста равна или масштаб контура вашей основной модели.
## Механизм контекста

Контекст механизма определяет, как управляются разговоры при приближении к модели лимиту токенов. Встроенный механизм компрессор использует сжатие с потерями (см. Сжатие контекста). Плагинные механизмы могут заменить его альтернативными стратегиями.

context:
  engine: "compressor"    # по умолчанию — встроенная суммаризация с потерями

Чтобы использовать плагинный механизм (например, LCM для управления контекстом без потерь):

context:
  engine: "lcm"          # должно совпадать с именем плагина

Плагинные механизмы никогда не активируются автоматически — вы должны явно установить context.engine в имя плагина. Доступные механизмы можно просмотреть и выбрать через Плагины Hermes → Плагины провайдера → Контекстный движок.

См. Провайдеры памяти для последовательной системы одиночного выбора для подключения памяти.

Давление бюджета итераций

Когда агент над работой платы с большим количеством вызовов, он может исчерпать свой бюджет итераций (по умолчанию: 90 шагов), не осознавая, что он на исходе. Давление бюджета автоматически предупреждает модель о наименьшем приближении к лимиту:

Порог Уровень Что видит модель
70% Осторожно [БЮДЖЕТ: 63/90. Осталось 27 итераций. Начинайте консолидироваться.]
90% Предупреждение [БЮДЖЕТНОЕ ПРЕДУПРЕЖДЕНИЕ: 81/90. Осталось всего 9. Ответьте СЕЙЧАС.]

Предупреждения внедряются в JSON-инструмент последнего результата (например, поле _budget_warning), а не как сообщение — это сохраняет кэширование запросов и не нарушает структуру разговора.

agent:
  max_turns: 90                # Макс. итераций на один шаг разговора (по умолчанию: 90)
  api_max_retries: 3           # Повторных попыток на провайдера до включения запасного (по умолчанию: 3)

Давление бюджета включено по умолчанию. Агент видит предупреждения естественным образом в составе результатов инструментов, что побуждает его консолидировать работу и выдать ответ до того, как итерации закончатся.

Когда бюджет итераций полностью исчерпан, CLI показывает пользователю уведомление: ⚠ Бюджет итераций достигнут (90/90) — ответ может быть неполным. Если бюджет исчерпан во время активной работы, агент генерирует сводку выполненного перед остановкой.

agent.api_max_retries определяет, сколько раз Hermes повторяет вызов API провайдера при временных ошибках (ограничения скорости, обрывы соединения, 5xx) до того, как сработает переключение на запасного провайдера. По умолчанию 3 — всего четыре попытки. Если у вас настроены запасные провайдеры и вы хотите быстрее переключаться, уменьшите до 0, чтобы первая же временная ошибка на основном провайдере немедленно передала управление запасному, вместо того чтобы тратить попытки на нестабильную конечную точку.

Тайм-ауты API

У Hermes есть отдельные уровни тайм-аутов для потоковой передачи, а также детектор «зависших» вызовов для непотоковых вызовов. Детекторы «зависших» вызовов автоматически настраиваются для локальных провайдеров только в том случае, если вы оставляете их в неявных значениях по умолчанию.

Тайм-аут По умолчанию Локальные провайдеры Конфиг / переменная окружения
Тайм-аут чтения сокета 120 с Автоматически повышается до 1800 с HERMES_STREAM_READ_TIMEOUT
Тайм-аут обнаружения зависшего потока 180 с Автоматически отключается HERMES_STREAM_STALE_TIMEOUT
Тайм-аут обнаружения зависшего непотокового вызова 300 с Автоматически отключается при неявном значении providers.<id>.stale_timeout_seconds или HERMES_API_CALL_STALE_TIMEOUT
Вызов API (непотоковый) 1800 с Без изменений providers.<id>.request_timeout_seconds / timeout_seconds или HERMES_API_TIMEOUT

Тайм-аут чтения сокета определяет, сколько httpx ждёт следующего фрагмента данных от провайдера. Локальные LLM могут тратить минуты на префилл в больших контекстах, прежде чем выдать первый токен, поэтому Hermes увеличивает его до 30 минут при обнаружении локальной конечной точки. Если вы явно установите HERMES_STREAM_READ_TIMEOUT, это значение всегда используется независимо от обнаружения конечной точки.

Тайм-аут обнаружения зависшего потока завершает соединения, которые получают ping поддержания активности SSE, но не фактический контент. Он полностью отключается для локальных провайдеров, поскольку они не отправляют ping поддержания активности во время префилла.

Тайм-аут обнаружения зависшего непотокового вызова завершает непотоковые вызовы, которые не дают ответа слишком долго. По умолчанию Hermes отключает это на локальных конечных точках, чтобы избежать ложных срабатываний во время длительных префиллов. Если вы явно установите providers.<id>.stale_timeout_seconds, providers.<id>.models.<model>.stale_timeout_seconds или HERMES_API_CALL_STALE_TIMEOUT, это явное значение соблюдается даже на локальных конечных точках.

Предупреждения о давлении контекста

В отличие от давления бюджета итераций, давление контекста отслеживает, насколько разговор близок к порогу сжатия — точке, где срабатывает сжатие контекста для суммаризации старых сообщений. Это помогает и вам, и агенту понимать, когда разговор становится длинным.

Прогресс Уровень Что происходит
≥ 60% до порога Информация CLI показывает голубой индикатор выполнения; шлюз отправляет информационное уведомление
≥ 85% до порога Предупреждение CLI показывает жирный жёлтый индикатор; шлюз предупреждает о неминуемом сжатии

В CLI давление контекста отображается как индикатор выполнения в ленте вывода инструментов:

  ◐ контекст ████████████░░░░░░░░ 62% до сжатия  48k порог (50%) · приближается сжатие

На платформе обмена сообщениями отправляется текстовое сообщение:

◐ Контекст: ████████████░░░░░░░░ 62% до сжатия (порог: 50% окна).

Если автосжатие отключено, в предупреждении сообщается, что контекст может быть усечён вместо этого.

Давление контекста незначительное — настройка не требуется. Оно реализуется исключительно как.для пользователя и не изменяет поток сообщений и не внедряет ничего в контекстные модели.

Стратегии пулов учётных данных

Если у вас несколько ключей API или токенов OAuth для одного провайдера, настройте балансировку ротации:

credential_pool_strategies:
  openrouter: round_robin    # равномерно перебирать ключи
  anthropic: least_used      # всегда выбирать наименее используемый ключ

Варианты: fill_first (по умолчанию), round_robin, least_used, random. Полная документация в разделе Пулы учётных данных.

Вспомогательные модели

Hermes использует «вспомогательные» модели для решения задач, таких как анализ изображений, масштабирование анализа веб-страницы, анализ скриншотов браузера, генерация названных сессий и сжатие контекста. По умолчанию (auxiliary.*.provider: "auto") Hermes направляет все вспомогательные задачи на основную модель чата — того же провайдера/модели, которую вы выбрали в hermes model. Для начала вам не нужно ничего настраивать, но имейте в виду, что на дорогах моделей рассуждений (Opus, MiniMax M2.7 и т.д.) вспомогательные задачи требуют значительных затрат. Если вам нужны дешёвые и простые сложные задачи, отличные от основных моделей, обязательно укажите auxiliary.<task>.provider и auxiliary.<task>.model (например, Gemini Flash на OpenRouter для просмотра и веб-страницы).

📝 Note

Почему «auto» использует основную модель Ранние сборки разделяли пользователей агрегаторов (OpenRouter, Nous Portal) в дешёвом варианте по умолчанию на стороне провайдера. Это было неожиданно — пользователи, платившие за подписку агрегатора, по другую сторону модели, обрабатывающую их вспомогательный трафик. Теперь auto использует основную модель для всех, переопределение конкретных задач в config.yaml по-прежнему имеет приоритет (см. Полную справку по вспомогательной конфигурации ниже).

Интерактивная настройка вспомогательных моделей

Вместо ручного редактирования YAML запустите «модель Гермеса» и выберите в меню «Настроить вспомогательные модели». Вы получаете интерактивный выбор для каждой задачи:

$ hermes model
→ Configure auxiliary models

[ ] vision               сейчас: auto / основная модель
[ ] web_extract          сейчас: auto / основная модель
[ ] session_search       сейчас: openrouter / google/gemini-2.5-flash
[ ] title_generation     сейчас: openrouter / google/gemini-3-flash-preview
[ ] compression          сейчас: auto / основная модель
[ ] approval             сейчас: auto / основная модель
[ ] triage_specifier     сейчас: auto / основная модель

Выберите вопрос, укажите провайдера (OAuth-потоки открывают браузер; провайдеры с ключами API запрашивают ключ), выберите модель. Изменение сохраняется в auxiliary.<task>.* в config.yaml. Тот же механизм, что и при выборе основной модели — никакого дополнительного синтаксиса.

Видеоурок