🤖HermesBlog
Официальные Учебники Hermes · Часть 268/9/2026

Учебник 26: Пакетная Обработка

Учебник 26: Пакетная Обработка — простое для понимания руководство на основе официальных документов

Это часть официальной серии уроков по Hermes Agent. Смотреть все уроки

Представьте, что это утренний чек-лист, который вы прогоняете перед началом работы — вам не нужно запоминать каждую задачу, вы записываете их один раз, а ваш ассистент автоматически отмечает их каждый день. Именно это Hermes позволяет вам делать с помощью хуков шлюза (gateway hooks) и простого файла под названием BOOT.md.

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


Hermes tutorial

Шаг 1: Создайте каталог для вашего хука

Сначала создайте папку внутри вашего каталога хуков. Каждый хук живет в своей собственной подпапке с двумя файлами: HOOK.yaml (конфигурация) и handler.py (логика).

mkdir -p ~/.hermes/hooks/boot-md
cd ~/.hermes/hooks/boot-md

Теперь создайте HOOK.yaml:

name: "boot-md"
event: "gateway_startup"

Вот и всё — событие сообщает Hermes, что этот хук нужно запустить при загрузке шлюза.


Шаг 2: Напишите обработчик

Теперь создайте handler.py. Вот где происходит вся магия. Обработчик читает файл BOOT.md из вашего домашнего каталога, а затем запускает фоновый поток, который выполняет агента с этими инструкциями.

Вот основная идея (упрощенная):

import os, threading
from pathlib import Path
from hermes.agent import AIAgent

def run_boot_md():
    content = Path.home().joinpath(".hermes", "BOOT.md").read_text()
    print(f"Running BOOT.md ({len(content)} chars)")

    agent = AIAgent(
        instructions=content,
        model=_resolve_gateway_model(),          # использует модель вашего шлюза
        **_resolve_runtime_agent_kwargs()       # использует учетные данные вашего провайдера
    )
    result = agent.run()
    print(f"boot-md completed: {result.summary()}")

def handler(event):
    thread = threading.Thread(target=run_boot_md, daemon=True)
    thread.start()

Две ключевые строки:

  • _resolve_gateway_model() считывает текущую сконфигурированную модель шлюза.
  • _resolve_runtime_agent_kwargs() разрешает учетные данные провайдера так же, как это делает обычный ход шлюза — включая API-ключи, базовые URL, OAuth-токены и пулы учетных данных.

Без них голый AIAgent() будет использовать встроенные настройки по умолчанию и получит ошибку 401 при обращении к любой нестандартной конечной точке.


Шаг 3: Проверьте это

Перезапустите шлюз:

hermes gateway restart

Следите за логами:

hermes logs --follow --level INFO | grep boot-md

Вы должны увидеть Running BOOT.md (N chars), за которым следует либо boot-md completed: ... (краткое описание того, что сделал агент), либо boot-md completed (nothing to report), когда агент ответил точным токеном тишины, например [SILENT].

Удалите ~/.hermes/BOOT.md, чтобы отключить чек-лист — хук останется загруженным, но будет молча пропускать выполнение, если файла нет.


Расширение паттерна

  • Чек-листы с учетом расписания: используйте datetime.now().weekday() в инструкциях BOOT.md («если сегодня понедельник, также проверь еженедельный лог деплоя»). Инструкции — это свободный текст, так что все, о чем агент может рассуждать, подходит.
  • Несколько чек-листов: укажите хуку другой файл (STARTUP.md, MORNING.md и т.д.) и зарегистрируйте отдельные каталоги хуков для каждого.
  • Вариант без агента: если вам не нужен полный цикл агента, пропустите AIAgent и заставьте обработчик отправлять фиксированное уведомление напрямую через httpx. Дешевле, быстрее и не зависит от провайдера.

Почему это не встроенная функция

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


Как это работает

  1. При запуске шлюза HookRegistry.discover_and_load() сканирует ~/.hermes/hooks/
  2. Каждая подпапка с HOOK.yaml + handler.py загружается динамически
  3. Обработчики регистрируются для объявленных событий
  4. В каждой точке жизненного цикла hooks.emit() запускает все подходящие обработчики
  5. Ошибки в любом обработчике перехватываются и логируются — сломанный хук никогда не крашит агента

:::info Хуки шлюза срабатывают только в шлюзе (Telegram, Discord, Slack, WhatsApp, Teams). CLI не загружает хуки шлюза. Для хуков, которые работают везде, используйте хуки плагинов. :::


Итог

Теперь вы знаете, как превратить простой текстовый файл в мощный стартовый чек-лист, который выполняется автоматически. Будь то полный цикл агента или быстрый HTTP-запрос, паттерн один и тот же: напишите хук, укажите ему на файл и позвольте Hermes сделать все остальное.

Далее: Урок 27 — Голосовой режим: общение с Hermes без помощи рук.

📖 Официальная документация

Эта статья основана на официальной документации Hermes Agent :Официальные документы › user-guide/features/batch-processing