Перейти к основному содержанию
Cron — встроенный планировщик Gateway. Он сохраняет задания, пробуждает агента в нужное время и может доставлять вывод обратно в канал чата или конечную точку Webhook.

Быстрый старт

1

Add a one-shot reminder

openclaw cron create "2026-02-01T16:00:00Z" \
  --name "Reminder" \
  --session main \
  --system-event "Reminder: check the cron docs draft" \
  --wake now \
  --delete-after-run
2

Check your jobs

openclaw cron list
openclaw cron get <job-id>
openclaw cron show <job-id>
3

See run history

openclaw cron runs --id <job-id>

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

  • Cron выполняется внутри процесса Gateway (а не внутри модели).
  • Определения заданий, состояние выполнения и история запусков сохраняются в общей базе данных состояния SQLite OpenClaw, поэтому перезапуски не теряют расписания.
  • При обновлении выполните openclaw doctor --fix, чтобы импортировать устаревшие файлы ~/.openclaw/cron/jobs.json, jobs-state.json и runs/*.jsonl в SQLite и переименовать их с суффиксом .migrated. Некорректные строки заданий пропускаются во время выполнения и копируются в jobs-quarantine.json для последующего исправления или проверки.
  • cron.store по-прежнему задает логический ключ хранилища cron и путь импорта doctor. После импорта редактирование этого JSON-файла больше не изменяет активные задания cron; вместо этого используйте openclaw cron add|edit|remove или методы RPC cron в Gateway.
  • Все выполнения cron создают записи фоновых задач.
  • При запуске Gateway просроченные изолированные задания агентского хода перепланируются за пределы окна подключения канала, а не воспроизводятся немедленно, поэтому запуск Discord/Telegram и настройка встроенных команд остаются отзывчивыми после перезапусков.
  • Одноразовые задания (--at) по умолчанию автоматически удаляются после успешного выполнения.
  • Изолированные запуски cron по возможности закрывают отслеживаемые вкладки браузера и процессы для своего сеанса cron:<jobId> после завершения запуска, чтобы отсоединенная браузерная автоматизация не оставляла осиротевшие процессы.
  • Изолированные запуски cron, получившие узкое разрешение на самоочистку cron, по-прежнему могут читать состояние планировщика, отфильтрованный по себе список текущего задания и историю запусков этого задания, поэтому проверки состояния и Heartbeat могут просматривать собственное расписание без получения более широкого доступа на изменение cron.
  • Изолированные запуски cron также защищаются от устаревших подтверждающих ответов. Если первый результат — это лишь промежуточное обновление состояния (on it, pulling everything together и похожие подсказки), а ни один дочерний запуск субагента больше не отвечает за финальный ответ, OpenClaw один раз повторно запрашивает фактический результат перед доставкой.
  • Изолированные запуски cron используют структурированные метаданные отказа выполнения из встроенного запуска, включая обертки node-host UNAVAILABLE, у которых вложенное сообщение об ошибке начинается с SYSTEM_RUN_DENIED или INVALID_REQUEST, поэтому заблокированная команда не считается успешным запуском, а обычный текст ассистента не трактуется как отказ.
  • Изолированные запуски cron также считают ошибки агента на уровне запуска ошибками задания, даже если полезная нагрузка ответа не была создана, поэтому сбои модели или провайдера увеличивают счетчики ошибок и запускают уведомления о сбое, а не помечают задание как успешное.
  • Когда изолированное задание агентского хода достигает timeoutSeconds, cron прерывает базовый запуск агента и дает ему короткое окно для очистки. Если запуск не завершается штатно, очистка, принадлежащая Gateway, принудительно очищает владение сеансом этого запуска до того, как cron зафиксирует тайм-аут, поэтому ожидающая работа чата не остается за устаревшим обрабатываемым сеансом.
  • Если изолированный агентский ход зависает до старта исполнителя или до первого вызова модели, cron фиксирует тайм-аут с указанием фазы, например setup timed out before runner start или stalled before first model call (last phase: context-engine). Эти сторожевые проверки покрывают встроенные провайдеры и провайдеры на основе CLI до фактического запуска их внешнего процесса CLI и ограничиваются отдельно от длинных значений timeoutSeconds, чтобы сбои холодного старта, аутентификации или контекста проявлялись быстро, а не ждали полного бюджета задания.
  • Если вы используете системный cron или другой внешний планировщик для запуска openclaw agent, оберните его жесткой эскалацией завершения, даже если CLI обрабатывает SIGTERM/SIGINT. Запуски через Gateway просят Gateway прервать принятые запуски; локальные и встроенные резервные запуски получают тот же сигнал прерывания. Для GNU timeout предпочитайте timeout -k 60 600 openclaw agent ... вместо простого timeout 600 ...; значение -k — это страховка супервизора на случай, если процесс не сможет завершиться штатно. Для systemd-юнитов сохраняйте ту же форму: используйте стоп-сигнал SIGTERM плюс окно ожидания, например TimeoutStopSec, перед любым окончательным завершением. Если повторная попытка повторно использует --run-id, пока исходный запуск Gateway еще активен, дубликат считается находящимся в выполнении, а не запускает второй запуск.
Согласование задач для cron сначала принадлежит среде выполнения, а во вторую очередь опирается на долговечную историю: активная задача cron остается живой, пока среда выполнения cron все еще отслеживает это задание как выполняющееся, даже если старая строка дочернего сеанса все еще существует. Когда среда выполнения перестает владеть заданием и истекает 5-минутное льготное окно, обслуживание проверяет сохраненные журналы запусков и состояние задания для соответствующего запуска cron:<jobId>:<startedAt>. Если эта долговечная история показывает терминальный результат, реестр задач финализируется на ее основе; в противном случае обслуживание, принадлежащее Gateway, может пометить задачу как lost. Офлайн-аудит CLI может восстановиться из долговечной истории, но не считает собственный пустой набор активных заданий в процессе доказательством того, что запуск cron, принадлежащий Gateway, исчез.

Типы расписаний

ВидФлаг CLIОписание
at--atОдноразовая временная метка (ISO 8601 или относительная, например 20m)
every--everyФиксированный интервал
cron--cron5-польное или 6-польное выражение cron с необязательным --tz
Временные метки без часового пояса считаются UTC. Добавьте --tz America/New_York для планирования по локальному настенному времени. Повторяющиеся выражения на начало часа автоматически распределяются с разбросом до 5 минут, чтобы снизить пики нагрузки. Используйте --exact, чтобы принудительно задать точное время, или --stagger 30s для явного окна.

День месяца и день недели используют логику OR

Выражения Cron разбираются с помощью croner. Когда поля дня месяца и дня недели оба не являются подстановочными, croner срабатывает, когда совпадает любое из полей, а не оба. Это стандартное поведение Vixie cron.
# Intended: "9 AM on the 15th, only if it's a Monday"
# Actual:   "9 AM on every 15th, AND 9 AM on every Monday"
0 9 15 * 1
Это срабатывает примерно 5–6 раз в месяц вместо 0–1 раза в месяц. Здесь OpenClaw использует стандартное поведение OR в Croner. Чтобы требовать оба условия, используйте модификатор дня недели + в Croner (0 9 15 * +1) или планируйте по одному полю, а другое проверяйте в подсказке или команде задания.

Стили выполнения

СтильЗначение --sessionГде выполняетсяЛучше всего для
Основной сеансmainВыделенная линия пробуждения cronНапоминания, системные события
ИзолированныйisolatedВыделенный cron:<jobId>Отчеты, фоновые работы
Текущий сеансcurrentПривязан во время созданияПовторяющаяся работа с учетом контекста
Пользовательский сеансsession:custom-idПостоянный именованный сеансРабочие процессы, которые опираются на историю
Задания основного сеанса ставят системное событие в очередь принадлежащей cron линии запуска и при необходимости пробуждают Heartbeat (--wake now или --wake next-heartbeat). Они могут использовать последний контекст доставки целевого основного сеанса для ответов, но не добавляют обычные ходы cron в линию человеческого чата и не продлевают свежесть ежедневного или idle-сброса для целевого сеанса. Изолированные задания выполняют выделенный агентский ход со свежим сеансом. Пользовательские сеансы (session:xxx) сохраняют контекст между запусками, включая рабочие процессы вроде ежедневных стендапов, которые строятся на предыдущих сводках.События cron основного сеанса — это самодостаточные напоминания системных событий. Они не включают автоматически инструкцию “Read HEARTBEAT.md” из стандартной подсказки Heartbeat. Если повторяющееся напоминание должно обращаться к HEARTBEAT.md, явно укажите это в тексте события cron или в собственных инструкциях агента.
Для изолированных заданий «свежий сеанс» означает новый идентификатор транскрипта или сеанса для каждого запуска. OpenClaw может переносить безопасные предпочтения, такие как настройки thinking/fast/verbose, метки и явно выбранные пользователем переопределения модели или аутентификации, но не наследует окружающий контекст разговора из более старой строки cron: маршрутизацию канала или группы, политику отправки или очереди, повышение прав, источник или привязку среды выполнения ACP. Используйте current или session:<id>, когда повторяющееся задание должно намеренно строиться на том же контексте разговора.
Для изолированных заданий завершение среды выполнения теперь включает по возможности очистку браузера для этого сеанса cron. Сбои очистки игнорируются, чтобы фактический результат cron по-прежнему имел приоритет.Изолированные запуски cron также освобождают любые встроенные экземпляры среды выполнения MCP, созданные для задания, через общий путь очистки среды выполнения. Это соответствует тому, как завершаются MCP-клиенты основного сеанса и пользовательского сеанса, поэтому изолированные задания cron не оставляют между запусками дочерние процессы stdio или долгоживущие подключения MCP.
Когда изолированные запуски cron оркестрируют субагентов, доставка также предпочитает финальный вывод потомка устаревшему промежуточному тексту родителя. Если потомки все еще выполняются, OpenClaw подавляет это частичное родительское обновление вместо его объявления.Для текстовых целей объявлений Discord OpenClaw отправляет канонический финальный текст ассистента один раз вместо повторного воспроизведения как потоковых или промежуточных текстовых полезных нагрузок, так и финального ответа. Медиа и структурированные полезные нагрузки Discord по-прежнему доставляются отдельными полезными нагрузками, чтобы вложения и компоненты не отбрасывались.

Полезные нагрузки команд

Используйте полезные нагрузки команд для детерминированных скриптов, которые должны выполняться внутри планировщика Gateway без запуска агентского хода изолированного агента с моделью. Задания команд выполняются на хосте Gateway, захватывают stdout/stderr, записывают запуск в историю cron и повторно используют те же режимы доставки announce, webhook и none, что и изолированные задания.
Командный cron — это поверхность операторско-административной автоматизации Gateway, а не вызов агента tools.exec. Создание, обновление, удаление или ручной запуск заданий cron требует operator.admin; запланированные командные запуски позже выполняются внутри процесса Gateway как эта автоматизация, созданная администратором. Политика agent exec, такая как tools.exec.mode, запросы подтверждения и списки разрешенных инструментов для каждого агента, регулирует видимые модели exec-инструменты, а не полезные нагрузки командного cron.
openclaw cron create "*/15 * * * *" \
  --name "Queue depth probe" \
  --command "scripts/check-queue.sh" \
  --command-cwd "/srv/app" \
  --announce \
  --channel telegram \
  --to "-1001234567890"
--command <shell> сохраняет argv: ["sh", "-lc", <shell>]. Используйте --command-argv '["node","scripts/report.mjs"]', когда вам нужно точное выполнение argv без разбора оболочкой. Необязательные поля --command-env KEY=VALUE, --command-input, --timeout-seconds, --no-output-timeout-seconds и --output-max-bytes управляют окружением процесса, stdin и ограничениями вывода. Если stdout не пуст, этот текст является доставленным результатом. Если stdout пуст, а stderr не пуст, доставляется stderr. Если присутствуют оба потока, cron доставляет небольшой блок stdout: / stderr:. Нулевой код выхода записывает запуск как ok; ненулевой выход, сигнал, тайм-аут или тайм-аут без вывода записывает error и может вызвать оповещения о сбое. Команда, которая выводит только NO_REPLY, использует обычное подавление silent-token в cron и ничего не отправляет обратно в чат.

Параметры полезной нагрузки для изолированных задач

--message
string
обязательно
Текст запроса (обязателен для изолированного режима).
--model
string
Переопределение модели; использует выбранную разрешенную модель для задачи.
--fallbacks
string
Список резервных моделей для отдельной задачи, например --fallbacks openrouter/gpt-4.1-mini,openai/gpt-5. Передайте --fallbacks "" для строгого запуска без резервных вариантов.
--clear-fallbacks
boolean
В cron edit удаляет переопределение резервных вариантов для отдельной задачи, чтобы задача следовала настроенному приоритету резервных вариантов. Нельзя сочетать с --fallbacks.
--clear-model
boolean
В cron edit удаляет переопределение модели для отдельной задачи, чтобы задача следовала обычному приоритету выбора модели cron (сохраненное переопределение cron-сессии, если задано, иначе модель агента/по умолчанию). Нельзя сочетать с --model.
--thinking
string
Переопределение уровня мышления.
--light-context
boolean
Пропустить внедрение файлов начальной загрузки рабочей области.
--tools
string
Ограничить инструменты, которые может использовать задача, например --tools exec,read.
--model использует выбранную разрешенную модель как основную модель этой задачи. Это не то же самое, что переопределение /model в чат-сессии: настроенные цепочки резервных вариантов по-прежнему применяются, когда основная модель задачи дает сбой. Если запрошенная модель не разрешена или не может быть разрешена, cron завершает запуск явной ошибкой валидации, а не молча откатывается к выбору модели агента/по умолчанию для задачи. Задачи cron также могут содержать fallbacks на уровне полезной нагрузки. Если они присутствуют, этот список заменяет настроенную цепочку резервных вариантов для задачи. Используйте fallbacks: [] в полезной нагрузке/API задачи, когда нужен строгий запуск cron, который пробует только выбранную модель. Если у задачи есть --model, но нет ни резервных вариантов в полезной нагрузке, ни настроенных резервных вариантов, OpenClaw передает явное пустое переопределение резервных вариантов, чтобы основная модель агента не добавлялась как скрытая дополнительная цель повтора. Предварительные проверки локального провайдера обходят настроенные резервные варианты перед тем, как пометить запуск cron как skipped; fallbacks: [] сохраняет этот путь предварительной проверки строгим. Приоритет выбора модели для изолированных задач:
  1. Переопределение модели Gmail hook (когда запуск пришел из Gmail и это переопределение разрешено)
  2. model в полезной нагрузке отдельной задачи
  3. Сохраненное выбранное пользователем переопределение модели cron-сессии
  4. Выбор модели агента/по умолчанию
Быстрый режим также следует разрешенному текущему выбору. Если в конфигурации выбранной модели есть params.fastMode, изолированный cron использует его по умолчанию. Сохраненное переопределение fastMode в сессии по-прежнему имеет приоритет над конфигурацией в любом направлении. Автоматический режим использует порог params.fastAutoOnSeconds выбранной модели, если он присутствует, по умолчанию 60 секунд. Если изолированный запуск попадает на передачу live-переключения модели, cron повторяет запуск с переключенным провайдером/моделью и сохраняет этот live-выбор для активного запуска перед повтором. Когда переключение также несет новый профиль аутентификации, cron также сохраняет переопределение этого профиля аутентификации для активного запуска. Повторы ограничены: после начальной попытки и 2 повторов переключения cron прерывается, а не зацикливается навсегда. Перед тем как изолированный запуск cron войдет в runner агента, OpenClaw проверяет доступные локальные endpoint-адреса провайдера для настроенных провайдеров api: "ollama" и api: "openai-completions", у которых baseUrl является loopback, частной сетью или .local. Если этот endpoint недоступен, запуск записывается как skipped с понятной ошибкой провайдера/модели вместо запуска вызова модели. Результат endpoint кэшируется на 5 минут, поэтому множество наступивших задач, использующих один и тот же недоступный локальный сервер Ollama, vLLM, SGLang или LM Studio, совместно используют одну небольшую проверку вместо создания шквала запросов. Пропущенные запуски предварительной проверки провайдера не увеличивают backoff ошибок выполнения; включите failureAlert.includeSkipped, если нужны повторяющиеся уведомления о пропуске.

Доставка и вывод

РежимЧто происходит
announceДоставляет итоговый текст цели через резервную доставку, если агент не отправил его
webhookОтправляет полезную нагрузку события завершения на URL методом POST
noneНет резервной доставки runner
Используйте --announce --channel telegram --to "-1001234567890" для доставки в канал. Для тем форума Telegram используйте -1001234567890:topic:123; OpenClaw также принимает принадлежащую Telegram сокращенную форму -1001234567890:123. Прямые вызывающие стороны RPC/config могут передавать delivery.threadId как строку или число. Цели Slack/Discord/Mattermost должны использовать явные префиксы (channel:<id>, user:<id>). Идентификаторы комнат Matrix чувствительны к регистру; используйте точный идентификатор комнаты или форму room:!room:server из Matrix. Когда доставка announce использует channel: "last" или пропускает channel, цель с префиксом провайдера, например telegram:123, может выбрать канал до того, как cron откатится к истории сессии или одному настроенному каналу. Селекторами провайдера являются только префиксы, объявленные загруженным Plugin. Если delivery.channel задан явно, префикс цели должен называть того же провайдера; например, channel: "whatsapp" с to: "telegram:123" отклоняется, вместо того чтобы позволить WhatsApp интерпретировать идентификатор Telegram как номер телефона. Префиксы типа цели и сервиса, такие как channel:<id>, user:<id>, imessage:<handle> и sms:<number>, остаются синтаксисом цели, принадлежащим каналу, а не селекторами провайдера. Для изолированных задач доставка в чат является общей. Если доступен маршрут чата, агент может использовать инструмент message, даже когда задача использует --no-deliver. Если агент отправляет сообщение в настроенную/текущую цель, OpenClaw пропускает резервный announce. В противном случае announce, webhook и none управляют только тем, что runner делает с финальным ответом после хода агента. Когда агент создает изолированное напоминание из активного чата, OpenClaw сохраняет сохраненную live-цель доставки для резервного маршрута announce. Внутренние ключи сессии могут быть в нижнем регистре; цели доставки провайдера не реконструируются из этих ключей, когда доступен текущий контекст чата. Неявная доставка announce использует настроенные allowlist каналов для проверки и перенаправления устаревших целей. Подтверждения из хранилища пар DM не являются получателями резервной автоматизации; задайте delivery.to или настройте запись allowFrom канала, когда запланированная задача должна проактивно отправлять в DM.

Язык вывода

Задачи cron не выводят язык ответа из канала, локали или предыдущих сообщений. Поместите правило языка в запланированное сообщение или шаблон:
openclaw cron edit <jobId> \
  --message "Summarize the updates. Respond in Chinese; keep URLs, code, and product names unchanged."
Для файлов шаблонов держите языковую инструкцию в отрендеренном запросе и проверяйте, что placeholders, такие как {{language}}, заполнены до запуска задачи. Если вывод смешивает языки, сделайте правило явным, например: “Use Chinese for narrative text and keep technical terms in English.” Уведомления о сбоях следуют отдельному пути назначения:
  • cron.failureDestination задает глобальное значение по умолчанию для уведомлений о сбоях.
  • job.delivery.failureDestination переопределяет его для отдельной задачи.
  • Если ни одно из них не задано и задача уже доставляет через announce, уведомления о сбоях теперь откатываются к этой основной цели announce.
  • delivery.failureDestination поддерживается только для задач sessionTarget="isolated", если основной режим доставки не webhook.
  • failureAlert.includeSkipped: true включает для задачи или глобальной политики оповещений cron повторяющиеся оповещения о пропущенных запусках. Пропущенные запуски ведут отдельный счетчик последовательных пропусков, поэтому они не влияют на backoff ошибок выполнения.

Примеры CLI

openclaw cron add \
  --name "Calendar check" \
  --at "20m" \
  --session main \
  --system-event "Next heartbeat: check calendar." \
  --wake now

Webhooks

Gateway может предоставлять HTTP endpoint-адреса webhook для внешних триггеров. Включите в конфигурации:
{
  hooks: {
    enabled: true,
    token: "shared-secret",
    path: "/hooks",
  },
}

Аутентификация

Каждый запрос должен включать токен hook через заголовок:
  • Authorization: Bearer <token> (рекомендуется)
  • x-openclaw-token: <token>
Токены в query-string отклоняются.
Поместить системное событие в очередь для основной сессии:
curl -X POST http://127.0.0.1:18789/hooks/wake \
  -H 'Authorization: Bearer SECRET' \
  -H 'Content-Type: application/json' \
  -d '{"text":"New email received","mode":"now"}'
text
string
обязательно
Описание события.
mode
string
по умолчанию:"now"
now или next-heartbeat.
Запустить ход изолированного агента:
curl -X POST http://127.0.0.1:18789/hooks/agent \
  -H 'Authorization: Bearer SECRET' \
  -H 'Content-Type: application/json' \
  -d '{"message":"Summarize inbox","name":"Email","model":"openai/gpt-5.4"}'
Поля: message (обязательно), name, agentId, wakeMode, deliver, channel, to, model, fallbacks, thinking, timeoutSeconds.
Пользовательские имена hook разрешаются через hooks.mappings в конфигурации. Сопоставления могут преобразовывать произвольные полезные нагрузки в действия wake или agent с помощью шаблонов или преобразований кода.
Держите endpoint-адреса hook за loopback, tailnet или доверенным обратным прокси.
  • Используйте выделенный токен hook; не переиспользуйте токены аутентификации gateway.
  • Держите hooks.path на выделенном подпути; / отклоняется.
  • Задайте hooks.allowedAgentIds, чтобы ограничить, на какого эффективного агента может быть нацелен hook, включая агента по умолчанию, когда agentId опущен.
  • Оставляйте hooks.allowRequestSessionKey=false, если вам не нужны сессии, выбираемые вызывающей стороной.
  • Если вы включаете hooks.allowRequestSessionKey, также задайте hooks.allowedSessionKeyPrefixes, чтобы ограничить допустимые формы ключей сессии.
  • Полезные нагрузки hook по умолчанию оборачиваются границами безопасности.

Интеграция Gmail PubSub

Подключите триггеры входящих Gmail к OpenClaw через Google PubSub.
Предварительные требования: CLI gcloud, gog (gogcli), включенные хуки OpenClaw, Tailscale для публичной конечной точки HTTPS.

Настройка мастером (рекомендуется)

openclaw webhooks gmail setup --account openclaw@gmail.com
Это записывает конфигурацию hooks.gmail, включает пресет Gmail и использует Tailscale Funnel для конечной точки push.

Автозапуск Gateway

Когда задано hooks.enabled=true и hooks.gmail.account, Gateway запускает gog gmail watch serve при загрузке и автоматически продлевает watch. Задайте OPENCLAW_SKIP_GMAIL_WATCHER=1, чтобы отказаться.

Разовая ручная настройка

1

Выберите проект GCP

Выберите проект GCP, которому принадлежит OAuth-клиент, используемый gog:
gcloud auth login
gcloud config set project <project-id>
gcloud services enable gmail.googleapis.com pubsub.googleapis.com
2

Создайте topic и предоставьте Gmail доступ к push

gcloud pubsub topics create gog-gmail-watch
gcloud pubsub topics add-iam-policy-binding gog-gmail-watch \
  --member=serviceAccount:gmail-api-push@system.gserviceaccount.com \
  --role=roles/pubsub.publisher
3

Запустите watch

gog gmail watch start \
  --account openclaw@gmail.com \
  --label INBOX \
  --topic projects/<project-id>/topics/gog-gmail-watch

Переопределение модели Gmail

{
  hooks: {
    gmail: {
      model: "openrouter/meta-llama/llama-3.3-70b-instruct:free",
      thinking: "off",
    },
  },
}

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

# Список всех заданий
openclaw cron list

# Получить одно сохраненное задание как JSON
openclaw cron get <jobId>

# Показать одно задание, включая разрешенный маршрут доставки
openclaw cron show <jobId>

# Изменить задание
openclaw cron edit <jobId> --message "Updated prompt" --model "opus"

# Принудительно запустить задание сейчас
openclaw cron run <jobId>

# Принудительно запустить задание сейчас и дождаться его конечного статуса
openclaw cron run <jobId> --wait --wait-timeout 10m --poll-interval 2s

# Запустить только если срок наступил
openclaw cron run <jobId> --due

# Просмотреть историю запусков
openclaw cron runs --id <jobId> --limit 50

# Просмотреть один точный запуск
openclaw cron runs --id <jobId> --run-id <runId>

# Удалить задание
openclaw cron remove <jobId>

# Выбор агента (настройки с несколькими агентами)
openclaw cron create "0 6 * * *" "Check ops queue" --name "Ops sweep" --session isolated --agent ops
openclaw cron edit <jobId> --clear-agent
openclaw cron run <jobId> возвращается после постановки ручного запуска в очередь. Используйте --wait для хуков завершения, скриптов обслуживания или другой автоматизации, которая должна блокироваться до окончания запуска из очереди. Режим ожидания опрашивает точно возвращенный runId; он завершается с 0 при статусе ok и с ненулевым кодом при error, skipped или тайм-ауте ожидания. Инструмент агента cron возвращает компактные сводки заданий (id, name, enabled, nextRunAtMs, scheduleKind, lastRunStatus) из cron(action: "list"); используйте cron(action: "get", jobId: "...") для полного определения одного задания. Прямые вызывающие стороны Gateway могут передать compact: true в cron.list; если опустить это поле, сохраняется существующий полный ответ с предварительным просмотром доставки. openclaw cron create — псевдоним для openclaw cron add, а новые задания могут использовать позиционное расписание ("0 9 * * 1", "every 1h", "20m" или временную метку ISO), за которым следует позиционный промпт агента. Используйте --webhook <url> в cron add|create или cron edit, чтобы отправить payload завершенного запуска методом POST на конечную точку HTTP. Доставку Webhook нельзя сочетать с флагами доставки в чат, такими как --announce, --channel, --to, --thread-id или --account. В cron edit флаги --clear-channel, --clear-to, --clear-thread-id и --clear-account по отдельности сбрасывают эти поля маршрутизации (каждый отклоняется вместе с соответствующим флагом установки), что отличается от --no-deliver, который отключает резервную доставку runner.
Примечание о переопределении модели:
  • openclaw cron add|edit --model ... меняет выбранную модель задания.
  • Если модель разрешена, именно этот provider/model попадает в изолированный запуск агента.
  • Если она не разрешена или не может быть разрешена, Cron завершает запуск с явной ошибкой валидации.
  • Патчи payload API cron.update могут задавать model: null, чтобы очистить сохраненное переопределение модели задания.
  • openclaw cron edit <job-id> --clear-model очищает это переопределение из CLI (тот же эффект, что и патч model: null) и не может сочетаться с --model.
  • Настроенные цепочки fallback по-прежнему применяются, потому что --model для Cron — основная модель задания, а не переопределение /model сессии.
  • openclaw cron add|edit --fallbacks ... задает payload fallbacks, заменяя настроенные fallback для этого задания; --fallbacks "" отключает fallback и делает запуск строгим. openclaw cron edit <job-id> --clear-fallbacks очищает переопределение для отдельного задания.
  • Обычный --model без явного или настроенного списка fallback не переходит к основной модели агента как к скрытой дополнительной цели повтора.

Конфигурация

{
  cron: {
    enabled: true,
    store: "~/.openclaw/cron/jobs.json",
    maxConcurrentRuns: 8,
    retry: {
      maxAttempts: 3,
      backoffMs: [60000, 120000, 300000],
      retryOn: ["rate_limit", "overloaded", "network", "server_error"],
    },
    webhookToken: "replace-with-dedicated-webhook-token",
    sessionRetention: "24h",
    runLog: { maxBytes: "2mb", keepLines: 2000 },
  },
}
maxConcurrentRuns ограничивает как плановую отправку Cron, так и выполнение изолированных ходов агента, и по умолчанию равен 8. Изолированные ходы агента Cron внутри используют выделенную очередь выполнения cron-nested, поэтому повышение этого значения позволяет независимым LLM-запускам Cron продвигаться параллельно, а не только запускать их внешние обертки Cron. Общая не-Cron очередь nested этой настройкой не расширяется. cron.store — логический ключ хранилища и устаревший путь импорта doctor. Запустите openclaw doctor --fix, чтобы импортировать существующие JSON-хранилища в SQLite и архивировать их; будущие изменения Cron должны идти через CLI или API Gateway. Отключить Cron: cron.enabled: false или OPENCLAW_SKIP_CRON=1.
Повтор для одноразового запуска: временные ошибки (лимит частоты, перегрузка, сеть, ошибка сервера) повторяются до 3 раз с экспоненциальной задержкой. Постоянные ошибки отключают задание немедленно.Повтор для регулярного запуска: экспоненциальная задержка (от 30 с до 60 мин) между повторами. Задержка сбрасывается после следующего успешного запуска.
cron.sessionRetention (по умолчанию 24h) удаляет устаревшие записи изолированных сессий запуска. cron.runLog.keepLines ограничивает сохраненные строки истории запусков SQLite для каждого задания; maxBytes сохраняется для совместимости конфигурации со старыми файловыми журналами запусков.

Устранение неполадок

Лестница команд

openclaw status
openclaw gateway status
openclaw cron status
openclaw cron list
openclaw cron runs --id <jobId> --limit 20
openclaw system heartbeat last
openclaw logs --follow
openclaw doctor
  • Проверьте cron.enabled и переменную среды OPENCLAW_SKIP_CRON.
  • Убедитесь, что Gateway работает непрерывно.
  • Для расписаний cron проверьте часовой пояс (--tz) относительно часового пояса хоста.
  • reason: not-due в выводе запуска означает, что ручной запуск был проверен командой openclaw cron run <jobId> --due, и срок задания еще не наступил.
  • Режим доставки none означает, что резервная отправка runner не ожидается. Агент все еще может отправить напрямую с помощью инструмента message, когда доступен маршрут чата.
  • Отсутствующая/недействительная цель доставки (channel/to) означает, что исходящая отправка была пропущена.
  • Для Matrix скопированные или устаревшие задания с приведенными к нижнему регистру ID комнаты delivery.to могут завершаться ошибкой, потому что ID комнат Matrix чувствительны к регистру. Измените задание на точное значение !room:server или room:!room:server из Matrix.
  • Ошибки авторизации канала (unauthorized, Forbidden) означают, что доставка была заблокирована учетными данными.
  • Если изолированный запуск возвращает только молчаливый токен (NO_REPLY / no_reply), OpenClaw подавляет прямую исходящую доставку, а также подавляет резервный путь сводки из очереди, поэтому в чат ничего не публикуется.
  • Если агент должен сам написать пользователю, проверьте, что у задания есть пригодный маршрут (channel: "last" с предыдущим чатом или явный канал/цель).
  • Актуальность ежедневного и idle-сброса не основана на updatedAt; см. Управление сессиями.
  • Пробуждения Cron, запуски Heartbeat, уведомления exec и служебные записи gateway могут обновлять строку сессии для маршрутизации/статуса, но они не продлевают sessionStartedAt или lastInteractionAt.
  • Для устаревших строк, созданных до появления этих полей, OpenClaw может восстановить sessionStartedAt из заголовка сессии transcript JSONL, если файл все еще доступен. Устаревшие idle-строки без lastInteractionAt используют это восстановленное время начала как базовую точку idle.
  • Cron без --tz использует часовой пояс хоста gateway.
  • Расписания at без часового пояса считаются UTC.
  • activeHours Heartbeat использует настроенное разрешение часового пояса.

Связанные разделы