Cron est le planificateur intégré du Gateway. Il conserve les tâches, réveille l’agent au bon moment et peut renvoyer la sortie vers un canal de discussion ou un point de terminaison Webhook.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Démarrage rapide
Fonctionnement de cron
- Cron s’exécute dans le processus Gateway (pas dans le modèle).
- Les définitions de tâches sont conservées dans
~/.openclaw/cron/jobs.json, afin que les redémarrages ne perdent pas les planifications. - L’état d’exécution au runtime est conservé à côté, dans
~/.openclaw/cron/jobs-state.json. Si vous suivez les définitions cron dans git, suivezjobs.jsonet ajoutezjobs-state.jsonau gitignore. - Après la séparation, les anciennes versions d’OpenClaw peuvent lire
jobs.json, mais peuvent considérer les tâches comme nouvelles, car les champs de runtime se trouvent désormais dansjobs-state.json. - Lorsque
jobs.jsonest modifié pendant que le Gateway est en cours d’exécution ou arrêté, OpenClaw compare les champs de planification modifiés avec les métadonnées de créneau de runtime en attente et efface les valeursnextRunAtMsobsolètes. Les réécritures portant uniquement sur la mise en forme ou l’ordre des clés conservent le créneau en attente. - Toutes les exécutions cron créent des enregistrements de tâche en arrière-plan.
- Au démarrage du Gateway, les tâches isolées de tour d’agent en retard sont replanifiées en dehors de la fenêtre de connexion au canal au lieu d’être rejouées immédiatement, afin que le démarrage de Discord/Telegram et la configuration des commandes natives restent réactifs après les redémarrages.
- Les tâches ponctuelles (
--at) sont supprimées automatiquement après réussite par défaut. - Les exécutions cron isolées ferment au mieux les onglets/processus de navigateur suivis pour leur session
cron:<jobId>lorsque l’exécution se termine, afin que l’automatisation de navigateur détachée ne laisse pas de processus orphelins. - Les exécutions cron isolées qui reçoivent l’autorisation limitée d’auto-nettoyage cron peuvent toujours lire l’état du planificateur, une liste auto-filtrée de leur tâche actuelle et l’historique d’exécution de cette tâche, afin que les vérifications d’état/Heartbeat puissent inspecter leur propre planification sans obtenir un accès plus large aux mutations cron.
- Les exécutions cron isolées se protègent aussi contre les réponses d’accusé de réception obsolètes. Si le premier résultat n’est qu’une mise à jour d’état intermédiaire (
on it,pulling everything togetheret indications similaires) et qu’aucune exécution de sous-agent descendante n’est encore responsable de la réponse finale, OpenClaw relance une fois la demande pour obtenir le résultat réel avant la livraison. - Les exécutions cron isolées privilégient les métadonnées structurées de refus d’exécution provenant de l’exécution intégrée, puis se replient sur des marqueurs connus de résumé/sortie final tels que
SYSTEM_RUN_DENIEDetINVALID_REQUEST, afin qu’une commande bloquée ne soit pas signalée comme une exécution réussie. - Les exécutions cron isolées traitent aussi les échecs d’agent au niveau de l’exécution comme des erreurs de tâche même lorsqu’aucune charge utile de réponse n’est produite, afin que les échecs de modèle/fournisseur incrémentent les compteurs d’erreurs et déclenchent des notifications d’échec au lieu de marquer la tâche comme réussie.
- Lorsqu’une tâche isolée de tour d’agent atteint
timeoutSeconds, cron interrompt l’exécution d’agent sous-jacente et lui accorde une courte fenêtre de nettoyage. Si l’exécution ne se vide pas, le nettoyage appartenant au Gateway force l’effacement de la propriété de session de cette exécution avant que cron enregistre le délai d’expiration, afin que le travail de discussion en file d’attente ne reste pas bloqué derrière une session de traitement obsolète. - Si un tour d’agent isolé se bloque avant le démarrage du runner ou avant le premier appel au modèle, cron enregistre un délai d’expiration propre à la phase, comme
setup timed out before runner startoustalled before first model call (last phase: context-engine). Ces watchdogs couvrent les fournisseurs intégrés et les fournisseurs adossés à la CLI avant que leur processus CLI externe ne démarre réellement, et sont plafonnés indépendamment des longues valeurstimeoutSeconds, afin que les échecs de démarrage à froid/d’authentification/de contexte remontent rapidement au lieu d’attendre tout le budget de la tâche.
La réconciliation des tâches pour cron appartient d’abord au runtime, puis s’appuie sur l’historique durable : une tâche cron active reste en vie tant que le runtime cron suit encore cette tâche comme en cours d’exécution, même si une ancienne ligne de session enfant existe encore. Une fois que le runtime cesse de posséder la tâche et que la fenêtre de grâce de 5 minutes expire, la maintenance vérifie les journaux d’exécution persistés et l’état de la tâche pour l’exécution
cron:<jobId>:<startedAt> correspondante. Si cet historique durable montre un résultat terminal, le registre des tâches est finalisé à partir de celui-ci ; sinon, la maintenance appartenant au Gateway peut marquer la tâche comme lost. L’audit CLI hors ligne peut récupérer à partir de l’historique durable, mais il ne considère pas son propre ensemble vide de tâches actives en cours de processus comme une preuve qu’une exécution cron appartenant au Gateway a disparu.Types de planification
| Type | Option CLI | Description |
|---|---|---|
at | --at | Horodatage ponctuel (ISO 8601 ou relatif comme 20m) |
every | --every | Intervalle fixe |
cron | --cron | Expression cron à 5 ou 6 champs avec --tz facultatif |
--tz America/New_York pour une planification à l’heure locale.
Les expressions récurrentes en début d’heure sont automatiquement décalées de jusqu’à 5 minutes afin de réduire les pics de charge. Utilisez --exact pour imposer un horaire précis ou --stagger 30s pour une fenêtre explicite.
Le jour du mois et le jour de la semaine utilisent une logique OR
Les expressions cron sont analysées par croner. Lorsque les champs jour du mois et jour de la semaine ne sont pas des jokers, croner correspond lorsque l’un ou l’autre champ correspond — pas les deux. Il s’agit du comportement standard de Vixie cron.+ de Croner (0 9 15 * +1) ou planifiez sur un champ et vérifiez l’autre dans le prompt ou la commande de votre tâche.
Styles d’exécution
| Style | Valeur de --session | S’exécute dans | Idéal pour |
|---|---|---|---|
| Session principale | main | Prochain tour Heartbeat | Rappels, événements système |
| Isolé | isolated | cron:<jobId> dédié | Rapports, tâches de fond |
| Session actuelle | current | Liée à la création | Travail récurrent sensible au contexte |
| Session personnalisée | session:custom-id | Session nommée persistante | Workflows qui s’appuient sur l’historique |
Session principale vs isolée vs personnalisée
Session principale vs isolée vs personnalisée
Les tâches de session principale mettent en file d’attente un événement système et peuvent réveiller le Heartbeat (
--wake now ou --wake next-heartbeat). Ces événements système n’étendent pas la fraîcheur de réinitialisation quotidienne/inactive pour la session cible. Les tâches isolées exécutent un tour d’agent dédié avec une nouvelle session. Les sessions personnalisées (session:xxx) conservent le contexte entre les exécutions, ce qui permet des workflows comme des standups quotidiens qui s’appuient sur les résumés précédents.Ce que signifie « nouvelle session » pour les tâches isolées
Ce que signifie « nouvelle session » pour les tâches isolées
Pour les tâches isolées, « nouvelle session » signifie un nouvel identifiant de transcript/session pour chaque exécution. OpenClaw peut transporter des préférences sûres comme les paramètres thinking/fast/verbose, les libellés et les substitutions explicites de modèle/auth sélectionnées par l’utilisateur, mais il n’hérite pas du contexte de conversation ambiant d’une ancienne ligne cron : routage de canal/groupe, politique d’envoi ou de file d’attente, élévation, origine ou liaison de runtime ACP. Utilisez
current ou session:<id> lorsqu’une tâche récurrente doit délibérément s’appuyer sur le même contexte de conversation.Nettoyage du runtime
Nettoyage du runtime
Pour les tâches isolées, le démontage du runtime inclut désormais le nettoyage au mieux du navigateur pour cette session cron. Les échecs de nettoyage sont ignorés afin que le résultat cron réel prévale toujours.Les exécutions cron isolées libèrent aussi toutes les instances de runtime MCP groupées créées pour la tâche via le chemin partagé de nettoyage du runtime. Cela correspond à la manière dont les clients MCP de session principale et de session personnalisée sont démontés, afin que les tâches cron isolées ne fuient pas de processus enfants stdio ni de connexions MCP de longue durée entre les exécutions.
Sous-agent et livraison Discord
Sous-agent et livraison Discord
Lorsque des exécutions cron isolées orchestrent des sous-agents, la livraison privilégie aussi la sortie finale descendante plutôt que le texte intermédiaire parent obsolète. Si des descendants sont encore en cours d’exécution, OpenClaw supprime cette mise à jour parent partielle au lieu de l’annoncer.Pour les cibles d’annonce Discord textuelles uniquement, OpenClaw envoie une seule fois le texte final canonique de l’assistant au lieu de rejouer à la fois les charges utiles de texte diffusé/intermédiaire et la réponse finale. Les charges utiles multimédias et structurées Discord sont toujours livrées comme charges utiles séparées, afin que les pièces jointes et les composants ne soient pas abandonnés.
Options de charge utile pour les tâches isolées
Texte du prompt (obligatoire pour isolé).
Substitution de modèle ; utilise le modèle autorisé sélectionné pour la tâche.
Substitution du niveau thinking.
Ignorer l’injection du fichier d’amorçage de l’espace de travail.
Restreindre les outils que la tâche peut utiliser, par exemple
--tools exec,read.--model utilise le modèle autorisé sélectionné comme modèle principal de cette tâche. Ce n’est pas la même chose qu’une substitution /model de session de discussion : les chaînes de repli configurées s’appliquent toujours lorsque le modèle principal de la tâche échoue. Si le modèle demandé n’est pas autorisé ou ne peut pas être résolu, cron fait échouer l’exécution avec une erreur de validation explicite au lieu de se replier silencieusement sur la sélection de modèle de l’agent/par défaut de la tâche.
Les tâches Cron peuvent aussi porter des fallbacks au niveau de la charge utile. Lorsqu’elle est présente, cette liste remplace la chaîne de repli configurée pour la tâche. Utilisez fallbacks: [] dans la charge utile/API de la tâche lorsque vous voulez une exécution cron stricte qui n’essaie que le modèle sélectionné. Si une tâche a --model mais ni replis de charge utile ni replis configurés, OpenClaw transmet une substitution de repli vide explicite afin que le modèle principal de l’agent ne soit pas ajouté comme cible de nouvelle tentative supplémentaire masquée.
La priorité de sélection du modèle pour les tâches isolées est :
- Substitution de modèle du hook Gmail (lorsque l’exécution provient de Gmail et que cette substitution est autorisée)
modelde charge utile par tâche- Substitution de modèle de session cron stockée sélectionnée par l’utilisateur
- Sélection du modèle de l’agent/par défaut
params.fastMode, cron isolé l’utilise par défaut. Une substitution fastMode de session stockée prévaut toujours sur la configuration dans les deux directions.
Si une exécution isolée rencontre un transfert de changement de modèle en direct, cron réessaie avec le fournisseur/modèle changé et persiste cette sélection en direct pour l’exécution active avant de réessayer. Lorsque le changement porte aussi un nouveau profil d’authentification, cron persiste aussi cette substitution de profil d’authentification pour l’exécution active. Les nouvelles tentatives sont limitées : après la tentative initiale plus 2 nouvelles tentatives de changement, cron abandonne au lieu de boucler indéfiniment.
Avant qu’une exécution cron isolée n’entre dans le lanceur d’agent, OpenClaw vérifie les points de terminaison de fournisseurs locaux joignables configurés avec api: "ollama" et api: "openai-completions" dont le baseUrl est une adresse de bouclage, de réseau privé ou en .local. Si ce point de terminaison est indisponible, l’exécution est enregistrée comme skipped avec une erreur fournisseur/modèle explicite au lieu de lancer un appel au modèle. Le résultat du point de terminaison est mis en cache pendant 5 minutes, afin que de nombreuses tâches arrivées à échéance utilisant le même serveur local Ollama, vLLM, SGLang ou LM Studio indisponible partagent une petite sonde unique au lieu de créer une tempête de requêtes. Les exécutions ignorées lors du précontrôle du fournisseur n’incrémentent pas le backoff d’erreur d’exécution ; activez failureAlert.includeSkipped lorsque vous souhaitez recevoir des notifications répétées d’exécutions ignorées.
Livraison et sortie
| Mode | Ce qui se passe |
|---|---|
announce | Livrer en repli le texte final à la cible si l’agent ne l’a pas envoyé |
webhook | Publier la charge utile de l’événement terminé vers une URL |
none | Aucune livraison de repli par le lanceur |
--announce --channel telegram --to "-1001234567890" pour la livraison vers un canal. Pour les sujets de forum Telegram, utilisez -1001234567890:topic:123 ; les appelants RPC/config directs peuvent aussi transmettre delivery.threadId sous forme de chaîne ou de nombre. Les cibles Slack/Discord/Mattermost doivent utiliser des préfixes explicites (channel:<id>, user:<id>). Les ID de salons Matrix sont sensibles à la casse ; utilisez l’ID exact du salon ou la forme room:!room:server de Matrix.
Lorsque la livraison d’annonce utilise channel: "last" ou omet channel, une cible préfixée par fournisseur comme telegram:123 peut sélectionner le canal avant que cron ne se rabatte sur l’historique de session ou sur un seul canal configuré. Seuls les préfixes annoncés par le plugin chargé sont des sélecteurs de fournisseur. Si delivery.channel est explicite, le préfixe de cible doit nommer le même fournisseur ; par exemple, channel: "whatsapp" avec to: "telegram:123" est rejeté au lieu de laisser WhatsApp interpréter l’ID Telegram comme un numéro de téléphone. Les préfixes de type de cible et de service comme channel:<id>, user:<id>, imessage:<handle> et sms:<number> restent une syntaxe de cible propre au canal, et non des sélecteurs de fournisseur.
Pour les tâches isolées, la livraison de chat est partagée. Si une route de chat est disponible, l’agent peut utiliser l’outil message même lorsque la tâche utilise --no-deliver. Si l’agent envoie vers la cible configurée/actuelle, OpenClaw ignore l’annonce de repli. Sinon, announce, webhook et none contrôlent uniquement ce que le lanceur fait de la réponse finale après le tour de l’agent.
Lorsqu’un agent crée un rappel isolé depuis un chat actif, OpenClaw stocke la cible de livraison en direct préservée pour la route d’annonce de repli. Les clés de session internes peuvent être en minuscules ; les cibles de livraison du fournisseur ne sont pas reconstruites à partir de ces clés lorsque le contexte de chat actuel est disponible.
La livraison d’annonce implicite utilise les listes d’autorisation des canaux configurés pour valider et rerouter les cibles obsolètes. Les approbations du magasin d’appariement DM ne sont pas des destinataires d’automatisation de repli ; définissez delivery.to ou configurez l’entrée allowFrom du canal lorsqu’une tâche planifiée doit envoyer proactivement vers un DM.
Les notifications d’échec suivent un chemin de destination distinct :
cron.failureDestinationdéfinit une valeur globale par défaut pour les notifications d’échec.job.delivery.failureDestinationla remplace par tâche.- Si aucune des deux n’est définie et que la tâche livre déjà via
announce, les notifications d’échec se rabattent désormais sur cette cible d’annonce principale. delivery.failureDestinationn’est pris en charge que sur les tâchessessionTarget="isolated", sauf si le mode de livraison principal estwebhook.failureAlert.includeSkipped: trueinscrit une tâche ou une stratégie globale d’alerte cron aux alertes répétées d’exécutions ignorées. Les exécutions ignorées conservent un compteur distinct d’ignorations consécutives, elles n’affectent donc pas le backoff d’erreur d’exécution.
Exemples CLI
- Rappel ponctuel
- Tâche isolée récurrente
- Remplacement du modèle et de la réflexion
Webhooks
Gateway peut exposer des points de terminaison Webhook HTTP pour les déclencheurs externes. Activez-les dans la configuration :Authentification
Chaque requête doit inclure le jeton de hook via l’en-tête :Authorization: Bearer <token>(recommandé)x-openclaw-token: <token>
POST /hooks/wake
POST /hooks/wake
POST /hooks/agent
POST /hooks/agent
Exécuter un tour d’agent isolé :Champs :
message (obligatoire), name, agentId, wakeMode, deliver, channel, to, model, fallbacks, thinking, timeoutSeconds.Hooks mappés (POST /hooks/<name>)
Hooks mappés (POST /hooks/<name>)
Les noms de hooks personnalisés sont résolus via
hooks.mappings dans la configuration. Les mappages peuvent transformer des charges utiles arbitraires en actions wake ou agent avec des modèles ou des transformations de code.Intégration Gmail PubSub
Reliez les déclencheurs de boîte de réception Gmail à OpenClaw via Google PubSub.Prérequis : CLI
gcloud, gog (gogcli), hooks OpenClaw activés, Tailscale pour le point de terminaison HTTPS public.Configuration par assistant (recommandé)
hooks.gmail, active le préréglage Gmail et utilise Tailscale Funnel pour le point de terminaison push.
Démarrage automatique du Gateway
Lorsquehooks.enabled=true et que hooks.gmail.account est défini, le Gateway démarre gog gmail watch serve au démarrage et renouvelle automatiquement la surveillance. Définissez OPENCLAW_SKIP_GMAIL_WATCHER=1 pour vous désinscrire.
Configuration manuelle unique
Remplacement du modèle Gmail
Gestion des tâches
Note sur le remplacement du modèle :
openclaw cron add|edit --model ...change le modèle sélectionné pour la tâche.- Si le modèle est autorisé, ce fournisseur/modèle exact atteint l’exécution d’agent isolée.
- S’il n’est pas autorisé ou ne peut pas être résolu, cron fait échouer l’exécution avec une erreur de validation explicite.
- Les chaînes de repli configurées continuent de s’appliquer, car
--modelde cron est un modèle principal de tâche, et non un remplacement/modelde session. - La charge utile
fallbacksremplace les replis configurés pour cette tâche ;fallbacks: []désactive le repli et rend l’exécution stricte. - Un simple
--modelsans liste de replis explicite ou configurée ne bascule pas vers le modèle principal de l’agent comme cible de nouvelle tentative supplémentaire silencieuse.
Configuration
maxConcurrentRuns limite à la fois la distribution cron planifiée et l’exécution des tours d’agent isolés. Les tours d’agent cron isolés utilisent en interne la voie d’exécution dédiée cron-nested de la file, donc augmenter cette valeur permet à des exécutions LLM cron indépendantes de progresser en parallèle au lieu de seulement démarrer leurs enveloppes cron externes. La voie partagée non-cron nested n’est pas élargie par ce paramètre.
Le sidecar d’état d’exécution est dérivé de cron.store : un magasin .json comme ~/clawd/cron/jobs.json utilise ~/clawd/cron/jobs-state.json, tandis qu’un chemin de magasin sans suffixe .json ajoute -state.json.
Si vous modifiez jobs.json manuellement, laissez jobs-state.json hors du contrôle de source. OpenClaw utilise ce sidecar pour les emplacements en attente, les marqueurs actifs, les métadonnées de dernière exécution et l’identité de planification qui indique au planificateur quand une tâche modifiée en externe a besoin d’un nouveau nextRunAtMs.
Désactiver cron : cron.enabled: false ou OPENCLAW_SKIP_CRON=1.
Comportement des nouvelles tentatives
Comportement des nouvelles tentatives
Nouvelle tentative ponctuelle : les erreurs transitoires (limite de débit, surcharge, réseau, erreur serveur) sont retentées jusqu’à 3 fois avec un backoff exponentiel. Les erreurs permanentes désactivent immédiatement.Nouvelle tentative récurrente : backoff exponentiel (30 s à 60 min) entre les tentatives. Le backoff est réinitialisé après la prochaine exécution réussie.
Maintenance
Maintenance
cron.sessionRetention (par défaut 24h) élague les entrées de sessions d’exécution isolées. cron.runLog.maxBytes / cron.runLog.keepLines élaguent automatiquement les fichiers journaux d’exécution.Dépannage
Progression des commandes
Cron ne se déclenche pas
Cron ne se déclenche pas
- Vérifiez
cron.enabledet la variable d’environnementOPENCLAW_SKIP_CRON. - Confirmez que le Gateway fonctionne en continu.
- Pour les planifications
cron, vérifiez le fuseau horaire (--tz) par rapport au fuseau horaire de l’hôte. reason: not-duedans la sortie d’exécution signifie que l’exécution manuelle a été vérifiée avecopenclaw cron run <jobId> --dueet que la tâche n’était pas encore arrivée à échéance.
Cron s’est déclenché mais rien n’a été remis
Cron s’est déclenché mais rien n’a été remis
- Le mode de remise
nonesignifie qu’aucun envoi de secours par l’exécuteur n’est attendu. L’agent peut toujours envoyer directement avec l’outilmessagelorsqu’une route de discussion est disponible. - Une cible de remise manquante ou non valide (
channel/to) signifie que l’envoi sortant a été ignoré. - Pour Matrix, les tâches copiées ou héritées avec des ID de salon
delivery.toen minuscules peuvent échouer, car les ID de salon Matrix sont sensibles à la casse. Modifiez la tâche avec la valeur exacte!room:serverouroom:!room:serverprovenant de Matrix. - Les erreurs d’authentification de canal (
unauthorized,Forbidden) signifient que la remise a été bloquée par les identifiants. - Si l’exécution isolée renvoie uniquement le jeton silencieux (
NO_REPLY/no_reply), OpenClaw supprime la remise sortante directe et supprime également le chemin de résumé en file d’attente de secours, donc rien n’est publié dans la discussion. - Si l’agent doit envoyer lui-même un message à l’utilisateur, vérifiez que la tâche dispose d’une route utilisable (
channel: "last"avec une discussion précédente, ou un canal/une cible explicite).
Cron ou Heartbeat semble empêcher le basculement /new-style
Cron ou Heartbeat semble empêcher le basculement /new-style
- La fraîcheur de réinitialisation quotidienne et d’inactivité n’est pas basée sur
updatedAt; consultez Gestion des sessions. - Les réveils Cron, les exécutions Heartbeat, les notifications exec et la tenue des données du Gateway peuvent mettre à jour la ligne de session pour le routage/l’état, mais ils ne prolongent pas
sessionStartedAtnilastInteractionAt. - Pour les anciennes lignes créées avant l’existence de ces champs, OpenClaw peut récupérer
sessionStartedAtdepuis l’en-tête de session du transcript JSONL lorsque le fichier est encore disponible. Les anciennes lignes inactives sanslastInteractionAtutilisent cette heure de début récupérée comme référence d’inactivité.
Pièges liés aux fuseaux horaires
Pièges liés aux fuseaux horaires
- Cron sans
--tzutilise le fuseau horaire de l’hôte du gateway. - Les planifications
atsans fuseau horaire sont traitées comme UTC. - Les
activeHoursde Heartbeat utilisent la résolution de fuseau horaire configurée.
Connexe
- Automatisation — tous les mécanismes d’automatisation en un coup d’œil
- Tâches en arrière-plan — registre des tâches pour les exécutions cron
- Heartbeat — tours périodiques de session principale
- Fuseau horaire — configuration du fuseau horaire