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

Планируйте автоматический запуск задач с помощью естественного языка или выражений cron. Hermes предоставляет управление cron с помощью единого инструмента cronjob с операциями в стиле действий вместо отдельных инструментов планирования/списка/удаления.

Что cron теперь может сделать

Задания Cron могут:

Все это доступно самому Hermes через инструмент cronjob, поэтому вы можете создавать, приостанавливать, редактировать и удалять задания, запрашивая простым языком — CLI не требуется.:::предупреждение Сеансы, запускаемые Cron, не могут рекурсивно создавать дополнительные задания cron. Hermes отключает инструменты управления cron внутри выполнения cron, чтобы предотвратить неконтролируемые циклы планирования.

Создание запланированных задач

В чате с /cron

/cron add 30m "Remind me to check the build"
/cron add "every 2h" "Check server status"
/cron add "every 1h" "Summarize new feed items" --skill blogwatcher
/cron add "every 1h" "Use both skills and combine the result" --skill blogwatcher --skill maps

Из автономного интерфейса командной строки

hermes cron create "every 2h" "Check server status"
hermes cron create "every 1h" "Summarize new feed items" --skill blogwatcher
hermes cron create "every 1h" "Use both skills and combine the result" \
  --skill blogwatcher \
  --skill maps \
  --name "Skill combo"

Через естественный разговор

Спросите Гермеса обычно:

Every morning at 9am, check Hacker News for AI news and send me a summary on Telegram.

Hermes будет использовать единый инструмент cronjob для внутренних целей.

Задания cron, поддерживаемые навыками

Задание cron может загрузить один или несколько навыков до запуска приглашения.

Один навык

cronjob(
    action="create",
    skill="blogwatcher",
    prompt="Check the configured feeds and summarize anything new.",
    schedule="0 9 * * *",
    name="Morning feeds",
)

Несколько навыков

Навыки загружаются по порядку. Подсказка становится инструкцией по выполнению задачи, наложенной поверх этих навыков.

cronjob(
    action="create",
    skills=["blogwatcher", "maps"],
    prompt="Look for new local events and interesting nearby places, then combine them into one short brief.",
    schedule="every 6h",
    name="Local brief",
)

Это полезно, если вы хотите, чтобы запланированный агент наследовал многократно используемые рабочие процессы, не вставляя полный текст навыка в саму подсказку cron.

Запуск задания внутри каталога проекта

Задания Cron по умолчанию выполняются отдельно от любого репозитория — никакие AGENTS.md, CLAUDE.md или .cursorrules не загружаются, а инструменты терминала/файла/code-exec запускаются из любого рабочего каталога, в котором запущен шлюз. Передайте --workdir (CLI) или workdir= (вызов инструмента), чтобы изменить это:

# Standalone CLI (schedule and prompt are positional)
hermes cron create "every 1d at 09:00" \
  "Audit open PRs, summarize CI health, and post to #eng" \
  --workdir /home/me/projects/acme
# From a chat, via the cronjob tool
cronjob(
    action="create",
    schedule="every 1d at 09:00",
    workdir="/home/me/projects/acme",
    prompt="Audit open PRs, summarize CI health, and post to #eng",
)

Когда установлен workdir:

Редактирование заданий

Вам не нужно удалять и заново создавать задания только для того, чтобы их изменить.

Чат

/cron edit <job_id> --schedule "every 4h"
/cron edit <job_id> --prompt "Use the revised task"
/cron edit <job_id> --skill blogwatcher --skill maps
/cron edit <job_id> --remove-skill blogwatcher
/cron edit <job_id> --clear-skills

Автономный интерфейс командной строки

hermes cron edit <job_id> --schedule "every 4h"
hermes cron edit <job_id> --prompt "Use the revised task"
hermes cron edit <job_id> --skill blogwatcher --skill maps
hermes cron edit <job_id> --add-skill maps
hermes cron edit <job_id> --remove-skill blogwatcher
hermes cron edit <job_id> --clear-skills

Примечания:

Действия жизненного цикла

Задания Cron теперь имеют более полный жизненный цикл, чем просто создание/удаление.

Чат

/cron list
/cron pause <job_id>
/cron resume <job_id>
/cron run <job_id>
/cron remove <job_id>

Автономный интерфейс командной строки

hermes cron list
hermes cron pause <job_id>
hermes cron resume <job_id>
hermes cron run <job_id>
hermes cron remove <job_id>
hermes cron status
hermes cron tick

Что они делают:

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

Выполнение Cron осуществляется демоном шлюза. Шлюз проверяет планировщик каждые 60 секунд, выполняя все необходимые задания в изолированных сеансах агента.

hermes gateway install     # Install as a user service
sudo hermes gateway install --system   # Linux: boot-time system service for servers
hermes gateway             # Or run in foreground

hermes cron list
hermes cron status

Поведение планировщика шлюза

На каждом тике Гермеса:

  1. загружает задания из ~/.hermes/cron/jobs.json
  2. сверяет next_run_at с текущим временем
  3. запускает новый сеанс AIAgent для каждого выполняемого задания.
  4. при необходимости добавляет в новую сессию один или несколько дополнительных навыков.
  5. запускает подсказку до завершения
  6. дает окончательный ответ
  7. обновления запускают метаданные и следующее запланированное время.

Блокировка файла ~/.hermes/cron/.tick.lock предотвращает перекрытие тактов планировщика от двойного запуска одного и того же пакета заданий.

Варианты доставки

При планировании заданий вы указываете, куда направляются выходные данные:

Вариант Описание Пример
"происхождение" Назад туда, где была создана вакансия По умолчанию на платформах обмена сообщениями
"местный" Сохранять только в локальные файлы (~/.hermes/cron/output/) По умолчанию в CLI
"телеграмма" Домашний канал Telegram Использует TELEGRAM_HOME_CHANNEL
"телеграмма:123456" Конкретный чат Telegram по ID Прямая доставка
"телеграмма:-100123:17585" Конкретная тема Telegram формат chat_id:thread_id
"раздор" Домашний канал Discord Использует DISCORD_HOME_CHANNEL
"discord:#engineering" Конкретный канал Discord По названию канала
"слаба" Домашний канал Slack
"WhatsApp" WhatsApp дома
"сигнал" Сигнал
"матрица" Матрица домашняя комната
"самое важное" Самый важный домашний канал
"электронная почта" Электронная почта
"смс" СМС через Twilio
"домашний помощник" Домашний помощник
"Динтолк" ДинТок
"фейшу" Фейшу/Жаворонок
"Веком" ВеКом
"Вэйсинь" Вэйсинь (WeChat)
"голубые пузыри" BlueBubbles (iMessage)
"qqbot" QQ-бот (Tencent QQ)

Окончательный ответ агента доставляется автоматически. Вам не нужно вызывать send_message в командной строке cron.

Перенос ответа

По умолчанию доставленные выходные данные cron оборачиваются верхним и нижним колонтитулом, чтобы получатель знал, что они получены в результате запланированной задачи:

Cronjob Response: Morning feeds
-------------

<agent output here>

Note: The agent cannot see this message, and therefore cannot respond to it.

Чтобы доставить необработанный вывод агента без оболочки, установите для параметра cron.wrap_response значение false:

# ~/.hermes/config.yaml
cron:
  wrap_response: false

Тихое подавление

Если окончательный ответ агента начинается с [SILENT], доставка полностью подавляется. Вывод по-прежнему сохраняется локально для аудита (в ~/.hermes/cron/output/), но никакое сообщение не отправляется адресату доставки.

Это полезно для мониторинга заданий, которые должны сообщать только о том, что что-то не так:

Check if nginx is running. If everything is healthy, respond with only [SILENT].
Otherwise, report the issue.

Неудачные задания всегда выполняются независимо от маркера [SILENT] — только успешные запуски могут быть отключены.

Таймаут скрипта

Сценарии перед запуском (прикрепляемые через параметр script) имеют время ожидания по умолчанию 120 секунд. Если вашим сценариям требуется больше времени — например, для включения рандомизированных задержек, которые позволяют избежать шаблонов синхронизации, подобных боту, — вы можете увеличить это значение:

# ~/.hermes/config.yaml
cron:
  script_timeout_seconds: 300   # 5 minutes

Или установите переменную среды HERMES_CRON_SCRIPT_TIMEOUT. Порядок разрешения: env var → config.yaml → 120 с по умолчанию.

Режим без агента (задания только для сценариев)

Для повторяющихся заданий, которые не требуют рассуждений LLM — классических сторожевых таймеров, предупреждений о диске/памяти, тактовых импульсов, пингов CI — передайте no_agent=True во время создания. Планировщик запускает ваш скрипт по расписанию и доставляет его стандартный вывод напрямую, полностью пропуская агент:

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

Семантика:

Файлы .sh/.bash запускаются в /bin/bash; что-нибудь еще в текущем интерпретаторе Python (sys.executable). Скрипты должны находиться в ~/.hermes/scripts/ (то же правило песочницы, что и для шлюза предварительного запуска скриптов).

Агент настроит их для вас

Схема инструмента cronjob предоставляет no_agent непосредственно Hermes, поэтому вы можете описать сторожевой таймер в чате и позволить агенту подключить его:

Ping me on Telegram if RAM is over 85%, every 5 minutes.

Hermes запишет сценарий проверки в ~/.hermes/scripts/ через write_file, а затем вызовет:

cronjob(action="create", schedule="every 5m",
        script="memory-watchdog.sh", no_agent=True,
        deliver="telegram", name="memory-watchdog")

Он выбирает no_agent=True автоматически, когда содержимое сообщения полностью определяется сценарием (сторожевые таймеры, пороговые оповещения, контрольные сигналы). Тот же инструмент также позволяет агенту приостанавливать, возобновлять, редактировать и удалять задания — таким образом, весь жизненный цикл управляется через чат, и никто не затрагивает интерфейс командной строки.

Рабочие примеры см. в Руководстве по заданиям Cron только для сценариев.

Восстановление провайдера

Задания Cron наследуют настроенных резервных поставщиков и ротацию пула учетных данных. Если основной ключ API ограничен по скорости или поставщик возвращает ошибку, агент cron может:

Это означает, что задания cron, которые выполняются с высокой частотой или в часы пик, более устойчивы — один ключ с ограниченной скоростью не приведет к сбою на протяжении всего выполнения.

Форматы расписания

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

Относительные задержки (однократные)

30m     → Run once in 30 minutes
2h      → Run once in 2 hours
1d      → Run once in 1 day

Интервалы (повторяющиеся)

every 30m    → Every 30 minutes
every 2h     → Every 2 hours
every 1d     → Every day

Выражения Cron

0 9 * * *       → Daily at 9:00 AM
0 9 * * 1-5     → Weekdays at 9:00 AM
0 */6 * * *     → Every 6 hours
30 8 1 * *      → First of every month at 8:30 AM
0 0 * * 0       → Every Sunday at midnight

Временные метки ISO

2026-03-15T09:00:00    → One-time at March 15, 2026 9:00 AM

Повторить поведение

Тип расписания Повтор по умолчанию Поведение
One-shot (30m, временная метка) 1 Запускается один раз
Интервал («каждые 2 часа») навсегда Работает, пока не будет удален
Выражение Cron навсегда Работает, пока не будет удален

Вы можете переопределить его:

cronjob(
    action="create",
    prompt="...",
    schedule="every 2h",
    repeat=5,
)

Программное управление заданиями

API, ориентированный на агента, — это один из инструментов:

cronjob(action="create",...)
cronjob(action="list")
cronjob(action="update", job_id="...")
cronjob(action="pause", job_id="...")
cronjob(action="resume", job_id="...")
cronjob(action="run", job_id="...")
cronjob(action="remove", job_id="...")

Для update передайте skills=[], чтобы удалить все прикрепленные навыки.

Наборы инструментов, доступные для заданий cron

Cron запускает каждое задание в новом сеансе агента без подключения платформы чата. По умолчанию агент cron получает набор инструментов, который вы настроили для платформы cron в инструментах Hermes, а не CLI по умолчанию и не все на свете.

hermes tools
# → pick the "cron" platform in the curses UI
# → toggle toolsets on/off just like you would for Telegram/Discord/etc.

Более жесткий контроль над каждым заданием доступен через поле enabled_toolsets в cronjob.create (или в существующем задании через cronjob.update):

cronjob(action="create", name="weekly-news-summary",
        schedule="every sunday 9am",
        enabled_toolsets=["web", "file"],      # just web + file, no terminal/browser/etc.
        prompt="Summarize this week's AI news:...")

Когда для задания установлен enabled_toolsets, оно выигрывает; в противном случае побеждает конфигурация cron-платформы hermestools; в противном случае Hermes вернется к встроенным настройкам по умолчанию. Это важно для контроля затрат: включение «moa», «браузера» и «делегирования» в каждое крошечное задание по получению новостей приводит к раздуванию подсказки схемы инструмента при каждом вызове LLM.

Полный пропуск агента: wakeAgent

Если к вашему заданию cron прилагается сценарий предварительной проверки (через script=), сценарий может решить во время выполнения, следует ли Hermes вообще вызывать агент. Выдайте последнюю строку стандартного вывода формы:

{"wakeAgent": false}

…и cron полностью пропускает запуск агента для этого тика. Полезно для частых опросов (каждые 1–5 минут), при которых LLM необходимо разбудить только тогда, когда состояние действительно изменилось — в противном случае вы снова и снова платите за обороты агента с нулевым содержанием.

# pre-check script
import json, sys
latest = fetch_latest_issue_count()
prev = read_state("issue_count")
if latest == prev:
    print(json.dumps({"wakeAgent": False}))   # skip this tick
    sys.exit(0)
write_state("issue_count", latest)
print(json.dumps({"wakeAgent": True, "context": {"new_issues": latest - prev}}))

Если wakeAgent опущен, значением по умолчанию является true (разбудить агент как обычно).

Объединение заданий: context_from

Задание cron может использовать самые последние успешные выходные данные одного или нескольких других заданий, перечислив их имена (или идентификаторы) в context_from:

cronjob(action="create", name="daily-digest",
        schedule="every day 7am",
        context_from=["ai-news-fetch", "github-prs-fetch"],
        prompt="Write the daily digest using the outputs above.")

Результаты последних завершенных заданий, на которые имеются ссылки, вставляются над приглашением в качестве контекста для этого запуска. Каждая восходящая запись должна быть действительным идентификатором или именем задания (см. cronjob action="list"). Примечание: цепочка считывает самые последние завершенные выходные данные — она не ожидает выполнения вышестоящих заданий, выполняющихся в тот же такт.

Хранилище заданий

Рабочие места хранятся в ~/.hermes/cron/jobs.json. Вывод результатов выполнения заданий сохраняется в ~/.hermes/cron/output/{job_id}/{timestamp}.md.

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

В хранилище используется атомарная запись файлов, поэтому прерванные записи не оставляют после себя частично записанный файл задания.

Самостоятельные подсказки по-прежнему имеют значение:::предупреждение Важно

Задания Cron выполняются в совершенно новом сеансе агента. Приглашение должно содержать все, что нужно агенту, чего еще не предусмотрено прикрепленными навыками. ПЛОХО: "Проверьте проблему с этим сервером"

ХОРОШО: "Подключитесь по SSH к серверу 192.168.1.100 от имени пользователя "deploy", проверьте, работает ли nginx с "systemctl status nginx", и убедитесь, что https://example.com возвращает HTTP 200."

Безопасность

Запросы запланированных задач сканируются на предмет шаблонов внедрения подсказок и кражи учетных данных во время создания и обновления. Запросы, содержащие невидимые трюки Unicode, попытки бэкдора SSH или очевидные полезные данные для раскрытия секретов, блокируются.