Cronjobs (Gateway-scheduler)
Cron vs Heartbeat? Zie Cron vs Heartbeat voor richtlijnen over wanneer je welke gebruikt.Cron is de ingebouwde scheduler van de Gateway. Hij bewaart jobs persistent, wekt de agent op het juiste moment en kan optioneel uitvoer terugsturen naar een chat. Als je “dit elke ochtend uitvoeren” of “de agent over 20 minuten een seintje geven” wilt, dan is cron het juiste mechanisme. Problemen oplossen: /automation/troubleshooting
TL;DR
- Cron draait binnen de Gateway (niet binnen het model).
- Jobs worden persistent opgeslagen onder
~/.openclaw/cron/, zodat herstarts schema’s niet verliezen. - Twee uitvoeringsstijlen:
- Hoofdsessie: een systeemevenement in de wachtrij zetten en uitvoeren bij de volgende heartbeat.
- Geïsoleerd: een speciale agent-turn uitvoeren in
cron:<jobId>, met levering (standaard aankondigen of geen).
- Wake-ups zijn eersteklas: een job kan “nu wekken” aanvragen i.p.v. “volgende heartbeat”.
Snelle start (actiegericht)
Maak een eenmalige herinnering, controleer dat deze bestaat en voer hem direct uit:Tool-call equivalenten (Gateway cron tool)
Voor de canonieke JSON-vormen en voorbeelden, zie JSON-schema voor tool calls.Waar cronjobs worden opgeslagen
Cronjobs worden standaard persistent opgeslagen op de Gateway-host in~/.openclaw/cron/jobs.json.
De Gateway laadt het bestand in het geheugen en schrijft het terug bij wijzigingen, dus handmatige bewerkingen
zijn alleen veilig wanneer de Gateway is gestopt. Geef de voorkeur aan openclaw cron add/edit of de cron
tool-call API voor wijzigingen.
Beginner-vriendelijk overzicht
Denk aan een cronjob als: wanneer uitvoeren + wat doen.-
Kies een schema
- Eenmalige herinnering →
schedule.kind = "at"(CLI:--at) - Terugkerende job →
schedule.kind = "every"ofschedule.kind = "cron" - Als je ISO-tijdstempel geen tijdzone bevat, wordt deze behandeld als UTC.
- Eenmalige herinnering →
-
Kies waar deze draait
sessionTarget: "main"→ uitvoeren tijdens de volgende heartbeat met hoofdcontext.sessionTarget: "isolated"→ een speciale agent-turn uitvoeren incron:<jobId>.
-
Kies de payload
- Hoofdsessie →
payload.kind = "systemEvent" - Geïsoleerde sessie →
payload.kind = "agentTurn"
- Hoofdsessie →
schedule.kind = "at") worden standaard na succes verwijderd. Stel
deleteAfterRun: false in om ze te behouden (ze worden na succes uitgeschakeld).
Concepten
Vacatures
Een cronjob is een opgeslagen record met:- een schema (wanneer deze moet draaien),
- een payload (wat deze moet doen),
- een optionele leveringsmodus (aankondigen of geen).
- een optionele agentbinding (
agentId): voer de job uit onder een specifieke agent; indien ontbrekend of onbekend, valt de Gateway terug op de standaardagent.
jobId (gebruikt door CLI/Gateway-API’s).
In agent tool calls is jobId canoniek; het legacy id wordt geaccepteerd voor compatibiliteit.
Eenmalige jobs worden standaard na succes automatisch verwijderd; stel deleteAfterRun: false in om ze te behouden.
Schema’s
Cron ondersteunt drie soorten schema’s:at: eenmalige tijdstempel viaschedule.at(ISO 8601).every: vaste interval (ms).cron: 5-veld cron-expressie met optionele IANA-tijdzone.
croner. Als een tijdzone ontbreekt, wordt de lokale
tijdzone van de Gateway-host gebruikt.
Hoofd- vs geïsoleerde uitvoering
Hoofdsessie-jobs (systeemevenementen)
Hoofd-jobs plaatsen een systeemevenement in de wachtrij en wekken optioneel de heartbeat-runner. Ze moetenpayload.kind = "systemEvent" gebruiken.
wakeMode: "now"(standaard): het evenement triggert een onmiddellijke heartbeat-run.wakeMode: "next-heartbeat": het evenement wacht op de volgende geplande heartbeat.
Geïsoleerde jobs (speciale cron-sessies)
Geïsoleerde jobs draaien een speciale agent-turn in sessiecron:<jobId>.
Belangrijke gedragingen:
- De prompt krijgt het voorvoegsel
[cron:<jobId> <job name>]voor traceerbaarheid. - Elke run start met een verse sessie-id (geen eerdere gesprekscontext).
- Standaardgedrag: als
deliveryontbreekt, kondigen geïsoleerde jobs een samenvatting aan (delivery.mode = "announce"). delivery.mode(alleen geïsoleerd) bepaalt wat er gebeurt:announce: lever een samenvatting aan het doelkanaal en plaats een korte samenvatting in de hoofdsessie.none: alleen intern (geen levering, geen hoofdsessie-samenvatting).
wakeModebepaalt wanneer de hoofdsessie-samenvatting wordt geplaatst:now: onmiddellijke heartbeat.next-heartbeat: wacht tot de volgende geplande heartbeat.
Payload-vormen (wat wordt uitgevoerd)
Er worden twee soorten payloads ondersteund:systemEvent: alleen hoofdsessie, gerouteerd via de heartbeat-prompt.agentTurn: alleen geïsoleerde sessie, draait een speciale agent-turn.
agentTurn-velden:
message: vereiste tekstprompt.model/thinking: optionele overrides (zie hieronder).timeoutSeconds: optionele timeout-override.
delivery.mode:none|announce.delivery.channel:lastof een specifiek kanaal.delivery.to: kanaalspecifiek doel (telefoon/chat/kanaal-id).delivery.bestEffort: voorkom dat de job faalt als aankondigingslevering mislukt.
delivery.channel/delivery.to
om direct de chat te targeten. Wanneer delivery.mode = "none", wordt er geen samenvatting in de hoofdsessie geplaatst.
Als delivery ontbreekt voor geïsoleerde jobs, gebruikt OpenClaw standaard announce.
Kondig levering stroom aan
Wanneerdelivery.mode = "announce", levert cron direct via de outbound-kanaaladapters.
De hoofdagent wordt niet gestart om het bericht te formuleren of door te sturen.
Gedragsdetails:
- Inhoud: levering gebruikt de outbound-payloads (tekst/media) van de geïsoleerde run met normale chunking en kanaalopmaak.
- Alleen-heartbeat-antwoorden (
HEARTBEAT_OKzonder echte inhoud) worden niet geleverd. - Als de geïsoleerde run al een bericht naar hetzelfde doel heeft gestuurd via de messaging-tool, wordt levering overgeslagen om duplicaten te voorkomen.
- Ontbrekende of ongeldige leveringsdoelen laten de job falen tenzij
delivery.bestEffort = true. - Een korte samenvatting wordt alleen in de hoofdsessie geplaatst wanneer
delivery.mode = "announce". - De hoofdsessie-samenvatting respecteert
wakeMode:nowtriggert een onmiddellijke heartbeat ennext-heartbeatwacht op de volgende geplande heartbeat.
Model- en thinking-overrides
Geïsoleerde jobs (agentTurn) kunnen het model en het thinking-niveau overriden:
model: Provider/model-string (bijv.anthropic/claude-sonnet-4-20250514) of alias (bijv.opus)thinking: Thinking-niveau (off,minimal,low,medium,high,xhigh; alleen GPT-5.2 + Codex-modellen)
model ook instellen voor hoofdsessie-jobs, maar dat wijzigt het gedeelde
hoofdsessiemodel. We raden model-overrides alleen aan voor geïsoleerde jobs om
onverwachte contextverschuivingen te voorkomen.
Resolutieprioriteit:
- Job-payload-override (hoogste)
- Hook-specifieke standaardwaarden (bijv.
hooks.gmail.model) - Agent-config-standaard
Levering (kanaal + doel)
Geïsoleerde jobs kunnen uitvoer leveren aan een kanaal via de top-leveldelivery-config:
delivery.mode:announce(lever een samenvatting) ofnone.delivery.channel:whatsapp/telegram/discord/slack/mattermost(plugin) /signal/imessage/last.delivery.to: kanaalspecifiek ontvangerdoel.
sessionTarget: "isolated").
Als delivery.channel of delivery.to ontbreekt, kan cron terugvallen op de “laatste route”
van de hoofdsessie (de laatste plek waar de agent antwoordde).
Herinneringen voor doelformaten:
- Slack/Discord/Mattermost (plugin)-doelen moeten expliciete voorvoegsels gebruiken (bijv.
channel:<id>,user:<id>) om ambiguïteit te voorkomen. - Telegram-onderwerpen moeten de
:topic:-vorm gebruiken (zie hieronder).
Telegram-leveringsdoelen (topics / forumthreads)
Telegram ondersteunt forumtopics viamessage_thread_id. Voor cron-levering kun je
het topic/thread coderen in het to-veld:
-1001234567890(alleen chat-id)-1001234567890:topic:123(aanbevolen: expliciete topic-marker)-1001234567890:123(verkorte notatie: numerieke suffix)
telegram:... / telegram:group:... worden ook geaccepteerd:
telegram:group:-1001234567890:topic:123
JSON-schema voor tool calls
Gebruik deze vormen wanneer je Gateway-cron.*-tools direct aanroept (agent tool calls of RPC).
CLI-flags accepteren leesbare duurwaarden zoals 20m, maar tool calls moeten een ISO 8601-string
gebruiken voor schedule.at en milliseconden voor schedule.everyMs.
cron.add params
Eenmalige, hoofdsessie-job (systeemevenement):schedule.kind:at(at),every(everyMs), ofcron(expr, optioneeltz).schedule.ataccepteert ISO 8601 (tijdzone optioneel; behandeld als UTC wanneer weggelaten).everyMsis in milliseconden.sessionTargetmoet"main"of"isolated"zijn en moet overeenkomen metpayload.kind.- Optionele velden:
agentId,description,enabled,deleteAfterRun(standaard true voorat),delivery. wakeModeis standaard"now"wanneer weggelaten.
cron.update params
jobIdis canoniek;idwordt geaccepteerd voor compatibiliteit.- Gebruik
agentId: nullin de patch om een agentbinding te wissen.
cron.run en cron.remove params
Opslag & geschiedenis
- Jobopslag:
~/.openclaw/cron/jobs.json(Gateway-beheerde JSON). - Run-geschiedenis:
~/.openclaw/cron/runs/<jobId>.jsonl(JSONL, automatisch opgeschoond). - Overschrijf opslagpad:
cron.storein config.
Configuratie
cron.enabled: false(config)OPENCLAW_SKIP_CRON=1(env)
CLI-snelstart
Eenmalige herinnering (UTC ISO, automatisch verwijderd na succes):--due om alleen te draaien wanneer verschuldigd):
Gateway API-oppervlak
cron.list,cron.status,cron.add,cron.update,cron.removecron.run(force of due),cron.runsVoor onmiddellijke systeemevenementen zonder job, gebruikopenclaw system event.
Problemen oplossen
“Er draait niets”
- Controleer of cron is ingeschakeld:
cron.enabledenOPENCLAW_SKIP_CRON. - Controleer of de Gateway continu draait (cron draait binnen het Gateway-proces).
- Voor
cron-schema’s: bevestig de tijdzone (--tz) versus de hosttijdzone.
Een terugkerende job blijft vertragen na fouten
- OpenClaw past exponentiële retry-backoff toe voor terugkerende jobs na opeenvolgende fouten: 30s, 1m, 5m, 15m, daarna 60m tussen retries.
- Backoff wordt automatisch gereset na de volgende succesvolle run.
- Eenmalige (
at) jobs schakelen uit na een terminale run (ok,errorofskipped) en proberen niet opnieuw.
Telegram levert op de verkeerde plek
- Gebruik voor forumtopics
-100…:topic:<id>, zodat het expliciet en ondubbelzinnig is. - Als je
telegram:...-voorvoegsels ziet in logs of opgeslagen “laatste route”-doelen, is dat normaal; cron-levering accepteert ze en parseert topic-id’s nog steeds correct.