Heartbeat (Gateway)
Heartbeat o cron? Consulta 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 inviarti spam. Heartbeat è un turno pianificato della sessione principale — non crea record di attività in background. I record delle attività sono per lavoro separato (esecuzioni ACP, subagenti, job cron isolati). Risoluzione dei problemi: Attività pianificate
Avvio rapido (principianti)
- Lascia gli heartbeat abilitati (il valore predefinito è
30m, oppure1hper l’autenticazione Anthropic OAuth/token, incluso il riutilizzo della Claude CLI) oppure imposta una tua cadenza. - Crea una piccola checklist
HEARTBEAT.mdo un bloccotasks:nello spazio di lavoro dell’agente (facoltativo ma consigliato). - Decidi dove devono andare i messaggi heartbeat (
target: "none"è il valore predefinito; impostatarget: "last"per instradare verso l’ultimo contatto). - Facoltativo: abilita la consegna del ragionamento 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 gli heartbeat alle ore attive (ora locale).
Valori predefiniti
- Intervallo:
30m(oppure1hquando la modalità di autenticazione rilevata è Anthropic OAuth/token, incluso il riutilizzo della Claude CLI). Impostaagents.defaults.heartbeat.everyoppureagents.list[].heartbeat.every; 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 verbatim come messaggio utente. Il prompt di sistema include una sezione “Heartbeat” solo quando gli heartbeat sono abilitati per l’agente predefinito e l’esecuzione è contrassegnata internamente.
- Quando gli heartbeat sono disabilitati con
0m, anche le esecuzioni normali omettonoHEARTBEAT.mddal contesto bootstrap, così il modello non vede istruzioni solo-heartbeat. - Le ore attive (
heartbeat.activeHours) vengono controllate nel fuso orario configurato. Fuori dalla finestra, gli heartbeat vengono saltati 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 in sospeso (posta in arrivo, calendario, promemoria, lavoro in coda) e a far emergere ciò che è urgente.
- Check-in con la persona: “Checkup sometimes on your human during day time” incoraggia un occasionale messaggio leggero del tipo “ti serve qualcosa?”, ma evita spam notturno usando il tuo fuso orario locale configurato (vedi /concepts/timezone).
agents.defaults.heartbeat.prompt (oppure agents.list[].heartbeat.prompt) su un corpo personalizzato (inviato verbatim).
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 scartata 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 isolato all’inizio/fine di un messaggio viene rimosso e registrato nel log; un messaggio che contiene solo HEARTBEAT_OK viene scartato.
Configurazione
Ambito e precedenza
agents.defaults.heartbeatimposta il comportamento heartbeat globale.agents.list[].heartbeatviene unito sopra; se un 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 per canale.
Heartbeat per agente
Se una voceagents.list[] include un blocco heartbeat, solo quegli agenti
eseguono heartbeat. Il blocco per agente viene unito sopra agents.defaults.heartbeat
(quindi puoi impostare una volta i valori condivisi e sovrascriverli per agente).
Esempio: due agenti, solo il secondo agente esegue heartbeat.
Esempio di ore attive
Limita gli heartbeat alle ore lavorative in un fuso orario specifico:Configurazione 24/7
Se vuoi che gli heartbeat vengano eseguiti tutto il giorno, usa uno di questi modelli:- Ometti completamente
activeHours(nessuna limitazione della finestra oraria; questo è il comportamento predefinito). - Imposta una finestra di un’intera giornata:
activeHours: { start: "00:00", end: "24:00" }.
start e end (ad esempio 08:00 e 08:00).
Questo viene trattato come una finestra di larghezza zero, quindi gli heartbeat vengono sempre saltati.
Esempio multi-account
UsaaccountId per puntare a un account specifico su 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 dello spazio di lavoro.isolatedSession: quando è true, ogni heartbeat viene eseguito in una nuova sessione senza cronologia di conversazione precedente. Usa lo stesso schema di isolamento di 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(predefinito): sessione principale dell’agente.- Chiave di sessione esplicita (copiala da
openclaw sessions --jsono dalla CLI sessions). - Formati della chiave di sessione: vedi Sessioni e Gruppi.
target:last: consegna all’ultimo canale esterno usato.- canale esplicito: qualunque canale configurato o id plugin, ad esempio
discord,matrix,telegramowhatsapp. none(predefinito): esegue l’heartbeat ma non consegna all’esterno.
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 esempio E.164 per WhatsApp o un chat id 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 last risolto se supporta gli 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 errore degli strumenti durante le esecuzioni heartbeat.activeHours: limita le esecuzioni heartbeat a una finestra temporale. Oggetto constart(HH:MM, inclusivo; usa00:00per l’inizio del giorno),end(HH:MM, esclusivo;24:00consentito per la fine del giorno) etimezonefacoltativo.- Omitto oppure
"user": usaagents.defaults.userTimezonese impostato, altrimenti ripiega sul fuso orario del sistema host. "local": usa sempre il fuso orario del sistema host.- Qualsiasi identificatore IANA (ad esempio
America/New_York): viene usato direttamente; se non valido, ripiega sul comportamento"user"sopra. starteendnon devono essere uguali per una finestra attiva; valori uguali vengono trattati come larghezza zero (sempre fuori dalla finestra).- Fuori dalla finestra attiva, gli heartbeat vengono saltati fino al tick successivo all’interno della finestra.
- Omitto oppure
Comportamento di consegna
- Gli heartbeat vengono eseguiti nella sessione principale dell’agente per impostazione predefinita (
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. - Le consegne heartbeat consentono per impostazione predefinita destinazioni dirette/DM. Imposta
directPolicy: "block"per sopprimere gli invii verso destinazioni dirette continuando comunque a eseguire il turno heartbeat. - Se la coda principale è occupata, l’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 subito conreason=alerts-disabled. - Se è disabilitata solo la consegna degli avvisi, OpenClaw può comunque eseguire l’heartbeat, aggiornare i timestamp delle attività in scadenza, ripristinare il timestamp di inattività della sessione e sopprimere il payload dell’avviso verso l’esterno.
- Le risposte solo-heartbeat non mantengono attiva la sessione; l’ultimo
updatedAtviene ripristinato così la scadenza per inattività si comporta normalmente. - Le attività in background separate possono accodare un evento di sistema e risvegliare l’heartbeat quando la sessione principale deve notare rapidamente qualcosa. Questo risveglio non fa sì che l’heartbeat esegua un’attività in background.
Controlli di visibilità
Per impostazione predefinita, i riconoscimentiHEARTBEAT_OK vengono soppressi mentre il contenuto degli avvisi viene
consegnato. Puoi regolarlo per canale o per account:
Cosa fa ciascun flag
showOk: invia un riconoscimentoHEARTBEAT_OKquando il modello restituisce una risposta composta solo da OK.showAlerts: invia il contenuto dell’avviso quando il modello restituisce una risposta non-OK.useIndicator: emette eventi indicatore per le superfici di stato dell’interfaccia.
Esempi per canale e 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 file HEARTBEAT.md, il prompt predefinito indica all’agente di
leggerlo. Consideralo come la tua “checklist heartbeat”: piccola, stabile e
sicura da includere ogni 30 minuti.
Nelle esecuzioni normali, HEARTBEAT.md viene iniettato solo quando la guida heartbeat è
abilitata per l’agente predefinito. Disabilitare la cadenza heartbeat con 0m o
impostare includeSystemPromptSection: false lo omette dal contesto bootstrap
normale.
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, l’heartbeat viene comunque eseguito e il modello decide cosa fare.
Mantienilo piccolo (checklist breve o promemoria) per evitare di appesantire il prompt.
Esempio di HEARTBEAT.md:
Blocchi tasks:
HEARTBEAT.md supporta anche un piccolo blocco strutturato tasks: per controlli basati su intervalli
all’interno dello stesso heartbeat.
Esempio:
- OpenClaw analizza il blocco
tasks:e controlla ogni attività rispetto al propriointerval. - Solo le attività in scadenza vengono incluse nel prompt heartbeat per quel tick.
- Se non ci sono attività in scadenza, l’heartbeat viene saltato interamente (
reason=no-tasks-due) per evitare una chiamata al modello sprecata. - Il contenuto non-task in
HEARTBEAT.mdviene preservato e aggiunto come contesto supplementare dopo l’elenco delle attività in scadenza. - I timestamp dell’ultima esecuzione delle attività vengono salvati nello stato della sessione (
heartbeatTaskState), così gli intervalli sopravvivono ai normali riavvii. - I timestamp delle attività vengono avanzati solo dopo che un’esecuzione heartbeat completa il proprio normale percorso di risposta. Le esecuzioni saltate
empty-heartbeat-file/no-tasks-duenon contrassegnano le attività come completate.
L’agente può aggiornare HEARTBEAT.md?
Sì — se glielo chiedi.
HEARTBEAT.md è semplicemente un file normale nel workspace dell’agente, quindi puoi dire
all’agente (in una chat normale) qualcosa come:
- “Aggiorna
HEARTBEAT.mdper aggiungere un controllo giornaliero del calendario.” - “Riscrivi
HEARTBEAT.mdin modo che sia più corto e focalizzato sui follow-up della posta in arrivo.”
HEARTBEAT.md — entra a far parte del contesto del prompt.
Risveglio manuale (su richiesta)
Puoi accodare un evento di sistema e attivare un heartbeat immediato con:heartbeat configurato, un risveglio manuale esegue immediatamente gli
heartbeat di ciascuno di quegli agenti.
Usa --mode next-heartbeat per attendere il prossimo tick pianificato.
Consegna del ragionamento (facoltativa)
Per impostazione predefinita, gli heartbeat consegnano 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 vedere perché ha deciso di inviarti un ping
— ma può anche esporre più dettagli interni di quanto desideri. È preferibile lasciarlo
disattivato nelle chat di gruppo.
Attenzione ai costi
Gli heartbeat eseguono 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 (~100K token fino a ~2-5K per esecuzione). - Usa
lightContext: trueper limitare i file bootstrap al soloHEARTBEAT.md. - Imposta un
modelpiù economico (ad esempioollama/llama3.2:1b). - Mantieni piccolo
HEARTBEAT.md. - 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 separato
- Fuso orario — come il fuso orario influisce sulla pianificazione heartbeat
- Risoluzione dei problemi — debug dei problemi di automazione