Gateway
Heartbeat
Heartbeat executa turnos periódicos do agente na sessão principal para que o modelo possa destacar qualquer coisa que precise de atenção sem enviar spam.
Heartbeat é um turno agendado da sessão principal — ele não cria registros de tarefa em segundo plano. Registros de tarefas são para trabalho separado (execuções ACP, subagentes, trabalhos Cron isolados).
Solução de problemas: Tarefas Agendadas
Início rápido (iniciante)
Escolha uma cadência
Deixe os heartbeats ativados (o padrão é 30m, ou 1h para autenticação Anthropic OAuth/token, incluindo reutilização da Claude CLI) ou defina sua própria cadência.
Adicione HEARTBEAT.md (opcional)
Crie uma pequena lista de verificação HEARTBEAT.md ou um bloco tasks: no workspace do agente.
Decida para onde as mensagens de heartbeat devem ir
target: "none" é o padrão; defina target: "last" para encaminhar para o último contato.
Ajuste opcional
- Ative a entrega de raciocínio do heartbeat para transparência.
- Use contexto de inicialização leve se as execuções de heartbeat precisarem apenas de
HEARTBEAT.md. - Ative sessões isoladas para evitar enviar todo o histórico da conversa a cada heartbeat.
- Restrinja heartbeats ao horário ativo (hora local).
Exemplo de configuração:
{
agents: {
defaults: {
heartbeat: {
every: "30m",
target: "last", // explicit delivery to last contact (default is "none")
directPolicy: "allow", // default: allow direct/DM targets; set "block" to suppress
lightContext: true, // optional: only inject HEARTBEAT.md from bootstrap files
isolatedSession: true, // optional: fresh session each run (no conversation history)
skipWhenBusy: true, // optional: also defer when subagent or nested lanes are busy
// activeHours: { start: "08:00", end: "24:00" },
// includeReasoning: true, // optional: send separate `Reasoning:` message too
},
},
},
}
Padrões
- Intervalo:
30m(ou1hquando autenticação Anthropic OAuth/token for o modo de autenticação detectado, incluindo reutilização da Claude CLI). Definaagents.defaults.heartbeat.everyouagents.list[].heartbeat.everypor agente; use0mpara desativar. - Corpo do prompt (configurável via
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. - O prompt de heartbeat é enviado verbatim como a mensagem do usuário. O prompt do sistema inclui uma seção "Heartbeat" somente quando heartbeats estão ativados para o agente padrão, e a execução é sinalizada internamente.
- Quando heartbeats são desativados com
0m, execuções normais também omitemHEARTBEAT.mddo contexto de inicialização para que o modelo não veja instruções exclusivas de heartbeat. - O horário ativo (
heartbeat.activeHours) é verificado no fuso horário configurado. Fora da janela, heartbeats são ignorados até o próximo tick dentro da janela. - Heartbeats são adiados automaticamente enquanto trabalho Cron está ativo ou na fila. Defina
heartbeat.skipWhenBusy: truepara adiar também em vias ocupadas extras (subagente ou trabalho de comando aninhado); isso é útil para Ollama local e outros hosts de runtime único restritos.
Para que serve o prompt de heartbeat
O prompt padrão é intencionalmente amplo:
- Tarefas em segundo plano: "Consider outstanding tasks" incentiva o agente a revisar acompanhamentos (caixa de entrada, calendário, lembretes, trabalho na fila) e destacar qualquer coisa urgente.
- Check-in humano: "Checkup sometimes on your human during day time" incentiva uma mensagem leve ocasional de "precisa de algo?", mas evita spam noturno usando seu fuso horário local configurado (consulte Fuso horário).
Heartbeat pode reagir a tarefas em segundo plano concluídas, mas uma execução de heartbeat em si não cria um registro de tarefa.
Se você quiser que um heartbeat faça algo muito específico (por exemplo, "verificar estatísticas do Gmail PubSub" ou "verificar a integridade do Gateway"), defina agents.defaults.heartbeat.prompt (ou agents.list[].heartbeat.prompt) para um corpo personalizado (enviado verbatim).
Contrato de resposta
- Se nada precisar de atenção, responda com
HEARTBEAT_OK. - Execuções de heartbeat com suporte a ferramentas podem chamar
heartbeat_respondcomnotify: falsepara nenhuma atualização visível, ounotify: truemaisnotificationTextpara um alerta. Quando presente, a resposta estruturada da ferramenta tem precedência sobre o fallback de texto. - Durante execuções de heartbeat, o OpenClaw trata
HEARTBEAT_OKcomo uma confirmação quando aparece no início ou fim da resposta. O token é removido e a resposta é descartada se o conteúdo restante tiver ≤ackMaxChars(padrão: 300). - Se
HEARTBEAT_OKaparecer no meio de uma resposta, ele não recebe tratamento especial. - Para alertas, não inclua
HEARTBEAT_OK; retorne apenas o texto do alerta.
Fora dos heartbeats, um HEARTBEAT_OK solto no início/fim de uma mensagem é removido e registrado em log; uma mensagem que contém apenas HEARTBEAT_OK é descartada.
Configuração
{
agents: {
defaults: {
heartbeat: {
every: "30m", // default: 30m (0m disables)
model: "anthropic/claude-opus-4-6",
includeReasoning: false, // default: false (deliver separate Reasoning: message when available)
lightContext: false, // default: false; true keeps only HEARTBEAT.md from workspace bootstrap files
isolatedSession: false, // default: false; true runs each heartbeat in a fresh session (no conversation history)
skipWhenBusy: false, // default: false; true also waits for subagent/nested lanes
target: "last", // default: none | options: last | none | <channel id> (core or plugin, e.g. "bluebubbles")
to: "+15551234567", // optional channel-specific override
accountId: "ops-bot", // optional multi-account channel id
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.",
ackMaxChars: 300, // max chars allowed after HEARTBEAT_OK
},
},
},
}
Escopo e precedência
agents.defaults.heartbeatdefine o comportamento global de heartbeat.agents.list[].heartbeaté mesclado por cima; se qualquer agente tiver um blocoheartbeat, somente esses agentes executam heartbeats.channels.defaults.heartbeatdefine padrões de visibilidade para todos os canais.channels.<channel>.heartbeatsubstitui os padrões do canal.channels.<channel>.accounts.<id>.heartbeat(canais com várias contas) substitui as configurações por canal.
Heartbeats por agente
Se qualquer entrada agents.list[] incluir um bloco heartbeat, somente esses agentes executam heartbeats. O bloco por agente é mesclado por cima de agents.defaults.heartbeat (assim você pode definir padrões compartilhados uma vez e substituir por agente).
Exemplo: dois agentes, apenas o segundo agente executa heartbeats.
{
agents: {
defaults: {
heartbeat: {
every: "30m",
target: "last", // explicit delivery to last contact (default is "none")
},
},
list: [
{ id: "main", default: true },
{
id: "ops",
heartbeat: {
every: "1h",
target: "whatsapp",
to: "+15551234567",
timeoutSeconds: 45,
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.",
},
},
],
},
}
Exemplo de horário ativo
Restrinja heartbeats ao horário comercial em um fuso horário específico:
{
agents: {
defaults: {
heartbeat: {
every: "30m",
target: "last", // explicit delivery to last contact (default is "none")
activeHours: {
start: "09:00",
end: "22:00",
timezone: "America/New_York", // optional; uses your userTimezone if set, otherwise host tz
},
},
},
},
}
Fora desta janela (antes das 9h ou depois das 22h no horário do Leste), heartbeats são ignorados. O próximo tick agendado dentro da janela será executado normalmente.
Configuração 24/7
Se quiser que heartbeats sejam executados o dia todo, use um destes padrões:
- Omita
activeHourscompletamente (sem restrição de janela de horário; este é o comportamento padrão). - Defina uma janela de dia inteiro:
activeHours: { start: "00:00", end: "24:00" }.
Exemplo com várias contas
Use accountId para direcionar uma conta específica em canais com várias contas, como Telegram:
{
agents: {
list: [
{
id: "ops",
heartbeat: {
every: "1h",
target: "telegram",
to: "12345678:topic:42", // optional: route to a specific topic/thread
accountId: "ops-bot",
},
},
],
},
channels: {
telegram: {
accounts: {
"ops-bot": { botToken: "YOUR_TELEGRAM_BOT_TOKEN" },
},
},
},
}
Observações de campos
everystringIntervalo do Heartbeat (string de duração; unidade padrão = minutos).
modelstringSubstituição opcional de modelo para execuções de heartbeat (provider/model).
includeReasoningbooleanQuando ativado, também entrega a mensagem Reasoning: separada quando disponível (mesmo formato de /reasoning on).
lightContextbooleanQuando true, execuções de heartbeat usam contexto de inicialização leve e mantêm apenas HEARTBEAT.md dos arquivos de inicialização do workspace.
isolatedSessionbooleanQuando true, cada heartbeat é executado em uma sessão nova, sem histórico de conversa anterior. Usa o mesmo padrão de isolamento que Cron sessionTarget: "isolated". Reduz drasticamente o custo de tokens por heartbeat. Combine com lightContext: true para economia máxima. O roteamento de entrega ainda usa o contexto da sessão principal.
skipWhenBusybooleanQuando true, execuções de heartbeat são adiadas em vias ocupadas extras: subagente ou trabalho de comando aninhado. As vias de Cron sempre adiam heartbeats, mesmo sem esta flag, para que hosts de modelos locais não executem prompts de Cron e heartbeat ao mesmo tempo.
sessionstringChave de sessão opcional para execuções de heartbeat.
main(padrão): sessão principal do agente.- Chave de sessão explícita (copie de
openclaw sessions --jsonou da CLI de sessões). - Formatos de chave de sessão: consulte Sessões e Grupos.
targetstringlast: entrega ao último canal externo usado.- canal explícito: qualquer canal configurado ou id de Plugin, por exemplo
discord,matrix,telegramouwhatsapp. none(padrão): executa o heartbeat, mas não entrega externamente.
directPolicy"allow" | "block"Controla o comportamento de entrega direta/DM. allow: permite entrega direta/DM de heartbeat. block: suprime entrega direta/DM (reason=dm-blocked).
tostringSubstituição opcional de destinatário (id específico do canal, por exemplo E.164 para WhatsApp ou um id de chat do Telegram). Para tópicos/threads do Telegram, use <chatId>:topic:<messageThreadId>.
accountIdstringId de conta opcional para canais com várias contas. Quando target: "last", o id da conta se aplica ao último canal resolvido se ele der suporte a contas; caso contrário, é ignorado. Se o id da conta não corresponder a uma conta configurada para o canal resolvido, a entrega será ignorada.
promptstringSubstitui o corpo do prompt padrão (não é mesclado).
ackMaxCharsnumberMáximo de caracteres permitidos após HEARTBEAT_OK antes da entrega.
suppressToolErrorWarningsbooleanQuando verdadeiro, suprime cargas de aviso de erro de ferramenta durante execuções de Heartbeat.
activeHoursobjectRestringe execuções de Heartbeat a uma janela de tempo. Objeto com start (HH:MM, inclusivo; use 00:00 para início do dia), end (HH:MM exclusivo; 24:00 permitido para fim do dia) e timezone opcional.
- Omitido ou
"user": usa seuagents.defaults.userTimezonese definido; caso contrário, usa o fuso horário do sistema host como fallback. "local": sempre usa o fuso horário do sistema host.- Qualquer identificador IANA (por exemplo,
America/New_York): usado diretamente; se inválido, usa como fallback o comportamento"user"acima. starteendnão devem ser iguais para uma janela ativa; valores iguais são tratados como largura zero (sempre fora da janela).- Fora da janela ativa, heartbeats são ignorados até o próximo tick dentro da janela.
Comportamento de entrega
Roteamento de sessão e destino
- Heartbeats são executados na sessão principal do agente por padrão (
agent:<id>:<mainKey>), ou emglobalquandosession.scope = "global". Definasessionpara substituir por uma sessão de canal específica (Discord/WhatsApp/etc.). sessionafeta apenas o contexto de execução; a entrega é controlada portargeteto.- Para entregar a um canal/destinatário específico, defina
target+to. Comtarget: "last", a entrega usa o último canal externo dessa sessão. - Entregas de Heartbeat permitem destinos diretos/DM por padrão. Defina
directPolicy: "block"para suprimir envios a destinos diretos enquanto ainda executa o turno de Heartbeat. - Se a fila principal, a faixa da sessão de destino, a faixa de Cron ou um trabalho de Cron ativo estiver ocupado, o Heartbeat será ignorado e tentado novamente mais tarde.
- Se
skipWhenBusy: true, subagentes e faixas aninhadas também adiam execuções de Heartbeat. - Se
targetnão resolver para nenhum destino externo, a execução ainda acontece, mas nenhuma mensagem de saída é enviada.
Visibilidade e comportamento de salto
- Se
showOk,showAlertseuseIndicatorestiverem todos desativados, a execução é ignorada de início comoreason=alerts-disabled. - Se apenas a entrega de alertas estiver desativada, o OpenClaw ainda pode executar o Heartbeat, atualizar timestamps de tarefas vencidas, restaurar o timestamp de inatividade da sessão e suprimir a carga de alerta externa.
- Se o destino de Heartbeat resolvido der suporte a digitação, o OpenClaw mostra digitação enquanto a execução de Heartbeat está ativa. Isso usa o mesmo destino para o qual o Heartbeat enviaria a saída do chat, e é desativado por
typingMode: "never".
Ciclo de vida da sessão e auditoria
- Respostas somente de Heartbeat não mantêm a sessão viva. Metadados de Heartbeat podem atualizar a linha da sessão, mas a expiração por inatividade usa
lastInteractionAtda última mensagem real de usuário/canal, e a expiração diária usasessionStartedAt. - O histórico da Control UI e do WebChat oculta prompts de Heartbeat e confirmações somente OK. A transcrição da sessão subjacente ainda pode conter esses turnos para auditoria/reprodução.
- Tarefas em segundo plano destacadas podem enfileirar um evento do sistema e acordar o Heartbeat quando a sessão principal deve perceber algo rapidamente. Esse despertar não faz a execução de Heartbeat virar uma tarefa em segundo plano.
Controles de visibilidade
Por padrão, confirmações HEARTBEAT_OK são suprimidas enquanto o conteúdo de alerta é entregue. Você pode ajustar isso por canal ou por conta:
channels:
defaults:
heartbeat:
showOk: false # Hide HEARTBEAT_OK (default)
showAlerts: true # Show alert messages (default)
useIndicator: true # Emit indicator events (default)
telegram:
heartbeat:
showOk: true # Show OK acknowledgments on Telegram
whatsapp:
accounts:
work:
heartbeat:
showAlerts: false # Suppress alert delivery for this account
Precedência: por conta → por canal → padrões do canal → padrões embutidos.
O que cada flag faz
showOk: envia uma confirmaçãoHEARTBEAT_OKquando o modelo retorna uma resposta somente OK.showAlerts: envia o conteúdo do alerta quando o modelo retorna uma resposta que não é OK.useIndicator: emite eventos de indicador para superfícies de status da UI.
Se todos os três forem falsos, o OpenClaw ignora completamente a execução de Heartbeat (sem chamada ao modelo).
Exemplos por canal vs por conta
channels:
defaults:
heartbeat:
showOk: false
showAlerts: true
useIndicator: true
slack:
heartbeat:
showOk: true # all Slack accounts
accounts:
ops:
heartbeat:
showAlerts: false # suppress alerts for the ops account only
telegram:
heartbeat:
showOk: true
Padrões comuns
| Objetivo | Configuração |
|---|---|
| Comportamento padrão (OKs silenciosos, alertas ativados) | (nenhuma configuração necessária) |
| Totalmente silencioso (sem mensagens, sem indicador) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| Somente indicador (sem mensagens) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| OKs em apenas um canal | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md (opcional)
Se um arquivo HEARTBEAT.md existir no workspace, o prompt padrão instrui o agente a lê-lo. Pense nele como sua "checklist de heartbeat": pequeno, estável e seguro para incluir a cada 30 minutos.
Em execuções normais, HEARTBEAT.md só é injetado quando a orientação de Heartbeat está habilitada para o agente padrão. Desativar a cadência de Heartbeat com 0m ou definir includeSystemPromptSection: false o omite do contexto normal de bootstrap.
Se HEARTBEAT.md existir, mas estiver efetivamente vazio (apenas linhas em branco e cabeçalhos markdown como # Heading), o OpenClaw ignora a execução de Heartbeat para economizar chamadas de API. Esse salto é relatado como reason=empty-heartbeat-file. Se o arquivo estiver ausente, o Heartbeat ainda é executado e o modelo decide o que fazer.
Mantenha-o minúsculo (checklist curta ou lembretes) para evitar inchaço de prompt.
Exemplo de HEARTBEAT.md:
# Heartbeat checklist
- Quick scan: anything urgent in inboxes?
- If it's daytime, do a lightweight check-in if nothing else is pending.
- If a task is blocked, write down _what is missing_ and ask Peter next time.
Blocos tasks:
HEARTBEAT.md também dá suporte a um pequeno bloco estruturado tasks: para verificações baseadas em intervalo dentro do próprio Heartbeat.
Exemplo:
tasks:
- name: inbox-triage
interval: 30m
prompt: "Check for urgent unread emails and flag anything time sensitive."
- name: calendar-scan
interval: 2h
prompt: "Check for upcoming meetings that need prep or follow-up."
# Additional instructions
- Keep alerts short.
- If nothing needs attention after all due tasks, reply HEARTBEAT_OK.
Comportamento
- O OpenClaw analisa o bloco
tasks:e verifica cada tarefa em relação ao seu própriointerval. - Apenas tarefas vencidas são incluídas no prompt de Heartbeat desse tick.
- Se nenhuma tarefa estiver vencida, o Heartbeat é completamente ignorado (
reason=no-tasks-due) para evitar uma chamada desperdiçada ao modelo. - Conteúdo que não é tarefa em
HEARTBEAT.mdé preservado e anexado como contexto adicional após a lista de tarefas vencidas. - Timestamps da última execução da tarefa são armazenados no estado da sessão (
heartbeatTaskState), então intervalos sobrevivem a reinicializações normais. - Timestamps de tarefas só avançam depois que uma execução de Heartbeat conclui seu caminho normal de resposta. Execuções ignoradas por
empty-heartbeat-file/no-tasks-duenão marcam tarefas como concluídas.
O modo de tarefa é útil quando você quer que um arquivo de heartbeat contenha várias verificações periódicas sem pagar por todas elas a cada tick.
O agente pode atualizar HEARTBEAT.md?
Sim — se você pedir.
HEARTBEAT.md é apenas um arquivo normal no workspace do agente, então você pode dizer ao agente (em um chat normal) algo como:
- "Atualize
HEARTBEAT.mdpara adicionar uma verificação diária de calendário." - "Reescreva
HEARTBEAT.mdpara que fique mais curto e focado em acompanhamentos da caixa de entrada."
Se quiser que isso aconteça proativamente, você também pode incluir uma linha explícita no seu prompt de Heartbeat, como: "Se a checklist ficar desatualizada, atualize HEARTBEAT.md com uma melhor."
Despertar manual (sob demanda)
Você pode enfileirar um evento do sistema e acionar um Heartbeat imediato com:
openclaw system event --text "Check for urgent follow-ups" --mode now
Se vários agentes tiverem heartbeat configurado, um despertar manual executa imediatamente cada um desses Heartbeats de agente.
Use --mode next-heartbeat para esperar pelo próximo tick agendado.
Entrega de raciocínio (opcional)
Por padrão, Heartbeats entregam apenas a carga final de "resposta".
Se quiser transparência, habilite:
agents.defaults.heartbeat.includeReasoning: true
Quando habilitado, Heartbeats também entregarão uma mensagem separada prefixada com Reasoning: (mesmo formato que /reasoning on). Isso pode ser útil quando o agente está gerenciando várias sessões/codexes e você quer ver por que ele decidiu enviar um ping — mas também pode vazar mais detalhes internos do que você deseja. Prefira mantê-lo desativado em chats em grupo.
Consciência de custo
Heartbeats executam turnos completos de agente. Intervalos mais curtos consomem mais tokens. Para reduzir custo:
- Use
isolatedSession: truepara evitar enviar o histórico completo da conversa (~100K tokens para ~2-5K por execução). - Use
lightContext: truepara limitar arquivos de bootstrap apenas aHEARTBEAT.md. - Defina um
modelmais barato (por exemplo,ollama/llama3.2:1b). - Mantenha
HEARTBEAT.mdpequeno. - Use
target: "none"se você quiser apenas atualizações de estado interno.
Estouro de contexto após Heartbeat
Se um Heartbeat anteriormente deixou uma sessão existente em um modelo local menor, por exemplo um modelo Ollama com uma janela de 32k, e o próximo turno da sessão principal relatar estouro de contexto, redefina o modelo de runtime da sessão de volta para o modelo primário configurado. A mensagem de redefinição do OpenClaw destaca isso quando o último modelo de runtime corresponde ao heartbeat.model configurado.
Heartbeats atuais preservam o modelo de runtime existente da sessão compartilhada depois que a execução é concluída. Você ainda pode usar isolatedSession: true para executar Heartbeats em uma nova sessão, combiná-lo com lightContext: true para o menor prompt ou escolher um modelo de Heartbeat com uma janela de contexto grande o suficiente para a sessão compartilhada.
Relacionado
- Automação e tarefas — todos os mecanismos de automação em resumo
- Tarefas em segundo plano — como o trabalho destacado é rastreado
- Fuso horário — como o fuso horário afeta o agendamento de Heartbeat
- Solução de problemas — depuração de problemas de automação