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

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

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

~/.hermes/
├── config.yaml     # Settings (model, terminal, TTS, compression, etc.)
├──.env            # API keys and secrets
├── auth.json       # OAuth provider credentials (Nous Portal, etc.)
├── SOUL.md         # Primary agent identity (slot #1 in system prompt)
├── memories/       # Persistent memory (MEMORY.md, USER.md)
├── skills/         # Agent-created skills (managed via skill_manage tool)
├── cron/           # Scheduled jobs
├── sessions/       # Gateway sessions
└── logs/           # Logs (errors.log, gateway.log — secrets auto-redacted)

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

hermes config              # View current configuration
hermes config edit         # Open config.yaml in your editor
hermes config set KEY VAL  # Set a specific value
hermes config check        # Check for missing options (after updates)
hermes config migrate      # Interactively add missing options

# Examples:
hermes config set model anthropic/claude-opus-4
hermes config set terminal.backend docker
hermes config set OPENROUTER_API_KEY sk-or-...  # Saves to.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. **Встроенные настройки по умолчанию**  жестко запрограммированные безопасные настройки по умолчанию, когда больше ничего не установлено.:::информация Практическое правило
Секреты (ключи 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 не расширяется.

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

Тайм-ауты поставщика

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

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

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

Конфигурация серверной части терминала

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

terminal:
  backend: local    # local | docker | ssh | modal | daytona | vercel_sandbox | singularity
  cwd: "."          # Gateway/cron working directory (CLI always uses launch dir)
  timeout: 180      # Per-command timeout in seconds
  env_passthrough: []  # Env var names to forward to sandboxed execution (terminal + execute_code)
  singularity_image: "docker://nikolaik/python-nodejs:python3.11-nodejs20"  # Container image for Singularity backend
  modal_image: "nikolaik/python-nodejs:python3.11-nodejs20"                 # Container image for Modal backend
  daytona_image: "nikolaik/python-nodejs:python3.11-nodejs20"               # Container image for Daytona backend

Для облачных песочниц, таких как 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

Запускает команды внутри контейнера 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  # Mount launch dir into /workspace
  docker_run_as_host_user: false   # See "Running container as host user" below
  docker_forward_env:              # Env vars to forward into container
    - "GITHUB_TOKEN"
  docker_volumes:                  # Host directory mounts
    - "/home/user/projects:/workspace/projects"
    - "/home/user/data:/data:ro"   #:ro for read-only

  # Resource limits
  container_cpu: 1                 # CPU cores (0 = unlimited)
  container_memory: 5120           # MB (0 = unlimited)
  container_disk: 51200            # MB (requires overlay2 on XFS+pquota)
  container_persistent: true       # Persist /workspace and /root across sessions

Требования: 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 сохраняются от одного вызова инструмента к другому. Контейнер останавливается и удаляется при выключении Гермеса (или когда его забирает холостой ход).

Параллельные подагенты, порожденные через delegate_task(tasks=[...]), совместно используют этот контейнер — одновременные мутации cd, env и записи по одному и тому же пути будут конфликтовать. Если субагенту требуется изолированная песочница, он должен зарегистрировать переопределение образа для каждой задачи через 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 МБ)

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

SSH-бэкэнд

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

terminal:
  backend: ssh
  persistent_shell: true           # Keep a long-lived bash session (default: 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                 # CPU cores
  container_memory: 5120           # MB (5GB)
  container_disk: 51200            # MB (50GB)
  container_persistent: true       # Snapshot/restore filesystem

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

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

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

Серверная часть Daytona

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

terminal:
  backend: daytona
  container_cpu: 1                 # CPU cores
  container_memory: 5120           # MB → converted to GiB
  container_disk: 10240            # MB → converted to GiB (max 10 GiB)
  container_persistent: true       # Stop/resume instead of delete

Обязательно: переменная среды DAYTONA_API_KEY.

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

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

Серверная часть песочницы Vercel

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

terminal:
  backend: vercel_sandbox
  vercel_runtime: node24          # node24 | node22 | python3.13
  cwd: /vercel/sandbox            # default workspace root
  container_persistent: true      # Snapshot/restore filesystem
  container_disk: 51200           # Shared default only; custom disk is unsupported

Требуется установка. Установите дополнительный SDK:

pip install 'hermes-agent[vercel]'

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

Для разовых местных разработок Hermes также принимает недолговечные токены Vercel OIDC:

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 делает снимок файловой системы песочницы во время очистки и восстанавливает более позднюю песочницу для той же задачи из этого снимка. Содержимое снимка может включать синхронизированные с Hermes учетные данные, навыки и файлы кэша, которые были скопированы в песочницу. При этом сохраняется только состояние файловой системы; он не сохраняет идентичность активной песочницы, пространство PID, состояние оболочки или запущенные фоновые процессы.

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

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

Серверная часть Singularity/Apptainer

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

terminal:
  backend: singularity
  singularity_image: "docker://nikolaik/python-nodejs:python3.11-nodejs20"
  container_cpu: 1                 # CPU cores
  container_memory: 5120           # MB
  container_persistent: true       # Writable overlay persists across sessions

Требования: 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     # default — sync files up to 100 MB each
  file_sync_enabled: true   # default — set false to skip the sync entirely

Таким образом вы восстанавливаете результаты из эфемерных облачных песочниц, которые уничтожаются после завершения сеанса, без необходимости явно указывать агенту 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"   # Read-write (default)
    - "/home/user/datasets:/data:ro"              # Read-only
    - "/home/user/.hermes/cache/documents:/output" # Gateway-visible exports

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

Если вы используете шлюз обмена сообщениями и хотите, чтобы агент отправлял сгенерированные файлы через 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   # default: false

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

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

Необязательно: смонтируйте каталог запуска в /workspace

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

Включите его в 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   # default — enables persistent shell for 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, автоматически переходят в одноразовый режим, поскольку стандартный ввод постоянной оболочки уже занят протоколом IPC.</div>
См. [Выполнение кода](features/code-execution.md) и [раздел «Терминал» в README](features/tools.md) для получения подробной информации о каждом бэкэнде.

## Настройки навыков

Навыки могут объявлять свои собственные настройки конфигурации через свой интерфейс SKILL.md. Это несекретные значения (пути, настройки, настройки домена), хранящиеся в пространстве имен «skills.config» в «config.yaml».
```yaml
skills:
  config:
    myplugin:
      path: ~/myplugin-data   # Example — each skill defines its own keys

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

Установка значений вручную:

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

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

Защита от записи навыков, созданных агентом

Когда агент использует skill_manage для создания, редактирования, исправления или удаления навыка, Hermes может дополнительно сканировать новый/обновленный контент на наличие опасных шаблонов ключевых слов (сбор учетных данных, очевидное внедрение подсказок, инструкции по удалению). Сканер отключен по умолчанию — рабочие процессы реальных агентов, которые законно касаются ~/.ssh/ или упоминают $OPENAI_API_KEY, слишком часто нарушали эвристику. Включите его снова, если хотите, чтобы сканер выдавал вам подсказку до того, как навык агента запишет:

skills:
  guard_agent_created: true   # default: false

Когда эта опция включена, любая запись с флагом skill_manage отображается в виде запроса на одобрение с обоснованием сканера. Принято пишет землю; Отказ в записи возвращает агенту поясняющую ошибку.

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

memory:
  memory_enabled: true
  user_profile_enabled: true
  memory_char_limit: 2200   # ~800 tokens
  user_char_limit: 1375     # ~500 tokens

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

Управляет объемом содержимого, который может вернуть один вызов read_file. Чтения, превышающие лимит, отклоняются с ошибкой, сообщающей агенту использовать offset и limit для меньшего диапазона. Это предотвращает заполнение контекстного окна при однократном чтении мини-пакета JS или большого файла данных.

file_read_max_chars: 100000  # default — ~25-35K tokens

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

# Large context model (200K+)
file_read_max_chars: 200000

# Small local model (16K context)
file_read_max_chars: 30000

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

Пределы усечения выходных данных инструмента

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

tool_output:
  max_bytes: 50000        # terminal output cap (chars)
  max_lines: 2000         # read_file pagination cap
  max_line_length: 2000   # per-line cap in read_file's line-numbered view

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

# Large context model (200K+)
tool_output:
  max_bytes: 150000
  max_lines: 5000

# Small local model (16K context)
tool_output:
  max_bytes: 20000
  max_lines: 500

Отключить глобальный набор инструментов

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

agent:
  disabled_toolsets:
    - memory       # hide memory tools + MEMORY_GUIDANCE injection
    - web          # no web_search / web_extract anywhere

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

Оставить список пустым или пропустить ключ — это пустая операция.

Изоляция рабочего дерева Git

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

worktree: true    # Always create a worktree (same as hermes -w)
# worktree: false # Default — only when -w flag is passed

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

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

#.worktreeinclude.env.venv/
node_modules/

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

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

Все настройки сжатия хранятся в config.yaml (без переменных среды).

Полная ссылка

compression:
  enabled: true                                     # Toggle compression on/off
  threshold: 0.50                                   # Compress at this % of context limit
  target_ratio: 0.20                                # Fraction of threshold to preserve as recent tail
  protect_last_n: 20                                # Min recent messages to keep uncompressed
  hygiene_hard_message_limit: 400                   # Gateway safety valve — see below

# The summarization model/provider is configured under auxiliary:
auxiliary:
  compression:
    model: "google/gemini-3-flash-preview"          # Model for summarization
    provider: "auto"                                # Provider: "auto", "openrouter", "nous", "codex", "main", etc.
    base_url: null                                  # Custom OpenAI-compatible endpoint (overrides provider)
```<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` — это **предохранительный клапан предварительного сжатия**, предназначенный только для шлюза. Неконтролируемые сеансы с тысячами сообщений могут достичь пределов контекста модели до того, как сработает обычный порог процента контекста; когда количество сообщений пересекает этот потолок, Hermes принудительно сжимает независимо от использования токена. Значение по умолчанию «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 и т.д.

Пользовательская конечная точка (автономное размещение, Ollama, zai, 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"    # default — built-in lossy summarization

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

context:
  engine: "lcm"          # must match the plugin's name

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

См. Поставщики памяти для получения информации об аналогичной системе единого выбора для плагинов памяти.

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

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

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

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

agent:
  max_turns: 90                # Max iterations per conversation turn (default: 90)
  api_max_retries: 2           # Retries per provider before fallback engages (default: 2)

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

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

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

Тайм-ауты API

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

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

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

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

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

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

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

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

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

  ◐ context ████████████░░░░░░░░ 62% to compaction  48k threshold (50%) · approaching compaction

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

◐ Context: ████████████░░░░░░░░ 62% to compaction (threshold: 50% of window).

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

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

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

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

credential_pool_strategies:
  openrouter: round_robin    # cycle through keys evenly
  anthropic: least_used      # always pick the least-used key

Опции: «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

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

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

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

$ hermes model
→ Configure auxiliary models

[ ] vision               currently: auto / main model
[ ] web_extract          currently: auto / main model
[ ] session_search       currently: openrouter / google/gemini-2.5-flash
[ ] title_generation     currently: openrouter / google/gemini-3-flash-preview
[ ] compression          currently: auto / main model
[ ] approval             currently: auto / main model

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

Видеоурок