Hermes Agent

Настройка, расширение и участие в разработке Hermes Agent.

Метаданные навыка

ИсточникВстроенный (установлен по умолчанию)
Путьskills/autonomous-ai-agents/hermes-agent
Версия2.1.0
АвторHermes Agent + Teknium
ЛицензияMIT
Платформыlinux, macos, windows
Тегиhermes, setup, configuration, multi-agent, spawning, cli, gateway, development
Связанные навыкиclaude-code, codex, opencode

Справочник: полный SKILL.md

инфо

Ниже приведено полное определение навыка, которое Hermes загружает при его активации. Именно это агент видит как инструкции во время работы навыка.

Hermes Agent

Hermes Agent — open-source фреймворк для ИИ-агентов от Nous Research, работающий в терминале, мессенджерах и IDE. По категории он стоит рядом с Claude Code (Anthropic), Codex (OpenAI) и OpenClaw — автономные агенты для написания кода и выполнения задач, взаимодействующие с системой через вызов инструментов. Hermes работает с любым LLM-провайдером (OpenRouter, Anthropic, OpenAI, DeepSeek, локальные модели и ещё 15+), поддерживает Linux, macOS и WSL.

Чем Hermes отличается от остальных:

  • Самообучение через навыки — Hermes накапливает опыт, сохраняя многоразовые процедуры в виде навыков. Когда агент решает сложную задачу, находит удачный рабочий процесс или получает поправку, он может зафиксировать это знание как документ навыка, который будет загружаться в следующих сессиях. Со временем навыки накапливаются, и агент становится всё лучше в задачах, характерных для вашей среды.
  • Постоянная память между сессиями — запоминает, кто вы, ваши предпочтения, детали окружения и усвоенные уроки. Подключаемые провайдеры памяти (встроенный, Honcho, Mem0 и другие) позволяют выбрать удобный вариант.
  • Мультиплатформенный шлюз — один и тот же агент работает в Telegram, Discord, Slack, WhatsApp, Signal, Matrix, Email и ещё 10+ платформах с полным доступом к инструментам, а не просто в режиме чата.
  • Независимость от провайдера — меняйте модели и провайдеры прямо в процессе работы, не меняя больше ничего. Пулы учётных данных автоматически ротируют несколько API-ключей.
  • Профили — запускайте несколько независимых экземпляров Hermes с изолированными конфигурациями, сессиями, навыками и памятью.
  • Расширяемость — плагины, MCP-серверы, пользовательские инструменты, вебхук-триггеры, cron-расписание и вся экосистема Python.

Hermes применяют для разработки ПО, исследований, системного администрирования, анализа данных, создания контента, домашней автоматизации и любых других задач, где нужен ИИ-агент с постоянным контекстом и полным доступом к системе.

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

Документация: https://hermes-agent.nousresearch.com/docs/

Быстрый старт

# Установка
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash

# Интерактивный чат (по умолчанию)
hermes

# Одиночный запрос
hermes chat -q "What is the capital of France?"

# Мастер настройки
hermes setup

# Смена модели/провайдера
hermes model

# Проверка работоспособности
hermes doctor

Справочник CLI

Глобальные флаги

hermes [flags] [command]

  --version, -V             Show version
  --resume, -r SESSION      Resume session by ID or title
  --continue, -c [NAME]     Resume by name, or most recent session
  --worktree, -w            Isolated git worktree mode (parallel agents)
  --skills, -s SKILL        Preload skills (comma-separate or repeat)
  --profile, -p NAME        Use a named profile
  --yolo                    Skip dangerous command approval
  --pass-session-id         Include session ID in system prompt

Если не указана подкоманда, по умолчанию запускается chat.

Chat

hermes chat [flags]
  -q, --query TEXT          Single query, non-interactive
  -m, --model MODEL         Model (e.g. anthropic/claude-sonnet-4)
  -t, --toolsets LIST       Comma-separated toolsets
  --provider PROVIDER       Force provider (openrouter, anthropic, nous, etc.)
  -v, --verbose             Verbose output
  -Q, --quiet               Suppress banner, spinner, tool previews
  --checkpoints             Enable filesystem checkpoints (/rollback)
  --source TAG              Session source tag (default: cli)

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

hermes setup [section]      Interactive wizard (model|terminal|gateway|tools|agent)
hermes model                Interactive model/provider picker
hermes config               View current config
hermes config edit          Open config.yaml in $EDITOR
hermes config set KEY VAL   Set a config value
hermes config path          Print config.yaml path
hermes config env-path      Print .env path
hermes config check         Check for missing/outdated config
hermes config migrate       Update config with new options
hermes auth                 Interactive credential manager
hermes auth add PROVIDER    Add OAuth or API-key credential (e.g. nous, openai-codex, qwen-oauth)
hermes auth list            List stored credentials
hermes auth remove PROVIDER Remove a stored credential
hermes doctor [--fix]       Check dependencies and config
hermes status [--all]       Show component status

Инструменты и навыки

hermes tools                Interactive tool enable/disable (curses UI)
hermes tools list           Show all tools and status
hermes tools enable NAME    Enable a toolset
hermes tools disable NAME   Disable a toolset

hermes skills list          List installed skills
hermes skills search QUERY  Search the skills hub
hermes skills install ID    Install a skill (ID can be a hub identifier OR a direct https://…/SKILL.md URL; pass --name to override when frontmatter has no name)
hermes skills inspect ID    Preview without installing
hermes skills config        Enable/disable skills per platform
hermes skills check         Check for updates
hermes skills update        Update outdated skills
hermes skills uninstall N   Remove a hub skill
hermes skills publish PATH  Publish to registry
hermes skills browse        Browse all available skills
hermes skills tap add REPO  Add a GitHub repo as skill source

MCP-серверы

hermes mcp serve            Run Hermes as an MCP server
hermes mcp add NAME         Add an MCP server (--url or --command)
hermes mcp remove NAME      Remove an MCP server
hermes mcp list             List configured servers
hermes mcp test NAME        Test connection
hermes mcp configure NAME   Toggle tool selection

Как встроенный MCP-клиент подключает серверы (stdio/HTTP), автоматически обнаруживает их инструменты и предоставляет их как полноценные инструменты, а также каталожная установка (hermes mcp install <name>): skill_view(name="hermes-agent", file_path="references/native-mcp.md").

Шлюз (платформы обмена сообщениями)

hermes gateway run          Start gateway foreground
hermes gateway install      Install as background service
hermes gateway start/stop   Control the service
hermes gateway restart      Restart the service
hermes gateway status       Check status
hermes gateway setup        Configure platforms

Поддерживаемые платформы: Telegram, Discord, Slack, WhatsApp, Signal, Email, SMS, Matrix, Mattermost, Home Assistant, DingTalk, Feishu, WeCom, BlueBubbles (iMessage), Weixin (WeChat), API Server, Webhooks. Open WebUI подключается через адаптер API Server.

Документация по платформам: https://hermes-agent.nousresearch.com/docs/user-guide/messaging/

Сессии

hermes sessions list        List recent sessions
hermes sessions browse      Interactive picker
hermes sessions export OUT  Export to JSONL
hermes sessions rename ID T Rename a session
hermes sessions delete ID   Delete a session
hermes sessions prune       Clean up old sessions (--older-than N days)
hermes sessions stats       Session store statistics

Cron-задания

hermes cron list            List jobs (--all for disabled)
hermes cron create SCHED    Create: '30m', 'every 2h', '0 9 * * *'
hermes cron edit ID         Edit schedule, prompt, delivery
hermes cron pause/resume ID Control job state
hermes cron run ID          Trigger on next tick
hermes cron remove ID       Delete a job
hermes cron status          Scheduler status

Вебхуки

hermes webhook subscribe N  Create route at /webhooks/<name>
hermes webhook list         List subscriptions
hermes webhook remove NAME  Remove a subscription
hermes webhook test NAME    Send a test POST

Полная настройка, конфигурация маршрутов, шаблонизация полезной нагрузки и событийные паттерны запуска агента: skill_view(name="hermes-agent", file_path="references/webhooks.md").

Профили

hermes profile list         List all profiles
hermes profile create NAME  Create (--clone, --clone-all, --clone-from)
hermes profile use NAME     Set sticky default
hermes profile delete NAME  Delete a profile
hermes profile show NAME    Show details
hermes profile alias NAME   Manage wrapper scripts
hermes profile rename A B   Rename a profile
hermes profile export NAME  Export to tar.gz
hermes profile import FILE  Import from archive

Пулы учётных данных

hermes auth add             Interactive credential wizard
hermes auth list [PROVIDER] List pooled credentials
hermes auth remove P INDEX  Remove by provider + index
hermes auth reset PROVIDER  Clear exhaustion status

Прочее

hermes insights [--days N]  Usage analytics
hermes update               Update to latest version
hermes pairing list/approve/revoke  DM authorization
hermes plugins list/install/remove  Plugin management
hermes honcho setup/status  Honcho memory integration (requires honcho plugin)
hermes memory setup/status/off  Memory provider config
hermes completion bash|zsh  Shell completions
hermes acp                  ACP server (IDE integration)
hermes claw migrate         Migrate from OpenClaw
hermes uninstall            Uninstall Hermes

Слэш-команды (в сессии)

Вводите их во время интерактивной чат-сессии. Новые команды появляются довольно часто; если что-то из перечисленного выглядит устаревшим, запустите /help в сессии для актуального списка или смотрите справочник слэш-команд. Единственный источник истины — hermes_cli/commands.py: автодополнение, меню Telegram, маппинг Slack и /help берут данные оттуда.

Управление сессией

/new (/reset)        Fresh session
/clear               Clear screen + new session (CLI)
/retry               Resend last message
/undo                Remove last exchange
/title [name]        Name the session
/compress            Manually compress context
/stop                Kill background processes
/rollback [N]        Restore filesystem checkpoint
/snapshot [sub]      Create or restore state snapshots of Hermes config/state (CLI)
/background <prompt> Run prompt in background
/queue <prompt>      Queue for next turn
/steer <prompt>      Inject a message after the next tool call without interrupting
/agents (/tasks)     Show active agents and running tasks
/resume [name]       Resume a named session
/goal [text|sub]     Set a standing goal Hermes works on across turns until achieved
                     (subcommands: status, pause, resume, clear)
/redraw              Force a full UI repaint (CLI)

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

/config              Show config (CLI)
/model [name]        Show or change model
/personality [name]  Set personality
/reasoning [level]   Set reasoning (none|minimal|low|medium|high|xhigh|show|hide)
/verbose             Cycle: off → new → all → verbose
/voice [on|off|tts]  Voice mode
/yolo                Toggle approval bypass
/busy [sub]          Control what Enter does while Hermes is working (CLI)
                     (subcommands: queue, steer, interrupt, status)
/indicator [style]   Pick the TUI busy-indicator style (CLI)
                     (styles: kaomoji, emoji, unicode, ascii)
/footer [on|off]     Toggle gateway runtime-metadata footer on final replies
/skin [name]         Change theme (CLI)
/statusbar           Toggle status bar (CLI)

Инструменты и навыки

/tools               Manage tools (CLI)
/toolsets            List toolsets (CLI)
/skills              Search/install skills (CLI)
/skill <name>        Load a skill into session
/reload-skills       Re-scan ~/.hermes/skills/ for added/removed skills
/reload              Reload .env variables into the running session (CLI)
/reload-mcp          Reload MCP servers
/cron                Manage cron jobs (CLI)
/curator [sub]       Background skill maintenance (status, run, pin, archive, …)
/kanban [sub]        Multi-profile collaboration board (tasks, links, comments)
/plugins             List plugins (CLI)

Шлюз

/approve             Approve a pending command (gateway)
/deny                Deny a pending command (gateway)
/restart             Restart gateway (gateway)
/sethome             Set current chat as home channel (gateway)
/update              Update Hermes to latest (gateway)
/topic [sub]         Enable or inspect Telegram DM topic sessions (gateway)
/platforms (/gateway) Show platform connection status (gateway)

Утилиты

/branch (/fork)      Branch the current session
/fast                Toggle priority/fast processing
/browser             Open CDP browser connection
/history             Show conversation history (CLI)
/save                Save conversation to file (CLI)
/copy [N]            Copy the last assistant response to clipboard (CLI)
/paste               Attach clipboard image (CLI)
/image               Attach local image file (CLI)

Информация

/help                Show commands
/commands [page]     Browse all commands (gateway)
/usage               Token usage
/insights [days]     Usage analytics
/gquota              Show Google Gemini Code Assist quota usage (CLI)
/status              Session info (gateway)
/profile             Active profile info
/debug               Upload debug report (system info + logs) and get shareable links

Выход

/quit (/exit, /q)    Exit CLI

Ключевые пути и конфигурация

~/.hermes/config.yaml       Main configuration
~/.hermes/.env              API keys and secrets
$HERMES_HOME/skills/        Installed skills
~/.hermes/sessions/         Gateway routing index, request dumps, *.jsonl transcripts (and optional per-session JSON snapshots when sessions.write_json_snapshots: true)
~/.hermes/state.db          Canonical session store (SQLite + FTS5)
~/.hermes/logs/             Gateway and error logs
~/.hermes/auth.json         OAuth tokens and credential pools
~/.hermes/hermes-agent/     Source code (if git-installed)

Профили используют ~/.hermes/profiles/<name>/ с той же структурой.

Секции конфигурации

Редактируйте через hermes config edit или hermes config set section.key value.

СекцияПараметры
modeldefault, provider, base_url, api_key, context_length
agentmax_turns (90), tool_use_enforcement
terminalbackend (local/docker/ssh/modal), cwd, timeout (180)
compressionenabled, threshold (0.50), target_ratio (0.20)
displayskin, tool_progress, show_reasoning, show_cost
sttenabled, provider (local/groq/openai/mistral)
ttsprovider (edge/elevenlabs/openai/minimax/mistral/neutts)
memorymemory_enabled, user_profile_enabled, provider
securitytirith_enabled, website_blocklist
delegationmodel, provider, base_url, api_key, max_iterations (50), reasoning_effort
checkpointsenabled, max_snapshots (50)

Полный справочник конфигурации: https://hermes-agent.nousresearch.com/docs/user-guide/configuration

Провайдеры

Поддерживается 20+ провайдеров. Настройте через hermes model или hermes setup.

ПровайдерАутентификацияПеременная окружения
OpenRouterAPI keyOPENROUTER_API_KEY
AnthropicAPI keyANTHROPIC_API_KEY
Nous PortalOAuthhermes auth
OpenAI CodexOAuthhermes auth
GitHub CopilotTokenCOPILOT_GITHUB_TOKEN
Google GeminiAPI keyGOOGLE_API_KEY or GEMINI_API_KEY
DeepSeekAPI keyDEEPSEEK_API_KEY
xAI / GrokAPI keyXAI_API_KEY
Hugging FaceTokenHF_TOKEN
Z.AI / GLMAPI keyGLM_API_KEY
MiniMaxAPI keyMINIMAX_API_KEY
MiniMax CNAPI keyMINIMAX_CN_API_KEY
Kimi / MoonshotAPI keyKIMI_API_KEY
Alibaba / DashScopeAPI keyDASHSCOPE_API_KEY
Xiaomi MiMoAPI keyXIAOMI_API_KEY
Kilo CodeAPI keyKILOCODE_API_KEY
OpenCode ZenAPI keyOPENCODE_ZEN_API_KEY
OpenCode GoAPI keyOPENCODE_GO_API_KEY
Qwen OAuthOAuthhermes auth add qwen-oauth
Custom endpointConfigmodel.base_url + model.api_key in config.yaml
GitHub Copilot ACPExternalCOPILOT_CLI_PATH or Copilot CLI

Полная документация по провайдерам: https://hermes-agent.nousresearch.com/docs/integrations/providers

Наборы инструментов

Включайте и отключайте через hermes tools (интерактивно) или hermes tools enable/disable NAME.

НаборЧто предоставляет
webВеб-поиск и извлечение контента
searchТолько веб-поиск (подмножество web)
browserБраузерная автоматизация (Browserbase, Camofox или локальный Chromium)
terminalКоманды оболочки и управление процессами
fileЧтение/запись/поиск/патч файлов
code_executionИзолированное выполнение Python
visionАнализ изображений
image_genГенерация изображений с помощью ИИ
videoАнализ и генерация видео
ttsСинтез речи
skillsПросмотр навыков и управление ими
memoryПостоянная память между сессиями
session_searchПоиск по прошлым разговорам
delegationДелегирование задач субагентам
cronjobУправление запланированными задачами
clarifyУточняющие вопросы к пользователю
messagingОтправка сообщений на разные платформы
todoПланирование и отслеживание задач в сессии
kanbanИнструменты рабочей очереди для нескольких агентов (доступны только воркерам)
debuggingДополнительные инструменты диагностики (отключены по умолчанию)
safeМинимальный низкорисковый набор для изолированных сессий
spotifyУправление воспроизведением и плейлистами Spotify
homeassistantУправление умным домом (отключено по умолчанию)
discordИнструменты интеграции с Discord
discord_adminИнструменты администрирования/модерации Discord
feishu_docИнструменты для документов Feishu (Lark)
feishu_driveИнструменты для диска Feishu (Lark)
yuanbaoИнструменты интеграции с Yuanbao
rlИнструменты обучения с подкреплением (отключены по умолчанию)
moaMixture of Agents (отключено по умолчанию)

Полный список находится в toolsets.py в словаре TOOLSETS; _HERMES_CORE_TOOLS — это стандартный набор, который наследует большинство платформ.

Изменения инструментов вступают в силу после /reset (новая сессия). Они не применяются в середине разговора — это сделано для сохранения кэширования промптов.


Настройки безопасности и приватности

Типичные вопросы «почему Hermes делает X с моим выводом / вызовами инструментов / командами» — и конкретные команды для изменения поведения. Большинство этих настроек требуют новой сессии (/reset в чате или запуск нового hermes), так как они читаются однократно при старте.

Сокрытие секретов в выводе инструментов

Сокрытие секретов включено по умолчанию — вывод инструментов (stdout терминала, read_file, веб-контент, сводки субагентов и т.д.) сканируется на строки, похожие на API-ключи, токены и секреты, прежде чем они попадут в контекст разговора и логи. Для обычного использования оставьте включённым:

hermes config set security.redact_secrets true       # keep enabled globally

Требуется перезапуск. security.redact_secrets фиксируется в момент импорта — переключение в середине сессии (например, через export HERMES_REDACT_SECRETS=false из вызова инструмента) не даст эффекта для запущенного процесса. Скажите пользователю изменить настройку в конфиге из терминала, затем начать новую сессию. Это сделано намеренно — чтобы LLM не мог переключить этот параметр самостоятельно в процессе работы.

Отключайте только когда намеренно нужны сырые строки, похожие на учётные данные, — для отладки или разработки редактора:

hermes config set security.redact_secrets false

Сокрытие PII в сообщениях шлюза

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

hermes config set privacy.redact_pii true    # enable
hermes config set privacy.redact_pii false   # disable (default)

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

По умолчанию (approvals.mode: manual) Hermes запрашивает подтверждение перед выполнением команд оболочки, помеченных как деструктивные (rm -rf, git reset --hard и т.д.). Доступные режимы:

  • manual — всегда спрашивать (по умолчанию)
  • smart — вспомогательная LLM автоматически одобряет низкорисковые команды, для высокорисковых запрашивает подтверждение
  • off — пропускать все запросы подтверждения (эквивалент --yolo)
hermes config set approvals.mode smart       # recommended middle ground
hermes config set approvals.mode off         # bypass everything (not recommended)

Обход для отдельного запуска без изменения конфига:

  • hermes --yolo …
  • export HERMES_YOLO_MODE=1

Замечание: YOLO / approvals.mode: off не отключает сокрытие секретов. Это независимые настройки.

Список разрешений для хуков оболочки

Некоторые интеграции с хуками оболочки требуют явного добавления в список разрешений до первого срабатывания. Управляется через ~/.hermes/shell-hooks-allowlist.json — при первой попытке запуска хука выводится интерактивный запрос.

Отключение инструментов web/browser/image-gen

Чтобы полностью закрыть модели доступ к сети или медиаинструментам, откройте hermes tools и переключите нужные инструменты для каждой платформы. Вступит в силу в следующей сессии (/reset). Подробнее — в разделе «Инструменты и навыки» выше.


Голосовой режим и транскрипция

STT (голос → текст)

Голосовые сообщения из мессенджеров транскрибируются автоматически.

Приоритет провайдеров (определяется автоматически):

  1. Local faster-whisper — бесплатно, API-ключ не нужен: pip install faster-whisper
  2. Groq Whisper — бесплатный тариф: установите GROQ_API_KEY
  3. OpenAI Whisper — платно: установите VOICE_TOOLS_OPENAI_KEY
  4. Mistral Voxtral — установите MISTRAL_API_KEY

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

stt:
  enabled: true
  provider: local        # local, groq, openai, mistral
  local:
    model: base          # tiny, base, small, medium, large-v3

TTS (текст → голос)

ПровайдерПеременная окруженияБесплатно?
Edge TTSДа (по умолчанию)
ElevenLabsELEVENLABS_API_KEYБесплатный тариф
OpenAIVOICE_TOOLS_OPENAI_KEYПлатно
MiniMaxMINIMAX_API_KEYПлатно
Mistral (Voxtral)MISTRAL_API_KEYПлатно
NeuTTS (local)— (pip install neutts[all] + espeak-ng)Бесплатно

Команды управления голосом: /voice on (голос-в-голос), /voice tts (всегда голос), /voice off.


Запуск дополнительных экземпляров Hermes

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

Когда использовать это вместо delegate_task

delegate_taskЗапуск процесса hermes
ИзоляцияОтдельный разговор, общий процессПолностью независимый процесс
ПродолжительностьМинуты (ограничено циклом родителя)Часы/дни
Доступ к инструментамПодмножество инструментов родителяПолный доступ к инструментам
ИнтерактивностьНетДа (PTY-режим)
СценарийБыстрые параллельные подзадачиДлительные автономные задания

Режим одиночного запроса

terminal(command="hermes chat -q 'Research GRPO papers and write summary to ~/research/grpo.md'", timeout=300)

# Background for long tasks:
terminal(command="hermes chat -q 'Set up CI/CD for ~/myapp'", background=true)

Интерактивный PTY-режим (через tmux)

Hermes использует prompt_toolkit, которому нужен настоящий терминал. Для интерактивного запуска используйте tmux:

# Start
terminal(command="tmux new-session -d -s agent1 -x 120 -y 40 'hermes'", timeout=10)

# Wait for startup, then send a message
terminal(command="sleep 8 && tmux send-keys -t agent1 'Build a FastAPI auth service' Enter", timeout=15)

# Read output
terminal(command="sleep 20 && tmux capture-pane -t agent1 -p", timeout=5)

# Send follow-up
terminal(command="tmux send-keys -t agent1 'Add rate limiting middleware' Enter", timeout=5)

# Exit
terminal(command="tmux send-keys -t agent1 '/exit' Enter && sleep 2 && tmux kill-session -t agent1", timeout=10)

Координация нескольких агентов

# Agent A: backend
terminal(command="tmux new-session -d -s backend -x 120 -y 40 'hermes -w'", timeout=10)
terminal(command="sleep 8 && tmux send-keys -t backend 'Build REST API for user management' Enter", timeout=15)

# Agent B: frontend
terminal(command="tmux new-session -d -s frontend -x 120 -y 40 'hermes -w'", timeout=10)
terminal(command="sleep 8 && tmux send-keys -t frontend 'Build React dashboard for user management' Enter", timeout=15)

# Check progress, relay context between them
terminal(command="tmux capture-pane -t backend -p | tail -30", timeout=5)
terminal(command="tmux send-keys -t frontend 'Here is the API schema from the backend agent: ...' Enter", timeout=5)

Возобновление сессии

# Resume most recent session
terminal(command="tmux new-session -d -s resumed 'hermes --continue'", timeout=10)

# Resume specific session
terminal(command="tmux new-session -d -s resumed 'hermes --resume 20260225_143052_a1b2c3'", timeout=10)

Советы

  • Для быстрых подзадач предпочитайте delegate_task — меньше накладных расходов, чем при запуске полноценного процесса
  • Используйте -w (режим worktree) при запуске агентов, которые редактируют код — предотвращает конфликты git
  • Устанавливайте таймауты в режиме одиночного запроса — сложные задачи могут занимать 5–10 минут
  • hermes chat -q подходит для запуска без ожидания — PTY не нужен
  • Для интерактивных сессий используйте tmux — сырой PTY-режим имеет проблемы с \r и \n в prompt_toolkit
  • Для запланированных задач используйте инструмент cronjob вместо запуска процессов — он обрабатывает доставку и повторные попытки

Постоянные и фоновые системы

Четыре системы работают параллельно с основным циклом разговора. Краткий справочник здесь; полные заметки для разработчиков — в AGENTS.md, пользовательская документация — в website/docs/user-guide/features/.

Делегирование (delegate_task)

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

  • Одиночный: delegate_task(goal, context, toolsets).
  • Пакетный: delegate_task(tasks=[{goal, ...}, ...]) запускает дочерних агентов параллельно, ограничиваясь значением delegation.max_concurrent_children (по умолчанию 3).
  • Роли: leaf (по умолчанию; не может повторно делегировать) vs orchestrator (может порождать своих воркеров, ограничено delegation.max_spawn_depth).
  • Не отказоустойчиво. При прерывании родителя дочерний агент отменяется. Для работы, которая должна пережить текущий ход, используйте cronjob или terminal(background=True, notify_on_complete=True).

Конфигурация: delegation.* в config.yaml.

Cron (запланированные задания)

Надёжный планировщик — cron/jobs.py + cron/scheduler.py. Управляется через инструмент cronjob, CLI hermes cron (list, add, edit, pause, resume, run, remove) или слэш-команду /cron.

  • Расписания: продолжительность ("30m", "2h"), фраза “every” ("every monday 9am"), пятипольный cron ("0 9 * * *") или метка времени ISO.
  • Параметры задания: skills, переопределение model/provider, script (сбор данных перед запуском; no_agent=True делает скрипт всем заданием), context_from (передача вывода задания A в задание B), workdir (запуск в конкретной директории с загрузкой её AGENTS.md / CLAUDE.md), доставка на несколько платформ.
  • Инварианты: жёсткое прерывание через 3 минуты на запуск, файл .tick.lock предотвращает дублирование тиков между процессами, cron-сессии передают skip_memory=True по умолчанию, а cron-доставки оформляются заголовком/подвалом вместо зеркалирования в целевую сессию шлюза (сохраняет чередование ролей).

Документация: https://hermes-agent.nousresearch.com/docs/user-guide/features/cron

Curator (жизненный цикл навыков)

Фоновое обслуживание навыков, созданных агентом. Отслеживает использование, помечает простаивающие навыки как устаревшие, архивирует их, сохраняет tar.gz-резервную копию перед каждым запуском — ничего не теряется.

  • CLI: hermes curator <verb>status, run, pause, resume, pin, unpin, archive, restore, prune, backup, rollback.
  • Слэш-команды: /curator <subcommand> повторяет CLI.
  • Область действия: работает только с навыками, у которых created_by: "agent". Встроенные и установленные из хаба навыки — вне досягаемости. Никогда не удаляет — максимум — архивирование. Закреплённые навыки исключены из всех автопереходов и проверок LLM.
  • Телеметрия: файл ~/.hermes/skills/.usage.json хранит для каждого навыка use_count, view_count, patch_count, last_activity_at, state, pinned.

Конфигурация: curator.* (enabled, interval_hours, min_idle_hours, stale_after_days, archive_after_days, backup.*). Документация: https://hermes-agent.nousresearch.com/docs/user-guide/features/curator

Kanban (рабочая очередь для нескольких агентов)

Надёжная SQLite-доска для совместной работы нескольких профилей и воркеров. Пользователи управляют ею через hermes kanban <verb>; воркеры, запущенные диспетчером, видят сфокусированный набор инструментов kanban_*, ограниченный переменной HERMES_KANBAN_TASK, а профили-оркестраторы могут подключить расширенный набор kanban. Обычные сессии не имеют никакого kanban_*-следа, пока это не настроено.

  • CLI-команды (основные): init, create, list (псевдоним ls), show, assign, link, unlink, comment, complete, block, unblock, archive, tail. Менее частые: watch, stats, runs, log, dispatch, daemon, gc.
  • Набор инструментов для воркеров/оркестраторов: kanban_show, kanban_complete, kanban_block, kanban_heartbeat, kanban_comment, kanban_create, kanban_link; профили, которые явно включают набор kanban вне задачи, запущенной диспетчером, также получают kanban_list и kanban_unblock для маршрутизации по доске.
  • Диспетчер по умолчанию работает внутри шлюза (kanban.dispatch_in_gateway: true) — возвращает зависшие задачи, продвигает готовые, атомарно захватывает и запускает назначенные профили. Автоматически блокирует задачу после failure_limit последовательных сбоев запуска (по умолчанию 2; настраивается через kanban.failure_limit или max_retries для конкретной задачи).
  • Изоляция: доска — жёсткая граница (воркеры получают HERMES_KANBAN_BOARD зафиксированным в окружении); тенант — мягкое пространство имён внутри доски для изоляции по пути рабочей директории и ключу памяти.

Документация: https://hermes-agent.nousresearch.com/docs/user-guide/features/kanban


Особенности Windows

Hermes работает нативно на Windows (PowerShell, cmd, Windows Terminal, git-bash mintty, встроенный терминал VS Code). Большинство функций работает из коробки, но есть несколько отличий между Win32 и POSIX, которые регулярно вызывают проблемы — документируйте новые здесь, чтобы следующий человек (или следующая сессия) не открывал их заново.

Ввод и горячие клавиши

Alt+Enter не вставляет перевод строки. Windows Terminal перехватывает Alt+Enter на уровне терминала для переключения полноэкранного режима — нажатие не доходит до prompt_toolkit. Используйте Ctrl+Enter. Windows Terminal передаёт Ctrl+Enter как LF (c-j), отличный от обычного Enter (c-m / CR), и CLI привязывает c-j к вставке строки только на win32 (см. _bind_prompt_submit_keys + Windows-only привязка c-j в cli.py). Побочный эффект: сырое нажатие Ctrl+J тоже вставляет строку на Windows — это неизбежно, потому что Windows Terminal сворачивает Ctrl+Enter и Ctrl+J в один код клавиши на уровне Win32 console API. Конфликтующей привязки для Ctrl+J на Windows не было, так что это безвредный побочный эффект.

mintty / git-bash ведут себя так же (полноэкранный режим на Alt+Enter), если не отключить Alt+Fn-клавиши в Options → Keys. Проще просто использовать Ctrl+Enter.

Диагностика горячих клавиш. Запустите python scripts/keystroke_diagnostic.py (корень репозитория), чтобы увидеть, как именно prompt_toolkit идентифицирует каждое нажатие в текущем терминале. Это поможет разобраться, например, «приходит ли Shift+Enter как отдельная клавиша?» (почти никогда — большинство терминалов сворачивает его в обычный Enter) или «какую последовательность байт мой терминал посылает для Ctrl+Enter?». Именно так был установлен факт Ctrl+Enter = c-j.

Конфигурация и файлы

HTTP 400 “No models provided” при первом запуске. config.yaml сохранён с UTF-8 BOM (часто случается, когда Windows-приложения записывают файлы). Пересохраните как UTF-8 без BOM. hermes config edit пишет без BOM; виновник ручных правок — обычно Блокнот.

execute_code / Sandbox

WinError 10106 (“The requested service provider could not be loaded or initialized”) из дочернего процесса sandbox — не удаётся создать сокет AF_INET, поэтому резервный RPC через loopback-TCP падает до connect(). Причина, как правило, не сломанный Winsock LSP, а собственный скруббер окружения Hermes, который убирает SYSTEMROOT / WINDIR / COMSPEC из дочернего env. Python-модулю socket нужен SYSTEMROOT для поиска mswsock.dll. Исправлено через список разрешений _WINDOWS_ESSENTIAL_ENV_VARS в tools/code_execution_tool.py. Если проблема сохраняется, выведите os.environ внутри блока execute_code, чтобы убедиться, что SYSTEMROOT задан. Полная инструкция по диагностике — в references/execute-code-sandbox-env-windows.md.

Тестирование и участие в разработке

scripts/run_tests.sh не работает как есть на Windows — скрипт ищет POSIX-структуру venv (.venv/bin/activate). Hermes-установленный venv по пути venv/Scripts/ тоже не содержит pip или pytest (убраны для уменьшения размера установки). Обходной путь: установите pytest + pytest-xdist + pyyaml в пользовательский site-packages системного Python 3.11, затем запускайте pytest напрямую с установленным PYTHONPATH:

"/c/Program Files/Python311/python" -m pip install --user pytest pytest-xdist pyyaml
export PYTHONPATH="$(pwd)"
"/c/Program Files/Python311/python" -m pytest tests/foo/test_bar.py -v --tb=short -n 0

Используйте -n 0, а не -n 4pyproject.toml уже включает -n в addopts по умолчанию, а гарантии CI-совместимости обёртки не распространяются на не-POSIX системы.

Тесты, специфичные для POSIX, нуждаются в skip-гвардах. Часто встречающиеся маркеры в кодовой базе:

  • Символические ссылки — требуют повышенных привилегий на Windows
  • Права доступа 0o600 — POSIX-биты прав не применяются на NTFS по умолчанию
  • signal.SIGALRM — только Unix (см. tests/conftest.py::_enforce_test_timeout)
  • Winsock / Windows-специфические регрессии — @pytest.mark.skipif(sys.platform != "win32", ...)

Используйте существующий стиль (sys.platform == "win32" или sys.platform.startswith("win")), чтобы оставаться в согласии с остальной частью набора.

Пути и файловая система

Окончания строк. Git может предупреждать LF will be replaced by CRLF the next time Git touches it. Это косметически — .gitattributes репозитория нормализует их. Не позволяйте редакторам автоматически конвертировать закоммиченные POSIX-файлы в CRLF.

Прямые слэши работают почти везде. C:/Users/... принимается всеми инструментами Hermes и большинством Windows API. Предпочитайте прямые слэши в коде и логах — это избавляет от необходимости экранировать обратные в bash.


Устранение неполадок

Голосовой режим не работает

  1. Проверьте stt.enabled: true в config.yaml
  2. Убедитесь в наличии провайдера: pip install faster-whisper или задайте API-ключ
  3. В шлюзе: /restart. В CLI: выйдите и перезапустите.

Инструмент недоступен

  1. hermes tools — проверьте, включён ли набор инструментов для вашей платформы
  2. Некоторые инструменты требуют переменных окружения (проверьте .env)
  3. После включения инструментов выполните /reset

Проблемы с моделью/провайдером

  1. hermes doctor — проверьте конфигурацию и зависимости
  2. hermes auth — повторно авторизуйтесь у OAuth-провайдеров (или hermes auth add <provider>)
  3. Убедитесь, что в .env правильный API-ключ
  4. Copilot 403: токены gh auth login не работают для Copilot API. Нужно использовать специальный OAuth device code flow: hermes model → GitHub Copilot.

Изменения не применяются

  • Инструменты/навыки: /reset начинает новую сессию с обновлённым набором инструментов
  • Изменения конфига: в шлюзе: /restart. В CLI: выйдите и перезапустите.
  • Изменения кода: перезапустите CLI или процесс шлюза

Навыки не отображаются

  1. hermes skills list — убедитесь, что навык установлен
  2. hermes skills config — проверьте, включён ли он для платформы
  3. Загрузите явно: /skill name или hermes -s name

Проблемы со шлюзом

Сначала проверьте логи:

grep -i "failed to send\|error" ~/.hermes/logs/gateway.log | tail -20

Частые проблемы со шлюзом:

  • Шлюз падает при logout по SSH: включите linger: sudo loginctl enable-linger $USER
  • Шлюз падает при закрытии WSL2: WSL2 требует systemd=true в /etc/wsl.conf для работы systemd-сервисов. Без этого шлюз переходит на nohup (падает при завершении сессии).
  • Шлюз в петле перезапуска: сбросьте состояние ошибки: systemctl --user reset-failed hermes-gateway

Специфические проблемы платформ

  • Бот Discord молчит: необходимо включить Message Content Intent в Bot → Privileged Gateway Intents.
  • Бот Slack работает только в личных сообщениях: нужно подписаться на событие message.channels. Без него бот игнорирует публичные каналы.
  • Проблемы Windows (Alt+Enter перевод строки, WinError 10106, UTF-8 BOM в конфиге, тестовый набор, окончания строк): см. раздел Особенности Windows выше.

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

Если задачи auxiliary (vision, compression, session_search) молча завершаются с ошибкой, провайдер auto не может найти бэкенд. Установите OPENROUTER_API_KEY или GOOGLE_API_KEY, либо явно настройте провайдер для каждой вспомогательной задачи:

hermes config set auxiliary.vision.provider <your_provider>
hermes config set auxiliary.vision.model <model_name>

Где что найти

Ищу…Где смотреть
Параметры конфигаhermes config edit или документация по конфигурации
Доступные инструментыhermes tools list или справочник инструментов
Слэш-команды/help в сессии или справочник слэш-команд
Каталог навыковhermes skills browse или каталог навыков
Настройка провайдераhermes model или руководство по провайдерам
Настройка платформыhermes gateway setup или документация по мессенджерам
MCP-серверыhermes mcp list или руководство по MCP
Профилиhermes profile list или документация по профилям
Cron-заданияhermes cron list или документация по cron
Памятьhermes memory status или документация по памяти
Переменные окруженияhermes config env-path или справочник переменных окружения
CLI-командыhermes --help или справочник CLI
Логи шлюза~/.hermes/logs/gateway.log
Файлы сессийhermes sessions browse (читает state.db)
Исходный код~/.hermes/hermes-agent/

Краткий справочник для контрибьюторов

Для разовых участников и авторов PR. Полная документация для разработчиков: https://hermes-agent.nousresearch.com/docs/developer-guide/

Структура проекта

hermes-agent/
├── run_agent.py          # AIAgent — core conversation loop
├── model_tools.py        # Tool discovery and dispatch
├── toolsets.py           # Toolset definitions
├── cli.py                # Interactive CLI (HermesCLI)
├── hermes_state.py       # SQLite session store
├── agent/                # Prompt builder, context compression, memory, model routing, credential pooling, skill dispatch
├── hermes_cli/           # CLI subcommands, config, setup, commands
│   ├── commands.py       # Slash command registry (CommandDef)
│   ├── config.py         # DEFAULT_CONFIG, env var definitions
│   └── main.py           # CLI entry point and argparse
├── tools/                # One file per tool
│   └── registry.py       # Central tool registry
├── gateway/              # Messaging gateway
│   └── platforms/        # Platform adapters (telegram, discord, etc.)
├── cron/                 # Job scheduler
├── tests/                # ~3000 pytest tests
└── website/              # Docusaurus docs site

Конфигурация: ~/.hermes/config.yaml (настройки), ~/.hermes/.env (API-ключи).

Добавление инструмента (3 файла)

1. Создайте tools/your_tool.py:

import json, os
from tools.registry import registry

def check_requirements() -> bool:
    return bool(os.getenv("EXAMPLE_API_KEY"))

def example_tool(param: str, task_id: str = None) -> str:
    return json.dumps({"success": True, "data": "..."})

registry.register(
    name="example_tool",
    toolset="example",
    schema={"name": "example_tool", "description": "...", "parameters": {...}},
    handler=lambda args, **kw: example_tool(
        param=args.get("param", ""), task_id=kw.get("task_id")),
    check_fn=check_requirements,
    requires_env=["EXAMPLE_API_KEY"],
)

2. Добавьте в toolsets.py → список _HERMES_CORE_TOOLS.

Автообнаружение: любой файл tools/*.py с вызовом registry.register() на верхнем уровне импортируется автоматически — вручную перечислять не нужно.

Все обработчики должны возвращать JSON-строки. Используйте get_hermes_home() для путей, не хардкодьте ~/.hermes.

Добавление слэш-команды

  1. Добавьте CommandDef в COMMAND_REGISTRY в hermes_cli/commands.py
  2. Добавьте обработчик в cli.pyprocess_command()
  3. (Опционально) Добавьте обработчик шлюза в gateway/run.py

Все потребители (текст справки, автодополнение, меню Telegram, маппинг Slack) автоматически берут данные из центрального реестра.

Цикл агента (высокий уровень)

run_conversation():
  1. Build system prompt
  2. Loop while iterations < max:
     a. Call LLM (OpenAI-format messages + tool schemas)
     b. If tool_calls → dispatch each via handle_function_call() → append results → continue
     c. If text response → return
  3. Context compression triggers automatically near token limit

Тестирование

python -m pytest tests/ -o 'addopts=' -q   # Full suite
python -m pytest tests/tools/ -q            # Specific area
  • Тесты автоматически перенаправляют HERMES_HOME во временные директории — никогда не трогают настоящий ~/.hermes/
  • Запускайте полный набор перед каждым пушем
  • Используйте -o 'addopts=' для сброса встроенных флагов pytest

Контрибьюторам на Windows: scripts/run_tests.sh ищет POSIX-структуру venv (.venv/bin/activate / venv/bin/activate) и завершится с ошибкой на Windows, где используется venv/Scripts/activate + python.exe. Hermes-установленный venv в venv/Scripts/ также не содержит pip или pytest — урезан для уменьшения размера установки. Обходной путь: установите pytest + pytest-xdist + pyyaml в пользовательский site-packages системного Python 3.11 (/c/Program Files/Python311/python -m pip install --user pytest pytest-xdist pyyaml), затем запускайте тесты напрямую:

export PYTHONPATH="$(pwd)"
"/c/Program Files/Python311/python" -m pytest tests/tools/test_foo.py -v --tb=short -n 0

Используйте -n 0 (а не -n 4), потому что pyproject.toml уже включает -n в addopts по умолчанию, а гарантии CI-совместимости обёртки не работают вне POSIX.

Кроссплатформенные гварды для тестов: тесты, использующие только POSIX-системные вызовы, нуждаются в skip-маркере. Часто встречающиеся в кодовой базе:

  • Создание символических ссылок → @pytest.mark.skipif(sys.platform == "win32", reason="Symlinks require elevated privileges on Windows") (см. tests/cron/test_cron_script.py)
  • POSIX-права доступа (0o600 и т.д.) → @pytest.mark.skipif(sys.platform.startswith("win"), reason="POSIX mode bits not enforced on Windows") (см. tests/hermes_cli/test_auth_toctou_file_modes.py)
  • signal.SIGALRM → только Unix (см. tests/conftest.py::_enforce_test_timeout)
  • Живые Winsock / Windows-специфические регрессионные тесты → @pytest.mark.skipif(sys.platform != "win32", reason="Windows-specific regression")

Подмены sys.platform через monkeypatch недостаточно, когда тестируемый код также вызывает platform.system() / platform.release() / platform.mac_ver(). Эти функции независимо читают настоящую ОС, поэтому тест с sys.platform = "linux" на Windows-раннере всё равно получит platform.system() == "Windows" и пойдёт по Windows-ветке. Патчите все три вместе:

monkeypatch.setattr(sys, "platform", "linux")
monkeypatch.setattr(platform, "system", lambda: "Linux")
monkeypatch.setattr(platform, "release", lambda: "6.8.0-generic")

Рабочий пример: tests/agent/test_prompt_builder.py::TestEnvironmentHints.

Расширение блока execution-environment в системном промпте

Фактическая информация о хост-ОС, домашней директории пользователя, рабочей директории, бэкенде терминала и оболочке (bash vs. PowerShell на Windows) генерируется в agent/prompt_builder.py::build_environment_hints(). Там же живут WSL-подсказка и логика зондирования для каждого бэкенда. Соглашение:

  • Локальный бэкенд терминала → выводить информацию о хосте (ОС, $HOME, cwd) + Windows-специфические заметки (hostname ≠ username, terminal использует bash, а не PowerShell).
  • Удалённый бэкенд терминала (любой из _REMOTE_TERMINAL_BACKENDS: docker, singularity, modal, daytona, ssh, managed_modal) → не выводить информацию о хосте совсем, описывать только бэкенд. Живой зонд uname/whoami/pwd запускается внутри бэкенда через tools.environments.get_environment(...).execute(...), кэшируется в _BACKEND_PROBE_CACHE на процесс, со статическим фолбэком при таймауте.
  • Важно для написания промптов: когда TERMINAL_ENV != "local", каждый файловый инструмент (read_file, write_file, patch, search_files) работает внутри контейнера бэкенда, а не на хосте. В этом случае системный промпт не должен описывать хост — агент не имеет к нему доступа.

Полные заметки по дизайну, точные генерируемые строки и ловушки при тестировании: references/prompt-builder-environment-hints.md.

Паттерн безопасного рефакторинга (POSIX-equivalence guard): когда выносите инлайн-логику в хелпер, который добавляет Windows/платформо-специфичное поведение, оставьте в тестовом файле функцию-оракул _legacy_<name> — дословную копию старого кода, затем сравните их через параметризованный тест. Пример: tests/tools/test_code_execution_windows_env.py::TestPosixEquivalence. Это фиксирует инвариант битовой идентичности POSIX-поведения и заставит любой будущий дрейф громко упасть с понятным diff.

Соглашения о коммитах

type: concise subject line

Optional body.

Типы: fix:, feat:, refactor:, docs:, chore:

Ключевые правила

  • Не нарушайте кэширование промптов — не меняйте контекст, инструменты или системный промпт в середине разговора
  • Чередование ролей сообщений — никогда два сообщения assistant или два user подряд
  • Используйте get_hermes_home() из hermes_constants для всех путей (безопасно для профилей)
  • Настройки идут в config.yaml, секреты — в .env
  • Новые инструменты должны иметь check_fn, чтобы появляться только при выполнении требований
ESC