Задания Cron (планировщик Gateway)
Cron или Heartbeat? См. Cron vs Heartbeat для руководства о том, когда использовать каждый вариант.
Cron — это встроенный планировщик Gateway. Он сохраняет задания, пробуждает агента в нужное время и может опционально доставлять вывод обратно в чат.
Если вам нужно "запускать это каждое утро" или "напомнить агенту через 20 минут", cron — это механизм для этого.
Кратко
- Cron работает внутри Gateway (не внутри модели).
- Задания сохраняются в ~/.openclaw/cron/, поэтому перезапуски не теряют расписания.
- Два стиля выполнения:
- Основная сессия: поставить в очередь системное событие, затем выполнить при следующем сердцебиении.
- Изолированная: запустить отдельный ход агента в cron:<jobId>, опционально доставить вывод.
- Пробуждения являются приоритетными: задание может запросить "пробудить сейчас" против "следующее сердцебиение".
Обзор для начинающих
Думайте о задании cron как о: когда запускать + что делать.
-
Выберите расписание
- Одноразовое напоминание → schedule.kind = "at" (CLI: --at)
- Повторяющееся задание → schedule.kind = "every" или schedule.kind = "cron"
- Если ваш временной штамп ISO не указывает часовой пояс, он рассматривается как UTC.
-
Выберите, где оно выполняется
- sessionTarget: "main" → запустить во время следующего сердцебиения с основным контекстом.
- sessionTarget: "isolated" → запустить отдельный ход агента в cron:<jobId>.
-
Выберите полезную нагрузку
- Основная сессия → payload.kind = "systemEvent"
- Изолированная сессия → payload.kind = "agentTurn"
Опционально: deleteAfterRun: true удаляет успешные одноразовые задания из хранилища.
Концепции
Задания
Задание cron — это сохраненная запись с:
- расписанием (когда оно должно выполняться),
- полезной нагрузкой (что оно должно делать),
- опциональной доставкой (куда должен быть отправлен вывод).
- опциональной привязкой к агенту (agentId): выполнить задание под конкретным агентом; если отсутствует или неизвестно, gateway возвращается к агенту по умолчанию.
Задания идентифицируются стабильным jobId (используется CLI/API Gateway). В вызовах инструментов агента jobId является каноническим; устаревший id принимается для совместимости. Задания могут опционально автоматически удаляться после успешного одноразового выполнения через deleteAfterRun: true.
Расписания
Cron поддерживает три типа расписаний:
- at: одноразовый временной штамп (мс с эпохи). Gateway принимает ISO 8601 и приводит к UTC.
- every: фиксированный интервал (мс).
- cron: 5-полевое выражение cron с опциональным часовым поясом IANA.
Выражения cron используют croner. Если часовой пояс не указан, используется локальный часовой пояс хоста Gateway.
Выполнение в основной и изолированной сессиях
Задания основной сессии (системные события)
Задания основной сессии ставят в очередь системное событие и опционально пробуждают исполнитель сердцебиения. Они должны использовать payload.kind = "systemEvent".
- wakeMode: "next-heartbeat" (по умолчанию): событие ждет следующего запланированного сердцебиения.
- wakeMode: "now": событие запускает немедленное выполнение сердцебиения.
Это лучший вариант, когда вы хотите обычный промпт сердцебиения + контекст основной сессии. См. Heartbeat.
Изолированные задания (выделенные cron-сессии)
Изолированные задания выполняют отдельный ход агента в сессии cron:<jobId>.
Ключевое поведение:
- Промпт с префиксом [cron:<jobId> <имя задания>] для отслеживаемости.
- Каждый запуск начинает новый session id (без переноса предыдущей беседы).
- Сводка публикуется в основной сессии (префикс Cron, настраивается).
- wakeMode: "now" запускает немедленное сердцебиение после публикации сводки.
- Если payload.deliver: true, вывод доставляется в канал; иначе остается внутренним.
Используйте изолированные задания для шумных, частых или "фоновых задач", которые не должны спамить вашу основную историю чата.
Формы полезной нагрузки (что выполняется)
Поддерживаются два типа полезной нагрузки:
- systemEvent: только для основной сессии, маршрутизируется через промпт сердцебиения.
- agentTurn: только для изолированной сессии, выполняет отдельный ход агента.
Общие поля agentTurn:
- message: обязательный текстовый промпт.
- model / thinking: опциональные переопределения (см. ниже).
- timeoutSeconds: опциональное переопределение таймаута.
- deliver: true для отправки вывода в целевой канал.
- channel: last или конкретный канал.
- to: специфичная для канала цель (телефон/чат/id канала).
- bestEffortDeliver: избегать сбоя задания, если доставка не удалась.
Параметры изоляции (только для session=isolated):
- postToMainPrefix (CLI: --post-prefix): префикс для системного события в основной сессии.
- postToMainMode: summary (по умолчанию) или full.
- postToMainMaxChars: максимум символов когда postToMainMode=full (по умолчанию 8000).
Переопределения модели и мышления
Изолированные задания (agentTurn) могут переопределять модель и уровень мышления:
- model: Строка провайдер/модель (например, anthropic/claude-sonnet-4-20250514) или алиас (например, opus)
- thinking: Уровень мышления (off, minimal, low, medium, high, xhigh; только модели GPT-5.2 + Codex)
Примечание: Вы можете установить model и для заданий основной сессии, но это изменяет общую модель основной сессии. Мы рекомендуем переопределения модели только для изолированных заданий, чтобы избежать неожиданных смен контекста.
Приоритет разрешения:
- Переопределение полезной нагрузки задания (наивысший)
- Значения по умолчанию для конкретного хука (например, hooks.gmail.model)
- Конфигурация агента по умолчанию
Доставка (канал + цель)
Изолированные задания могут доставлять вывод в канал. Полезная нагрузка задания может указывать:
- channel: whatsapp / telegram / discord / slack / mattermost (плагин) / signal / imessage / last
- to: специфичная для канала целевая получатель
Если channel или to пропущены, cron может вернуться к "последнему маршруту" основной сессии (последнее место, где агент ответил).
Примечания по доставке:
- Если установлен to, cron автоматически доставляет финальный вывод агента, даже если deliver не указан.
- Используйте deliver: true, когда хотите доставку по последнему маршруту без явного to.
- Используйте deliver: false, чтобы сохранить вывод внутренним, даже если присутствует to.
Напоминания о формате цели:
- Цели Slack/Discord/Mattermost (плагин) должны использовать явные префиксы (например, channel:<id>, user:<id>), чтобы избежать неоднозначности.
- Темы Telegram должны использовать форму :topic: (см. ниже).
Цели доставки Telegram (темы / форумные потоки)
Telegram поддерживает темы форума через message_thread_id. Для доставки cron вы можете закодировать тему/поток в поле to:
- -1001234567890 (только id чата)
- -1001234567890:topic:123 (предпочтительно: явный маркер темы)
- -1001234567890:123 (краткая форма: числовой суффикс)
Префиксные цели типа telegram:... / telegram:group:... также принимаются:
- telegram:group:-1001234567890:topic:123
Хранилище и история
- Хранилище заданий: ~/.openclaw/cron/jobs.json (JSON, управляемый Gateway).
- История выполнений: ~/.openclaw/cron/runs/<jobId>.jsonl (JSONL, автоматическая очистка).
- Переопределить путь хранилища: cron.store в конфигурации.
Конфигурация
{
cron: {
enabled: true, // по умолчанию true
store: "~/.openclaw/cron/jobs.json",
maxConcurrentRuns: 1 // по умолчанию 1
}
}
Полностью отключить cron:
- cron.enabled: false (конфигурация)
- OPENCLAW_SKIP_CRON=1 (переменная окружения)
Быстрый старт CLI
Одноразовое напоминание (UTC ISO, автоудаление после успеха):
openclaw cron add \
--name "Send reminder" \
--at "2026-01-12T18:00:00Z" \
--session main \
--system-event "Reminder: submit expense report." \
--wake now \
--delete-after-run
Одноразовое напоминание (основная сессия, пробудить немедленно):
openclaw cron add \
--name "Calendar check" \
--at "20m" \
--session main \
--system-event "Next heartbeat: check calendar." \
--wake now
Повторяющееся изолированное задание (доставить в WhatsApp):
openclaw cron add \
--name "Morning status" \
--cron "0 7 * * *" \
--tz "America/Los_Angeles" \
--session isolated \
--message "Summarize inbox + calendar for today." \
--deliver \
--channel whatsapp \
--to "+15551234567"
Повторяющееся изолированное задание (доставить в тему Telegram):
openclaw cron add \
--name "Nightly summary (topic)" \
--cron "0 22 * * *" \
--tz "America/Los_Angeles" \
--session isolated \
--message "Summarize today; send to the nightly topic." \
--deliver \
--channel telegram \
--to "-1001234567890:topic:123"
Изолированное задание с переопределением модели и мышления:
openclaw cron add \
--name "Deep analysis" \
--cron "0 6 * * 1" \
--tz "America/Los_Angeles" \
--session isolated \
--message "Weekly deep analysis of project progress." \
--model "opus" \
--thinking high \
--deliver \
--channel whatsapp \
--to "+15551234567"
Выбор агента (настройки с несколькими агентами):
```bash
# Привязать задание к агенту "ops" (вернуться к умолчанию, если этот агент отсутствует)
openclaw cron add --name "Ops sweep" --cron "0 6 * * *" --session isolated --message "Check ops queue" --agent ops
# Переключить или очистить агента для существующего задания
openclaw cron edit <jobId> --agent ops
openclaw cron edit <jobId> --clear-agent
Ручной запуск (отладка):
```bash
openclaw cron run <jobId> --force
Редактировать существующее задание (изменить поля):
openclaw cron edit <jobId> \
--message "Updated prompt" \
--model "opus" \
--thinking low
История выполнений:
openclaw cron runs --id <jobId> --limit 50
Немедленное системное событие без создания задания:
openclaw system event --mode now --text "Next heartbeat: check battery."
Поверхность Gateway API
- cron.list, cron.status, cron.add, cron.update, cron.remove
- cron.run (принудительно или по расписанию), cron.runs Для немедленных системных событий без задания используйте openclaw system event.
Устранение неполадок
"Ничего не запускается"
- Проверьте, что cron включен: cron.enabled и OPENCLAW_SKIP_CRON.
- Проверьте, что Gateway работает непрерывно (cron выполняется внутри процесса Gateway).
- Для расписаний cron: подтвердите часовой пояс (--tz) против часового пояса хоста.
Telegram доставляет не туда
- Для тем форума используйте -100…:topic:<id>, чтобы это было явно и однозначно.
- Если вы видите префиксы telegram:... в логах или сохраненных целях "последнего маршрута", это нормально; доставка cron принимает их и все равно корректно парсит ID тем.