Heartbeat (Gateway)
Heartbeat ou Cron? Consulte Automação e tarefas 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. Os registros de tarefa são para trabalho desacoplado (execuções ACP, subagentes, trabalhos cron isolados). Solução de problemas: Tarefas agendadas
Início rápido (iniciante)
- Deixe os heartbeats habilitados (o padrão é
30m, ou1hpara autenticação Anthropic OAuth/token, incluindo reutilização do Claude CLI) ou defina sua própria cadência. - Crie uma pequena 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: habilite a entrega de raciocínio do heartbeat para transparência.
- Opcional: use contexto de bootstrap leve se as execuções de heartbeat precisarem apenas de
HEARTBEAT.md. - Opcional: habilite sessões isoladas para evitar o envio de todo o histórico da conversa a cada heartbeat.
- Opcional: restrinja heartbeats a horários ativos (hora local).
Padrões
- Intervalo:
30m(ou1hquando o modo de autenticação detectado é Anthropic OAuth/token, incluindo reutilização do Claude CLI). Definaagents.defaults.heartbeat.everyouagents.list[].heartbeat.everypor agente; use0mpara desabilitar. - 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 mensagem do usuário. O prompt do sistema inclui uma seção “Heartbeat” apenas quando os heartbeats estão habilitados para o agente padrão e a execução é marcada internamente.
- Quando os heartbeats são desabilitados com
0m, execuções normais também omitemHEARTBEAT.mddo contexto de bootstrap para que o modelo não veja instruções exclusivas de heartbeat. - Os 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 pendentes (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 ocasional e leve do tipo “precisa de algo?”, mas evita spam noturno usando seu 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 perdido 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, apenas esses agentes executarão heartbeats.channels.defaults.heartbeatdefine os 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 emagents.list[] incluir um bloco heartbeat, apenas esses agentes
executarão heartbeats. O bloco por agente é mesclado sobre agents.defaults.heartbeat
(assim você pode definir padrões compartilhados uma vez e substituí-los por agente).
Exemplo: dois agentes, apenas o segundo executa heartbeats.
Exemplo de horários ativos
Restrinja os 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
activeHourspor completo (sem restrição de janela de tempo; este é 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:
Notas dos campos
every: intervalo do heartbeat (string de duração; unidade padrão = minutos).model: substituição opcional do modelo para execuções de heartbeat (provider/model).includeReasoning: quando habilitado, 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 nova sessão, sem histórico anterior da conversa. Usa o mesmo padrão de isolamento que cronsessionTarget: "isolated". Reduz drasticamente o custo de 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 do CLI de sessões). - Formatos de chave de sessão: consulte Sessões e Grupos.
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 de conta se aplica ao último canal resolvido se ele oferecer suporte a contas; caso contrário, é ignorado. Se o id de conta não corresponder a uma conta configurada para o canal resolvido, a entrega será ignorada.prompt: substitui o corpo do prompt padrão (não é mesclado).ackMaxChars: máximo de caracteres permitidos apósHEARTBEAT_OKantes da entrega.suppressToolErrorWarnings: quando true, suprime payloads 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 início do dia),end(HH:MM exclusivo;24:00permitido para fim do dia) etimezoneopcional.- Omitido ou
"user": usa seuagents.defaults.userTimezonese definido; caso contrário, recorre ao 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, recorre ao 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
- Os 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 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 a destinos diretos, mantendo a execução do turno de heartbeat. - Se a fila principal estiver ocupada, o heartbeat será 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 desabilitados, a execução será ignorada antecipadamente comoreason=alerts-disabled. - Se apenas a entrega de alertas estiver desabilitada, o OpenClaw ainda pode executar o heartbeat, atualizar timestamps de tarefas vencidas, restaurar o timestamp ocioso da sessão e suprimir o payload externo do alerta.
- Respostas exclusivas 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 do sistema e acordar o heartbeat quando a sessão principal precisar perceber algo rapidamente. Esse despertar não faz da execução de heartbeat uma tarefa em segundo plano.
Controles de visibilidade
Por padrão, os acksHEARTBEAT_OK são suprimidos, enquanto o conteúdo de alerta é
entregue. Você pode ajustar isso por canal ou por conta:
O que cada flag faz
showOk: envia um ackHEARTBEAT_OKquando o modelo retorna uma resposta somente com 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 ativados) | (nenhuma configuração necessária) |
| Totalmente silencioso (sem mensagens, sem indicador) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| Apenas indicador (sem mensagens) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| OKs apenas em um canal | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md (opcional)
Se um arquivoHEARTBEAT.md existir no workspace, o prompt padrão diz ao
agente para lê-lo. Pense nele como sua “checklist de heartbeat”: pequena, estável e
segura 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. Desabilitar 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.
Essa ignorada é relatada 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 curta 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. - Apenas tarefas vencidas são incluídas no prompt de heartbeat daquele tick.
- Se nenhuma tarefa estiver vencida, o heartbeat será totalmente ignorado (
reason=no-tasks-due) para evitar uma chamada desperdiçada ao modelo. - O conteúdo que não pertence a tarefas em
HEARTBEAT.mdé preservado e anexado como contexto adicional após a lista de tarefas vencidas. - Os timestamps da última execução da tarefa 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 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 agente pode atualizar HEARTBEAT.md?
Sim — se você pedir a ele.
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 se torna parte do contexto do prompt.
Despertar manual (sob demanda)
Você pode enfileirar um evento do 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 o payload final da “resposta”. Se você quiser transparência, habilite: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
notificar você — mas isso também pode expor mais detalhes internos do que você deseja. Prefira mantê-lo
desativado em chats em grupo.
Atenção ao custo
Os heartbeats executam turnos completos do agente. Intervalos menores consomem mais tokens. Para reduzir o custo:- Use
isolatedSession: truepara evitar enviar todo o histórico da conversa (~100K tokens para ~2-5K por execução). - Use
lightContext: truepara limitar os arquivos de bootstrap a apenasHEARTBEAT.md. - Defina um
modelmais barato (por exemploollama/llama3.2:1b). - Mantenha
HEARTBEAT.mdpequeno. - Use
target: "none"se quiser apenas atualizações internas de estado.
Relacionado
- Automação e tarefas — todos os mecanismos de automação em um só lugar
- Tarefas em segundo plano — como o trabalho desacoplado é rastreado
- Fuso horário — como o fuso horário afeta o agendamento de heartbeats
- Solução de problemas — depuração de problemas de automação