Tâches planifiées (Cron)
Cron est le planificateur intégré de la Gateway. Il persiste les tâches, réveille l’agent au bon moment et peut renvoyer la sortie vers un canal de chat ou un point de terminaison webhook.Démarrage rapide
Fonctionnement de cron
- Cron s’exécute dans le processus Gateway (pas dans le modèle).
- Les tâches sont persistées dans
~/.openclaw/cron/jobs.json, donc les redémarrages ne font pas perdre les planifications. - Toutes les exécutions cron créent des enregistrements de tâche d’arrière-plan.
- Les tâches à exécution unique (
--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 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 indices similaires) et qu’aucune exécution de sous-agent descendante n’est encore responsable de la réponse finale, OpenClaw relance une invite une fois pour obtenir le résultat réel avant la livraison.
lost.
Types de planification
| Type | Option CLI | Description |
|---|---|---|
at | --at | Horodatage à exécution unique (ISO 8601 ou relatif comme 20m) |
every | --every | Intervalle fixe |
cron | --cron | Expression cron à 5 ou 6 champs avec --tz optionnel |
--tz America/New_York pour une planification locale à l’heure murale.
Les expressions récurrentes au début de chaque heure sont automatiquement décalées jusqu’à 5 minutes pour réduire les pics de charge. Utilisez --exact pour imposer un timing 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 fait correspondre lorsque l’un ou l’autre des champs correspond — pas les deux. C’est le comportement standard de Vixie cron.+ de Croner (0 9 15 * +1) ou planifiez sur un seul champ et vérifiez l’autre dans l’invite ou la commande de votre tâche.
Styles d’exécution
| Style | Valeur --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 d’arrière-plan |
| Session actuelle | current | Liée au moment de la création | Travail récurrent sensible au contexte |
| Session personnalisée | session:custom-id | Session nommée persistante | Flux de travail qui s’appuient sur l’historique |
--wake now ou --wake next-heartbeat). Les tâches isolées exécutent un tour d’agent dédié avec une session fraîche. Les sessions personnalisées (session:xxx) conservent le contexte d’une exécution à l’autre, ce qui permet des flux de travail comme des points quotidiens qui s’appuient sur les résumés précédents.
Pour les tâches isolées, le démontage du runtime inclut désormais un nettoyage du navigateur au mieux pour cette session cron. Les échecs de nettoyage sont ignorés afin que le résultat réel de cron reste prioritaire.
Lorsque des exécutions cron isolées orchestrent des sous-agents, la livraison privilégie également la sortie finale descendante plutôt qu’un texte intermédiaire obsolète du parent. Si des descendants sont encore en cours d’exécution, OpenClaw supprime cette mise à jour partielle du parent au lieu de l’annoncer.
Options de payload pour les tâches isolées
--message: texte de l’invite (obligatoire pour l’isolé)--model/--thinking: remplacements du modèle et du niveau de réflexion--light-context: ignorer l’injection des fichiers d’initialisation du workspace--tools exec,read: restreindre les outils que la tâche peut utiliser
--model utilise le modèle autorisé sélectionné pour cette tâche. Si le modèle demandé n’est pas autorisé, cron enregistre un avertissement et revient à la sélection du modèle de l’agent/par défaut pour cette tâche. Les chaînes de repli configurées continuent de s’appliquer, mais un simple remplacement de modèle sans liste de repli explicite par tâche n’ajoute plus le primaire de l’agent comme cible de nouvelle tentative cachée supplémentaire.
L’ordre de priorité de sélection du modèle pour les tâches isolées est le suivant :
- Remplacement de modèle du hook Gmail (lorsque l’exécution provient de Gmail et que ce remplacement est autorisé)
modeldu payload par tâche- Remplacement de modèle de session cron stocké
- Sélection du modèle de l’agent/par défaut
params.fastMode, le cron isolé l’utilise par défaut. Un remplacement fastMode stocké dans la session reste prioritaire sur la configuration dans les deux sens.
Si une exécution isolée rencontre un basculement actif de modèle en direct, cron réessaie avec le fournisseur/modèle basculé et persiste cette sélection active avant de réessayer. Lorsque le basculement transporte aussi un nouveau profil d’authentification, cron persiste également ce remplacement de profil d’authentification. Les nouvelles tentatives sont limitées : après la tentative initiale plus 2 nouvelles tentatives de basculement, cron abandonne au lieu de boucler indéfiniment.
Livraison et sortie
| Mode | Ce qui se passe |
|---|---|
announce | Livrer le résumé au canal cible (par défaut pour l’isolé) |
webhook | POST du payload d’événement terminé vers une URL |
none | Interne uniquement, pas de livraison |
--announce --channel telegram --to "-1001234567890" pour une livraison vers un canal. Pour les sujets de forum Telegram, utilisez -1001234567890:topic:123. Les cibles Slack/Discord/Mattermost doivent utiliser des préfixes explicites (channel:<id>, user:<id>).
Pour les tâches isolées gérées par cron, le runner possède le chemin de livraison final. Une invite est envoyée à l’agent pour qu’il renvoie un résumé en texte brut, puis ce résumé est envoyé via announce, webhook ou conservé en interne pour none. --no-deliver ne redonne pas la livraison à l’agent ; cela conserve l’exécution en interne.
Si la tâche d’origine indique explicitement d’envoyer un message à un destinataire externe, l’agent doit indiquer qui/où ce message doit être envoyé dans sa sortie au lieu d’essayer de l’envoyer directement.
Les notifications d’échec suivent un chemin de destination distinct :
cron.failureDestinationdéfinit une valeur par défaut globale pour les notifications d’échec.job.delivery.failureDestinationla remplace par tâche.- Si aucun des deux n’est défini et que la tâche livre déjà via
announce, les notifications d’échec reviennent désormais à 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.
Exemples CLI
Rappel à exécution unique (session principale) :Webhooks
La Gateway peut exposer des points de terminaison HTTP webhook pour des déclencheurs externes. Activez-les dans la configuration :Authentification
Chaque requête doit inclure le jeton du hook via un en-tête :Authorization: Bearer <token>(recommandé)x-openclaw-token: <token>
POST /hooks/wake
Mettre en file un événement système pour la session principale :text(obligatoire) : description de l’événementmode(optionnel) :now(par défaut) ounext-heartbeat
POST /hooks/agent
Exécuter un tour d’agent isolé :message (obligatoire), name, agentId, wakeMode, deliver, channel, to, model, thinking, timeoutSeconds.
Hooks mappés (POST /hooks/<name>)
Les noms de hook personnalisés sont résolus viahooks.mappings dans la configuration. Les mappings peuvent transformer des payloads arbitraires en actions wake ou agent avec des modèles ou des transformations par code.
Sécurité
- Gardez les points de terminaison de hook derrière loopback, tailnet ou un reverse proxy de confiance.
- Utilisez un jeton de hook dédié ; ne réutilisez pas les jetons d’authentification de gateway.
- Gardez
hooks.pathsur un sous-chemin dédié ;/est rejeté. - Définissez
hooks.allowedAgentIdspour limiter le routage expliciteagentId. - Gardez
hooks.allowRequestSessionKey=falsesauf si vous avez besoin de sessions sélectionnées par l’appelant. - Si vous activez
hooks.allowRequestSessionKey, définissez aussihooks.allowedSessionKeyPrefixespour contraindre les formes de clés de session autorisées. - Les payloads de hook sont encapsulés avec des limites de sécurité par défaut.
Intégration Gmail PubSub
Reliez les déclencheurs de boîte de réception Gmail à OpenClaw via Google PubSub. Prérequis : CLIgcloud, gog (gogcli), hooks OpenClaw activés, Tailscale pour le point de terminaison HTTPS public.
Configuration avec assistant (recommandée)
hooks.gmail, active le preset Gmail et utilise Tailscale Funnel pour le point de terminaison push.
Démarrage automatique de la Gateway
Lorsquehooks.enabled=true et que hooks.gmail.account est défini, la Gateway démarre gog gmail watch serve au démarrage et renouvelle automatiquement le watch. Définissez OPENCLAW_SKIP_GMAIL_WATCHER=1 pour désactiver ce comportement.
Configuration manuelle ponctuelle
- Sélectionnez le projet GCP qui possède le client OAuth utilisé par
gog:
- Créez le topic et accordez à Gmail l’accès push :
- Démarrez le watch :
Remplacement du modèle Gmail
Gérer les tâches
openclaw cron add|edit --model ...modifie le modèle sélectionné de la tâche.- Si le modèle est autorisé, ce fournisseur/modèle exact est transmis à l’exécution de l’agent isolé.
- S’il n’est pas autorisé, cron émet un avertissement et revient à la sélection du modèle de l’agent/par défaut de la tâche.
- Les chaînes de repli configurées continuent de s’appliquer, mais un simple remplacement
--modelsans liste de repli explicite par tâche ne bascule plus vers le primaire de l’agent comme cible supplémentaire de nouvelle tentative silencieuse.
Configuration
cron.enabled: false ou OPENCLAW_SKIP_CRON=1.
Nouvelle tentative pour exécution unique : les erreurs transitoires (limitation de débit, surcharge, réseau, erreur serveur) sont retentées jusqu’à 3 fois avec un backoff exponentiel. Les erreurs permanentes sont désactivées immédiatement.
Nouvelle tentative récurrente : backoff exponentiel (de 30 s à 60 min) entre les nouvelles tentatives. Le backoff est réinitialisé après la prochaine exécution réussie.
Maintenance : cron.sessionRetention (par défaut 24h) purge les entrées de session d’exécution isolée. cron.runLog.maxBytes / cron.runLog.keepLines purgent automatiquement les fichiers de journal d’exécution.
Dépannage
Échelle de commandes
Cron ne se déclenche pas
- Vérifiez
cron.enabledet la variable d’environnementOPENCLAW_SKIP_CRON. - Confirmez que la 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 due.
Cron s’est déclenché mais aucune livraison
- Le mode de livraison
nonesignifie qu’aucun message externe n’est attendu. - Une cible de livraison manquante/invalide (
channel/to) signifie que l’envoi sortant a été ignoré. - Des erreurs d’authentification du canal (
unauthorized,Forbidden) signifient que la livraison a été bloquée par les identifiants. - Si l’exécution isolée ne renvoie que le jeton silencieux (
NO_REPLY/no_reply), OpenClaw supprime la livraison sortante directe ainsi que le chemin de résumé mis en file de secours, donc rien n’est renvoyé dans le chat. - Pour les tâches isolées gérées par cron, n’attendez pas que l’agent utilise l’outil de message comme solution de secours. Le runner gère la livraison finale ;
--no-deliverla conserve en interne au lieu d’autoriser un envoi direct.
Pièges liés au fuseau horaire
- Cron sans
--tzutilise le fuseau horaire de l’hôte de gateway. - Les planifications
atsans fuseau horaire sont traitées comme UTC. activeHoursde heartbeat utilise la résolution de fuseau horaire configurée.
Lié
- Automatisation et tâches — tous les mécanismes d’automatisation en un coup d’œil
- Tâches d’arrière-plan — registre des tâches pour les exécutions cron
- Heartbeat — tours périodiques de la session principale
- Fuseau horaire — configuration du fuseau horaire