Автоматизация с Cron

Почему Cron?

Cron в Hermes Agent — это не просто планировщик задач. Это полноценная система автоматизации, которая позволяет агенту выполнять задачи по расписанию: мониторить сайты, генерировать отчёты, запускать пайплайны данных и объединять несколько навыков (skills) в сложные рабочие процессы. Агент получает промпт, выполняет его и доставляет результат — всё без вашего участия.

CLI-справочник

Все операции с cron-задачами выполняются через CLI или slash-команды:

hermes cron list [--all]       # Список активных (--all включая отключённые)
hermes cron create SCHED       # Создать: '30m', 'every 2h', '0 9 * * *'
hermes cron edit ID            # Редактировать расписание, промпт, доставку
hermes cron pause/resume ID    # Пауза / возобновление
hermes cron run ID             # Запустить немедленно (для тестирования)
hermes cron remove ID          # Удалить задачу
hermes cron status             # Статус планировщика

В интерактивной сессии: /cron list, /cron run <job_id>, /cron pause <job_id>, /cron edit <job_id>, /cron remove <job_id>.

Поля cron-задачи

Каждая cron-задача имеет следующие поля (задаются при создании или через hermes cron edit):

Поле Описание
schedule Расписание: 30m, every 2h, 0 9 * * *, ISO-метка времени
prompt Промпт для агента. Должен быть самодостаточным — агент не помнит ваши разговоры
deliver Режим доставки результата (см. раздел «Режимы доставки»)
enabled_toolsets Список доступных инструментов: terminal, file, browser, web, messaging и др. Переопределяет дефолты
workdir Рабочая директория агента при выполнении задачи
model Модель и провайдер: {"model": "claude-sonnet-4", "provider": "anthropic"}
script Путь к Python-скрипту, выполняемому перед агентом. stdout передаётся как контекст
no_agent Если true — скрипт выполняется без LLM (только script → stdout)
skills Список навыков для загрузки: ["arxiv", "obsidian"]
context_from Источник контекста: session — возобновить сессию, none — чистый старт
attach_to_session Привязать к конкретной сессии (continuation mode)

Режимы доставки

Поле deliver определяет, куда отправляется результат:

  • origin — в тот же чат, где задача была создана (по умолчанию)
  • local — только сохранить локально, без отправки в мессенджер
  • all — во все подключённые платформы одновременно
  • platform:chat_id — в конкретный чат. Пример: telegram:-1001234567890
  • platform:chat_id:thread_id — в конкретный топик. Пример: telegram:-1001234567890:42

Паттерн 1: Мониторинг изменений на сайте

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

/cron add "every 30m" "Fetch https://example.com/pricing and compare to the last version. If content changed, summarize what's different. If unchanged, respond [SILENT]." --name "Pricing page monitor"

Используйте [SILENT] в промпте, чтобы агент не слал уведомления при отсутствии изменений.

Паттерн 2: Генерация отчётов

Настройте еженедельный дайджест активности в репозитории:

/cron add "0 9 * * 1" "Summarize GitHub activity for repo: owner/repo. Include: new issues, merged PRs, notable commits. Format as a brief weekly digest." --deliver telegram

Формат расписания поддерживает стандартные cron-выражения (0 9 * * *), относительные интервалы (every 2h) и ISO-метки времени.

Паттерн 3: Слежение за GitHub-репозиторием

/cron add "every 6h" "Check GitHub repo owner/repo for new issues or PRs opened in the last 6 hours. Report titles, authors, and labels. If nothing new, respond [SILENT]." --deliver slack

Паттерн 4: Пайплайн сбора данных

Для сложных сценариев используйте --script — Python-скрипт собирает данные, а агент анализирует:

  • Скрипт выполняет HTTP-запросы, чтение файлов, обработку данных
  • Агент получает stdout скрипта и применяет рассуждение
  • Дешевле и надёжнее, чем если бы агент сам делал запросы

Пример: скрипт собирает криптовалютные цены каждые 15 минут, а агент раз в час анализирует тренды и предупреждает о значительных движениях (>5%).

Паттерн 5: Мульти-skill рабочий процесс

Объединяйте несколько навыков. Skills загружаются по порядку перед промптом:

/cron add "0 8 * * *" "Search arXiv for 3 most interesting papers on 'language model reasoning' from the past day. For each, create an Obsidian note with title, authors, abstract summary, and key contribution." --skill arxiv --skill obsidian --name "Paper digest"

Управление задачами

  • /cron list — показать все активные задачи
  • /cron run <job_id> — запустить немедленно (для тестирования)
  • /cron pause <job_id> — пауза
  • /cron edit <job_id> --schedule "every 4h" — изменить расписание
  • /cron edit <job_id> --prompt "Новое описание" — обновить промпт
  • /cron remove <job_id> — удалить навсегда

Обязательно тестируйте командой /cron run перед запуском по расписанию.

Практические советы

  • Делайте промпты самодостаточными. Агент не помнит ваши разговоры. Указывайте URL, имена репозиториев, форматы и инструкции по доставке прямо в промпте.
  • Используйте [SILENT] щедро. Для мониторинговых задач добавляйте «если ничего не изменилось, ответьте [SILENT]».
  • Скрипты для сбора данных. --script позволяет Python-скрипту выполнять рутинную работу, а агенту — только анализировать.
  • Тестируйте перед запуском. /cron run <job_id> для проверки вывода до срабатывания по расписанию.
  • Форматы расписания. Относительные задержки (30m), интервалы (every 2h), cron-выражения (0 9 * * *), ISO-метки (2025-06-15T09:00:00).

Подводные камни

Skills перекрывают промпты cron-задач

Агент загружает skills через skill_view и следует их инструкциям в первую очередь. Промпт cron-задачи — вторичен. Если skill содержит fallback-цепочки (например, «если send_message не сработал, попробуй curl с bot token»), агент выполнит их, даже если промпт говорит использовать только send_message. Удаляйте все альтернативные методы из skills, которые противоречат каноническому подходу. Это вызвало реальный инцидент: 4 publishing skills содержали fallback-инструкции с bot token, из-за которых cron-агенты использовали отозванные токены вместо send_message.

Emoji с невидимым Unicode блокируются

Emoji с Zero Width Joiner (U+200D), такие как 🐦‍⬛, блокируются детектором инъекций. Ошибка: Blocked: prompt contains invisible unicode U+200D. Используйте простые emoji или уберите их из промптов cron-задач.

send_message требует messaging в enabled_toolsets

send_message принадлежит тулсету messaging. Сессии cron по умолчанию НЕ включают messaging. Если задаче нужен send_message (например, для публикации в дополнительный канал), добавьте его в enabled_toolsets:

cronjob(action="update", job_id="...",
  enabled_toolsets=["terminal", "file", "browser", "web", "messaging"])

Когда enabled_toolsets задан, он переопределяет все дефолты — укажите все нужные тулсеты.

Важно: deliver отвечает за автоматическую доставку финального ответа в целевой чат. send_message нужен только для дополнительных целей.

Устаревшие пути после миграции

При восстановлении из бэкапа с другого сервера ВСЕ пути — в workdir и в тексте промпта — могут ссылаться на несуществующие директории. Выполните hermes cron list --all после восстановления и проверьте каждую задачу.

Агенты cron следуют SKILL.md, а не промпту

Когда промпт говорит «используй send_message», но SKILL.md говорит «используй curl с bot token как fallback», агент следует SKILL.md. Skill загружается как авторитетный контекст и перекрывает промпт. Последствие: если вы исправили workflow в промпте, но оставили старый подход в skill, агент будет использовать старый подход. Всегда обновляйте оба источника. Это вызывало месяцы ошибок «bot unavailable» — промпт был правильный, но skill содержал fallback-цепочки.

Автоматизация с Cron превращает Hermes Agent из интерактивного помощника в круглосуточного работника, который мониторит, анализирует и отчитывается — даже когда вы спите.