Код и хуки
Hermes Agent предоставляет два механизма автоматизации: выполнение кода (execute_code) и событийные хуки (event hooks). Вместе они позволяют программно управлять рабочими процессами и вмешиваться в жизненный цикл агента.
Выполнение кода: execute_code
Инструмент execute_code запускает Python-скрипт в изолированном окружении с доступом ко всем инструментам Hermes через RPC. Это позволяет объединять множество шагов в одну программу вместо последовательных вызовов.
Python RPC
Внутри скрипта доступен модуль hermes_tools с RPC-прокси: terminal(), read_file(), web_search() и другие. Вызовы сериализуются в JSON, передаются через Unix-сокет и возвращают результат — поведение идентично обычным вызовам инструментов.
Режимы и ограничения
project— скрипт в рабочей директории сессии с активным venvstrict— изолированная временная директория с фиксированным интерпретатором
Лимиты: таймаут 300 секунд, stdout до 50 КБ, до 50 вызовов инструментов. Переменные окружения с KEY, TOKEN, SECRET и PASSWORD в имени автоматически вырезаются.
Событийные хуки
Хуки запускают код (Python-плагины или shell-скрипты) в ключевых точках жизненного цикла агента для логирования, аудита и блокировки опасных операций.
Жизненный цикл
on_session_start/on_session_end— начало и конец сессииpre_llm_call/post_llm_call— до и после вызова LLMpre_tool_call/post_tool_call— до и после вызова инструментаsubagent_stop— завершение подагентаtransform_tool_result— модификация результата
Типы хуков
Python-плагины в ~/.hermes/hooks/ выполняются в процессе Hermes с доступом к его структурам. Shell-хуки настраиваются в config.yaml: получают JSON через stdin и возвращают {} для разрешения или {"decision": "block"} для блокировки.
Безопасность
Первое срабатывание требует подтверждения пользователя. Решения сохраняются в shell-hooks-allowlist.json. Для CI доступны --accept-hooks и hooks_auto_accept: true. Python-плагины имеют приоритет над shell-хуками, первый блокирующий ответ прерывает цепочку.
Добавление инструмента
Добавление нового инструмента в Hermes затрагивает 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
Добавить toolset в список _HERMES_CORE_TOOLS.
Auto-discovery
Любой файл tools/*.py с вызовом registry.register() на верхнем уровне автоматически импортируется — ручной список не нужен.
Важные правила для инструментов
- Все handlers должны возвращать JSON-строки — не словари, не объекты, а именно
json.dumps(...) - Используйте
get_hermes_home()изhermes_constantsдля всех путей. Никогда не хардкодьте~/.hermes check_fn— функция проверки доступности. Инструмент появляется в списке только когдаcheck_fn()возвращаетTruerequires_env— список переменных окружения, необходимых для работы инструмента
Добавление slash-команды
Slash-команда добавляется в два шага:
- CommandDef в
COMMAND_REGISTRY— файлhermes_cli/commands.py. Определение команды с именем, описанием и параметрами - Handler в
cli.py— функцияprocess_command()обрабатывает вызов команды - (Опционально) Gateway handler в
gateway/run.py— для поддержки команды в мессенджерах
Все потребители (текст помощи, автодополнение, Telegram-меню, Slack-маппинг) автоматически берут данные из центрального реестра.
Commit Conventions
Формат коммитов в проекте:
type: concise subject line
Optional body.
Допустимые типы:
fix:— исправление багаfeat:— новая функциональностьrefactor:— рефакторинг без изменения поведенияdocs:— изменения документацииchore:— обслуживающие задачи (зависимости, CI, конфигурация)
Key Rules
Критические правила, которые нельзя нарушать:
- Никогда не ломайте prompt caching — не меняйте контекст, инструменты или системный промпт в середине сессии. Изменения toolset применяются только после
/reset - Чередование ролей сообщений — никогда не должно быть двух сообщений assistant или двух сообщений user подряд
get_hermes_home()— используйте для всех путей (profile-safe). Не хардкодьте~/.hermes- Конфигурация — настройки в
config.yaml, секреты в.env - Новые инструменты — обязаны иметь
check_fn, чтобы появляться только при выполнении требований