Pular para conteúdo

Heartbeat no OpenClaw: monitoramento automático com custo zero

Categoria Tutorial

Você configurou o OpenClaw, saiu para almoçar, e quando voltou o CI estava quebrado faz duas horas. Ninguém avisou. Seu agente estava ali o tempo todo — mas esperando você perguntar.

O heartbeat resolve exatamente isso: o agente faz rondas periódicas e avisa quando encontra algo fora do lugar, sem precisar de intervenção sua.


O queComoCusto
Heartbeat (batimento — uma checagem periódica para saber se o sistema está vivo) padrão (30 min)Já vem habilitadoTokens (unidades de texto processadas) do modelo principal
Heartbeat com modelo gratuitomodel: "openrouter/nvidia/nemotron-3-super-120b-a12b:free"R$ 0
Heartbeat silenciosotarget: "none"Só roda internamente
Heartbeat com alerta no Telegramtarget: "telegram" + to: "chat_id"Modelo + Telegram grátis

O que é heartbeat

Pense num vigia noturno. A cada meia hora ele percorre o prédio, verifica cada porta, olha cada corredor. Se tudo está em ordem, anota no registro: HEARTBEAT_OK. Se encontra uma janela aberta, aciona o responsável. Ele não fica na guarita esperando alguém ligar — vai lá checar por conta própria.

O heartbeat do OpenClaw funciona assim. A cada intervalo configurado, o agente “acorda”, executa o checklist do HEARTBEAT.md, e decide sozinho se precisa mandar um alerta ou só registrar que está tudo bem.

timer dispara


lê HEARTBEAT.md


checa cada item

    ├── tudo ok ──→ HEARTBEAT_OK (silenciado)
    │                     │
    └── algo urgente ──→ alerta pro canal configurado

                              └── dorme → repete no próximo ciclo

Como funciona por baixo

A cada intervalo definido em every, o OpenClaw injeta o prompt do heartbeat na sessão (a conversa ativa entre você e o agente) principal do agente. O agente lê o arquivo HEARTBEAT.md na raiz do projeto — se ele existir — e segue as instruções ali descritas.

Se nada precisa de atenção, o agente responde HEARTBEAT_OK. Essa resposta fica oculta por padrão: ninguém vê, nenhuma notificação chega, nenhum log aparece no chat. Só é registrado internamente.

Se algo precisa de atenção, o agente envia uma mensagem para o canal configurado — Telegram, WhatsApp, ou qualquer outro suportado. A mensagem chega com contexto suficiente para você entender o que está acontecendo sem precisar abrir o terminal (a tela preta onde você digita comandos).

Um detalhe importante: se o HEARTBEAT.md estiver vazio ou ausente, o ciclo é pulado inteiramente. Nenhuma chamada ao modelo é feita. Você só paga (ou consome cota) quando tem instruções reais configuradas.


O truque do custo zero — modelo gratuito via OpenRouter

O heartbeat não precisa de um modelo poderoso. A tarefa é simples: ler um checklist curto, verificar condições de contexto e decidir se há algo urgente. Não tem geração criativa, não tem raciocínio complexo.

O OpenRouter oferece modelos gratuitos com capacidade mais do que suficiente para isso. Um deles é o nvidia/nemotron-3-super-120b-a12b:free: um modelo de 120B parâmetros que ativa apenas 12B por vez (Mixture of Experts), com custo de $0 tanto na entrada quanto na saída via OpenRouter.

A ideia é apontar o heartbeat especificamente para esse modelo, enquanto o resto dos seus agentes usa o modelo principal que você escolheu. Cada agente pode ter configurações independentes.

{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m",   // intervalo entre checagens — aqui a cada 30 minutos
        model: "openrouter/nvidia/nemotron-3-super-120b-a12b:free",  // modelo gratuito via OpenRouter
        target: "last", // envia alertas para o mesmo canal da sua última conversa
        activeHours: {
          start: "08:00",              // começa a rodar às 8h
          end: "22:00",               // para de rodar às 22h
          timezone: "America/Sao_Paulo",  // fuso horário de referência
        },
      },
    },
  },
}

O campo every define o intervalo entre rondas. "30m" significa a cada 30 minutos — você pode usar "1h", "15m", "2h", o que fizer sentido para o que você está monitorando.

O model com o prefixo openrouter/ indica que essa chamada específica passa pelo OpenRouter (um serviço que centraliza acesso a vários modelos de IA) antes de chegar ao modelo. O restante da string é o identificador do modelo no catálogo do OpenRouter.

O target define onde o agente manda os alertas quando encontra algo. "last" usa o mesmo canal da última conversa ativa — útil quando você está no meio de uma sessão (conversa ativa) e quer os alertas no mesmo lugar.

O bloco activeHours limita as rondas a uma janela de horário. Fora desse intervalo, o heartbeat simplesmente não roda. O timezone usa o formato padrão de fuso horário — essencial para não receber alertas de madrugada quando você configurou para “horário comercial”.


HEARTBEAT.md — o checklist do vigia

O agente vai ler esse arquivo a cada ciclo. Mantenha-o curto e direto: quanto menor, menos tokens são consumidos e mais rápida fica a checagem.

# Checklist do heartbeat

- Olhar se tem erro no último deploy (publicação de nova versão)
- Se tem mensagem pendente no canal do Telegram
- Se alguma tarefa está bloqueada há mais de 2 horas
- Se encontrar algo urgente, avisa no Telegram
- Se nada precisa de atenção: HEARTBEAT_OK

Dois cuidados importantes. Primeiro: não coloque senhas, tokens ou chaves de API nesse arquivo. O agente vai ler o conteúdo, e esse contexto pode aparecer em logs dependendo da configuração. Segundo: seja específico sobre o que “urgente” significa para o seu projeto. “Algo errado” é vago demais — o agente vai interpretar de forma conservadora e provavelmente não alertar.


Receitas prontas

Cenário A — Silencioso (só roda, não avisa ninguém)

Útil quando você quer que o agente faça as checagens mas prefere consultar o histórico manualmente, sem notificações.

heartbeat: {
  every: "1h",   // checa a cada 1 hora
  model: "openrouter/nvidia/nemotron-3-super-120b-a12b:free",
  target: "none",  // não envia notificações — apenas registra internamente
}

Cenário B — Alerta no Telegram quando algo precisa de atenção

O mais comum para quem já usa o Telegram como canal principal. O accountId referencia a conta de bot configurada nas suas integrações.

heartbeat: {
  every: "30m",   // checa a cada 30 minutos
  model: "openrouter/nvidia/nemotron-3-super-120b-a12b:free",
  target: "telegram",
  to: "SEU_CHAT_ID",   // seu ID no Telegram (veja como obter abaixo)
  accountId: "meu-bot", // nome do bot configurado nas suas integrações
}

Cenário C — Horário comercial, WhatsApp

Para times que usam WhatsApp como canal de operação. O activeHours garante que ninguém recebe alerta fora do expediente.

heartbeat: {
  every: "30m",
  model: "openrouter/nvidia/nemotron-3-super-120b-a12b:free",
  target: "whatsapp",
  to: "+5511999999999",   // número com código do país
  activeHours: {
    start: "09:00",
    end: "18:00",         // fora desse intervalo, o heartbeat não roda
    timezone: "America/Sao_Paulo",
  },
}

Controle de visibilidade

Por padrão, os HEARTBEAT_OK ficam escondidos — você só recebe notificação quando o agente encontra algo. Três flags controlam esse comportamento:

FlagPadrãoO que faz
showOkfalseMostra HEARTBEAT_OK no canal configurado
showAlertstrueMostra alertas reais no canal configurado
useIndicatortrueExibe um indicador visual discreto na interface

O caso mais comum de ajuste é showOk: true para debug — você quer confirmar que o heartbeat está rodando antes de confiar que o silêncio significa “tudo bem”. Depois de validar, volta para false.


Troubleshooting

O heartbeat nunca roda

Verifique se every tem um valor maior que "0m" e se o HEARTBEAT.md existe e não está vazio. Um arquivo vazio faz o ciclo ser pulado completamente — o que pode parecer que o heartbeat está desabilitado. Se o arquivo não existir na raiz do projeto, o mesmo comportamento ocorre.

Recebo HEARTBEAT_OK no Telegram o tempo todo

O padrão do showOk é false. Se você está recebendo OKs, alguém trocou para true na configuração. Adicione showOk: false explicitamente no bloco do heartbeat para sobrescrever qualquer configuração herdada de outro lugar.

heartbeat: {
  every: "30m",
  showOk: false,   // garante que OKs fiquem silenciosos
  // resto da config...
}

Quero rodar agora sem esperar o próximo ciclo

Use o comando de evento manual. O --mode now ignora o activeHours (o horário configurado) e roda imediatamente.

# Dispara o heartbeat agora, independente do horário configurado
openclaw system event --text "Checar urgências" --mode now

Próximo passo

Se você ainda está conhecendo o OpenClaw, o melhor ponto de entrada é o guia introdutório. Se já está com o agente rodando, as páginas de configuração de modelos e memória vão complementar o que você viu aqui.

Esc