Heartbeat (Gateway)
Heartbeat o Cron? Vedi Automazione e attività per indicazioni su quando usare ciascuno.Heartbeat esegue turni periodici dell’agente nella sessione principale così il modello può far emergere tutto ciò che richiede attenzione senza sommergerti di messaggi. Heartbeat è un turno pianificato della sessione principale — non crea record di attività in background. I record delle attività servono per lavoro scollegato (esecuzioni ACP, sotto-agenti, attività cron isolate). Risoluzione dei problemi: Attività pianificate
Avvio rapido (principianti)
- Lascia heartbeat abilitato (il valore predefinito è
30m, oppure1hper l’autenticazione Anthropic OAuth/token, incluso il riuso di Claude CLI) oppure imposta la tua cadenza. - Crea un piccolo elenco di controllo
HEARTBEAT.mdo un bloccotasks:nel workspace dell’agente (facoltativo ma consigliato). - Decidi dove devono andare i messaggi heartbeat (
target: "none"è il valore predefinito; impostatarget: "last"per instradare all’ultimo contatto). - Facoltativo: abilita la consegna del reasoning heartbeat per maggiore trasparenza.
- Facoltativo: usa un contesto bootstrap leggero se le esecuzioni heartbeat richiedono solo
HEARTBEAT.md. - Facoltativo: abilita sessioni isolate per evitare di inviare l’intera cronologia della conversazione a ogni heartbeat.
- Facoltativo: limita heartbeat alle ore attive (ora locale).
Valori predefiniti
- Intervallo:
30m(oppure1hquando l’autenticazione Anthropic OAuth/token è la modalità di autenticazione rilevata, incluso il riuso di Claude CLI). Impostaagents.defaults.heartbeat.everyoagents.list[].heartbeat.everyper agente; usa0mper disabilitare. - Corpo del prompt (configurabile tramite
agents.defaults.heartbeat.prompt):Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK. - Il prompt heartbeat viene inviato testualmente come messaggio utente. Il prompt di sistema include una sezione “Heartbeat” e l’esecuzione viene segnalata internamente.
- Le ore attive (
heartbeat.activeHours) vengono controllate nel fuso orario configurato. Fuori dalla finestra, heartbeat viene saltato fino al tick successivo all’interno della finestra.
A cosa serve il prompt heartbeat
Il prompt predefinito è intenzionalmente ampio:- Attività in background: “Consider outstanding tasks” spinge l’agente a rivedere i follow-up (posta in arrivo, calendario, promemoria, lavoro in coda) e far emergere tutto ciò che è urgente.
- Check-in umano: “Checkup sometimes on your human during day time” spinge a un occasionale e leggero messaggio “hai bisogno di qualcosa?”, ma evita spam notturno usando il tuo fuso orario locale configurato (vedi /concepts/timezone).
agents.defaults.heartbeat.prompt (o
agents.list[].heartbeat.prompt) su un corpo personalizzato (inviato testualmente).
Contratto di risposta
- Se non c’è nulla che richiede attenzione, rispondi con
HEARTBEAT_OK. - Durante le esecuzioni heartbeat, OpenClaw tratta
HEARTBEAT_OKcome un ack quando appare all’inizio o alla fine della risposta. Il token viene rimosso e la risposta viene eliminata se il contenuto rimanente è ≤ackMaxChars(predefinito: 300). - Se
HEARTBEAT_OKappare nel mezzo di una risposta, non viene trattato in modo speciale. - Per gli avvisi, non includere
HEARTBEAT_OK; restituisci solo il testo dell’avviso.
HEARTBEAT_OK accidentale all’inizio/fine di un messaggio viene rimosso
e registrato nei log; un messaggio che contiene solo HEARTBEAT_OK viene eliminato.
Configurazione
Ambito e precedenza
agents.defaults.heartbeatimposta il comportamento heartbeat globale.agents.list[].heartbeatviene unito sopra; se un qualsiasi agente ha un bloccoheartbeat, solo quegli agenti eseguono heartbeat.channels.defaults.heartbeatimposta i valori predefiniti di visibilità per tutti i canali.channels.<channel>.heartbeatsovrascrive i valori predefiniti del canale.channels.<channel>.accounts.<id>.heartbeat(canali multi-account) sovrascrive le impostazioni per canale.
Heartbeat per agente
Se un qualsiasi elementoagents.list[] include un blocco heartbeat, solo quegli agenti
eseguono heartbeat. Il blocco per agente viene unito sopra agents.defaults.heartbeat
(così puoi impostare una sola volta i valori condivisi e sovrascriverli per agente).
Esempio: due agenti, solo il secondo agente esegue heartbeat.
Esempio di ore attive
Limita heartbeat alle ore lavorative in un fuso orario specifico:Configurazione 24/7
Se vuoi che heartbeat venga eseguito tutto il giorno, usa uno di questi schemi:- Ometti completamente
activeHours(nessuna limitazione di finestra temporale; questo è il comportamento predefinito). - Imposta una finestra di giornata intera:
activeHours: { start: "00:00", end: "24:00" }.
start e end (ad esempio 08:00 e 08:00).
Viene trattata come una finestra di ampiezza zero, quindi heartbeat viene sempre saltato.
Esempio multi-account
UsaaccountId per indirizzare un account specifico sui canali multi-account come Telegram:
Note sui campi
every: intervallo heartbeat (stringa durata; unità predefinita = minuti).model: override facoltativo del modello per le esecuzioni heartbeat (provider/model).includeReasoning: quando abilitato, consegna anche il messaggio separatoReasoning:quando disponibile (stessa forma di/reasoning on).lightContext: quando è true, le esecuzioni heartbeat usano un contesto bootstrap leggero e mantengono soloHEARTBEAT.mddai file bootstrap del workspace.isolatedSession: quando è true, ogni heartbeat viene eseguito in una nuova sessione senza cronologia della conversazione precedente. Usa lo stesso schema di isolamento del cronsessionTarget: "isolated". Riduce drasticamente il costo in token per heartbeat. Combinalo conlightContext: trueper il massimo risparmio. L’instradamento della consegna usa comunque il contesto della sessione principale.session: chiave di sessione facoltativa per le esecuzioni heartbeat.main(predefinita): sessione principale dell’agente.- Chiave di sessione esplicita (copiala da
openclaw sessions --jsono dalla CLI delle sessioni). - Formati delle chiavi di sessione: vedi Sessioni e Gruppi.
target:last: consegna all’ultimo canale esterno usato.- canale esplicito: qualsiasi canale configurato o id plugin, ad esempio
discord,matrix,telegramowhatsapp. none(predefinito): esegue heartbeat ma non effettua consegna esterna.
directPolicy: controlla il comportamento di consegna diretta/DM:allow(predefinito): consente la consegna heartbeat diretta/DM.block: sopprime la consegna diretta/DM (reason=dm-blocked).
to: override facoltativo del destinatario (id specifico del canale, ad es. E.164 per WhatsApp o un id chat Telegram). Per topic/thread Telegram, usa<chatId>:topic:<messageThreadId>.accountId: id account facoltativo per canali multi-account. Quandotarget: "last", l’id account si applica al canale risolto come ultimo se supporta account; altrimenti viene ignorato. Se l’id account non corrisponde a un account configurato per il canale risolto, la consegna viene saltata.prompt: sovrascrive il corpo del prompt predefinito (non viene unito).ackMaxChars: numero massimo di caratteri consentiti dopoHEARTBEAT_OKprima della consegna.suppressToolErrorWarnings: quando è true, sopprime i payload di avviso degli errori degli strumenti durante le esecuzioni heartbeat.activeHours: limita le esecuzioni heartbeat a una finestra temporale. Oggetto constart(HH:MM, inclusivo; usa00:00per l’inizio della giornata),end(HH:MM esclusivo;24:00consentito per la fine della giornata) etimezonefacoltativo.- Ometto o
"user": usa il tuoagents.defaults.userTimezonese impostato, altrimenti ripiega sul fuso orario del sistema host. "local": usa sempre il fuso orario del sistema host.- Qualsiasi identificatore IANA (ad es.
America/New_York): usato direttamente; se non valido, ripiega sul comportamento"user"sopra. starteendnon devono essere uguali per una finestra attiva; valori uguali sono trattati come ampiezza zero (sempre fuori dalla finestra).- Fuori dalla finestra attiva, heartbeat viene saltato fino al tick successivo all’interno della finestra.
- Ometto o
Comportamento della consegna
- Per impostazione predefinita, heartbeat viene eseguito nella sessione principale dell’agente (
agent:<id>:<mainKey>), oppureglobalquandosession.scope = "global". Impostasessionper sovrascrivere con una sessione di canale specifica (Discord/WhatsApp/ecc.). sessioninfluisce solo sul contesto di esecuzione; la consegna è controllata datargeteto.- Per consegnare a un canale/destinatario specifico, imposta
target+to. Contarget: "last", la consegna usa l’ultimo canale esterno per quella sessione. - Per impostazione predefinita, le consegne heartbeat consentono target diretti/DM. Imposta
directPolicy: "block"per sopprimere gli invii a target diretti pur continuando a eseguire il turno heartbeat. - Se la coda principale è occupata, heartbeat viene saltato e ritentato più tardi.
- Se
targetnon si risolve in alcuna destinazione esterna, l’esecuzione avviene comunque ma non viene inviato alcun messaggio in uscita. - Se
showOk,showAlertseuseIndicatorsono tutti disabilitati, l’esecuzione viene saltata in anticipo comereason=alerts-disabled. - Se è disabilitata solo la consegna degli avvisi, OpenClaw può comunque eseguire heartbeat, aggiornare i timestamp delle attività scadute, ripristinare il timestamp di inattività della sessione e sopprimere il payload di avviso verso l’esterno.
- Le risposte solo-heartbeat non mantengono attiva la sessione; l’ultimo
updatedAtviene ripristinato così che la scadenza per inattività si comporti normalmente. - Le attività in background scollegate possono accodare un evento di sistema e attivare heartbeat quando la sessione principale deve notare rapidamente qualcosa. Questa attivazione non fa diventare l’esecuzione heartbeat un’attività in background.
Controlli di visibilità
Per impostazione predefinita, gli ackHEARTBEAT_OK vengono soppressi mentre il contenuto degli avvisi
viene consegnato. Puoi regolare questo comportamento per canale o per account:
Cosa fa ogni flag
showOk: invia un ackHEARTBEAT_OKquando il modello restituisce una risposta composta solo da OK.showAlerts: invia il contenuto dell’avviso quando il modello restituisce una risposta diversa da OK.useIndicator: emette eventi indicatore per le superfici UI di stato.
Esempi per canale vs per-account
Schemi comuni
| Obiettivo | Configurazione |
|---|---|
| Comportamento predefinito (OK silenziosi, avvisi attivi) | (nessuna configurazione necessaria) |
| Completamente silenzioso (nessun messaggio, nessun indicatore) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| Solo indicatore (nessun messaggio) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| OK in un solo canale | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md (facoltativo)
Se nel workspace esiste un fileHEARTBEAT.md, il prompt predefinito dice all’agente
di leggerlo. Consideralo come il tuo “elenco di controllo heartbeat”: piccolo, stabile e
sicuro da includere ogni 30 minuti.
Se HEARTBEAT.md esiste ma è di fatto vuoto (solo righe vuote e intestazioni Markdown
come # Heading), OpenClaw salta l’esecuzione heartbeat per risparmiare chiamate API.
Questo salto viene riportato come reason=empty-heartbeat-file.
Se il file manca, heartbeat viene comunque eseguito e il modello decide cosa fare.
Mantienilo piccolo (breve elenco di controllo o promemoria) per evitare il gonfiore del prompt.
Esempio di HEARTBEAT.md:
Blocchi tasks:
HEARTBEAT.md supporta anche un piccolo blocco strutturato tasks: per
controlli basati su intervalli all’interno di heartbeat stesso.
Esempio:
- OpenClaw analizza il blocco
tasks:e controlla ogni attività rispetto al propriointerval. - Solo le attività scadute vengono incluse nel prompt heartbeat per quel tick.
- Se non ci sono attività scadute, heartbeat viene saltato completamente (
reason=no-tasks-due) per evitare una chiamata al modello sprecata. - Il contenuto non-task in
HEARTBEAT.mdviene conservato e aggiunto come contesto supplementare dopo l’elenco delle attività scadute. - I timestamp dell’ultima esecuzione delle attività vengono archiviati nello stato della sessione (
heartbeatTaskState), così gli intervalli sopravvivono ai normali riavvii. - I timestamp delle attività avanzano solo dopo che un’esecuzione heartbeat completa il normale percorso di risposta. Le esecuzioni saltate
empty-heartbeat-file/no-tasks-duenon segnano le attività come completate.
L’agente può aggiornare HEARTBEAT.md?
Sì — se glielo chiedi.HEARTBEAT.md è solo un normale file nel workspace dell’agente, quindi puoi dire
all’agente (in una chat normale) qualcosa come:
- “Aggiorna
HEARTBEAT.mdper aggiungere un controllo quotidiano del calendario.” - “Riscrivi
HEARTBEAT.mdin modo che sia più corto e focalizzato sui follow-up della posta in arrivo.”
HEARTBEAT.md — diventa parte del contesto del prompt.
Attivazione manuale (su richiesta)
Puoi accodare un evento di sistema e attivare immediatamente heartbeat con:heartbeat configurato, un’attivazione manuale esegue immediatamente ciascuno di quegli
heartbeat degli agenti.
Usa --mode next-heartbeat per attendere il tick pianificato successivo.
Consegna del reasoning (facoltativa)
Per impostazione predefinita, heartbeat consegna solo il payload finale della “risposta”. Se vuoi trasparenza, abilita:agents.defaults.heartbeat.includeReasoning: true
Reasoning: (stessa forma di /reasoning on). Questo può essere utile quando l’agente
gestisce più sessioni/codex e vuoi capire perché ha deciso di inviarti un ping
— ma può anche esporre più dettagli interni di quanto desideri. È preferibile lasciarlo
disattivato nelle chat di gruppo.
Consapevolezza dei costi
Heartbeat esegue turni completi dell’agente. Intervalli più brevi consumano più token. Per ridurre il costo:- Usa
isolatedSession: trueper evitare di inviare l’intera cronologia della conversazione (da ~100K token a ~2-5K per esecuzione). - Usa
lightContext: trueper limitare i file bootstrap al soloHEARTBEAT.md. - Imposta un
modelpiù economico (ad es.ollama/llama3.2:1b). - Mantieni
HEARTBEAT.mdpiccolo. - Usa
target: "none"se vuoi solo aggiornamenti di stato interni.
Correlati
- Automazione e attività — tutti i meccanismi di automazione a colpo d’occhio
- Attività in background — come viene tracciato il lavoro scollegato
- Fuso orario — come il fuso orario influisce sulla pianificazione heartbeat
- Risoluzione dei problemi — debug dei problemi di automazione