Перейти к содержанию

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

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

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

[code] ~/.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 — секреты автоматически скрываются)

[/code]

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

[code] 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

[/code] tip Команда hermes config set автоматически направляет значения в нужный файл — ключи API сохраняются в .env, всё остальное — в config.yaml.

Приоритет конфигурации

Настройки разрешаются в следующем порядке (наивысший приоритет первый): 1. Аргументы CLI — например, hermes chat --model anthropic/claude-sonnet-4 (переопределение для одного запуска) 2. ~/.hermes/config.yaml — основной файл конфигурации для всех несекретных настроек 3. ~/.hermes/.env — резерв для переменных окружения; обязателен для секретов (ключи API, токены, пароли) 4. Встроенные значения по умолчанию — жёстко заданные безопасные значения, если ничего другого не установлено

Правило большого пальца Секреты (ключи API, токены ботов, пароли) помещаются в .env. Всё остальное (модель, бэкенд терминала, настройки сжатия, лимиты памяти, наборы инструментов) идёт в config.yaml. Если заданы оба файла, config.yaml имеет приоритет для несекретных настроек.

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

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

delegation:
  api_key: ${DELEGATION_KEY}

[/code] В одном значении можно использовать несколько ссылок: url: "${HOST}:${PORT}". Если переменная не задана, заполнитель остаётся как есть (${UNDEFINED_VAR} остаётся без изменений). Поддерживается только синтаксис ${VAR} — простая запись $VAR не раскрывается. Информацию по настройке AI-провайдеров (OpenRouter, Anthropic, Copilot, пользовательские конечные точки, локальные LLM, запасные модели и т.д.) см. в разделе AI-провайдеры.

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

Вы можете установить providers.<id>.request_timeout_seconds для тайм-аута запроса ко всему провайдеру, а также providers.<id>.models.<model>.timeout_seconds для переопределения для конкретной модели. Применяется к основному клиенту на каждом транспорте (OpenAI-wire, нативный Anthropic, Anthropic-совместимый), цепочке fallback, перестроениям после смены учётных данных и (для OpenAI-wire) к параметру тайм-аута каждого запроса — таким образом, настроенное значение имеет приоритет над устаревшей переменной окружения HERMES_API_TIMEOUT. Вы также можете установить providers.<id>.stale_timeout_seconds для детектора зависших не-стриминговых вызовов, а также providers.<id>.models.<model>.stale_timeout_seconds для переопределения для конкретной модели. Это имеет приоритет над устаревшей переменной окружения 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 Sandbox или в контейнере Singularity/Apptainer. [code] 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

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

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

Бэкенд| Где выполняются команды| Изоляция| Лучше всего подходит для ---|---|---|---|--- local| На вашей машине напрямую| Нет| Разработка, личное использование docker| Единый долгоживущий Docker-контейнер (общий для сессии, /new, подагентов)| Полная (пространства имён, cap-drop)| Безопасная изоляция, CI/CD ssh| Удалённый сервер через SSH| Сетевая граница| Удалённая разработка, мощное оборудование modal| Modal облачная песочница| Полная (облачная ВМ)| Эфемерные облачные вычисления, оценки daytona| Daytona рабочее пространство| Полная (облачный контейнер)| Управляемые облачные среды разработки vercel_sandbox| Vercel Sandbox| Полная (облачная микро-ВМ)| Облачное выполнение с сохранением файловой системы на основе снимков singularity| Контейнер Singularity/Apptainer| Пространства имён (--containall)| HPC-кластеры, общие машины

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

Значение по умолчанию. Команды выполняются напрямую на вашей машине без изоляции. Не требует специальной настройки. [code] terminal: backend: local

[/code] warning Агент имеет такой же доступ к файловой системе, как и ваша учётная запись. Используйте hermes tools, чтобы отключить нежелательные инструменты, или переключитесь на Docker для изоляции.

Docker бэкенд

Выполняет команды внутри Docker-контейнера с усиленной безопасностью (все capabilities отозваны, без повышения привилегий, лимиты PID). Единый долгоживущий контейнер, а не по команде. Hermes запускает ОДИН долгоживущий контейнер при первом использовании и направляет все вызовы терминала, файлов и execute_code через docker exec в этот же контейнер — в рамках сессий, /new, /reset и подагентов delegate_task — на всё время работы процесса Hermes. Изменения рабочего каталога, установленные пакеты и файлы в /workspace сохраняются от одного вызова инструмента к другому, как в локальной оболочке. Контейнер останавливается и удаляется при завершении работы. Подробнее см. в разделе Жизненный цикл контейнера ниже. [code] 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                 # Ядра CPU (0 = без ограничений)
  container_memory: 5120           # МБ (0 = без ограничений)
  container_disk: 51200            # МБ (требуется overlay2 на XFS+pquota)
  container_persistent: true       # Сохранять /workspace и /root между сессиями

[/code] Требования: 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 с login shell, поэтому изменения рабочего каталога, установленные пакеты и файлы в /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. Навыки также могут объявлять required_environment_variables, которые объединяются автоматически.

SSH бэкенд

Выполняет команды на удалённом сервере через SSH. Использует ControlMaster для повторного использования соединения (5-минутный keepalive бездействия). Постоянная оболочка включена по умолчанию — состояние (рабочий каталог, переменные окружения) сохраняется между командами. [code] terminal: backend: ssh persistent_shell: true # Держать долгоживущую bash-сессию (по умолчанию: true)

[/code] Обязательные переменные окружения: [code] TERMINAL_SSH_HOST=my-server.example.com TERMINAL_SSH_USER=ubuntu

[/code] Опционально: Переменная| По умолчанию| Описание ---|---|--- TERMINAL_SSH_PORT| 22| Порт SSH TERMINAL_SSH_KEY| (системный)| Путь к закрытому ключу SSH TERMINAL_SSH_PERSISTENT| true| Включить постоянную оболочку Как это работает: Подключается при инициализации с BatchMode=yes и StrictHostKeyChecking=accept-new. Постоянная оболочка держит один процесс bash -l на удалённом хосте, общаясь через временные файлы. Команды, требующие stdin_data или sudo, автоматически переключаются в одноразовый режим.

Выполняет команды в облачной песочнице Modal. Каждая задача получает изолированную ВМ с настраиваемыми CPU, памятью и диском. Файловая система может быть сохранена/восстановлена между сессиями. [code] terminal: backend: modal container_cpu: 1 # Ядра CPU container_memory: 5120 # МБ (5 ГБ) container_disk: 51200 # МБ (50 ГБ) container_persistent: true # Снимок/восстановление файловой системы

[/code] Обязательно: Переменные окружения MODAL_TOKEN_ID + MODAL_TOKEN_SECRET или файл конфигурации ~/.modal.toml. Постоянство: При включении файловая система песочницы сохраняется в снимок при очистке и восстанавливается при следующей сессии. Снимки отслеживаются в ~/.hermes/modal_snapshots.json. Это сохраняет состояние файловой системы, а не работающие процессы, пространство PID или фоновые задачи. Файлы учётных данных: Автоматически монтируются из ~/.hermes/ (OAuth-токены и т.д.) и синхронизируются перед каждой командой.

Daytona бэкенд

Выполняет команды в управляемом рабочем пространстве Daytona. Поддерживает остановку/возобновление для постоянства. [code] terminal: backend: daytona container_cpu: 1 # Ядра CPU container_memory: 5120 # МБ → конвертируется в ГиБ container_disk: 10240 # МБ → конвертируется в ГиБ (макс. 10 ГиБ) container_persistent: true # Остановка/возобновление вместо удаления

[/code] Обязательно: Переменная окружения DAYTONA_API_KEY. Постоянство: При включении песочницы останавливаются (не удаляются) при очистке и возобновляются при следующей сессии. Имена песочниц следуют шаблону hermes-{task_id}. Ограничение диска: Daytona устанавливает максимум 10 ГиБ. Запросы выше этого лимита обрезаются с предупреждением.

Vercel Sandbox бэкенд

Выполняет команды в облачной микро-ВМ Vercel Sandbox. Hermes использует обычные инструменты терминала и файлов; нет инструментов, специфичных для Vercel, предназначенных для модели. [code] terminal: backend: vercel_sandbox vercel_runtime: node24 # node24 | node22 | python3.13 cwd: /vercel/sandbox # Корень рабочего пространства по умолчанию container_persistent: true # Снимок/восстановление файловой системы container_disk: 51200 # Только общее значение по умолчанию; пользовательский диск не поддерживается

[/code] Обязательная установка: Установите дополнительный пакет SDK: [code] pip install 'hermes-agent[vercel]'

[/code] Обязательная аутентификация: Настройте аутентификацию с помощью токена доступа, указав все три параметра: VERCEL_TOKEN, VERCEL_PROJECT_ID и VERCEL_TEAM_ID. Это поддерживаемая настройка для развёртываний и обычных долгоживущих процессов Hermes на Render, Railway, Docker и подобных хостах. Для одноразовой локальной разработки Hermes также принимает краткосрочные токены Vercel OIDC: [code] VERCEL_OIDC_TOKEN="$(vc project token )" hermes chat

[/code] Из связанного каталога проекта Vercel можно опустить имя проекта: [code] VERCEL_OIDC_TOKEN="$(vc project token)" hermes chat

[/code] OIDC-токены являются краткосрочными и не должны использоваться в описанном пути развёртывания. Среда выполнения: terminal.vercel_runtime поддерживает node24, node22 и python3.13. Если не задано, Hermes по умолчанию использует node24. Постоянство: Когда container_persistent: true, Hermes сохраняет снимок файловой системы песочницы во время очистки и восстанавливает более позднюю песочницу для той же задачи из этого снимка. Содержимое снимка может включать синхронизированные Hermes учётные данные, навыки и файлы кеша, которые были скопированы в песочницу. Это сохраняет только состояние файловой системы; не сохраняется идентификатор работающей песочницы, пространство PID, состояние оболочки или работающие фоновые процессы. Фоновые команды: terminal(background=true) использует общий поток фоновых процессов Hermes для нелокальных сред. Вы можете запускать, опрашивать, ожидать, просматривать журналы и завершать процессы через обычный инструмент управления процессами, пока песочница активна. Hermes не предоставляет нативного механизма Vercel для восстановления отсоединённых процессов после очистки или перезапуска. Управление размером диска: Vercel Sandbox в настоящее время не поддерживает параметр ресурса container_disk от Hermes. Оставьте container_disk не заданным или используйте общее значение по умолчанию 51200; значения, отличные от значений по умолчанию, приводят к сбою диагностики и создания бэкенда, а не игнорируются без уведомления.

Бэкенд Singularity/Apptainer

Выполняет команды в контейнере Singularity/Apptainer. Разработан для HPC-кластеров и общих машин, где Docker недоступен. [code] terminal: backend: singularity singularity_image: "docker://nikolaik/python-nodejs:python3.11-nodejs20" container_cpu: 1 # Ядра CPU container_memory: 5120 # МБ container_persistent: true # Записываемый overlay сохраняется между сессиями

[/code] Требования: Бинарный файл 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 для полной изоляции пространств имён без монтирования домашнего каталога хоста.

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

Если команды терминала сразу завершаются ошибкой или сообщается, что инструмент терминала отключён: * Local — Не требует специальных требований. Самый безопасный вариант для начала. * Docker — Выполните docker version, чтобы проверить, работает ли Docker. Если не работает, исправьте Docker или выполните hermes config set terminal.backend local. * SSH — Должны быть установлены обе переменные TERMINAL_SSH_HOST и TERMINAL_SSH_USER. Hermes выводит понятную ошибку, если какая-либо из них отсутствует. * Modal — Требуется переменная окружения MODAL_TOKEN_ID или файл ~/.modal.toml. Выполните hermes doctor для проверки. * Daytona — Требуется DAYTONA_API_KEY. SDK Daytona обрабатывает конфигурацию URL сервера. * Singularity — Требуется apptainer или singularity в $PATH. Обычно доступно на HPC-кластерах.

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

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

Для бэкендов SSH, Modal и Daytona (где дерево файлов агента находится на другой машине, а не на хосте, где работает Hermes), Hermes отслеживает файлы, которые агент изменял в удалённой песочнице, и при завершении сессии/очистке песочницы синхронизирует изменённые файлы обратно на хост в каталог ~/.hermes/cache/remote-syncs/<session-id>/. * Срабатывает при: закрытии сессии, /new, /reset, тайм-ауте сообщения шлюза, завершении подагента delegate_task, если дочерний элемент использовал удалённый бэкенд. * Охватывает всё дерево, которое изменил агент, а не только файлы, которые он явно открывал. Добавления, изменения и удаления фиксируются. * Удалённая песочница может быть уничтожена к тому времени, как вы начнёте поиск; локальная копия ~/.hermes/cache/remote-syncs/… является авторитетной записью того, что изменил агент. * Крупные бинарные выводы (контрольные точки моделей, необработанные наборы данных) ограничены по размеру — синхронизация пропускает файлы размером больше file_sync_max_mb (по умолчанию 100). Увеличьте это значение, если ожидаете возврата более крупных артефактов.

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

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

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

При использовании Docker бэкенда docker_volumes позволяет вам делиться каталогами хоста с контейнером. Каждая запись использует стандартный синтаксис Docker -v: host_path:container_path[:options]. [code] terminal: backend: docker docker_volumes: - "/home/user/projects:/workspace/projects" # Чтение-запись (по умолчанию) - "/home/user/datasets:/data:ro" # Только чтение - "/home/user/.hermes/cache/documents:/output" # Экспорт, видимый шлюзу

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

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

warning Повторяющиеся ключи YAML молча перезаписывают предыдущие. Если у вас уже есть блок docker_volumes:, объедините новые монтирования в тот же список, а не добавляйте другой ключ docker_volumes: позже в файле. Также можно задать через переменную окружения: TERMINAL_DOCKER_VOLUMES='[\"/host:/container\"]' (массив JSON).

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

По умолчанию сессии Docker терминала не наследуют произвольные учётные данные хоста. Если вам нужен определённый токен внутри контейнера, добавьте его в terminal.docker_forward_env. [code] terminal: backend: docker docker_forward_env: - "GITHUB_TOKEN" - "NPM_TOKEN"

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

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

По умолчанию Docker-контейнеры работают от имени root (UID 0). Файлы, созданные внутри /workspace или других bind-mount точек, оказываются принадлежащими root на хосте, поэтому после сессии вам нужно выполнять sudo chown, чтобы редактировать их в редакторе хоста. Флаг terminal.docker_run_as_host_user исправляет это: [code] terminal: backend: docker docker_run_as_host_user: true # по умолчанию: false

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

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

Docker-песочницы по умолчанию остаются изолированными. Hermes не передаёт ваш текущий рабочий каталог хоста в контейнер, если вы явно не согласитесь на это. Включите это в config.yaml: [code] terminal: backend: docker docker_mount_cwd_to_workspace: true

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

При выключении /workspace остаётся принадлежащим песочнице, если вы явно не смонтируете что-либо через docker_volumes. Компромисс безопасности: * false сохраняет границу песочницы * true даёт песочнице прямой доступ к каталогу, из которого вы запустили Hermes

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

Постоянная оболочка

По умолчанию каждая команда терминала выполняется в своём собственном подпроцессе — рабочий каталог, переменные окружения и переменные оболочки сбрасываются между командами. Когда постоянная оболочка включена, один долгоживущий bash-процесс поддерживается живым между вызовами execute(), так что состояние сохраняется между командами. Это наиболее полезно для SSH бэкенда, где это также устраняет накладные расходы на соединение для каждой команды. Постоянная оболочка включена по умолчанию для SSH и отключена для локального бэкенда. [code] terminal: persistent_shell: true # по умолчанию — включает постоянную оболочку для SSH

[/code] Чтобы отключить: [code] hermes config set terminal.persistent_shell false

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

Приоритет: Уровень| Переменная| По умолчанию ---|---|--- Конфиг| terminal.persistent_shell| true SSH переопределение| TERMINAL_SSH_PERSISTENT| следует за конфигом Локальное переопределение| TERMINAL_LOCAL_PERSISTENT| false Переменные окружения для каждого бэкенда имеют наивысший приоритет. Если вы хотите использовать постоянную оболочку и для локального бэкенда: [code] export TERMINAL_LOCAL_PERSISTENT=true

[/code] note Команды, требующие stdin_data или sudo, автоматически переключаются в одноразовый режим, так как stdin постоянной оболочки уже занят протоколом IPC. Подробнее о каждом бэкенде см. в разделе Выполнение кода и README раздел Терминал.

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

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

[/code] Как работают настройки навыков: * hermes config migrate сканирует все включённые навыки, находит ненастроенные параметры и предлагает запросить их * hermes config show отображает все настройки навыков в разделе «Skill Settings» с указанием навыка, к которому они относятся * При загрузке навыка его настроенные значения конфигурации автоматически внедряются в контекст навыка

Установка значений вручную: [code] hermes config set skills.config.myplugin.path ~/myplugin-data

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

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

Когда агент использует skill_manage для создания, редактирования, изменения или удаления навыка, Hermes может опционально сканировать новое/обновлённое содержимое на наличие опасных ключевых слов (кража учётных данных, очевидная инъекция в промпт, инструкции по эксфильтрации). Сканер выключен по умолчанию — реальные рабочие процессы агентов, которые легитимно обращаются к ~/.ssh/ или упоминают $OPENAI_API_KEY, слишком часто срабатывали ложно. Включите его обратно, если хотите, чтобы сканер запрашивал подтверждение перед записью навыков агентом: [code] skills: guard_agent_created: true # по умолчанию: false

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

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

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

[/code]

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

Контролирует, сколько контента может вернуть один вызов read_file. Чтения, превышающие лимит, отклоняются с ошибкой, сообщающей агенту использовать offset и limit для меньшего диапазона. Это предотвращает заполнение окна контекста одним чтением минифицированного JS-бандла или большого файла данных. [code] file_read_max_chars: 100000 # по умолчанию — ~25-35K токенов

[/code] Увеличьте, если вы используете модель с большим окном контекста и часто читаете большие файлы. Уменьшите для моделей с маленьким контекстом, чтобы чтения были эффективными: [code] # Модель с большим контекстом (200K+) file_read_max_chars: 200000

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

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

Лимиты усечения вывода инструментов

Три связанных ограничения контролируют, сколько необработанного вывода может вернуть инструмент, прежде чем Hermes усечёт его: [code] tool_output: max_bytes: 50000 # Лимит вывода терминала (символов) max_lines: 2000 # Лимит пагинации read_file max_line_length: 2000 # Лимит на строку в нумерованном представлении read_file

[/code] * max_bytes — Когда команда terminal выдаёт больше этого количества символов объединённого stdout/stderr, Hermes сохраняет первые 40% и последние 60% и вставляет уведомление [OUTPUT TRUNCATED] между ними. По умолчанию 50000 (≈12-15K токенов для типичных токенизаторов). * max_lines — Верхняя граница параметра limit одного вызова read_file. Запросы выше этого значения обрезаются, чтобы одно чтение не могло заполнить окно контекста. По умолчанию 2000. * max_line_length — Ограничение на строку, применяемое, когда read_file выводит нумерованное представление. Строки длиннее этого значения усекаются до этого количества символов с последующим ... [truncated]. По умолчанию 2000.

Увеличьте лимиты для моделей с большими окнами контекста, которые могут позволить себе больше необработанного вывода на один вызов. Уменьшите для моделей с маленьким контекстом, чтобы результаты инструментов были компактными: [code] # Модель с большим контекстом (200K+) tool_output: max_bytes: 150000 max_lines: 5000

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

[/code]

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

Чтобы отключить определённые наборы инструментов в CLI и на всех платформах шлюзов в одном месте, перечислите их имена в agent.disabled_toolsets: [code] agent: disabled_toolsets: - memory # скрыть инструменты памяти + внедрение MEMORY_GUIDANCE - web # без web_search / web_extract везде

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

Изоляция git worktree

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

[/code] При включении каждая CLI-сессия создаёт новый worktree в .worktrees/ с собственной веткой. Агенты могут редактировать файлы, коммитить, пушить и создавать PR, не мешая друг другу. Чистые worktree удаляются при выходе; грязные сохраняются для ручного восстановления. Вы также можете указать игнорируемые git файлы для копирования в worktree через .worktreeinclude в корне вашего репозитория: [code] # .worktreeinclude .env .venv/ node_modules/

[/code]

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

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

Полная документация

[code] 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-совместимая конечная точка (переопределяет провайдера)

[/code] Миграция устаревшей конфигурации Старые конфиги с compression.summary_model, compression.summary_provider и compression.summary_base_url автоматически мигрируются в auxiliary.compression.* при первой загрузке (версия конфига 17). Ручное действие не требуется. hygiene_hard_message_limit — это предохранительный клапан перед сжатием, предназначенный только для шлюза. Неуправляемые сессии с тысячами сообщений могут достичь лимитов контекста модели до того, как сработает обычный процентный порог контекста; когда количество сообщений превышает этот предел, Hermes принудительно выполняет сжатие независимо от использования токенов. По умолчанию 400 — увеличьте для платформ, где очень длинные сессии являются нормой, уменьшите, чтобы принудить к более агрессивному сжатию. Изменение этого значения на работающем шлюзе вступает в силу при следующем сообщении (см. ниже). Горячая перезагрузка сжатия и длины контекста на шлюзе Начиная с недавних релизов, редактирование model.context_length или любых ключей compression.* в config.yaml на работающем шлюзе вступает в силу при следующем сообщении — перезапуск шлюза, /reset или ротация сессии не требуются. Сигнатура кешированного агента включает эти ключи, поэтому шлюз прозрачно перестраивает агента, когда видит изменение. Ключи API и конфигурация инструментов/навыков по-прежнему требуют обычных путей перезагрузки.

Типичные настройки

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

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

[/code] Работает с любым провайдером: nous, openrouter, codex, anthropic, main и т.д. Пользовательская конечная точка (самостоятельно размещённая, Ollama, zai, DeepSeek и т.д.): [code] auxiliary: compression: model: glm-4.7 base_url: https://api.z.ai/api/coding/paas/v4

[/code] Указывает на пользовательскую OpenAI-совместимую конечную точку. Использует OPENAI_API_KEY для аутентификации.

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

auxiliary.compression.provider auxiliary.compression.base_url Результат
auto (по умолчанию) не задан Автоопределение лучшего доступного провайдера
nous / openrouter / и т.д. не задан Принудительное использование этого провайдера, использование его аутентификации
любой задан Напрямую использовать пользовательскую конечную точку (провайдер игнорируется)
Требование к длине контекста модели суммаризации
Модель суммаризации должна иметь окно контекста как минимум такого же размера, как у вашей основной модели агента. Компрессор отправляет полную среднюю часть разговора модели суммаризации — если окно контекста этой модели меньше, чем у основной модели, вызов суммаризации завершится ошибкой превышения длины контекста. В этом случае средние части отбрасываются без суммаризации, что приводит к молчаливой потере контекста разговора. Если вы переопределяете модель, убедитесь, что длина её контекста равна или превышает длину контекста вашей основной модели.
## Механизм контекста
Механизм контекста управляет тем, как обрабатываются разговоры при приближении к лимиту токенов модели. Встроенный механизм compressor использует сжатие с потерями (см. Сжатие контекста). Плагинные механизмы могут заменить его альтернативными стратегиями.
[code]
context:
engine: "compressor" # по умолчанию — встроенное сжатие с потерями

[/code] Для использования механизма-плагина (например, LCM для управления контекстом без потерь): [code] context: engine: "lcm" # должен совпадать с именем плагина

[/code] Плагинные механизмы никогда не активируются автоматически — вы должны явно установить context.engine на имя плагина. Доступные механизмы можно просмотреть и выбрать через hermes plugins → Provider Plugins → Context Engine. См. Провайдеры памяти для аналогичной системы одиночного выбора для плагинов памяти.

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

Когда агент работает над сложной задачей со многими вызовами инструментов, он может быстро израсходовать свой бюджет итераций (по умолчанию: 90 шагов), не осознавая, что он на исходе. Давление бюджета автоматически предупреждает модель по мере приближения к лимиту: Порог| Уровень| Что видит модель ---|---|--- 70%| Осторожно| [BUDGET: 63/90. 27 iterations left. Start consolidating.] 90%| Предупреждение| [BUDGET WARNING: 81/90. Only 9 left. Respond NOW.] Предупреждения внедряются в JSON последнего результата инструмента (как поле _budget_warning), а не как отдельные сообщения — это сохраняет кеширование промптов и не нарушает структуру разговора. [code] agent: max_turns: 90 # Максимум итераций на один шаг разговора (по умолчанию: 90) api_max_retries: 2 # Повторные попытки на провайдера перед активацией fallback (по умолчанию: 2)

[/code] Давление бюджета включено по умолчанию. Агент видит предупреждения естественным образом как часть результатов инструментов, что побуждает его консолидировать работу и выдать ответ до того, как итерации закончатся. Когда бюджет итераций полностью исчерпан, CLI показывает уведомление пользователю: ⚠ Iteration budget reached (90/90) — response may be incomplete. Если бюджет заканчивается во время активной работы, агент генерирует сводку того, что было сделано перед остановкой. agent.api_max_retries контролирует, сколько раз Hermes повторяет вызов API провайдера при временных ошибках (ограничения скорости, разрывы соединения, 5xx) до того, как сработает переключение на fallback-провайдера. По умолчанию 2 — всего три попытки, что соответствует умолчанию OpenAI SDK. Если у вас настроены fallback-провайдеры и вы хотите переключаться быстрее, уменьшите до 0, чтобы первая же временная ошибка на основном провайдере немедленно передала задание fallback-у, вместо того чтобы тратить повторные попытки на проблемную конечную точку.

Тайм-ауты API

Hermes имеет отдельные уровни тайм-аутов для стриминга, а также детектор зависших вызовов для не-стриминговых вызовов. Детекторы зависших вызовов автоматически настраиваются для локальных провайдеров только когда вы оставляете их с неявными значениями по умолчанию. Тайм-аут| По умолчанию| Локальные провайдеры| Конфиг / env ---|---|---|--- Тайм-аут чтения сокета| 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 могут занимать минуты на prefill для больших контекстов, прежде чем выдать первый токен, поэтому Hermes повышает это значение до 30 минут, когда обнаруживает локальную конечную точку. Если вы явно установили HERMES_STREAM_READ_TIMEOUT, это значение используется всегда, независимо от обнаружения конечной точки. Детекция зависшего стрима завершает соединения, которые получают keep-alive пинги SSE, но не содержат фактического контента. Это полностью отключено для локальных провайдеров, поскольку они не отправляют keep-alive пинги во время prefill. Детекция зависшего не-стрима завершает не-стриминговые вызовы, которые не выдают ответ слишком долго. По умолчанию Hermes отключает это на локальных конечных точках, чтобы избежать ложных срабатываний во время длительных prefills. Если вы явно установите providers.<id>.stale_timeout_seconds, providers.<id>.models.<model>.stale_timeout_seconds или HERMES_API_CALL_STALE_TIMEOUT, это явное значение будет использоваться даже на локальных конечных точках.

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

Отдельно от давления бюджета итераций, давление контекста отслеживает, насколько разговор близок к порогу сжатия — моменту, когда срабатывает сжатие контекста для суммаризации старых сообщений. Это помогает и вам, и агенту понимать, когда разговор становится длинным. Прогресс| Уровень| Что происходит ---|---|--- ≥ 60% до порога| Информация| CLI показывает голубой индикатор прогресса; шлюз отправляет информационное уведомление ≥ 85% до порога| Предупреждение| CLI показывает жирный жёлтый индикатор; шлюз предупреждает, что сжатие неизбежно В CLI давление контекста отображается как индикатор прогресса в ленте вывода инструментов: [code] ◐ context ████████████░░░░░░░░ 62% to compaction 48k threshold (50%) · approaching compaction

[/code] На платформах обмена сообщениями отправляется текстовое уведомление: [code] ◐ Context: ████████████░░░░░░░░ 62% to compaction (threshold: 50% of window).

[/code] Если автосжатие отключено, предупреждение вместо этого сообщает, что контекст может быть усечён. Давление контекста автоматическое — настройка не требуется. Оно работает исключительно как пользовательское уведомление и не изменяет поток сообщений и не внедряет ничего в контекст модели.

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

Когда у вас есть несколько ключей API или OAuth-токенов для одного провайдера, настройте стратегию ротации: [code] credential_pool_strategies: openrouter: round_robin # циклический перебор ключей anthropic: least_used # всегда выбирать наименее используемый ключ

[/code] Варианты: 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 для зрения и извлечения веб-страниц). Почему «auto» использует вашу основную модель Более ранние сборки разделяли пользователей агрегаторов (OpenRouter, Nous Portal) на дешёвого провайдера по умолчанию. Это было неожиданно — пользователи, платившие за подписку агрегатора, видели другую модель, обрабатывающую их вспомогательный трафик. Теперь auto использует основную модель для всех, и переопределения для каждой задачи в config.yaml по-прежнему имеют приоритет (см. Полная документация вспомогательной конфигурации ниже).

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

Вместо ручного редактирования YAML выполните hermes model и выберите «Configure auxiliary models» в меню. Вы увидите интерактивный выбор для каждой задачи: [code] $ 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

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

Видеоурок

Универсальный шаблон конфигурации

Каждый слот модели в Hermes — вспомогательные задачи, сжатие, fallback — использует одни и те же три параметра: Ключ| Что делает| По умолчанию ---|---|--- provider| Какой провайдер использовать для аутентификации и маршрутизации| "auto" model| Какую модель запрашивать| По умолчанию провайдера base_url| Пользовательская OpenAI-совместимая конечная точка (переопределяет провайдера)| не задан Когда base_url задан, Hermes игнорирует провайдера и вызывает эту конечную точку напрямую (используя api_key или OPENAI_API_KEY для аутентификации). Когда задан только provider, Hermes использует встроенную аутентификацию и базовый URL этого провайдера. Доступные провайдеры для вспомогательных задач: auto, main, а также любой провайдер из реестра провайдеровopenrouter, nous, openai-codex, copilot, copilot-acp, anthropic, gemini, google-gemini-cli, qwen-oauth, zai, kimi-coding, kimi-coding-cn, minimax, minimax-cn, minimax-oauth, deepseek, nvidia, xai, ollama-cloud, alibaba, bedrock, huggingface, arcee, xiaomi, kilocode, opencode-zen, opencode-go, ai-gateway, azure-foundry — или любой именованный пользовательский провайдер из вашего списка custom_providers (например, provider: "beans"). MiniMax OAuth minimax-oauth выполняет вход через OAuth в браузере (ключ API не требуется). Выполните hermes model и выберите MiniMax (OAuth) для аутентификации. Вспомогательные задачи автоматически используют MiniMax-M2.7-highspeed. См. руководство по MiniMax OAuth. "main" только для вспомогательных задач Вариант провайдера "main" означает «использовать провайдера, которого использует мой основной агент» — он действителен только внутри конфигов auxiliary:, compression: и fallback_model:. Это не допустимое значение для вашей основной настройки model.provider. Если вы используете пользовательскую OpenAI-совместимую конечную точку, установите provider: custom в разделе model:. См. AI-провайдеры для всех вариантов провайдеров основной модели.

Полная документация вспомогательной конфигурации

[code] auxiliary: # Анализ изображений (vision_analyze tool + скриншоты браузера) vision: provider: "auto" # "auto", "openrouter", "nous", "codex", "main" и т.д. model: "" # например "openai/gpt-4o", "google/gemini-2.5-flash" base_url: "" # Пользовательская OpenAI-совместимая конечная точка (переопределяет провайдера) api_key: "" # Ключ API для base_url (запасной — OPENAI_API_KEY) timeout: 120 # секунд — тайм-аут LLM API; для vision нужен щедрый тайм-аут download_timeout: 30 # секунд — HTTP загрузка изображений; увеличьте для медленных соединений

  # Суммаризация веб-страниц + извлечение текста страниц браузера
  web_extract:
    provider: "auto"
    model: ""                  # например "google/gemini-2.5-flash"
    base_url: ""
    api_key: ""
    timeout: 360               # секунд (6 мин) — LLM суммаризация за попытку

  # Классификатор опасных команд для подтверждения
  approval:
    provider: "auto"
    model: ""
    base_url: ""
    api_key: ""
    timeout: 30                # секунд

  # Тайм-аут сжатия контекста (отдельно от compression.* конфига)
  compression:
    timeout: 120               # секунд — сжатие суммаризирует длинные разговоры, требуется больше времени

  # Поиск по сессиям — суммаризация совпадений прошлых сессий
  session_search:
    provider: "auto"
    model: ""
    base_url: ""
    api_key: ""
    timeout: 30
    max_concurrency: 3       # Ограничение параллельных суммаризаций для уменьшения 429 ошибок
    extra_body: {}           # Специфичные для провайдера OpenAI-совместимые поля запроса

  # Skills hub — сопоставление и поиск навыков
  skills_hub:
    provider: "auto"
    model: ""
    base_url: ""
    api_key: ""
    timeout: 30

  # MCP диспетчеризация инструментов
  mcp:
    provider: "auto"
    model: ""
    base_url: ""
    api_key: ""
    timeout: 30

[/code] tip Каждая вспомогательная задача имеет настраиваемый timeout (в секундах). Значения по умолчанию: vision 120с, web_extract 360с, approval 30с, compression 120с. Увеличьте их, если используете медленные локальные модели для вспомогательных задач. Vision также имеет отдельный download_timeout (по умолчанию 30с) для HTTP загрузки изображений — увеличьте для медленных соединений или собственных серверов изображений. info Сжатие контекста имеет собственный блок compression: для пороговых значений и блок auxiliary.compression: для настроек модели/провайдера — см. Сжатие контекста выше. Fallback-модель использует блок fallback_model: — см. Fallback-модель. Все три следуют одному шаблону provider/model/base_url.

Настройка поиска по сессиям

Если вы используете модель с большим объёмом рассуждений для auxiliary.session_search, Hermes теперь предоставляет два встроенных средства управления: * auxiliary.session_search.max_concurrency: ограничивает, сколько совпавших сессий Hermes суммаризирует одновременно * auxiliary.session_search.extra_body: передаёт специфичные для провайдера OpenAI-совместимые поля запроса для вызовов суммаризации

Пример: [code] auxiliary: session_search: provider: "main" model: "glm-4.5-air" timeout: 60 max_concurrency: 2 extra_body: enable_thinking: false

[/code] Используйте max_concurrency, когда ваш провайдер ограничивает частоту запросов и вы хотите, чтобы session_search обменял параллелизм на стабильность. Используйте extra_body только тогда, когда ваш провайдер документирует OpenAI-совместимые поля тела запроса, которые вы хотите, чтобы Hermes передавал для этой задачи. Hermes передаёт объект как есть. warning extra_body эффективен только если ваш провайдер действительно поддерживает отправляемое поле. Если провайдер не предоставляет нативного OpenAI-совместимого флага отключения рассуждений, Hermes не может синтезировать его от своего имени.

Изменение модели зрения

Чтобы использовать GPT-4o вместо Gemini Flash для анализа изображений: [code] auxiliary: vision: model: "openai/gpt-4o"

[/code] Или через переменную окружения (в ~/.hermes/.env): [code] AUXILIARY_VISION_MODEL=openai/gpt-4o

[/code]

Варианты провайдеров

Эти опции применяются к конфигурациям вспомогательных задач (auxiliary:, compression:, fallback_model:), а не к вашей основной настройке model.provider. Провайдер| Описание| Требования ---|---|--- "auto"| Лучший доступный (по умолчанию). Vision пробует OpenRouter → Nous → Codex.| — "openrouter"| Принудительно OpenRouter — направляет на любую модель (Gemini, GPT-4o, Claude и т.д.)| OPENROUTER_API_KEY "nous"| Принудительно Nous Portal| hermes auth "codex"| Принудительно Codex OAuth (аккаунт ChatGPT). Поддерживает vision (gpt-5.3-codex).| hermes model → Codex "minimax-oauth"| Принудительно MiniMax OAuth (вход в браузере, без ключа API). Использует MiniMax-M2.7-highspeed для вспомогательных задач.| hermes model → MiniMax (OAuth) "main"| Использует ваш активный пользовательский/основной endpoint. Может быть из OPENAI_BASE_URL + OPENAI_API_KEY или из пользовательского endpoint, сохранённого через hermes model / config.yaml. Работает с OpenAI, локальными моделями или любым OpenAI-совместимым API. Только для вспомогательных задач — недопустимо дляmodel.provider.| Учётные данные пользовательского endpoint + базовый URL Провайдеры с прямым ключом API из основного каталога провайдеров также работают здесь, когда вы хотите, чтобы побочные задачи обходили ваш маршрутизатор по умолчанию. gmi допустим, если настроен GMI_API_KEY: [code] auxiliary: compression: provider: "gmi" model: "anthropic/claude-opus-4.6"

[/code] Для вспомогательной маршрутизации GMI используйте точный ID модели, возвращаемый конечной точкой /v1/models GMI.

Типичные настройки

Использование прямой пользовательской конечной точки (понятнее, чем provider: "main" для локальных/самостоятельно размещённых API): [code] auxiliary: vision: base_url: "http://localhost:1234/v1" api_key: "local-key" model: "qwen2.5-vl"

[/code] base_url имеет приоритет над provider, так что это самый явный способ направить вспомогательную задачу на конкретную конечную точку. Для прямых переопределений endpoint Hermes использует настроенный api_key или запасной OPENAI_API_KEY; он не использует повторно OPENROUTER_API_KEY для этой пользовательской конечной точки. Использование ключа API OpenAI для vision: [code] # В ~/.hermes/.env: # OPENAI_BASE_URL=https://api.openai.com/v1 # OPENAI_API_KEY=sk-...

auxiliary:
  vision:
    provider: "main"
    model: "gpt-4o"       # или "gpt-4o-mini" для дешевле

[/code] Использование OpenRouter для vision (направление на любую модель): [code] auxiliary: vision: provider: "openrouter" model: "openai/gpt-4o" # или "google/gemini-2.5-flash" и т.д.

[/code] Использование Codex OAuth (аккаунт ChatGPT Pro/Plus — ключ API не требуется): [code] auxiliary: vision: provider: "codex" # использует ваш ChatGPT OAuth-токен # модель по умолчанию: gpt-5.3-codex (поддерживает vision)

[/code] Использование MiniMax OAuth (вход в браузере, ключ API не требуется): [code] model: default: MiniMax-M2.7 provider: minimax-oauth base_url: https://api.minimax.io/anthropic

[/code] Выполните hermes model и выберите MiniMax (OAuth) для входа и автоматической настройки. Для региона Китай базовый URL будет https://api.minimaxi.com/anthropic. См. руководство по MiniMax OAuth для полного описания. Использование локальной/самостоятельно размещённой модели: [code] auxiliary: vision: provider: "main" # использует ваш активный пользовательский endpoint model: "my-local-model"

[/code] provider: "main" использует того провайдера, которого Hermes использует для обычного чата — будь то именованный пользовательский провайдер (например, beans), встроенный провайдер вроде openrouter или устаревший endpoint OPENAI_BASE_URL. tip Если вы используете Codex OAuth как основного провайдера модели, vision работает автоматически — дополнительная настройка не требуется. Codex входит в цепочку автоопределения для vision. warning Vision требует мультимодальную модель. Если вы установили provider: "main", убедитесь, что ваш endpoint поддерживает мультимодальность/vision — иначе анализ изображений завершится ошибкой.

Переменные окружения (устаревшее)

Вспомогательные модели также можно настраивать через переменные окружения. Однако config.yaml является предпочтительным методом — им проще управлять, и он поддерживает все опции, включая base_url и api_key. Настройка| Переменная окружения ---|--- Провайдер vision| AUXILIARY_VISION_PROVIDER Модель vision| AUXILIARY_VISION_MODEL Endpoint vision| AUXILIARY_VISION_BASE_URL Ключ API vision| AUXILIARY_VISION_API_KEY Провайдер web extract| AUXILIARY_WEB_EXTRACT_PROVIDER Модель web extract| AUXILIARY_WEB_EXTRACT_MODEL Endpoint web extract| AUXILIARY_WEB_EXTRACT_BASE_URL Ключ API web extract| AUXILIARY_WEB_EXTRACT_API_KEY Настройки сжатия и fallback-модели доступны только через config.yaml. tip Выполните hermes config, чтобы увидеть ваши текущие настройки вспомогательных моделей. Переопределения отображаются только когда они отличаются от значений по умолчанию.

Уровень рассуждений

Управляет тем, сколько «размышлений» модель выполняет перед ответом: [code] agent: reasoning_effort: "" # пусто = medium (по умолчанию). Варианты: none, minimal, low, medium, high, xhigh (max)

[/code] Если не задано (по умолчанию), уровень рассуждений по умолчанию «medium» — сбалансированный уровень, который хорошо работает для большинства задач. Установка значения переопределяет его — более высокий уровень рассуждений даёт лучшие результаты на сложных задачах ценой большего количества токенов и задержки. Вы также можете изменить уровень рассуждений во время выполнения с помощью команды /reasoning: [code] /reasoning # Показать текущий уровень и состояние отображения /reasoning high # Установить уровень рассуждений на high /reasoning none # Отключить рассуждения /reasoning show # Показывать размышления модели над каждым ответом /reasoning hide # Скрыть размышления модели

[/code]

Принуждение к использованию инструментов

Некоторые модели иногда описывают предполагаемые действия текстом вместо выполнения вызовов инструментов («Я бы запустил тесты...» вместо фактического вызова терминала). Принуждение к использованию инструментов внедряет в системный промпт указания, направляющие модель обратно к фактическому вызову инструментов. [code] agent: tool_use_enforcement: "auto" # "auto" | true | false | ["model-substring", ...]

[/code] Значение| Поведение ---|--- "auto" (по умолчанию)| Включено для моделей, соответствующих: gpt, codex, gemini, gemma, grok. Отключено для всех остальных (Claude, DeepSeek, Qwen и т.д.). true| Всегда включено, независимо от модели. Полезно, если вы заметили, что ваша текущая модель описывает действия вместо их выполнения. false| Всегда отключено, независимо от модели. ["gpt", "codex", "qwen", "llama"]| Включено только когда имя модели содержит одну из перечисленных подстрок (регистронезависимо).

Что внедряется

Когда включено, в системный промпт могут быть добавлены три уровня указаний: 1. Общее принуждение к использованию инструментов (все соответствующие модели) — указывает модели немедленно выполнять вызовы инструментов вместо описания намерений, продолжать работу до завершения задачи и никогда не заканчивать шаг обещанием будущего действия. 2. Дисциплина выполнения OpenAI (только модели GPT и Codex) — дополнительные указания, касающиеся специфических режимов сбоя GPT: отказ от работы при частичных результатах, пропуск предварительных проверок, галлюцинирование вместо использования инструментов и объявление «готово» без проверки. 3. Операционные указания Google (только модели Gemini и Gemma) — краткость, абсолютные пути, параллельные вызовы инструментов и шаблоны «проверить-прежде-чем-редактировать».

Они прозрачны для пользователя и влияют только на системный промпт. Модели, которые уже надёжно используют инструменты (например, Claude), не нуждаются в этих указаниях, поэтому "auto" исключает их.

Когда включать

Если вы используете модель, не входящую в список auto по умолчанию, и замечаете, что она часто описывает, что она сделала бы, вместо того чтобы делать это, установите tool_use_enforcement: true или добавьте подстроку модели в список: [code] agent: tool_use_enforcement: ["gpt", "codex", "gemini", "grok", "my-custom-model"]

[/code]

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

[code] tts: provider: "edge" # "edge" | "elevenlabs" | "openai" | "minimax" | "mistral" | "gemini" | "xai" | "neutts" speed: 1.0 # Глобальный множитель скорости (запасной для всех провайдеров) edge: voice: "en-US-AriaNeural" # 322 голоса, 74 языка speed: 1.0 # Множитель скорости (конвертируется в процент, например 1.5 → +50%) elevenlabs: voice_id: "pNInz6obpgDQGcFmaJgB" model_id: "eleven_multilingual_v2" openai: model: "gpt-4o-mini-tts" voice: "alloy" # alloy, echo, fable, onyx, nova, shimmer speed: 1.0 # Множитель скорости (ограничивается 0.25–4.0 API) base_url: "https://api.openai.com/v1" # Переопределение для OpenAI-совместимых TTS endpoint minimax: speed: 1.0 # Множитель скорости речи # base_url: "" # Опционально: переопределение для OpenAI-совместимых TTS endpoint mistral: model: "voxtral-mini-tts-2603" voice_id: "c69964a6-ab8b-4f8a-9465-ec0925096ec8" # Paul - Neutral (по умолчанию) gemini: model: "gemini-2.5-flash-preview-tts" # или gemini-2.5-pro-preview-tts voice: "Kore" # 30 встроенных голосов: Zephyr, Puck, Kore, Enceladus и т.д. xai: voice_id: "eve" # xAI TTS голос language: "en" # ISO 639-1 sample_rate: 24000 bit_rate: 128000 # MP3 битрейт # base_url: "https://api.x.ai/v1" neutts: ref_audio: '' ref_text: '' model: neuphonic/neutts-air-q4-gguf device: cpu

[/code] Это управляет как инструментом text_to_speech, так и голосовыми ответами в голосовом режиме (/voice tts в CLI или шлюзе сообщений). Иерархия запасной скорости: скорость для конкретного провайдера (например, tts.edge.speed) → глобальная tts.speed → значение по умолчанию 1.0. Установите глобальную tts.speed, чтобы применить единую скорость для всех провайдеров, или переопределите для каждого провайдера для тонкой настройки.

Настройки отображения

[code] display: tool_progress: all # off | new | all | verbose tool_progress_command: false # Включить slash-команду /verbose в шлюзе сообщений platforms: {} # Переопределения отображения для каждой платформы (см. ниже) tool_progress_overrides: {} # УСТАРЕЛО — используйте display.platforms вместо этого interim_assistant_messages: true # Шлюз: отправлять промежуточные обновления ассистента как отдельные сообщения skin: default # Встроенная или пользовательская тема CLI (см. user-guide/features/skins) personality: "kawaii" # Устаревшее косметическое поле, всё ещё отображается в некоторых сводках compact: false # Компактный режим вывода (меньше пробелов) resume_display: full # full (показать предыдущие сообщения при возобновлении) | minimal (только одна строка) bell_on_complete: false # Воспроизводить звуковой сигнал терминала при завершении агента (отлично для длинных задач) show_reasoning: false # Показывать размышления/рассуждения модели над каждым ответом (переключение через /reasoning show|hide) streaming: false # Потоковая передача токенов в терминал по мере их поступления (вывод в реальном времени) show_cost: false # Показывать оценочную стоимость в $ в строке состояния CLI tool_preview_length: 0 # Макс. символов для предпросмотра вызовов инструментов (0 = без лимита, показывать полные пути/команды) runtime_metadata_footer: false # Шлюз: добавлять нижний колонтитул с контекстом выполнения к финальным ответам language: en # Язык интерфейса для статических сообщений (запросы подтверждения, некоторые ответы шлюза). en | zh | ja | de | es | fr | tr | uk

[/code]

Язык интерфейса для статических сообщений

Настройка display.language переводит небольшой набор статических пользовательских сообщений — приглашение к подтверждению в CLI, несколько ответов на slash-команды шлюза (например, уведомления о перезапуске, «approval expired», «goal cleared»). Она не переводит ответы агента, строки журналов, вывод инструментов, трассировки ошибок или описания slash-команд — они остаются на английском. Если вы хотите, чтобы агент отвечал на другом языке, просто укажите это в вашем промпте или системном сообщении. Поддерживаемые значения: en (по умолчанию), zh (упрощённый китайский), ja (японский), de (немецкий), es (испанский), fr (французский), tr (турецкий), uk (украинский). Неизвестные значения возвращаются к английскому. Вы также можете установить это для каждой сессии с помощью переменной окружения HERMES_LANGUAGE, которая переопределяет значение конфига. [code] display: language: zh # Приглашения к подтверждению в CLI отображаются на китайском

[/code] Режим| Что вы видите ---|--- off| Беззвучно — только финальный ответ new| Индикатор инструмента только при изменении инструмента all| Каждый вызов инструмента с кратким предпросмотром (по умолчанию) verbose| Полные аргументы, результаты и отладочные журналы В CLI переключайтесь между этими режимами с помощью /verbose. Чтобы использовать /verbose на платформах обмена сообщениями (Telegram, Discord, Slack и т.д.), установите tool_progress_command: true в разделе display выше. Команда будет переключать режим и сохранять в конфиг.

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

Когда display.runtime_metadata_footer: true, Hermes добавляет небольшой нижний колонтитул с контекстом выполнения к финальному сообщению каждого шага шлюза — та же информация, которую CLI показывает в строке состояния (модель, длительность сессии, токены, стоимость). По умолчанию выключено; включите для каждого шлюза, если ваша команда хочет, чтобы каждый ответ содержал информацию о происхождении. [code] display: runtime_metadata_footer: true

[/code] Пример нижнего колонтитула, добавленного к ответу Telegram/Discord/Slack: [code] — claude-opus-4.7 · 12 tool calls · 2m 14s · $0.042

[/code] Только финальное сообщение шага получает нижний колонтитул; промежуточные обновления остаются чистыми.

Переопределения прогресса для каждой платформы

У разных платформ разные потребности в подробности. Например, Signal не может редактировать сообщения, поэтому каждое обновление прогресса становится отдельным сообщением — шумно. Используйте display.platforms, чтобы установить режимы для каждой платформы: [code] display: tool_progress: all # глобальное значение по умолчанию platforms: signal: tool_progress: 'off' # отключить прогресс на Signal telegram: tool_progress: verbose # подробный прогресс на Telegram slack: tool_progress: 'off' # тихо в общем рабочем пространстве Slack

[/code] Платформы без переопределения используют глобальное значение tool_progress. Допустимые ключи платформ: telegram, discord, slack, signal, whatsapp, matrix, mattermost, email, sms, homeassistant, dingtalk, feishu, wecom, weixin, bluebubbles, qqbot. Устаревший ключ display.tool_progress_overrides всё ещё загружается для обратной совместимости, но считается устаревшим и мигрируется в display.platforms при первой загрузке. interim_assistant_messages доступен только для шлюза. При включении Hermes отправляет завершённые промежуточные обновления ассистента как отдельные сообщения чата. Это не зависит от tool_progress и не требует потоковой передачи шлюза.

Конфиденциальность

[code] privacy: redact_pii: false # Удалять PII из контекста LLM (только шлюз)

[/code] Когда redact_pii имеет значение true, шлюз удаляет личную информацию (PII) из системного промпта перед отправкой его LLM на поддерживаемых платформах: Поле| Обработка ---|--- Номера телефонов (ID пользователя на WhatsApp/Signal)| Хэшируется в user_<12-символов-sha256> ID пользователей| Хэшируется в user_<12-символов-sha256> ID чатов| Числовая часть хэшируется, префикс платформы сохраняется (telegram:<hash>) ID домашних каналов| Числовая часть хэшируется Имена пользователей / юзернеймы| Не затрагиваются (выбраны пользователем, публично видимы) Поддержка платформ: Редактирование применяется к WhatsApp, Signal и Telegram. Discord и Slack исключены, поскольку их системы упоминаний (<@user_id>) требуют реальный ID в контексте LLM. Хэши детерминированы — один и тот же пользователь всегда отображается в один и тот же хэш, поэтому модель всё ещё может различать пользователей в групповых чатах. Маршрутизация и доставка внутренне используют исходные значения.

Распознавание речи (STT)

[code] stt: provider: "local" # "local" | "groq" | "openai" | "mistral" local: model: "base" # tiny, base, small, medium, large-v3 openai: model: "whisper-1" # whisper-1 | gpt-4o-mini-transcribe | gpt-4o-transcribe # model: "whisper-1" # Устаревший запасной ключ, всё ещё поддерживается

[/code] Поведение провайдера: * local использует faster-whisper, запущенный на вашей машине. Установите его отдельно с помощью pip install faster-whisper. * groq использует Whisper-совместимую конечную точку Groq и читает GROQ_API_KEY. * openai использует речевой API OpenAI и читает VOICE_TOOLS_OPENAI_KEY.

Если запрошенный провайдер недоступен, Hermes автоматически переключается в следующем порядке: localgroqopenai. Переопределения моделей Groq и OpenAI управляются через окружение: [code] STT_GROQ_MODEL=whisper-large-v3-turbo STT_OPENAI_MODEL=whisper-1 GROQ_BASE_URL=https://api.groq.com/openai/v1 STT_OPENAI_BASE_URL=https://api.openai.com/v1

[/code]

Голосовой режим (CLI)

[code] voice: record_key: "ctrl+b" # Клавиша push-to-talk в CLI max_recording_seconds: 120 # Жёсткая остановка для длинных записей auto_tts: false # Включить голосовые ответы автоматически при /voice on beep_enabled: true # Воспроизводить звуки начала/остановки записи в голосовом режиме CLI silence_threshold: 200 # RMS порог для обнаружения речи silence_duration: 3.0 # Секунд тишины перед автоостановкой

[/code] Используйте /voice on в CLI для включения режима микрофона, record_key для запуска/остановки записи и /voice tts для переключения голосовых ответов. См. Голосовой режим для полной настройки и поведения на разных платформах.

Потоковая передача

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

Потоковая передача в CLI

[code] display: streaming: true # Потоковая передача токенов в терминал в реальном времени show_reasoning: true # Также потоковая передача токенов рассуждений/размышлений (опционально)

[/code] При включении ответы отображаются токен за токеном внутри потокового блока. Вызовы инструментов по-прежнему захватываются молча. Если провайдер не поддерживает потоковую передачу, автоматически используется обычный режим отображения.

Потоковая передача шлюза (Telegram, Discord, Slack)

[code] streaming: enabled: true # Включить прогрессивное редактирование сообщений transport: edit # "edit" (прогрессивное редактирование сообщений) или "off" edit_interval: 0.3 # Секунд между редактированиями сообщений buffer_threshold: 40 # Символов перед принудительным сбросом редактирования cursor: " ▉" # Курсор, отображаемый во время потоковой передачи fresh_final_after_seconds: 60 # Отправить свежее финальное (Telegram), когда предпросмотру больше этого времени; 0 = всегда редактировать на месте

[/code] При включении бот отправляет сообщение при первом токене, затем прогрессивно редактирует его по мере поступления новых токенов. Платформы, не поддерживающие редактирование сообщений (Signal, Email, Home Assistant), автоматически обнаруживаются при первой попытке — потоковая передача корректно отключается для этой сессии без потока сообщений. Для отдельных естественных промежуточных обновлений ассистента без прогрессивного редактирования токенов установите display.interim_assistant_messages: true. Обработка переполнения: Если потоковый текст превышает лимит длины сообщения платформы (~4096 символов), текущее сообщение финализируется и автоматически начинается новое. Свежее финальное сообщение (Telegram): editMessageText в Telegram сохраняет исходную временную метку сообщения, поэтому длительный потоковый ответ сохранял бы временную метку первого токена даже после завершения. Когда fresh_final_after_seconds > 0 (по умолчанию 60), завершённый ответ доставляется как совершенно новое сообщение (со stale предпросмотром, удаляемым по возможности), чтобы видимая временная метка Telegram отражала время завершения. Короткие предпросмотры всё ещё финализируются на месте. Установите 0, чтобы всегда редактировать на месте. note Потоковая передача отключена по умолчанию. Включите её в ~/.hermes/config.yaml, чтобы попробовать потоковый UX.

Изоляция сессий группового чата

Управляет тем, будут ли общие чаты хранить один разговор на комнату или один разговор на участника: [code] group_sessions_per_user: true # true = изоляция на пользователя в группах/каналах, false = одна общая сессия на чат

[/code] * true является значением по умолчанию и рекомендуется. В каналах Discord, группах Telegram, каналах Slack и подобных общих контекстах каждый отправитель получает свою собственную сессию, когда платформа предоставляет ID пользователя. * false возвращается к старому поведению общей комнаты. Это может быть полезно, если вы явно хотите, чтобы Hermes рассматривал канал как один совместный разговор, но это также означает, что пользователи делят контекст, затраты на токены и состояние прерывания. * Личные сообщения не затрагиваются. Hermes по-прежнему идентифицирует ЛС по ID чата/ЛС как обычно. * Ветки (threads) остаются изолированными от родительского канала в любом случае; с true каждый участник также получает свою собственную сессию внутри ветки.

Подробности поведения и примеры см. в разделах Сессии и Руководство по Discord.

Поведение при неавторизованном ЛС

Управляет тем, что делает Hermes, когда неизвестный пользователь отправляет личное сообщение: [code] unauthorized_dm_behavior: pair

whatsapp:
  unauthorized_dm_behavior: ignore

[/code] * pair используется по умолчанию. Hermes отклоняет доступ, но отвечает одноразовым кодом привязки в ЛС. * ignore молча отбрасывает неавторизованные ЛС. * Секции платформ переопределяют глобальное значение по умолчанию, поэтому вы можете оставить привязку включённой в целом, сделав одну платформу более тихой.

Быстрые команды

Определите пользовательские команды, которые либо выполняют команды оболочки без вызова LLM, либо создают псевдоним одной slash-команды для другой. Быстрые команды exec не потребляют токены и полезны на платформах обмена сообщениями (Telegram, Discord и т.д.) для быстрых проверок сервера или служебных скриптов. [code] quick_commands: status: type: exec command: systemctl status hermes-agent disk: type: exec command: df -h / update: type: exec command: cd ~/.hermes/hermes-agent && git pull && pip install -e . gpu: type: exec command: nvidia-smi --query-gpu=name,utilization.gpu,memory.used,memory.total --format=csv,noheader restart: type: alias target: /gateway restart

[/code] Использование: введите /status, /disk, /update, /gpu или /restart в CLI или на любой платформе обмена сообщениями. Команды exec выполняются локально на хосте и возвращают вывод напрямую — без вызова LLM, без потребления токенов. Команды alias переписываются в настроенную цель slash-команды. * Тайм-аут 30 секунд — долго выполняющиеся команды завершаются с сообщением об ошибке * Приоритет — быстрые команды проверяются перед командами навыков, поэтому вы можете переопределять имена навыков * Автодополнение — быстрые команды разрешаются во время отправки и не отображаются во встроенных таблицах автодополнения slash-команд * Тип — поддерживаемые типы: exec и alias; другие типы показывают ошибку * Работает везде — CLI, Telegram, Discord, Slack, WhatsApp, Signal, Email, Home Assistant

Ярлыки только с текстом промпта не являются допустимыми быстрыми командами. Для повторно используемых рабочих процессов создайте навык или псевдоним для существующей slash-команды.

Человеческая задержка

Симулирует похожий на человеческий темп ответа на платформах обмена сообщениями: [code] human_delay: mode: "off" # off | natural | custom min_ms: 800 # Минимальная задержка (пользовательский режим) max_ms: 2500 # Максимальная задержка (пользовательский режим)

[/code]

Выполнение кода

Настройка инструмента execute_code: [code] code_execution: mode: project # project (по умолчанию) | strict timeout: 300 # Макс. время выполнения в секундах max_tool_calls: 50 # Макс. вызовов инструментов в рамках выполнения кода

[/code] mode управляет рабочим каталогом и интерпретатором Python для скриптов: * project (по умолчанию) — скрипты выполняются в рабочем каталоге сессии с использованием python из активного virtualenv/conda. Зависимости проекта (pandas, torch, пакеты проекта) и относительные пути (.env, ./data.csv) разрешаются естественным образом, соответствуя тому, что видит terminal(). * strict — скрипты выполняются во временном промежуточном каталоге с sys.executable (собственный python Hermes). Максимальная воспроизводимость, но зависимости проекта и относительные пути не будут разрешаться.

Очистка окружения (удаляет *_API_KEY, *_TOKEN, *_SECRET, *_PASSWORD, *_CREDENTIAL, *_PASSWD, *_AUTH) и белый список инструментов применяются одинаково в обоих режимах — смена режима не меняет уровень безопасности.

Бэкенды веб-поиска

Инструменты web_search, web_extract и web_crawl поддерживают пять бэкендов. Настройте бэкенд в config.yaml или через hermes tools: [code] web: backend: firecrawl # firecrawl | searxng | parallel | tavily | exa

  # Или используйте ключи на каждую возможность для смешивания провайдеров (например, бесплатный поиск + платное извлечение):
  search_backend: "searxng"
  extract_backend: "firecrawl"

[/code] Бэкенд| Переменная окружения| Поиск| Извлечение| Обход ---|---|---|---|--- Firecrawl (по умолчанию)| FIRECRAWL_API_KEY| ✔| ✔| ✔ SearXNG| SEARXNG_URL| ✔| —| — Parallel| PARALLEL_API_KEY| ✔| ✔| — Tavily| TAVILY_API_KEY| ✔| ✔| ✔ Exa| EXA_API_KEY| ✔| ✔| — Выбор бэкенда: Если web.backend не задан, бэкенд автоматически определяется из доступных ключей API. Если задан только SEARXNG_URL, используется SearXNG. Если задан только EXA_API_KEY, используется Exa. Если задан только TAVILY_API_KEY, используется Tavily. Если задан только PARALLEL_API_KEY, используется Parallel. В противном случае используется Firecrawl по умолчанию. SearXNG — это бесплатный, самостоятельно размещаемый, уважающий конфиденциальность метапоисковый движок, который опрашивает 70+ поисковых систем. Ключ API не требуется — просто установите SEARXNG_URL на ваш экземпляр (например, http://localhost:8080). SearXNG поддерживает только поиск; web_extract и web_crawl требуют отдельного провайдера извлечения (установите web.extract_backend). См. руководство по настройке веб-поиска для инструкций по установке Docker. Самостоятельно размещаемый Firecrawl: Установите FIRECRAWL_API_URL, чтобы указать на ваш собственный экземпляр. Когда задан пользовательский URL, ключ API становится опциональным (установите USE_DB_AUTHENTICATION=*** на сервере, чтобы отключить аутентификацию). Режимы поиска Parallel: Установите PARALLEL_SEARCH_MODE для управления поведением поиска — fast, one-shot или agentic (по умолчанию: agentic). Exa: Установите EXA_API_KEY в ~/.hermes/.env. Поддерживает фильтрацию по category (company, research paper, news, people, personal site, pdf) и фильтры по домену/дате.

Браузер

Настройка поведения автоматизации браузера: [code] browser: inactivity_timeout: 120 # Секунд до автоматического закрытия бездействующих сессий command_timeout: 30 # Тайм-аут в секундах для команд браузера (скриншот, навигация и т.д.) record_sessions: false # Автоматически записывать сессии браузера как WebM видео в ~/.hermes/browser_recordings/ # Опциональное переопределение CDP — при установке Hermes подключается напрямую к вашему # Chrome (через /browser connect), а не запускает headless-браузер. cdp_url: "" # Супервизор диалогов — управляет обработкой нативных JS-диалогов (alert / confirm / prompt) # когда подключён CDP-бэкенд (Browserbase, локальный Chrome через # /browser connect). Игнорируется в Camofox и стандартном режиме локального агент-браузера. dialog_policy: must_respond # must_respond | auto_dismiss | auto_accept dialog_timeout_s: 300 # Автоматическое закрытие безопасности при must_respond (секунды) camofox: managed_persistence: false # При true сессии Camofox сохраняют куки/логины между перезапусками

[/code] Политики диалогов: * must_respond (по умолчанию) — захватить диалог, отобразить его в browser_snapshot.pending_dialogs и ждать, пока агент вызовет browser_dialog(action=...). Через dialog_timeout_s секунд без ответа диалог автоматически закрывается, чтобы предотвратить бесконечную блокировку JS-потока страницы. * auto_dismiss — захватить, немедленно отклонить. Агент всё ещё видит запись диалога в browser_snapshot.recent_dialogs с closed_by="auto_policy" после факта. * auto_accept — захватить, немедленно принять. Полезно для страниц с агрессивными приглашениями beforeunload.

См. страницу функции браузера для полного рабочего процесса диалогов. Набор инструментов браузера поддерживает несколько провайдеров. См. страницу функции браузера для подробностей о Browserbase, Browser Use и настройке локального Chrome CDP.

Часовой пояс

Переопределяет локальный часовой пояс сервера строкой часового пояса IANA. Влияет на временные метки в журналах, планировании cron и внедрении времени в системный промпт. [code] timezone: "America/New_York" # IANA часовой пояс (по умолчанию: "" = локальное время сервера)

[/code] Поддерживаемые значения: любой идентификатор часового пояса IANA (например, America/New_York, Europe/London, Asia/Kolkata, UTC). Оставьте пустым или опустите для локального времени сервера.

Discord

Настройка поведения, специфичного для Discord, для шлюза сообщений: [code] discord: require_mention: true # Требовать @упоминание для ответа в серверных каналах free_response_channels: "" # ID каналов через запятую, где бот отвечает без @упоминания auto_thread: true # Автоматически создавать ветки при @упоминании в каналах

[/code] * require_mention — когда true (по умолчанию), бот отвечает в серверных каналах только при упоминании с @BotName. ЛС всегда работают без упоминания. * free_response_channels — список ID каналов через запятую, где бот отвечает на каждое сообщение без необходимости упоминания. * auto_thread — когда true (по умолчанию), упоминания в каналах автоматически создают ветку для разговора, сохраняя каналы чистыми (похоже на ветки Slack).

Безопасность

Сканирование безопасности перед выполнением и удаление секретов: [code] security: redact_secrets: false # Удалять шаблоны ключей API в выводе инструментов и журналах (выключено по умолчанию) tirith_enabled: true # Включить сканирование безопасности Tirith для команд терминала tirith_path: "tirith" # Путь к бинарному файлу tirith (по умолчанию: "tirith" в $PATH) tirith_timeout: 5 # Секунд ожидания сканирования tirith перед тайм-аутом tirith_fail_open: true # Разрешить выполнение команд, если tirith недоступен website_blocklist: # См. раздел Блокировка веб-сайтов ниже enabled: false domains: [] shared_files: []

[/code] * redact_secrets — когда true, автоматически обнаруживает и удаляет шаблоны, похожие на ключи API, токены и пароли в выводе инструментов, прежде чем они попадут в контекст разговора и журналы. Выключено по умолчанию — включите, если вы часто работаете с реальными учётными данными в выводе инструментов и хотите подстраховку. Установите true явно для включения. * tirith_enabled — когда true, команды терминала сканируются Tirith перед выполнением для обнаружения потенциально опасных операций. * tirith_path — путь к бинарному файлу tirith. Установите, если tirith установлен в нестандартном месте. * tirith_timeout — максимальное количество секунд ожидания сканирования tirith. Команды выполняются, если сканирование превышает тайм-аут. * tirith_fail_open — когда true (по умолчанию), командам разрешается выполняться, если tirith недоступен или не работает. Установите false, чтобы блокировать команды, когда tirith не может их проверить.

Блокировка веб-сайтов

Блокируйте определённые домены от доступа инструментами веб-поиска и браузера агента: [code] security: website_blocklist: enabled: false # Включить блокировку URL (по умолчанию: false) domains: # Список шаблонов заблокированных доменов - ".internal.company.com" - "admin.example.com" - ".local" shared_files: # Загрузить дополнительные правила из внешних файлов - "/etc/hermes/blocked-sites.txt"

[/code] При включении любой URL, соответствующий шаблону заблокированного домена, отклоняется до выполнения инструмента веб-поиска или браузера. Это применяется к web_search, web_extract, browser_navigate и любому инструменту, который обращается к URL. Правила доменов поддерживают: * Точные домены: admin.example.com * Поддомены с wildcard: *.internal.company.com (блокирует все поддомены) * TLD wildcard: *.local

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

Умные подтверждения

Управляйте тем, как Hermes обрабатывает потенциально опасные команды: [code] approvals: mode: manual # manual | smart | off

[/code] Режим| Поведение ---|--- manual (по умолчанию)| Запрашивать пользователя перед выполнением любой отмеченной команды. В CLI показывает интерактивный диалог подтверждения. В обмене сообщениями ставит в очередь запрос на подтверждение. smart| Использовать вспомогательную LLM для оценки, является ли отмеченная команда действительно опасной. Команды с низким уровнем риска автоматически одобряются с сохранением на уровне сессии. Действительно рискованные команды передаются пользователю. off| Пропустить все проверки подтверждения. Эквивалентно HERMES_YOLO_MODE=true. Использовать с осторожностью. Умный режим особенно полезен для снижения усталости от подтверждений — он позволяет агенту работать более автономно над безопасными операциями, всё ещё перехватывая действительно разрушительные команды. warning Установка approvals.mode: off отключает все проверки безопасности для команд терминала. Используйте это только в доверенных, изолированных средах.

Контрольные точки

Автоматические снимки файловой системы перед опасными файловыми операциями. См. Контрольные точки и откат для подробностей. [code] checkpoints: enabled: true # Включить автоматические контрольные точки (также: hermes --checkpoints) max_snapshots: 50 # Макс. контрольных точек для хранения на каталог

[/code]

Делегирование

Настройка поведения подагентов для инструмента делегирования: [code] delegation: # model: "google/gemini-3-flash-preview" # Переопределить модель (пусто = наследовать родительскую) # provider: "openrouter" # Переопределить провайдера (пусто = наследовать родительского) # base_url: "http://localhost:1234/v1" # Прямая OpenAI-совместимая конечная точка (имеет приоритет над провайдером) # api_key: "local-key" # Ключ API для base_url (запасной — OPENAI_API_KEY) max_concurrent_children: 3 # Параллельные дочерние элементы на пакет (минимум 1, без потолка). Также через переменную окружения DELEGATION_MAX_CONCURRENT_CHILDREN. max_spawn_depth: 1 # Ограничение глубины дерева делегирования (1-3, с зажимом). 1 = плоская (по умолчанию): родитель порождает листья, которые не могут делегировать. 2 = дочерние оркестраторы могут порождать внуков-листьев. 3 = три уровня. orchestrator_enabled: true # Глобальный выключатель. При false role="orchestrator" игнорируется, и каждый дочерний элемент принудительно становится листом независимо от max_spawn_depth.

[/code] Переопределение провайдера/модели подагента: По умолчанию подагенты наследуют провайдера и модель родительского агента. Установите delegation.provider и delegation.model, чтобы направлять подагентов на другую пару провайдер:модель — например, используйте дешёвую/быструю модель для узких подзадач, пока ваш основной агент использует дорогую модель рассуждений. Прямое переопределение конечной точки: Если вы хотите очевидный путь пользовательского endpoint, установите delegation.base_url, delegation.api_key и delegation.model. Это отправляет подагентов напрямую на эту OpenAI-совместимую конечную точку и имеет приоритет над delegation.provider. Если delegation.api_key опущен, Hermes использует запасной OPENAI_API_KEY. Провайдер делегирования использует то же разрешение учётных данных, что и запуск CLI/шлюза. Поддерживаются все настроенные провайдеры: openrouter, nous, copilot, zai, kimi-coding, minimax, minimax-cn. Когда провайдер установлен, система автоматически разрешает правильный базовый URL, ключ API и режим API — ручное подключение учётных данных не требуется. Приоритет: delegation.base_url в конфиге → delegation.provider в конфиге → родительский провайдер (наследуется). delegation.model в конфиге → родительская модель (наследуется). Установка только model без provider изменяет только имя модели, сохраняя учётные данные родителя (полезно для переключения моделей в рамках одного провайдера, например OpenRouter). Ширина и глубина: max_concurrent_children ограничивает количество подагентов, работающих параллельно в одном пакете (по умолчанию 3, минимум 1, без потолка). Также может быть задано через переменную окружения DELEGATION_MAX_CONCURRENT_CHILDREN. Когда модель отправляет массив tasks длиннее лимита, delegate_task возвращает ошибку инструмента, объясняющую лимит, а не молча обрезает. max_spawn_depth контролирует глубину дерева делегирования (зажимается до 1-3). При значении по умолчанию 1 делегирование плоское: дочерние элементы не могут порождать внуков, и передача role="orchestrator" молча понижается до leaf. Увеличьте до 2, чтобы дочерние оркестраторы могли порождать внуков-листьев; 3 для трёхуровневых деревьев. Агент выбирает оркестрацию для каждого вызова через role="orchestrator"; orchestrator_enabled: false принудительно возвращает каждого дочернего элемента к листу независимо. Затраты масштабируются мультипликативно — при max_spawn_depth: 3 с max_concurrent_children: 3 дерево может достигать 3×3×3 = 27 одновременных агентов-листьев. См. Делегирование подагентов → Ограничение глубины и вложенная оркестрация для примеров использования.

Уточнение

Настройка поведения запроса на уточнение: [code] clarify: timeout: 120 # Секунд ожидания ответа пользователя на уточнение

[/code]

Контекстные файлы (SOUL.md, AGENTS.md)

Hermes использует две разные области контекста: Файл| Назначение| Область ---|---|--- SOUL.md| Основная идентичность агента — определяет, кем является агент (слот #1 в системном промпте)| ~/.hermes/SOUL.md или $HERMES_HOME/SOUL.md .hermes.md / HERMES.md| Инструкции для конкретного проекта (наивысший приоритет)| Поднимается к корню git AGENTS.md| Инструкции для конкретного проекта, соглашения по коду| Рекурсивный обход каталогов CLAUDE.md| Контекстные файлы Claude Code (также обнаруживаются)| Только рабочий каталог .cursorrules| Правила Cursor IDE (также обнаруживаются)| Только рабочий каталог .cursor/rules/*.mdc| Файлы правил Cursor (также обнаруживаются)| Только рабочий каталог * SOUL.md — это основная идентичность агента. Он занимает слот #1 в системном промпте, полностью заменяя встроенную идентичность по умолчанию. Отредактируйте его, чтобы полностью настроить, кем является агент. * Если SOUL.md отсутствует, пуст или не может быть загружен, Hermes возвращается к встроенной идентичности по умолчанию. * Контекстные файлы проекта используют систему приоритетов — загружается только ОДИН тип (первое совпадение побеждает): .hermes.mdAGENTS.mdCLAUDE.md.cursorrules. SOUL.md всегда загружается независимо. * AGENTS.md иерархический: если подкаталоги также имеют AGENTS.md, все они объединяются. * Hermes автоматически создаёт файл SOUL.md по умолчанию, если его ещё не существует. * Все загруженные контекстные файлы ограничены 20 000 символов с интеллектуальным усечением.

См. также: * Личность и SOUL.md * Контекстные файлы

Рабочий каталог

Контекст По умолчанию
CLI (hermes) Текущий каталог, где вы выполняете команду
Шлюз сообщений Домашний каталог ~ (переопределите через MESSAGING_CWD)
Docker / Singularity / Modal / SSH Домашний каталог пользователя внутри контейнера или удалённой машины
Переопределение рабочего каталога:
[code]
# В ~/.hermes/.env или ~/.hermes/config.yaml:
MESSAGING_CWD=/home/myuser/projects # Сессии шлюза
TERMINAL_CWD=/workspace # Все сессии терминала

[/code] * Структура каталога * Управление конфигурацией * Приоритет конфигурации * Подстановка переменных окружения * Тайм-ауты провайдера * Конфигурация бэкенда терминала * Обзор бэкендов * Локальный бэкенд * Docker бэкенд * SSH бэкенд * Modal бэкенд * Daytona бэкенд * Vercel Sandbox бэкенд * Бэкенд Singularity/Apptainer * Распространённые проблемы бэкендов терминала * Удалённая синхронизация файлов с хостом при завершении * Монтирование Docker томов * Пересылка учётных данных Docker * Запуск контейнера от имени вашего пользователя хоста * Опционально: Монтирование каталога запуска в /workspace * Постоянная оболочка * Настройки навыков * Защита записи навыков, созданных агентом * Конфигурация памяти * Безопасность чтения файлов * Лимиты усечения вывода инструментов * Глобальное отключение наборов инструментов * Изоляция git worktree * Сжатие контекста * Полная документация * Типичные настройки * Как взаимодействуют три параметра * Механизм контекста * Давление бюджета итераций * Тайм-ауты API * Предупреждения о давлении контекста * Стратегии пула учётных данных * Вспомогательные модели * Интерактивная настройка вспомогательных моделей * Видеоурок * Универсальный шаблон конфигурации * Полная документация вспомогательной конфигурации * Настройка поиска по сессиям * Изменение модели зрения * Варианты провайдеров * Типичные настройки * Переменные окружения (устаревшее) * Уровень рассуждений * Принуждение к использованию инструментов * Что внедряется * Когда включать * Конфигурация TTS * Настройки отображения * Язык интерфейса для статических сообщений * Нижний колонтитул с метаданными выполнения (только шлюз) * Переопределения прогресса для каждой платформы * Конфиденциальность * Распознавание речи (STT) * Голосовой режим (CLI) * Потоковая передача * Потоковая передача в CLI * Потоковая передача шлюза (Telegram, Discord, Slack) * Изоляция сессий группового чата * Поведение при неавторизованном ЛС * Быстрые команды * Человеческая задержка * Выполнение кода * Бэкенды веб-поиска * Браузер * Часовой пояс * Discord * Безопасность * Блокировка веб-сайтов * Умные подтверждения * Контрольные точки * Делегирование * Уточнение * Контекстные файлы (SOUL.md, AGENTS.md) * Рабочий каталог