Latido (Gateway)
¿Heartbeat vs Cron? Consulte Cron vs Heartbeat para obtener orientación sobre cuándo usar cada uno.Heartbeat ejecuta turnos periódicos del agente en la sesión principal para que el modelo pueda mostrar cualquier cosa que requiera atención sin enviarle spam. Solución de problemas: /automation/troubleshooting
Inicio rápido (principiante)
- Deje los heartbeats habilitados (el valor predeterminado es
30m, o1hpara Anthropic OAuth/setup-token) o establezca su propia cadencia. - Cree una pequeña lista de verificación
HEARTBEAT.mden el espacio de trabajo del agente (opcional pero recomendado). - Decida a dónde deben ir los mensajes de heartbeat (
target: "last"es el valor predeterminado). - Opcional: habilite la entrega del razonamiento del heartbeat para mayor transparencia.
- Opcional: restrinja los heartbeats a horas activas (hora local).
Valores predeterminados
- Intervalo:
30m(o1hcuando Anthropic OAuth/setup-token es el modo de autenticación detectado). Establezcaagents.defaults.heartbeat.everyo por agenteagents.list[].heartbeat.every; use0mpara deshabilitar. - Cuerpo del prompt (configurable mediante
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. - El prompt de heartbeat se envía literalmente como el mensaje del usuario. El prompt del sistema incluye una sección “Heartbeat” y la ejecución se marca internamente.
- Las horas activas (
heartbeat.activeHours) se verifican en la zona horaria configurada. Fuera de la ventana, los heartbeats se omiten hasta el siguiente tick dentro de la ventana.
Para qué sirve el prompt de heartbeat
El prompt predeterminado es intencionalmente amplio:- Tareas en segundo plano: “Consider outstanding tasks” incentiva al agente a revisar seguimientos (bandeja de entrada, calendario, recordatorios, trabajo en cola) y mostrar cualquier cosa urgente.
- Chequeo humano: “Checkup sometimes on your human during day time” incentiva un mensaje ocasional y ligero de “¿necesita algo?”, pero evita el spam nocturno usando su zona horaria local configurada (ver /concepts/timezone).
agents.defaults.heartbeat.prompt (o
agents.list[].heartbeat.prompt) con un cuerpo personalizado (enviado literalmente).
Contrato de respuesta
- Si no hay nada que requiera atención, responda con
HEARTBEAT_OK. - Durante las ejecuciones de heartbeat, OpenClaw trata
HEARTBEAT_OKcomo un acuse cuando aparece al inicio o al final de la respuesta. El token se elimina y la respuesta se descarta si el contenido restante es ≤ackMaxChars(predeterminado: 300). - Si
HEARTBEAT_OKaparece en la mitad de una respuesta, no se trata de forma especial. - Para alertas, no incluya
HEARTBEAT_OK; devuelva solo el texto de la alerta.
HEARTBEAT_OK aislado al inicio/final de un mensaje se elimina
y se registra; un mensaje que sea solo HEARTBEAT_OK se descarta.
Configuración
Alcance y precedencia
agents.defaults.heartbeatestablece el comportamiento global del heartbeat.agents.list[].heartbeatse fusiona encima; si algún agente tiene un bloqueheartbeat, solo esos agentes ejecutan heartbeats.channels.defaults.heartbeatestablece valores predeterminados de visibilidad para todos los canales.channels.<channel>.heartbeatsobrescribe los valores predeterminados del canal.channels.<channel>.accounts.<id>.heartbeat(canales de múltiples cuentas) sobrescribe la configuración por canal.
Heartbeats por agente
Si alguna entradaagents.list[] incluye un bloque heartbeat, solo esos agentes
ejecutan heartbeats. El bloque por agente se fusiona encima de agents.defaults.heartbeat
(para que pueda establecer valores compartidos una vez y sobrescribir por agente).
Ejemplo: dos agentes, solo el segundo agente ejecuta heartbeats.
Ejemplo de horas activas
Restrinja los heartbeats al horario laboral en una zona horaria específica:Ejemplo de múltiples cuentas
UseaccountId para apuntar a una cuenta específica en canales de múltiples cuentas como Telegram:
Notas de campos
every: intervalo de heartbeat (cadena de duración; unidad predeterminada = minutos).model: sobrescritura opcional del modelo para ejecuciones de heartbeat (provider/model).includeReasoning: cuando está habilitado, también entrega el mensaje separadoReasoning:cuando está disponible (misma forma que/reasoning on).session: clave de sesión opcional para ejecuciones de heartbeat.main(predeterminado): sesión principal del agente.- Clave de sesión explícita (copiar desde
openclaw sessions --jsono la CLI de sesiones). - Formatos de clave de sesión: ver Sesiones y Grupos.
target:last(predeterminado): entrega al último canal externo utilizado.- canal explícito:
whatsapp/telegram/discord/googlechat/slack/msteams/signal/imessage. none: ejecuta el heartbeat pero no entrega externamente.
to: sobrescritura opcional del destinatario (id específico del canal, p. ej., E.164 para WhatsApp o un id de chat de Telegram).accountId: id de cuenta opcional para canales de múltiples cuentas. Cuandotarget: "last", el id de cuenta se aplica al último canal resuelto si admite cuentas; de lo contrario, se ignora. Si el id de cuenta no coincide con una cuenta configurada para el canal resuelto, la entrega se omite.prompt: sobrescribe el cuerpo del prompt predeterminado (no se fusiona).ackMaxChars: máximo de caracteres permitidos después deHEARTBEAT_OKantes de la entrega.activeHours: restringe las ejecuciones de heartbeat a una ventana de tiempo. Objeto constart(HH:MM, inclusivo),end(HH:MM exclusivo; se permite24:00para fin de día) ytimezoneopcional.- Omitido o
"user": usa suagents.defaults.userTimezonesi está configurado; de lo contrario, vuelve a la zona horaria del sistema del host. "local": siempre usa la zona horaria del sistema del host.- Cualquier identificador IANA (p. ej.,
America/New_York): se usa directamente; si no es válido, vuelve al comportamiento"user"anterior. - Fuera de la ventana activa, los heartbeats se omiten hasta el siguiente tick dentro de la ventana.
- Omitido o
Comportamiento de entrega
- Los heartbeats se ejecutan en la sesión principal del agente de forma predeterminada (
agent:<id>:<mainKey>), oglobalcuandosession.scope = "global". Establezcasessionpara sobrescribir a una sesión de canal específica (Discord/WhatsApp/etc.). sessionsolo afecta el contexto de la ejecución; la entrega está controlada portargetyto.- Para entregar a un canal/destinatario específico, establezca
target+to. Contarget: "last", la entrega usa el último canal externo para esa sesión. - Si la cola principal está ocupada, el heartbeat se omite y se reintenta más tarde.
- Si
targetse resuelve sin destino externo, la ejecución aún ocurre pero no se envía ningún mensaje saliente. - Las respuestas solo de heartbeat no mantienen viva la sesión; se restaura el último
updatedAtpara que la expiración por inactividad se comporte con normalidad.
Controles de visibilidad
De forma predeterminada, los acusesHEARTBEAT_OK se suprimen mientras que el contenido de alerta se
entrega. Puede ajustar esto por canal o por cuenta:
Qué hace cada indicador
showOk: envía un acuseHEARTBEAT_OKcuando el modelo devuelve una respuesta solo OK.showAlerts: envía el contenido de la alerta cuando el modelo devuelve una respuesta que no es OK.useIndicator: emite eventos indicadores para superficies de estado de la UI.
Ejemplos por canal vs por cuenta
Patrones comunes
| Objetivo | Configuración |
|---|---|
| Comportamiento predeterminado (OKs silenciosos, alertas activadas) | (no se necesita configuración) |
| Totalmente silencioso (sin mensajes, sin indicador) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| Solo indicador (sin mensajes) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| OKs solo en un canal | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md (opcional)
Si existe un archivoHEARTBEAT.md en el espacio de trabajo, el prompt predeterminado le indica al
agente que lo lea. Piénselo como su “lista de verificación de heartbeat”: pequeña, estable y
segura para incluir cada 30 minutos.
Si HEARTBEAT.md existe pero está efectivamente vacío (solo líneas en blanco y encabezados markdown como # Heading), OpenClaw omite la ejecución del heartbeat para ahorrar llamadas a la API.
Si el archivo falta, el heartbeat aún se ejecuta y el modelo decide qué hacer.
Manténgalo pequeño (lista corta o recordatorios) para evitar inflar el prompt.
Ejemplo de HEARTBEAT.md:
¿Puede el agente actualizar HEARTBEAT.md?
Sí — si usted se lo pide.HEARTBEAT.md es solo un archivo normal en el espacio de trabajo del agente, por lo que puede decirle al
agente (en un chat normal) algo como:
- “Actualiza
HEARTBEAT.mdpara agregar una revisión diaria del calendario.” - “Reescribe
HEARTBEAT.mdpara que sea más corto y se enfoque en seguimientos de la bandeja de entrada.”
HEARTBEAT.md — pasa a formar parte del contexto del prompt.
Activación manual (bajo demanda)
Puede poner en cola un evento del sistema y activar un heartbeat inmediato con:heartbeat configurado, una activación manual ejecuta inmediatamente
los heartbeats de cada uno de esos agentes.
Use --mode next-heartbeat para esperar al siguiente tick programado.
Entrega de razonamiento (opcional)
De forma predeterminada, los heartbeats entregan solo la carga “respuesta” final. Si quiere transparencia, habilite:agents.defaults.heartbeat.includeReasoning: true
Reasoning: (misma forma que /reasoning on). Esto puede ser útil cuando el agente
administra múltiples sesiones/códices y quiere ver por qué decidió hacerle ping
— pero también puede filtrar más detalles internos de los que desea. Prefiera mantenerlo
desactivado en chats grupales.
Conciencia de costos
Los heartbeats ejecutan turnos completos del agente. Intervalos más cortos consumen más tokens. MantengaHEARTBEAT.md pequeño y considere un model o target: "none" más económico si
solo quiere actualizaciones de estado internas.