Cron-задания только со скриптами (без агента)

Иногда вы уже точно знаете, какое сообщение хотите отправить. Нет нужды в агенте, который будет размышлять над ним — вам нужен просто скрипт, запускающийся по таймеру, а его вывод (если он есть) должен попадать в Telegram / Discord / Slack / Signal.

В Hermes это называется режим без агента (no-agent mode). Это система cron минус LLM.

   ┌──────────────────┐          ┌──────────────────┐
   │ scheduler tick   │  every   │ run script       │
   │ (every N minutes)│ ──────▶ │ (bash or python) │
   └──────────────────┘          └──────────────────┘
                                          │
                                          │ stdout
                                          ▼
                                 ┌──────────────────┐
                                 │ delivery router  │
                                 │ (telegram/disc…) │
                                 └──────────────────┘

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

Используйте режим без агента для:

Используйте обычное (LLM-управляемое) cron-задание, когда агенту нужно решить, что сказать — резюмировать длинный документ, выбрать интересные элементы из ленты, составить дружелюбное сообщение. Путь без агента — для случаев, когда stdout скрипта УЖЕ является сообщением.

Создать из чата

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

Пример диалога

Вы: пингуй меня в telegram, если RAM превышает 85%, каждые 5 минут

Hermes: (пишет ~/.hermes/scripts/memory-watchdog.sh, затем вызывает cronjob(...) с no_agent=true)

Настроено. Запускается каждые 5 мин, оповещает Telegram только когда RAM выше 85%. Скрипт: memory-watchdog.sh. ID задания: abc123.

Под капотом агент делает два вызова инструментов:

# 1. Write the check script
write_file(
    path="~/.hermes/scripts/memory-watchdog.sh",
    content='''#!/usr/bin/env bash
ram_pct=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$ram_pct" -ge 85 ]; then
  echo "RAM ${ram_pct}% on $(hostname)"
fi
# Empty stdout = silent tick; no message sent.
''',
)

# 2. Schedule it — no_agent=True skips the LLM on every tick
cronjob(
    action="create",
    schedule="every 5m",
    script="memory-watchdog.sh",
    no_agent=True,
    deliver="telegram",
    name="memory-watchdog",
)

С этого момента каждый тик бесплатен: планировщик запускает скрипт, перенаправляет его stdout в Telegram (если он непустой) и никогда не обращается к модели.

Что агент решает за вас

Когда вы формулируете запрос вроде «предупреди меня, когда X» или «каждые N минут проверяй Y и сообщай, если Z», описание инструмента cronjob в Hermes подсказывает ему использовать no_agent=True всякий раз, когда содержание сообщения полностью определяется скриптом. Он переключается на обычный LLM-управляемый путь, когда запрос требует рассуждений («резюмируй новые issues», «выбери самые интересные заголовки», «составь дружеское напоминание»).

Вам не нужно указывать --no-agent самостоятельно. Просто опишите желаемое поведение.

Управление сторожами из чата

Агент может приостанавливать, возобновлять, редактировать и удалять задания так же, как и создавать их:

Вы: останови memory watchdog на сегодняшнюю ночь

Hermes: (вызывает cronjob(action='pause', job_id='abc123'))

Приостановлено. Возобновите командой «включи обратно» или через hermes cron resume abc123.

Вы: измени на каждые 15 минут

Hermes: (вызывает cronjob(action='update', job_id='abc123', schedule='every 15m'))

Полный жизненный цикл (создание / список / обновление / пауза / возобновление / запуск сейчас / удаление) доступен агенту без необходимости изучать CLI-команды.

Создать из CLI

Предпочитаете терминал? Путь через CLI даёт тот же результат за три команды:

# 1. Write your script
cat > ~/.hermes/scripts/memory-watchdog.sh <<'EOF'
#!/usr/bin/env bash
# Alert when RAM usage is over 85%. Silent otherwise.
RAM_PCT=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$RAM_PCT" -ge 85 ]; then
  echo "⚠ RAM ${RAM_PCT}% on $(hostname)"
fi
# Empty stdout = silent run; no message sent.
EOF
chmod +x ~/.hermes/scripts/memory-watchdog.sh

# 2. Schedule it
hermes cron create "every 5m" \
  --no-agent \
  --script memory-watchdog.sh \
  --deliver telegram \
  --name "memory-watchdog"

# 3. Verify
hermes cron list
hermes cron run <job_id>    # fire it once to test

Вот и всё. Никакого промпта, никакого навыка, никакой модели.

Как вывод скрипта преобразуется в доставку

Поведение скрипта Результат
Выход 0, непустой stdout stdout доставляется как есть
Выход 0, пустой stdout Тихий тик — без доставки
Выход 0, stdout содержит {"wakeAgent": false} в последней строке Тихий тик (общий шлюз с LLM-заданиями)
Ненулевой код выхода Отправляется уведомление об ошибке (чтобы сломавшийся сторож не замолчал)
Тайм-аут скрипта Отправляется уведомление об ошибке

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

Правила для скриптов

Скрипты должны находиться в ~/.hermes/scripts/. Это проверяется как при создании задания, так и во время выполнения — абсолютные пути, подстановка ~/ и паттерны обхода пути (../) отвергаются. Та же директория используется для скриптов предварительной проверки LLM-заданий.

Выбор интерпретатора определяется расширением файла:

Расширение Интерпретатор
.sh, .bash /bin/bash
всё остальное sys.executable (текущий Python)

Мы намеренно НЕ обрабатываем шебанг-строки #!/... — явный и небольшой набор интерпретаторов снижает поверхность доверия планировщика.

Синтаксис расписания

Такой же, как и для всех остальных cron-заданий:

hermes cron create "every 5m"        # интервал
hermes cron create "every 2h"
hermes cron create "0 9 * * *"       # стандартный cron: ежедневно в 9 утра
hermes cron create "30m"             # одноразовый: запустить один раз через 30 минут

Полный синтаксис см. в справочнике по функциям cron.

Цели доставки

--deliver принимает всё, что знает шлюз. Некоторые распространённые варианты:

--deliver telegram                       # домашний канал платформы
--deliver telegram:-1001234567890        # конкретный чат
--deliver telegram:-1001234567890:17585  # конкретная тема форума Telegram
--deliver discord:#ops
--deliver slack:#engineering
--deliver signal:+155****4567
--deliver local                          # просто сохранить в ~/.hermes/cron/output/

Для работы с платформами на токенах ботов (Telegram, Discord, Slack, Signal, SMS, WhatsApp) работающий шлюз не требуется во время выполнения скрипта — инструмент вызывает REST-эндпоинты каждой платформы напрямую, используя учётные данные из ~/.hermes/.env / ~/.hermes/config.yaml.

Редактирование и жизненный цикл

hermes cron list                                    # показать все задания
hermes cron pause <job_id>                          # остановить выполнение, сохранить определение
hermes cron resume <job_id>
hermes cron edit <job_id> --schedule "every 10m"    # изменить частоту
hermes cron edit <job_id> --agent                   # переключиться в режим LLM
hermes cron edit <job_id> --no-agent --script      # переключиться обратно
hermes cron remove <job_id>                         # удалить задание

Всё, что работает с LLM-заданиями (пауза, возобновление, ручной запуск, изменение цели доставки), работает и с заданиями без агента.

Пример: оповещение о заполнении диска

cat > ~/.hermes/scripts/disk-alert.sh <<'EOF'
#!/usr/bin/env bash
# Alert when / or /home is over 90% full.
THRESHOLD=90
df -h / /home 2>/dev/null | awk -v t="$THRESHOLD" '
  NR > 1 && $5+0 >= t {
    printf "⚠ Disk %s full on %s\\n", $5, $6
  }
'
EOF
chmod +x ~/.hermes/scripts/disk-alert.sh

hermes cron create "*/15 * * * *" \
  --no-agent \
  --script disk-alert.sh \
  --deliver telegram \
  --name "disk-alert"

Молчит, когда обе файловые системы заполнены менее чем на 90%; отправляет ровно одну строку для каждой файловой системы, превысившей порог.

Сравнение с другими подходами

Подход Что запускается Когда использовать
cronjob --no-agent (эта страница) Ваш скрипт по расписанию Hermes Повторяющиеся сторожа / оповещения / метрики, не требующие рассуждений
cronjob (по умолчанию, с LLM) Агент с опциональным скриптом предпроверки Когда содержание сообщения требует анализа данных
OS cron + curl к подписке webhook Ваш скрипт по расписанию ОС Когда Hermes может быть нездоров (объект мониторинга)

Для критических сторожей системного здоровья, которые должны срабатывать даже когда шлюз недоступен, используйте cron на уровне ОС с обычным curl к подписке webhook Hermes (или любому внешнему endpoint'у оповещений) — они запускаются как независимые процессы ОС и не требуют работающего Hermes. Внутренний планировщик шлюза — правильный выбор, когда объект мониторинга является внешним.