Heartbeat versus cron? Zie Automatisering voor richtlijnen over wanneer je welke gebruikt.
openclaw cron list --all als Heartbeat (agent-id)). De Heartbeat-configuratie blijft de invoer voor de gewenste toestand, terwijl het opgeslagen monitorschema de daadwerkelijke tik en de daaropvolgende afkoelperiode van de runner beheert. De Gateway schrijft configuratiewijzigingen door bij het opstarten en wanneer de configuratie opnieuw wordt geladen; openclaw doctor --fix kan ontbrekende of verouderde monitorrijen aanmaken vóór de volgende start van de Gateway. Bewerk agents.*.heartbeat, niet de cron-taak.
Geplande Heartbeats vereisen cron. Wanneer cron.enabled false of OPENCLAW_SKIP_CRON=1 is, registreert de Gateway bij het opstarten een waarschuwing en worden geplande Heartbeats niet uitgevoerd; handmatige en gebeurtenisgestuurde Heartbeat-activeringen blijven beschikbaar. Er is geen afzonderlijke reservetimer voor Heartbeat.
Probleemoplossing: Geplande taken
Snel aan de slag (beginner)
1
Kies een ritme
Laat Heartbeats ingeschakeld (standaard is
30m, of 1h wanneer Anthropic OAuth-/tokenauthenticatie is geconfigureerd, inclusief hergebruik van de Claude CLI) of stel je eigen ritme in.2
Voeg monitorkladruimte toe (optioneel)
Sla met
openclaw cron scratch <jobId> --set "..." een korte controlelijst op in de kladruimte van de Heartbeat-monitor.3
Bepaal waar Heartbeat-berichten naartoe moeten
target: "none" is de standaard; stel target: "last" in om berichten naar het laatste contact te routeren.4
Optionele afstemming
- Gebruik een lichtgewicht bootstrapcontext als Heartbeat-runs alleen de monitorkladruimte nodig hebben.
- Schakel geïsoleerde sessies in om te voorkomen dat bij elke Heartbeat de volledige gespreksgeschiedenis wordt verzonden.
- Beperk Heartbeats tot actieve uren (lokale tijd).
Standaardwaarden
- Interval:
30m. Door de standaardwaarden van de Anthropic-provider toe te passen, wordt dit verhoogd naar1hwanneer de vastgestelde authenticatiemodus OAuth/token is (inclusief hergebruik van de Claude CLI), maar alleen zolangheartbeat.everyniet is ingesteld. Stelagents.defaults.heartbeat.everyofagents.entries.*.heartbeat.everyper agent in; gebruik0mom dit uit te schakelen. - Prompttekst (configureerbaar via
agents.defaults.heartbeat.prompt):Follow the heartbeat monitor scratch context when provided. Recurring tasks are cron jobs; create or change their schedules with cron tools or the openclaw cron CLI, not heartbeat scratch. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK. - Time-out: Heartbeat-beurten zonder ingestelde waarde gebruiken
agents.defaults.timeoutSecondsals die is ingesteld. Anders gebruiken ze het Heartbeat-ritme, met een maximum van 600 seconden. Stelagents.defaults.heartbeat.timeoutSecondsofagents.entries.*.heartbeat.timeoutSecondsper agent in voor langer Heartbeat-werk. - De Heartbeat-prompt wordt letterlijk als gebruikersbericht verzonden. De systeemprompt bevat een sectie ‘Heartbeats’ wanneer Heartbeats voor de standaardagent zijn ingeschakeld, en de run wordt intern gemarkeerd.
- Wanneer Heartbeats met
0mworden uitgeschakeld, blijft de cron-taak van de monitor bestaan maar wordt deze uitgeschakeld. De kladruimte blijft behouden voor wanneer je het ritme opnieuw inschakelt. - Wanneer cron zelf is uitgeschakeld, worden geplande Heartbeats niet uitgevoerd, zelfs als het Heartbeat-ritme ingeschakeld blijft.
- Actieve uren (
heartbeat.activeHours) worden gecontroleerd in de geconfigureerde tijdzone. Buiten het tijdvenster worden Heartbeats overgeslagen tot de volgende tik binnen het venster. - Heartbeats worden automatisch uitgesteld zolang cron-werk actief is of in de wachtrij staat, of zolang de sessiesleutelgebonden subagent- of geneste opdrachtbanen van die agent bezet zijn. Parallelle agents pauzeren elkaar niet.
Waarvoor de Heartbeat-prompt dient
De standaardprompt is bewust ruim geformuleerd:- Achtergrondtaken: ‘Houd rekening met openstaande taken’ spoort de agent aan om vervolgacties te bekijken (inbox, agenda, herinneringen, werk in de wachtrij) en alles wat dringend is onder de aandacht te brengen.
- Contact met de gebruiker: ‘Vraag overdag soms hoe het met je gebruiker gaat’ spoort aan tot af en toe een kort bericht als ‘heb je iets nodig?’, maar voorkomt berichtenoverlast ‘s nachts door je geconfigureerde lokale tijdzone te gebruiken (zie Tijdzone).
agents.defaults.heartbeat.prompt (of agents.entries.*.heartbeat.prompt) in op een aangepaste tekst (die letterlijk wordt verzonden).
Responscontract
- Als niets aandacht nodig heeft, antwoord je met
HEARTBEAT_OK. - Heartbeat-runs kunnen in plaats daarvan
heartbeat_respondaanroepen metnotify: falsevoor geen zichtbare update, ofnotify: trueplusnotificationTextvoor een waarschuwing. Wanneer aanwezig, heeft het gestructureerde toolantwoord voorrang op de tekstuele terugvaloptie. - Een betekenisvol resultaat van
heartbeat_respondmetnotify: falseblijft stil, maar wordt onthouden als begrensde interne context voor de volgende gebruikersbeurt in die sessie. Bevestigingen metno_changeen zichtbare meldingen worden niet op deze manier opgeslagen. - Tijdens Heartbeat-runs behandelt OpenClaw
HEARTBEAT_OKals een bevestiging wanneer het aan het begin of einde van het antwoord staat. Het token wordt verwijderd en het antwoord wordt verworpen als de resterende inhoud maximaal 300 tekens bevat. - Als
HEARTBEAT_OKin het midden van een antwoord staat, wordt het niet speciaal behandeld. - Neem bij waarschuwingen
HEARTBEAT_OKniet op; retourneer alleen de waarschuwingstekst.
HEARTBEAT_OK aan het begin/einde van een bericht verwijderd en geregistreerd; een bericht dat alleen uit HEARTBEAT_OK bestaat, wordt verworpen.
Configuratie
Bereik en voorrang
agents.defaults.heartbeatstelt het algemene Heartbeat-gedrag in.agents.entries.*.heartbeatwordt daar bovenop samengevoegd; als een agent eenheartbeat-blok heeft, voeren alleen die agents Heartbeats uit.channels.defaults.heartbeatVisibilitystelt de standaardinstellingen voor zichtbaarheid voor alle kanalen in.channels.<channel>.heartbeatVisibilityoverschrijft de standaardinstellingen van het kanaal.channels.<channel>.accounts.<id>.heartbeatVisibility(kanalen met meerdere accounts) overschrijft de instellingen per kanaal.
Heartbeats per agent
Als een item inagents.entries.* een heartbeat-blok bevat, voeren alleen die agents Heartbeats uit. Het blok per agent wordt boven op agents.defaults.heartbeat samengevoegd (zodat je gedeelde standaardwaarden één keer kunt instellen en ze per agent kunt overschrijven).
Voorbeeld: twee agents, waarbij alleen de tweede agent Heartbeats uitvoert.
Voorbeeld van actieve uren
Beperk Heartbeats tot kantooruren in een specifieke tijdzone:Configuratie voor 24/7
Als je wilt dat Heartbeats de hele dag worden uitgevoerd, gebruik je een van deze patronen:- Laat
activeHoursvolledig weg (geen beperking door een tijdvenster; dit is het standaardgedrag). - Stel een venster voor de hele dag in:
activeHours: { start: "00:00", end: "24:00" }.
Voorbeeld met meerdere accounts
GebruikaccountId om een specifiek account te kiezen op kanalen met meerdere accounts, zoals Telegram:
Opmerkingen bij velden
string
Heartbeat-interval (tekenreeks voor de duur; standaardeenheid = minuten).
string
Optionele modeloverschrijving voor Heartbeat-runs (
provider/model).boolean
standaard:"false"
Indien true gebruiken Heartbeat-runs een lichtgewicht bootstrapcontext en slaan ze bootstrapbestanden van de werkruimte over. De monitorkladruimte wordt hoe dan ook door de Heartbeat-runner geïnjecteerd.
boolean
standaard:"false"
Indien true wordt elke Heartbeat uitgevoerd in een nieuwe sessie zonder eerdere gespreksgeschiedenis. Gebruikt hetzelfde isolatiepatroon als cron
sessionTarget: "isolated". Verlaagt de tokenkosten per Heartbeat drastisch. Combineer dit met lightContext: true voor maximale besparing. De bezorgingsroutering gebruikt nog steeds de context van de hoofdsessie.string
Optionele sessiesleutel voor Heartbeat-runs.
main(standaard): hoofdsessie van de agent.- Expliciete sessiesleutel (kopieer deze uit
openclaw sessions --jsonof de sessie-CLI). - Indelingen van sessiesleutels: zie Sessies en Groepen.
string
last: afleveren bij het laatst gebruikte externe kanaal.- expliciet kanaal: elk geconfigureerd kanaal of elke geconfigureerde plugin-id, bijvoorbeeld
discord,matrix,telegramofwhatsapp. none(standaard): voer de heartbeat uit, maar lever deze niet extern af.
"allow" | "block"
standaard:"allow"
Bepaalt het aflevergedrag voor directe berichten/DM’s.
allow: sta aflevering van heartbeats via directe berichten/DM’s toe. block: onderdruk aflevering via directe berichten/DM’s (reason=dm-blocked).string
Optionele overschrijving van de ontvanger (kanaalspecifieke id, bijvoorbeeld E.164 voor WhatsApp of een Telegram-chat-id). Gebruik voor Telegram-onderwerpen/threads
<chatId>:topic:<messageThreadId>.string
Optionele account-id voor kanalen met meerdere accounts. Wanneer
target: "last", geldt de account-id voor het bepaalde laatste kanaal als dat accounts ondersteunt; anders wordt deze genegeerd. Als de account-id niet overeenkomt met een geconfigureerd account voor het bepaalde kanaal, wordt de aflevering overgeslagen.string
Overschrijft de standaardinhoud van de prompt (wordt niet samengevoegd).
number
standaard:"global timeout or min(every, 600)"
Maximaal aantal seconden dat een heartbeat-beurt van de agent mag duren voordat deze wordt afgebroken. Laat dit oningesteld om
agents.defaults.timeoutSeconds te gebruiken wanneer die is ingesteld; anders wordt het heartbeat-interval gebruikt, begrensd op 600 seconden.object
Beperkt heartbeat-uitvoeringen tot een tijdvenster. Object met
start (UU:MM, inclusief; gebruik 00:00 voor het begin van de dag), end (UU:MM, exclusief; 24:00 toegestaan voor het einde van de dag) en optioneel timezone.- Weggelaten of
"user": gebruikt jouwagents.defaults.userTimezoneals die is ingesteld en valt anders terug op de tijdzone van het hostsysteem. "local": gebruikt altijd de tijdzone van het hostsysteem.- Elke IANA-identificatie (bijvoorbeeld
America/New_York): wordt rechtstreeks gebruikt; als deze ongeldig is, wordt teruggevallen op het hierboven beschreven gedrag van"user". startenendmogen voor een actief venster niet gelijk zijn; gelijke waarden worden behandeld als een venster zonder breedte (altijd buiten het venster).- Buiten het actieve venster worden heartbeats overgeslagen tot de volgende tick binnen het venster.
Aflevergedrag
Sessie- en doelroutering
Sessie- en doelroutering
- Heartbeats worden standaard uitgevoerd in de hoofdsessie van de agent (
agent:<id>:<mainKey>), of inglobalwanneersession.scope = "global". Stelsessionin om dit te overschrijven met een specifieke kanaalsessie (Discord/WhatsApp/enzovoort). sessionbeïnvloedt alleen de uitvoeringscontext; de aflevering wordt bepaald doortargetento.- Stel
target+toin om bij een specifiek kanaal of een specifieke ontvanger af te leveren. Mettarget: "last"gebruikt de aflevering het laatste externe kanaal voor die sessie. - Heartbeat-afleveringen staan standaard directe doelen/DM-doelen toe. Stel
directPolicy: "block"in om verzending naar directe doelen te onderdrukken terwijl de heartbeat-beurt nog steeds wordt uitgevoerd. - Als de hoofdwachtrij, de sessiebaan van het doel, de Cron-baan of een actieve Cron-taak bezet is, wordt de heartbeat overgeslagen en later opnieuw geprobeerd.
- Als
targetgeen externe bestemming oplevert, wordt de uitvoering nog steeds uitgevoerd, maar wordt er geen uitgaand bericht verzonden.
Zichtbaarheid en overslaggedrag
Zichtbaarheid en overslaggedrag
- Als
showOk,showAlertsenuseIndicatorallemaal zijn uitgeschakeld, wordt de uitvoering vooraf overgeslagen alsreason=alerts-disabled. - Als alleen de aflevering van waarschuwingen is uitgeschakeld, kan OpenClaw de heartbeat nog steeds uitvoeren, tijdstempels van vervallen taken bijwerken, het tijdstempel voor de inactiviteit van de sessie herstellen en de uitgaande waarschuwingsinhoud onderdrukken.
- Als het bepaalde heartbeat-doel typen ondersteunt, toont OpenClaw een typindicator terwijl de heartbeat wordt uitgevoerd. Hiervoor wordt hetzelfde doel gebruikt waarnaar de heartbeat chatuitvoer zou verzenden; dit wordt uitgeschakeld door
typingMode: "never".
Sessielevenscyclus en audit
Sessielevenscyclus en audit
- Antwoorden die uitsluitend uit een heartbeat bestaan, houden de sessie niet actief. Heartbeat-metagegevens kunnen de sessierij bijwerken, maar voor verval wegens inactiviteit wordt
lastInteractionAtvan het laatste echte gebruikers-/kanaalbericht gebruikt en voor dagelijks verval wordtsessionStartedAtgebruikt. - De geschiedenis van de Control UI en WebChat verbergt heartbeat-prompts en bevestigingen die alleen uit OK bestaan. Het onderliggende sessietranscript kan die beurten nog steeds bevatten voor audits/herhalingen.
- Losgekoppelde achtergrondtaken kunnen een systeemgebeurtenis in de wachtrij plaatsen en de heartbeat activeren wanneer de hoofdsessie snel ergens van op de hoogte moet worden gebracht. Die activering maakt van de heartbeat-uitvoering geen achtergrondtaak.
Zichtbaarheidsinstellingen
Standaard wordenHEARTBEAT_OK-bevestigingen onderdrukt terwijl waarschuwingsinhoud wordt afgeleverd. Je kunt dit per kanaal of per account aanpassen:
Wat elke vlag doet
showOk: verzendt eenHEARTBEAT_OK-bevestiging wanneer het model een antwoord retourneert dat alleen uit OK bestaat.showAlerts: verzendt de waarschuwingsinhoud wanneer het model een antwoord retourneert dat niet alleen uit OK bestaat.useIndicator: zendt indicatorgebeurtenissen uit voor UI-statusweergaven.
Voorbeelden per kanaal en per account
Veelvoorkomende patronen
Monitorkladblok (optioneel)
Elke Cron-taak voor heartbeat-bewaking heeft een eigen privékladblokdocument dat in de gedeelde statusdatabase wordt opgeslagen. Beschouw het als jouw ‘heartbeat-checklist’: klein, stabiel en veilig om elke 30 minuten te bekijken. Als het kladblok bestaat, wordt de inhoud ervan aan de heartbeat-prompt toegevoegd. Beheer het met de Cron-CLI (de taak-id is afkomstig uitopenclaw cron list --all):
--expected-revision <n> door om te mislukken in plaats van een gelijktijdige bewerking te overschrijven. Het kladblok is begrensd op 256 KiB en verschijnt nooit in de uitvoer van cron list/cron runs.
De agent kan ook zijn eigen kladblok bijwerken: tijdens een heartbeat-beurt accepteert heartbeat_respond een optionele tekenreeks scratch die het kladblok van de monitor volledig vervangt voor toekomstige heartbeats.
Migreren vanuit HEARTBEAT.md of een interval dat alleen in de configuratie staat? Voer
openclaw doctor --fix uit. Doctor maakt eerst de systeemeigen monitorrijen vanuit agents.*.heartbeat of werkt deze bij, importeert vervolgens de HEARTBEAT.md uit de werkruimte van elke agent in het kladblok van de monitor, zet geldige verouderde tasks:-vermeldingen om in Cron-taken, archiveert het origineel onder de statusmap (backups/heartbeat-migration/) en verwijdert het bestand. Heartbeat-instructies tijdens runtime zijn uitsluitend afkomstig uit het databasekladblok; de runtime leest HEARTBEAT.md nooit.# Heading, fence-markeringen of lege checklistsjablonen), slaat OpenClaw de heartbeat-uitvoering over om API-aanroepen te besparen. Die overslag wordt gerapporteerd als reason=empty-heartbeat-file. Als er geen kladblok bestaat, wordt de heartbeat nog steeds uitgevoerd en bepaalt het model wat er moet gebeuren.
Houd het klein (een korte checklist of herinneringen) om te voorkomen dat de prompt onnodig groot wordt.
Voorbeeldkladblok:
Terugkerende controles plannen met Cron
Het heartbeat-kladblok is promptcontext, geen planner. Maak elke terugkerende controle als een Cron-taak, zodat deze een eigen interval, in-/uitgeschakelde status en uitvoeringsgeschiedenis heeft. Cron-taken kunnen nog steeds op de hoofdsessie worden gericht wanneer de controle de normale gesprekscontext moet gebruiken. Oudere kladblokken kunnen een gestructureerdtasks:-blok bevatten. Voer openclaw doctor --fix eenmaal uit na de upgrade: Doctor zet elke geldige vermelding om in een onafhankelijk geplande Cron-taak, behoudt het interval en het eerdere tijdstip van de laatste uitvoering en verwijdert het buiten gebruik gestelde blok terwijl de omringende tekst in het kladblok behouden blijft. Heartbeat-beurten tijdens runtime interpreteren tasks:-tekst niet als planningen.
Door Doctor gemaakte heartbeat-taken behouden de actieve uren en de beveiligingen voor afkoeling, overbelasting en bezetting van de heartbeat. Taken die tegelijk moeten worden uitgevoerd, kunnen worden samengevoegd tot één heartbeat-beurt. Een uitvoering buiten de actieve uren wordt overgeslagen en bij de volgende geplande Cron-uitvoering opnieuw geprobeerd.
Kan de agent zijn kladblok bijwerken?
Ja. Tijdens een heartbeat-beurt kan de agent eenscratch-waarde doorgeven aan heartbeat_respond om de monitortekst voor toekomstige heartbeats volledig te vervangen. Je kunt de agent ook in een normaal gesprek vragen om openclaw cron scratch <jobId> --set ... uit te voeren, of het kladblok zelf met dezelfde opdracht bewerken. Beheer terugkerende planningen met Cron in plaats van plannersyntaxis in het kladblok te schrijven.
Handmatige activering (op aanvraag)
Gebruikopenclaw system event om een systeemgebeurtenis in de wachtrij te plaatsen en optioneel onmiddellijk een heartbeat te activeren:
Als geen
--session-key is opgegeven en voor meerdere agents heartbeat is geconfigureerd, voert --mode now de heartbeats van elk van die agents onmiddellijk uit.
Gerelateerde heartbeat-besturingselementen in dezelfde CLI-groep:
Kostenbewustzijn
Heartbeats voeren volledige agentbeurten uit. Kortere intervallen verbruiken meer tokens. Om de kosten te verlagen:- Gebruik
isolatedSession: trueom te voorkomen dat de volledige gespreksgeschiedenis wordt verzonden (van ~100K tokens naar ~2-5K per uitvoering). - Gebruik
lightContext: trueom bootstrapbestanden van de werkruimte over te slaan bij heartbeat-uitvoeringen. - Stel een goedkoper
modelin (bijv.ollama/llama3.2:1b). - Houd het kladgebied van de monitor klein.
- Gebruik
target: "none"als je alleen interne statusupdates wilt.
Contextoverloop na een heartbeat
Heartbeats behouden na voltooiing van de uitvoering het bestaande runtimemodel van de gedeelde sessie. Daardoor kan een heartbeat die een sessie heeft overgeschakeld naar een kleiner lokaal model (bijvoorbeeld een Ollama-model met een venster van 32k) dat model actief laten voor de volgende beurt in de hoofdsessie. Als die volgende beurt vervolgens een contextoverloop meldt en het laatst gebruikte runtimemodel van de sessie overeenkomt met de geconfigureerdeheartbeat.model, vermeldt het herstelbericht van OpenClaw dat het doorsijpelen van het heartbeat-model waarschijnlijk de oorzaak is en stelt het een oplossing voor.
Om dit te voorkomen: gebruik isolatedSession: true om heartbeats in een nieuwe sessie uit te voeren (eventueel gecombineerd met lightContext: true voor de kleinste prompt), of kies een heartbeat-model met een contextvenster dat groot genoeg is voor de gedeelde sessie.
Gerelateerd
- Automatisering - alle automatiseringsmechanismen in één oogopslag
- Achtergrondtaken - hoe losgekoppeld werk wordt bijgehouden
- Tijdzone - hoe de tijdzone de heartbeat-planning beïnvloedt
- Problemen oplossen - automatiseringsproblemen opsporen