Задания Cron только для сценариев

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

Гермес называет это режимом без агентов. Это система cron без LLM.

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

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

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

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

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

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

Пример расшифровки

Вы: пингуете меня в Telegram, если оперативная память превышает 85 %, каждые 5 минут.

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

Настроить. Запускается каждые 5 минут, предупреждает Telegram только тогда, когда ОЗУ превышает 85%. Скрипт: memory-watchdog.sh. Идентификатор вакансии: 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",
)

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

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

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

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

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

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

Вы: остановите сторожевой таймер памяти на сегодняшний вечер

Гермес: (вызывает cronjob(action='pause', job_id='abc123'))

Приостановлено. Возобновите работу с помощью «Включите его снова» или через «hermes cron возобновить abc123».

Вы: измените настройку на каждые 15 минут.

Гермес: (вызывает cronjob(action='update', job_id='abc123', Schedule='каждые 15 минут'))

Полный жизненный цикл (создание/список/обновление/пауза/возобновление/запуск/удаление) доступен агенту без изучения каких-либо команд 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, непустой стандартный вывод стандартный вывод доставляется дословно
Выход 0, пустой стандартный вывод Тихая галочка — доставки нет
Выход 0, стандартный вывод содержит {"wakeAgent": false} в последней строке Тихая галочка (общие ворота с вакансиями LLM)
Ненулевой код выхода Предупреждение об ошибке доставляется (поэтому сломанный сторожевой таймер не выходит из строя молча)
Таймаут скрипта Предупреждение об ошибке доставлено

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

Правила скрипта

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

Выбор интерпретатора осуществляется по расширению файла:

Расширение Переводчик
.sh, .bash /bin/bash
что-нибудь еще sys.executable (текущий Python)

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

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

То же, что и все остальные задания cron:

hermes cron create "every 5m"        # interval
hermes cron create "every 2h"
hermes cron create "0 9 * * *"       # standard cron: 9am daily
hermes cron create "30m"             # one-shot: run once in 30 minutes

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

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

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

--deliver telegram                       # platform home channel
--deliver telegram:-1001234567890        # specific chat
--deliver telegram:-1001234567890:17585  # specific Telegram forum topic
--deliver discord:#ops
--deliver slack:#engineering
--deliver signal:+15551234567
--deliver local                          # just save to ~/.hermes/cron/output/

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

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

hermes cron list                                    # see all jobs
hermes cron pause <job_id>                          # stop firing, keep definition
hermes cron resume <job_id>
hermes cron edit <job_id> --schedule "every 10m"    # adjust cadence
hermes cron edit <job_id> --agent                   # flip to LLM mode
hermes cron edit <job_id> --no-agent --script      # flip back
hermes cron remove <job_id>                         # delete it

Все, что работает в заданиях 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%; запускает ровно одну строку на каждую файловую систему, превышающую пороговое значение, когда она заполняется.

Сравнение с другими шаблонами

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

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

Похожие