Automation and tasks
Заплановані завдання
Cron — це вбудований планувальник Gateway. Він зберігає завдання, пробуджує агента в потрібний час і може доставляти результат назад у чат-канал або Webhook endpoint.
Швидкий старт
Add a one-shot reminder
openclaw cron add \
--name "Reminder" \
--at "2026-02-01T16:00:00Z" \
--session main \
--system-event "Reminder: check the cron docs draft" \
--wake now \
--delete-after-run
Check your jobs
openclaw cron list
openclaw cron show <job-id>
See run history
openclaw cron runs --id <job-id>
Як працює Cron
- Cron працює всередині процесу Gateway (не всередині моделі).
- Визначення завдань зберігаються в
~/.openclaw/cron/jobs.json, тому перезапуски не втрачають розклади. - Стан виконання під час роботи зберігається поруч у
~/.openclaw/cron/jobs-state.json. Якщо ви відстежуєте визначення cron у git, відстежуйтеjobs.jsonі додайтеjobs-state.jsonдо gitignore. - Після розділення старіші версії OpenClaw можуть читати
jobs.json, але можуть трактувати завдання як нові, оскільки поля виконання тепер містяться вjobs-state.json. - Коли
jobs.jsonредагується під час роботи Gateway або коли його зупинено, OpenClaw порівнює змінені поля розкладу з метаданими очікуваного runtime slot і очищає застарілі значенняnextRunAtMs. Перезаписи лише з форматуванням або зміною порядку ключів зберігають очікуваний slot. - Усі виконання cron створюють записи фонового завдання.
- Під час запуску Gateway прострочені ізольовані завдання agent-turn переплановуються за межі вікна підключення каналу, а не відтворюються негайно, тому запуск Discord/Telegram і налаштування native-command залишаються responsive після перезапусків.
- Одноразові завдання (
--at) за замовчуванням автоматично видаляються після успішного виконання. - Ізольовані запуски cron у режимі best-effort закривають відстежувані вкладки браузера/процеси для їхньої сесії
cron:<jobId>після завершення запуску, щоб від’єднана браузерна автоматизація не залишала осиротілі процеси. - Ізольовані запуски cron, які отримують вузький дозвіл на самоочищення cron, усе ще можуть читати стан планувальника й самофільтрований список свого поточного завдання, тож перевірки status/heartbeat можуть оглядати власний розклад без ширшого доступу до мутацій cron.
- Ізольовані запуски cron також захищаються від застарілих підтверджувальних відповідей. Якщо перший результат — це лише проміжне оновлення стану (
on it,pulling everything togetherі подібні підказки), і жоден descendant subagent run більше не відповідає за фінальну відповідь, OpenClaw один раз повторно запитує фактичний результат перед доставкою. - Ізольовані запуски cron спершу надають перевагу структурованим метаданим відмови у виконанні з вбудованого запуску, а потім повертаються до відомих маркерів фінального summary/output, таких як
SYSTEM_RUN_DENIEDіINVALID_REQUEST, щоб заблокована команда не повідомлялася як успішний запуск. - Ізольовані запуски cron також трактують збої агента на рівні запуску як помилки завдання навіть тоді, коли payload відповіді не створено, тому збої моделі/провайдера збільшують лічильники помилок і запускають сповіщення про збій замість того, щоб позначати завдання як успішне.
- Коли ізольоване завдання agent-turn досягає
timeoutSeconds, cron перериває базовий запуск агента й надає йому коротке вікно для очищення. Якщо запуск не завершується, очищення, що належить Gateway, примусово очищає ownership сесії цього запуску перед тим, як cron запише timeout, тому робота чату в черзі не лишається за застарілою processing session.
Типи розкладів
| Вид | Прапорець CLI | Опис |
|---|---|---|
at |
--at |
Одноразова timestamp (ISO 8601 або relative, як-от 20m) |
every |
--every |
Фіксований інтервал |
cron |
--cron |
5-польовий або 6-польовий cron expression з необов’язковим --tz |
Timestamp без timezone трактуються як UTC. Додайте --tz America/New_York для планування за локальним wall-clock часом.
Повторювані вирази top-of-hour автоматично розподіляються з відхиленням до 5 хвилин, щоб зменшити піки навантаження. Використовуйте --exact, щоб примусово задати точний час, або --stagger 30s для явного вікна.
Day-of-month і day-of-week використовують логіку OR
Cron expressions розбираються за допомогою croner. Коли поля day-of-month і day-of-week обидва не є wildcard, 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. Щоб вимагати обидві умови, використовуйте modifier day-of-week Croner + (0 9 15 * +1) або плануйте за одним полем і перевіряйте інше в prompt чи command вашого завдання.
Стилі виконання
| Стиль | Значення --session |
Де виконується | Найкраще для |
|---|---|---|---|
| Main session | main |
Наступний heartbeat turn | Нагадування, системні події |
| Ізольований | isolated |
Окремий cron:<jobId> |
Звіти, фонові операції |
| Поточна сесія | current |
Прив’язується під час створення | Повторювана робота з урахуванням контексту |
| Користувацька сесія | session:custom-id |
Постійна іменована сесія | Workflows, що будуються на історії |
Main session vs isolated vs custom
Завдання Main session додають системну подію в чергу й, за потреби, пробуджують heartbeat (--wake now або --wake next-heartbeat). Ці системні події не подовжують freshness daily/idle reset для цільової сесії. Ізольовані завдання виконують окремий agent turn зі свіжою сесією. Користувацькі сесії (session:xxx) зберігають контекст між запусками, що дає змогу workflows на кшталт daily standups будуватися на попередніх summary.
What 'fresh session' means for isolated jobs
Для ізольованих завдань "fresh session" означає новий transcript/session id для кожного запуску. OpenClaw може переносити безпечні preferences, як-от налаштування thinking/fast/verbose, labels і явно вибрані користувачем model/auth overrides, але не успадковує ambient conversation context зі старішого cron row: routing каналу/групи, send або queue policy, elevation, origin чи ACP runtime binding. Використовуйте current або session:<id>, коли recurring job має навмисно будуватися на тому самому conversation context.
Runtime cleanup
Для ізольованих завдань runtime teardown тепер включає best-effort очищення браузера для цієї cron-сесії. Помилки очищення ігноруються, щоб фактичний результат cron усе одно мав пріоритет.
Ізольовані запуски cron також dispose будь-які bundled MCP runtime instances, створені для завдання, через спільний шлях runtime-cleanup. Це відповідає тому, як main-session і custom-session MCP clients завершуються, тому ізольовані cron-завдання не залишають stdio child processes або довгоживучі MCP connections між запусками.
Subagent and Discord delivery
Коли ізольовані запуски cron оркеструють subagents, доставка також надає перевагу фінальному descendant output над застарілим проміжним текстом parent. Якщо descendants усе ще running, OpenClaw пригнічує це partial parent update замість того, щоб оголошувати його.
Для текстових Discord announce targets OpenClaw надсилає canonical final assistant text один раз замість повторного відтворення як streamed/intermediate text payloads, так і фінальної відповіді. Media і structured Discord payloads усе ще доставляються як окремі payloads, щоб attachments і components не втрачалися.
Параметри payload для ізольованих завдань
--messagestringrequiredТекст prompt (обов’язковий для isolated).
--modelstringModel override; використовує вибрану allowed model для завдання.
--thinkingstringПеревизначення рівня thinking.
--light-contextbooleanПропустити injection bootstrap-файлу workspace.
--toolsstringОбмежити, які tools може використовувати завдання, наприклад --tools exec,read.
--model використовує вибрану allowed model як primary model цього завдання. Це не те саме, що chat-session override /model: налаштовані fallback chains усе ще застосовуються, коли job primary зазнає збою. Якщо requested model не дозволена або її неможливо resolve, cron завершує запуск з явною validation error замість тихого fallback до agent/default model selection завдання.
Якщо старіші або відредаговані вручну entries jobs.json зберігають payload.model як "default", "null", порожній рядок або JSON null, запустіть openclaw doctor --fix. Doctor видаляє ці invalid persisted override sentinels; runtime не підтримує їх як fallback aliases. Опустіть поле model, щоб використовувати normal agent/default model selection.
Cron-завдання також можуть містити payload-level fallbacks. Якщо вони присутні, цей список замінює configured fallback chain для завдання. Використовуйте fallbacks: [] у payload/API завдання, коли потрібен strict cron run, який пробує лише selected model. Якщо завдання має --model, але не має ні payload fallbacks, ні configured fallbacks, OpenClaw передає явний empty fallback override, щоб agent primary не додавався як hidden extra retry target.
Пріоритет вибору моделі для ізольованих завдань:
- Gmail hook model override (коли запуск надійшов із Gmail і цей override дозволений)
- Per-job payload
model - User-selected stored cron session model override
- Agent/default model selection
Fast mode також слідує за resolved live selection. Якщо selected model config має params.fastMode, isolated cron використовує це за замовчуванням. Stored session override fastMode усе ще має пріоритет над config в обох напрямках.
Якщо isolated run натрапляє на live model-switch handoff, cron повторює спробу з switched provider/model і зберігає цей live selection для active run перед повторною спробою. Коли switch також несе новий auth profile, cron також зберігає цей auth profile override для active run. Повторні спроби обмежені: після initial attempt плюс 2 switch retries cron переривається замість нескінченного циклу.
Перед тим як isolated cron run увійде в agent runner, OpenClaw перевіряє reachable local provider endpoints для налаштованих провайдерів api: "ollama" і api: "openai-completions", у яких baseUrl є loopback, private-network або .local. Якщо цей endpoint не працює, запуск записується як skipped з чіткою provider/model error замість початку model call. Endpoint result кешується на 5 хвилин, тому багато due jobs, що використовують той самий недоступний локальний сервер Ollama, vLLM, SGLang або LM Studio, ділять одну невелику перевірку замість створення request storm. Skipped provider-preflight runs не збільшують execution-error backoff; увімкніть failureAlert.includeSkipped, якщо хочете повторні skip notifications.
Доставка й результат
| Режим | Що відбувається |
|---|---|
announce |
Доставляє фінальний текст цілі резервним способом, якщо агент не надіслав |
webhook |
Надсилає POST із payload завершеної події на URL |
none |
Немає резервної доставки runner |
Використовуйте --announce --channel telegram --to "-1001234567890" для доставки в канал. Для тем форуму Telegram використовуйте -1001234567890:topic:123; прямі RPC/config-виклики також можуть передавати delivery.threadId як рядок або число. Цілі Slack/Discord/Mattermost мають використовувати явні префікси (channel:<id>, user:<id>). ID кімнат Matrix чутливі до регістру; використовуйте точний ID кімнати або форму room:!room:server з Matrix.
Коли доставка оголошення використовує channel: "last" або пропускає channel, ціль із префіксом провайдера, наприклад telegram:123, може вибрати канал до того, як cron повернеться до історії сесії або одного налаштованого каналу. Лише префікси, оголошені завантаженим plugin, є селекторами провайдера. Якщо delivery.channel вказано явно, префікс цілі має називати того самого провайдера; наприклад, channel: "whatsapp" з to: "telegram:123" відхиляється, а не дозволяє WhatsApp інтерпретувати Telegram ID як номер телефону. Префікси типу цілі та сервісу, як-от channel:<id>, user:<id>, imessage:<handle> і sms:<number>, залишаються синтаксисом цілей, що належить каналу, а не селекторами провайдера.
Для ізольованих завдань доставка в чат є спільною. Якщо доступний маршрут чату, агент може використовувати інструмент message, навіть коли завдання використовує --no-deliver. Якщо агент надсилає до налаштованої/поточної цілі, OpenClaw пропускає резервне оголошення. Інакше announce, webhook і none керують лише тим, що runner робить із фінальною відповіддю після ходу агента.
Коли агент створює ізольоване нагадування з активного чату, OpenClaw зберігає збережену живу ціль доставки для маршруту резервного оголошення. Внутрішні ключі сесії можуть бути в нижньому регістрі; цілі доставки провайдера не реконструюються з цих ключів, коли доступний поточний контекст чату.
Неявна доставка оголошення використовує налаштовані allowlist каналів для перевірки й перенаправлення застарілих цілей. Схвалення зі сховища пар DM не є одержувачами резервної автоматизації; установіть delivery.to або налаштуйте запис каналу allowFrom, коли заплановане завдання має проактивно надсилати в DM.
Сповіщення про помилки використовують окремий шлях призначення:
cron.failureDestinationзадає глобальне типове значення для сповіщень про помилки.job.delivery.failureDestinationперевизначає його для окремого завдання.- Якщо жодне не задано і завдання вже доставляє через
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
Повторюване ізольоване завдання
openclaw cron add \
--name "Morning brief" \
--cron "0 7 * * *" \
--tz "America/Los_Angeles" \
--session isolated \
--message "Summarize overnight updates." \
--announce \
--channel slack \
--to "channel:C1234567890"
Перевизначення моделі та thinking
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 \
--announce
Webhook-и
Gateway може відкривати HTTP Webhook endpoint-и для зовнішніх тригерів. Увімкніть у config:
{
hooks: {
enabled: true,
token: "shared-secret",
path: "/hooks",
},
}
Автентифікація
Кожен запит має містити hook token через заголовок:
Authorization: Bearer <token>(рекомендовано)x-openclaw-token: <token>
Токени в query string відхиляються.
POST /hooks/wake
Додає системну подію в чергу для основної сесії:
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"}'
textstringrequiredОпис події.
modestringnow або next-heartbeat.
POST /hooks/agent
Запускає ізольований хід агента:
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.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSLQl9GW0YHRgtCw0LLQu9C10L3RliBob29rcyAoUE9TVCAvaG9va3MvPG5hbWU
)">
Користувацькі назви hook-ів розв’язуються через hooks.mappings у config. Зіставлення можуть перетворювати довільні payload-и на дії wake або agent за допомогою шаблонів чи code transforms.
Інтеграція Gmail PubSub
Під’єднайте тригери вхідних Gmail до OpenClaw через Google PubSub.
Налаштування майстром (рекомендовано)
openclaw webhooks gmail setup --account [email protected]
Це записує config hooks.gmail, вмикає preset Gmail і використовує Tailscale Funnel для push endpoint.
Автозапуск Gateway
Коли hooks.enabled=true і задано hooks.gmail.account, Gateway запускає gog gmail watch serve під час boot і автоматично поновлює watch. Установіть OPENCLAW_SKIP_GMAIL_WATCHER=1, щоб відмовитися.
Ручне одноразове налаштування
Виберіть проєкт GCP
Виберіть проєкт GCP, якому належить OAuth client, що використовується gog:
gcloud auth login
gcloud config set project <project-id>
gcloud services enable gmail.googleapis.com pubsub.googleapis.com
Створіть topic і надайте Gmail доступ для push
gcloud pubsub topics create gog-gmail-watch
gcloud pubsub topics add-iam-policy-binding gog-gmail-watch \
--member=serviceAccount:[email protected] \
--role=roles/pubsub.publisher
Запустіть watch
gog gmail watch start \
--account [email protected] \
--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",
},
},
}
Керування завданнями
# List all jobs
openclaw cron list
# Show one job, including resolved delivery route
openclaw cron show <jobId>
# Edit a job
openclaw cron edit <jobId> --message "Updated prompt" --model "opus"
# Force run a job now
openclaw cron run <jobId>
# Run only if due
openclaw cron run <jobId> --due
# View run history
openclaw cron runs --id <jobId> --limit 50
# Delete a job
openclaw cron remove <jobId>
# Agent selection (multi-agent setups)
openclaw cron add --name "Ops sweep" --cron "0 6 * * *" --session isolated --message "Check ops queue" --agent ops
openclaw cron edit <jobId> --clear-agent
Конфігурація
{
cron: {
enabled: true,
store: "~/.openclaw/cron/jobs.json",
maxConcurrentRuns: 1,
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, так і виконання ізольованого ходу агента. Ізольовані ходи агента cron внутрішньо використовують виділену execution lane черги cron-nested, тому збільшення цього значення дозволяє незалежним cron LLM-запускам просуватися паралельно, а не лише запускати їхні зовнішні cron wrappers. Спільна не-cron lane nested цим параметром не розширюється.
Sidecar runtime state виводиться з cron.store: .json store, як-от ~/clawd/cron/jobs.json, використовує ~/clawd/cron/jobs-state.json, тоді як шлях store без суфікса .json додає -state.json.
Якщо ви вручну редагуєте jobs.json, не додавайте jobs-state.json до source control. OpenClaw використовує цей sidecar для pending slots, active markers, метаданих останнього запуску та schedule identity, яка повідомляє scheduler, коли зовні відредагованому завданню потрібен свіжий nextRunAtMs.
Вимкнути cron: cron.enabled: false або OPENCLAW_SKIP_CRON=1.
Поведінка повторних спроб
Одноразова повторна спроба: transient errors (rate limit, overload, network, server error) повторюються до 3 разів з експоненційним backoff. Permanent errors вимикають одразу.
Повторна спроба для повторюваних завдань: експоненційний backoff (від 30с до 60хв) між повторними спробами. Backoff скидається після наступного успішного запуску.
Обслуговування
cron.sessionRetention (типово 24h) очищає записи ізольованих run-session. cron.runLog.maxBytes / cron.runLog.keepLines автоматично очищають run-log files.
Усунення несправностей
Драбина команд
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 не спрацьовує
- Перевірте
cron.enabledі env varOPENCLAW_SKIP_CRON. - Переконайтеся, що Gateway працює безперервно.
- Для розкладів
cronперевірте timezone (--tz) порівняно з timezone хоста. reason: not-dueу виводі запуску означає, що ручний запуск було перевірено за допомогоюopenclaw cron run <jobId> --due, і строк завдання ще не настав.
Cron спрацював, але доставлення немає
- Режим доставлення
noneозначає, що резервне надсилання runner не очікується. Агент усе ще може надсилати напряму за допомогою інструментаmessage, коли доступний маршрут чату. - Відсутня або недійсна ціль доставлення (
channel/to) означає, що вихідне повідомлення було пропущено. - Для Matrix скопійовані або застарілі завдання з ідентифікаторами кімнат
delivery.toу нижньому регістрі можуть не спрацювати, оскільки ідентифікатори кімнат Matrix чутливі до регістру. Відредагуйте завдання до точного значення!room:serverабоroom:!room:serverз Matrix. - Помилки автентифікації каналу (
unauthorized,Forbidden) означають, що доставлення було заблоковано обліковими даними. - Якщо ізольований запуск повертає лише мовчазний токен (
NO_REPLY/no_reply), OpenClaw пригнічує пряме вихідне доставлення, а також резервний шлях підсумку в черзі, тому нічого не публікується назад у чат. - Якщо агент має сам надіслати повідомлення користувачу, перевірте, що завдання має придатний маршрут (
channel: "last"з попереднім чатом або явний канал/ціль).
Cron або Heartbeat, схоже, перешкоджає переходу /new-style
- Свіжість щоденного та бездіяльного скидання не базується на
updatedAt; див. Керування сеансами. - Пробудження Cron, запуски Heartbeat, сповіщення exec і службові оновлення Gateway можуть оновлювати рядок сеансу для маршрутизації/статусу, але вони не подовжують
sessionStartedAtабоlastInteractionAt. - Для застарілих рядків, створених до появи цих полів, OpenClaw може відновити
sessionStartedAtіз заголовка сеансу transcript JSONL, якщо файл усе ще доступний. Застарілі бездіяльні рядки безlastInteractionAtвикористовують цей відновлений час початку як базову точку бездіяльності.
Підводні камені часових поясів
- Cron без
--tzвикористовує часовий пояс хоста Gateway. - Розклади
atбез часового поясу трактуються як UTC. - Heartbeat
activeHoursвикористовує налаштоване визначення часового поясу.
Пов’язане
- Автоматизація та завдання — усі механізми автоматизації одним поглядом
- Фонові завдання — журнал завдань для виконань Cron
- Heartbeat — періодичні ходи основного сеансу
- Часовий пояс — конфігурація часового поясу