Heartbeat (Gateway)
Heartbeat ou Cron? Consulte Automation & Tasks para orientações sobre quando usar cada um.O 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 para você. O heartbeat é um turno agendado da sessão principal — ele não cria registros de tarefas em segundo plano. Registros de tarefas são para trabalho desacoplado (execuções ACP, subagentes, tarefas cron isoladas). Solução de problemas: Scheduled Tasks
Início rápido (iniciante)
- Deixe os heartbeats ativados (o padrão é
30m, ou1hpara autenticação OAuth/token da Anthropic, incluindo reutilização da Claude CLI) ou defina sua própria cadência. - Crie um pequeno checklist em
HEARTBEAT.mdou um blocotasks:no workspace do agente (opcional, mas recomendado). - Decida para onde as mensagens de heartbeat devem ir (
target: "none"é o padrão; definatarget: "last"para encaminhar ao último contato). - Opcional: ative a entrega do raciocínio do heartbeat para maior transparência.
- Opcional: use contexto de bootstrap leve se as execuções de heartbeat precisarem apenas de
HEARTBEAT.md. - Opcional: ative sessões isoladas para evitar enviar o histórico completo da conversa a cada heartbeat.
- Opcional: restrinja os heartbeats a horários ativos (hora local).
Padrões
- Intervalo:
30m(ou1hquando autenticação OAuth/token da Anthropic é o modo de autenticação detectado, incluindo reutilização da Claude CLI). Definaagents.defaults.heartbeat.everyou por agente emagents.list[].heartbeat.every; 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 literalmente como a mensagem do usuário. O prompt de sistema inclui uma seção “Heartbeat” e a execução é sinalizada internamente.
- Horários ativos (
heartbeat.activeHours) são verificados no fuso horário configurado. Fora da janela, os heartbeats são ignorados até o próximo tick dentro da janela.
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 enfileirado) e destacar qualquer coisa urgente.
- Check-in humano: “Checkup sometimes on your human during day time” incentiva uma mensagem leve ocasional do tipo “precisa de algo?”, mas evita spam noturno usando o fuso horário local configurado (consulte /concepts/timezone).
agents.defaults.heartbeat.prompt (ou
agents.list[].heartbeat.prompt) com um corpo personalizado (enviado literalmente).
Contrato de resposta
- Se nada precisar de atenção, responda com
HEARTBEAT_OK. - Durante execuções de heartbeat, o OpenClaw trata
HEARTBEAT_OKcomo um ack quando ele aparece no início ou no fim da resposta. O token é removido e a resposta é descartada se o conteúdo restante for ≤ackMaxChars(padrão: 300). - Se
HEARTBEAT_OKaparecer no meio de uma resposta, ele não é tratado de forma especial. - Para alertas, não inclua
HEARTBEAT_OK; retorne apenas o texto do alerta.
HEARTBEAT_OK solto no início/fim de uma mensagem é removido
e registrado em log; uma mensagem que seja apenas HEARTBEAT_OK é descartada.
Configuração
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 por canal.
Heartbeats por agente
Se qualquer entrada emagents.list[] incluir um bloco heartbeat, somente esses agentes
executarão 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.
Exemplo de horários ativos
Restrinja heartbeats ao horário comercial em um fuso horário específico:Configuração 24/7
Se você quiser que os heartbeats sejam executados o dia todo, use um destes padrões:- Omita
activeHourscompletamente (sem restrição de janela de tempo; esse é o comportamento padrão). - Defina uma janela de dia inteiro:
activeHours: { start: "00:00", end: "24:00" }.
start e end (por exemplo, 08:00 a 08:00).
Isso é tratado como uma janela de largura zero, então os heartbeats são sempre ignorados.
Exemplo com várias contas
UseaccountId para direcionar uma conta específica em canais com várias contas, como o Telegram:
Observações dos campos
every: intervalo do heartbeat (string de duração; unidade padrão = minutos).model: substituição opcional de modelo para execuções de heartbeat (provider/model).includeReasoning: quando ativado, também entrega a mensagem separadaReasoning:quando disponível (mesmo formato de/reasoning on).lightContext: quando true, execuções de heartbeat usam contexto de bootstrap leve e mantêm apenasHEARTBEAT.mddos arquivos de bootstrap do workspace.isolatedSession: quando true, cada heartbeat é executado em uma sessão nova sem histórico prévio da conversa. Usa o mesmo padrão de isolamento de cronsessionTarget: "isolated". Reduz drasticamente o custo em tokens por heartbeat. Combine comlightContext: truepara máxima economia. O roteamento de entrega ainda usa o contexto da sessão principal.session: chave 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 Sessions e Groups.
target:last: 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: controla o comportamento de entrega direta/DM:allow(padrão): permite entrega direta/DM de heartbeat.block: suprime entrega direta/DM (reason=dm-blocked).
to: substituição opcional do 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>.accountId: id de conta opcional para canais com várias contas. Quandotarget: "last", o id da conta se aplica ao último canal resolvido se ele oferecer 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.prompt: substitui o corpo de prompt padrão (não é mesclado).ackMaxChars: máximo de caracteres permitidos apósHEARTBEAT_OKantes da entrega.suppressToolErrorWarnings: quando true, suprime cargas de aviso de erro de ferramenta durante execuções de heartbeat.activeHours: restringe execuções de heartbeat a uma janela de tempo. Objeto comstart(HH:MM, inclusivo; use00:00para o início do dia),end(HH:MM exclusivo;24:00é permitido para o fim do dia) etimezoneopcional.- Omitido ou
"user": usa seuagents.defaults.userTimezonese estiver definido; caso contrário, usa o fuso horário do sistema host. "local": sempre usa o fuso horário do sistema host.- Qualquer identificador IANA (por exemplo,
America/New_York): usado diretamente; se for inválido, usa 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, os heartbeats são ignorados até o próximo tick dentro da janela.
- Omitido ou
Comportamento de entrega
- Por padrão, os heartbeats são executados na sessão principal do agente (
agent:<id>:<mainKey>), ou emglobalquandosession.scope = "global". Definasessionpara substituir por uma sessão específica de canal (Discord/WhatsApp/etc.). sessionafeta apenas o contexto da 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. - As entregas de heartbeat permitem destinos diretos/DM por padrão. Defina
directPolicy: "block"para suprimir envios para destinos diretos enquanto ainda executa o turno de heartbeat. - Se a fila principal estiver ocupada, o heartbeat é ignorado e tentado novamente mais tarde.
- Se
targetnão resolver para nenhum destino externo, a execução ainda acontece, mas nenhuma mensagem de saída é enviada. - Se
showOk,showAlertseuseIndicatorestiverem todos desativados, a execução é ignorada antecipadamente 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 externa do alerta.
- Respostas somente de heartbeat não mantêm a sessão ativa; o último
updatedAté restaurado para que a expiração por inatividade se comporte normalmente. - Tarefas em segundo plano desacopladas podem enfileirar um evento de sistema e despertar o heartbeat quando a sessão principal deve perceber algo rapidamente. Esse despertar não faz da execução do heartbeat uma tarefa em segundo plano.
Controles de visibilidade
Por padrão, confirmaçõesHEARTBEAT_OK são suprimidas enquanto conteúdo de alerta é
entregue. Você pode ajustar isso por canal ou por conta:
O que cada flag faz
showOk: envia uma confirmaçãoHEARTBEAT_OKquando o modelo retorna uma resposta apenas de OK.showAlerts: envia o conteúdo do alerta quando o modelo retorna uma resposta diferente de OK.useIndicator: emite eventos de indicador para superfícies de status da UI.
Exemplos por canal vs por conta
Padrões comuns
| Objetivo | Configuração |
|---|---|
| Comportamento padrão (OKs silenciosos, alertas ativos) | (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 existir um arquivoHEARTBEAT.md no workspace, o prompt padrão diz ao
agente para lê-lo. Pense nele como sua “lista de verificação de heartbeat”: pequena, estável e
segura para incluir a cada 30 minutos.
Se HEARTBEAT.md existir, mas estiver efetivamente vazio (apenas linhas em branco e cabeçalhos
Markdown como # Heading), o OpenClaw ignora a execução do 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 pequeno (checklist curto ou lembretes) para evitar inchaço do prompt.
Exemplo de HEARTBEAT.md:
Blocos tasks:
HEARTBEAT.md também oferece suporte a um pequeno bloco estruturado tasks: para
verificações baseadas em intervalo dentro do próprio heartbeat.
Exemplo:
- O OpenClaw analisa o bloco
tasks:e verifica cada tarefa em relação ao seu própriointerval. - Somente tarefas vencidas são incluídas no prompt de heartbeat daquele tick.
- Se nenhuma tarefa estiver vencida, o heartbeat é totalmente ignorado (
reason=no-tasks-due) para evitar uma chamada desperdiçada ao modelo. - Conteúdo fora das tarefas em
HEARTBEAT.mdé preservado e anexado como contexto adicional após a lista de tarefas vencidas. - Timestamps da última execução das tarefas são armazenados no estado da sessão (
heartbeatTaskState), de modo que os intervalos sobrevivem a reinicializações normais. - Os timestamps das tarefas só avançam após uma execução de heartbeat completar seu caminho normal de resposta. Execuções ignoradas por
empty-heartbeat-file/no-tasks-duenão marcam tarefas como concluídas.
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 do calendário.” - “Reescreva
HEARTBEAT.mdpara que fique mais curto e focado em acompanhamentos da caixa de entrada.”
HEARTBEAT.md — ele passa a fazer parte do contexto do prompt.
Despertar manual (sob demanda)
Você pode enfileirar um evento de sistema e acionar um heartbeat imediato com:heartbeat configurado, um despertar manual executará imediatamente os heartbeats de cada um desses agentes.
Use --mode next-heartbeat para aguardar o próximo tick agendado.
Entrega de raciocínio (opcional)
Por padrão, os heartbeats entregam apenas a carga final de “resposta”. Se você quiser transparência, ative:agents.defaults.heartbeat.includeReasoning: true
Reasoning: (mesmo formato de /reasoning on). Isso pode ser útil quando o agente
está gerenciando várias sessões/codexes e você quer ver por que ele decidiu chamar
sua atenção — mas também pode expor mais detalhes internos do que você deseja. Prefira manter isso
desativado em chats de grupo.
Consciência de custo
Heartbeats executam turnos completos do agente. Intervalos mais curtos consomem mais tokens. Para reduzir custo:- Use
isolatedSession: truepara evitar enviar o histórico completo da conversa (~100 mil tokens para ~2-5 mil por execução). - Use
lightContext: truepara limitar os arquivos de bootstrap apenas aHEARTBEAT.md. - Defina um
modelmais barato (por exemplo,ollama/llama3.2:1b). - Mantenha
HEARTBEAT.mdpequeno. - Use
target: "none"se quiser apenas atualizações de estado internas.
Relacionado
- Automation & Tasks — todos os mecanismos de automação em um relance
- Background Tasks — como o trabalho desacoplado é rastreado
- Timezone — como o fuso horário afeta o agendamento do heartbeat
- Troubleshooting — depuração de problemas de automação