Задания cron (планировщик Gateway)
Cron или Heartbeat? См. Cron vs Heartbeat — рекомендации по выбору подходящего варианта.Cron — это встроенный планировщик Gateway. Он сохраняет задания, пробуждает агента в нужный момент и при необходимости доставляет вывод обратно в чат. Если вам нужно «выполнять это каждое утро» или «потревожить агента через 20 минут», используйте cron. Устранение неполадок: /automation/troubleshooting
TL;DR
- Cron работает внутри Gateway (а не внутри модели).
- Задания сохраняются в
~/.openclaw/cron/, поэтому перезапуски не приводят к потере расписаний. - Два стиля выполнения:
- Основной сеанс: поставить системное событие в очередь и выполнить на следующем heartbeat.
- Изолированный: выполнить отдельный ход агента в
cron:<jobId>с доставкой (по умолчанию — announce или без доставки).
- Пробуждения — первоклассная возможность: задание может запросить «разбудить сейчас» вместо «на следующем heartbeat».
Быстрый старт (практически применимо)
Создайте одноразовое напоминание, проверьте, что оно существует, и запустите его немедленно:Эквиваленты вызовов инструментов (инструмент cron Gateway)
Канонические JSON-формы и примеры см. в разделе JSON schema for tool calls.Где хранятся задания cron
Задания cron по умолчанию сохраняются на хосте шлюза Gateway по пути~/.openclaw/cron/jobs.json.
Gateway загружает файл в память и перезаписывает его при изменениях, поэтому ручное редактирование
безопасно только при остановленном Gateway. Для изменений предпочтительно использовать openclaw cron add/edit
или API вызовов инструмента cron.
Обзор для начинающих
Рассматривайте задание cron как: когда запускать + что выполнять.-
Выберите расписание
- Одноразовое напоминание →
schedule.kind = "at"(CLI:--at) - Повторяющееся задание →
schedule.kind = "every"илиschedule.kind = "cron" - Если в ISO-времени не указана временная зона, оно трактуется как UTC.
- Одноразовое напоминание →
-
Выберите, где выполняется
sessionTarget: "main"→ выполнение во время следующего heartbeat с основным контекстом.sessionTarget: "isolated"→ отдельный ход агента вcron:<jobId>.
-
Выберите полезную нагрузку
- Основной сеанс →
payload.kind = "systemEvent" - Изолированный сеанс →
payload.kind = "agentTurn"
- Основной сеанс →
schedule.kind = "at") по умолчанию удаляются после успешного выполнения. Установите deleteAfterRun: false, чтобы сохранить их (после успеха они будут отключены).
Concepts
Задания
Задание cron — это сохранённая запись, содержащая:- расписание (когда запускать),
- полезную нагрузку (что выполнять),
- необязательный режим доставки (announce или none),
- необязательную привязку к агенту (
agentId): запуск задания под конкретным агентом; если отсутствует или неизвестна, Gateway использует агент по умолчанию.
jobId (используется CLI и API Gateway).
В вызовах инструментов агента каноническим является jobId; устаревший id
принимается для совместимости.
Одноразовые задания по умолчанию автоматически удаляются после успеха;
установите deleteAfterRun: false, чтобы сохранить их.
Расписания
Cron поддерживает три типа расписаний:at: одноразовая отметка времени черезschedule.at(ISO 8601).every: фиксированный интервал (мс).cron: cron-выражение из 5 полей с необязательной IANA-временной зоной.
croner. Если временная зона не указана, используется
локальная временная зона хоста Gateway.
Основное и изолированное выполнение
Задания основного сеанса (системные события)
Основные задания ставят системное событие в очередь и при необходимости пробуждают runner heartbeat. Они должны использоватьpayload.kind = "systemEvent".
wakeMode: "now"(по умолчанию): событие запускает немедленный heartbeat.wakeMode: "next-heartbeat": событие ждёт следующего запланированного heartbeat.
Изолированные задания (выделенные сеансы cron)
Изолированные задания выполняют отдельный ход агента в сеансеcron:<jobId>.
Ключевые особенности:
- Prompt предваряется
[cron:<jobId> <job name>]для трассируемости. - Каждый запуск начинает новый идентификатор сеанса (без переноса предыдущего диалога).
- Поведение по умолчанию: если
deliveryне указан, изолированные задания публикуют краткий отчёт (delivery.mode = "announce"). delivery.mode(только для изолированных) определяет поведение:announce: доставить краткий отчёт в целевой канал и опубликовать короткий отчёт в основном сеансе.none: только внутренняя обработка (без доставки и без отчёта в основном сеансе).
wakeModeуправляет моментом публикации отчёта в основном сеансе:now: немедленный heartbeat.next-heartbeat: ожидание следующего запланированного heartbeat.
Формы полезной нагрузки (что выполняется)
Поддерживаются два типа полезной нагрузки:systemEvent: только для основного сеанса, проходит через prompt heartbeat.agentTurn: только для изолированного сеанса, выполняет отдельный ход агента.
agentTurn:
message: обязательный текстовый prompt.model/thinking: необязательные переопределения (см. ниже).timeoutSeconds: необязательное переопределение тайм-аута.
delivery.mode:none|announce.delivery.channel:lastили конкретный канал.delivery.to: целевой идентификатор канала (телефон/чат/id канала).delivery.bestEffort: не считать задание неуспешным, если доставка announce не удалась.
delivery.channel/delivery.to для прямого таргетинга чата. Когда delivery.mode = "none", отчёт в основной
сеанс не публикуется.
Если delivery не указан для изолированных заданий, OpenClaw по умолчанию использует announce.
Поток доставки announce
Когдаdelivery.mode = "announce", cron доставляет напрямую через адаптеры исходящих каналов.
Основной агент не запускается для формирования или пересылки сообщения.
Детали поведения:
- Содержимое: доставка использует исходящие полезные нагрузки изолированного запуска (текст/медиа) с обычной нарезкой и форматированием канала.
- Ответы только heartbeat (
HEARTBEAT_OKбез реального содержимого) не доставляются. - Если изолированный запуск уже отправил сообщение тому же получателю через инструмент сообщений, доставка пропускается во избежание дубликатов.
- Отсутствующие или некорректные цели доставки приводят к сбою задания, если не указан
delivery.bestEffort = true. - Короткий отчёт публикуется в основном сеансе только когда
delivery.mode = "announce". - Отчёт в основном сеансе учитывает
wakeMode:nowзапускает немедленный heartbeat, аnext-heartbeatожидает следующего запланированного heartbeat.
Переопределения модели и уровня «thinking»
Изолированные задания (agentTurn) могут переопределять модель и уровень thinking:
model: строка провайдера/модели (например,anthropic/claude-sonnet-4-20250514) или алиас (например,opus)thinking: уровень thinking (off,minimal,low,medium,high,xhigh; только модели GPT-5.2 + Codex)
model можно задавать и для заданий основного сеанса, но он изменяет
общую модель основного сеанса. Рекомендуется использовать переопределения модели только
для изолированных заданий, чтобы избежать неожиданных сдвигов контекста.
Приоритет разрешения:
- Переопределение в полезной нагрузке задания (наивысший)
- Значения по умолчанию конкретного хука (например,
hooks.gmail.model) - Значение по умолчанию в конфигурации агента
Доставка (канал + цель)
Изолированные задания могут доставлять вывод в канал через конфигурацию верхнего уровняdelivery:
delivery.mode:announce(доставить краткий отчёт) илиnone.delivery.channel:whatsapp/telegram/discord/slack/mattermost(плагин) /signal/imessage/last.delivery.to: целевой получатель, специфичный для канала.
sessionTarget: "isolated").
Если delivery.channel или delivery.to не указан, cron может использовать «последний маршрут»
основного сеанса (последнее место, куда агент отвечал).
Напоминания по форматам целей:
- Для 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
JSON schema для вызовов инструментов
Используйте эти формы при прямом вызове инструментов Gatewaycron.* (вызовы инструментов агента или RPC).
Флаги CLI принимают человекочитаемые длительности вроде 20m, но вызовы инструментов должны
использовать строку ISO 8601 для schedule.at и миллисекунды для schedule.everyMs.
Параметры cron.add
Одноразовое задание основного сеанса (системное событие):schedule.kind:at(at),every(everyMs) илиcron(expr, необязательныйtz).schedule.atпринимает ISO 8601 (временная зона необязательна; при отсутствии считается UTC).everyMs— миллисекунды.sessionTargetдолжен быть"main"или"isolated"и должен соответствоватьpayload.kind.- Необязательные поля:
agentId,description,enabled,deleteAfterRun(по умолчанию true дляat),delivery. wakeModeпо умолчанию равен"now", если не указан.
Параметры cron.update
jobIdявляется каноническим;idпринимается для совместимости.- Используйте
agentId: nullв патче, чтобы очистить привязку к агенту.
Параметры cron.run и cron.remove
Хранилище и история
- Хранилище заданий:
~/.openclaw/cron/jobs.json(JSON под управлением Gateway). - История запусков:
~/.openclaw/cron/runs/<jobId>.jsonl(JSONL, с автоочисткой). - Переопределение пути хранилища:
cron.storeв конфигурации.
Конфигурация
cron.enabled: false(конфиг)OPENCLAW_SKIP_CRON=1(переменная окружения)
Быстрый старт CLI
Одноразовое напоминание (UTC ISO, автоудаление после успеха):--due, чтобы запускать только при наступлении срока):
Поверхность API Gateway
cron.list,cron.status,cron.add,cron.update,cron.removecron.run(force или due),cron.runsДля немедленных системных событий без задания используйтеopenclaw system event.
Устранение неполадок
«Ничего не запускается»
- Проверьте, что cron включён:
cron.enabledиOPENCLAW_SKIP_CRON. - Убедитесь, что Gateway работает непрерывно (cron работает внутри процесса Gateway).
- Для расписаний
cron: проверьте временную зону (--tz) относительно временной зоны хоста.
Повторяющееся задание продолжает откладываться после ошибок
- OpenClaw применяет экспоненциальную задержку повторных попыток для повторяющихся заданий после последовательных ошибок: 30с, 1м, 5м, 15м, затем 60м между попытками.
- Задержка автоматически сбрасывается после следующего успешного запуска.
- Одноразовые (
at) задания отключаются после терминального запуска (ok,errorилиskipped) и не повторяются.
Telegram доставляет не туда
- Для тем форума используйте
-100…:topic:<id>, чтобы указание было явным и однозначным. - Если в логах или сохранённых целях «последнего маршрута» вы видите префиксы
telegram:..., это нормально; доставка cron принимает их и корректно разбирает идентификаторы тем.