Heartbeat
Latido ejecuta turnos periódicos del agente en la sesión principal para que el modelo pueda resaltar cualquier cosa que requiera atención sin saturarlo.
Heartbeat es un turno programado de la sesión principal — no crea registros de background task. Los registros de tareas son para trabajo separado (ejecuciones de ACP, subagentes, trabajos de cron aislados).
Solución de problemas: Scheduled Tasks
Inicio rápido (principiante)
Sección titulada «Inicio rápido (principiante)»Elija una cadencia
Deje los latidos habilitados (el valor predeterminado es
30m, o1hpara la autenticación OAuth/token de Anthropic, incluido el reuso de Claude CLI) o configure su propia cadencia.Añadir HEARTBEAT.md (opcional)
Cree una pequeña
HEARTBEAT.mdlista de verificación o un bloquetasks:en el espacio de trabajo del agente.Decidir a dónde deben ir los mensajes de latido
target: "none"es el valor predeterminado; configuretarget: "last"para enviar al último contacto.Ajustes opcionales
- Habilite la entrega de razonamiento del latido para transparencia.
- Use un contexto de arranque ligero si las ejecuciones de latido solo necesitan
HEARTBEAT.md. - Habilite sesiones aisladas para evitar enviar el historial completo de la conversación en cada latido.
- Restrinja los latidos a horas activas (hora local).
Configuración de ejemplo:
{ 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 this agent's subagent or nested lanes are busy // activeHours: { start: "08:00", end: "24:00" }, // includeReasoning: true, // optional: send separate `Thinking` message too }, }, },}Valores predeterminados
Sección titulada «Valores predeterminados»- Intervalo:
30m(o1hcuando se detecta la autenticación OAuth/token de Anthropic como modo de autenticación, incluido el reuso de Claude CLI). Configureagents.defaults.heartbeat.everyo por agenteagents.list[].heartbeat.every; use0mpara deshabilitar. - Cuerpo del mensaje (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 mensaje de latido (heartbeat) se envía verbatim como mensaje de usuario. El mensaje del sistema incluye una sección “Heartbeat” solo cuando los latidos están habilitados para el agente predeterminado, y la ejecución se marca internamente.
- Cuando los latidos se deshabilitan con
0m, las ejecuciones normales también omitenHEARTBEAT.mddel contexto de arranque para que el modelo no vea las instrucciones exclusivas del latido. - Las horas activas (
heartbeat.activeHours) se verifican en la zona horaria configurada. Fuera de la ventana, los latidos se omiten hasta el siguiente tick dentro de la ventana. - Los Heartbeats se aplazan automáticamente mientras el trabajo cron está activo o en cola. Configure
heartbeat.skipWhenBusy: truepara también aplazar un agente en sus propios carriles de subagente con clave de sesión o comandos anidados; los agentes hermanos ya no se pausan solo porque otro agente tiene trabajo de subagente en curso.
Para qué sirve el mensaje de heartbeat
Sección titulada «Para qué sirve el mensaje de heartbeat»El mensaje predeterminado es intencionalmente amplio:
- Tareas en segundo plano: “Considerar tareas pendientes” incita al agente a revisar los seguimientos (bandeja de entrada, calendario, recordatorios, trabajo en cola) y resaltar cualquier cosa urgente.
- Human check-in: “Checkup sometimes on your human during day time” incita un mensaje ocasional ligero de “anything you need?”, pero evita el spam nocturno al usar su zona horaria local configurada (consulte Timezone).
Heartbeat puede reaccionar a background tasks completadas, pero una ejecución de heartbeat en sí misma no crea un registro de tarea.
Si desea que un latido haga algo muy específico (por ejemplo, “verificar estadísticas de PubSub de Gmail” o “verificar el estado de la puerta de enlace”), establezca agents.defaults.heartbeat.prompt (o agents.list[].heartbeat.prompt) en un cuerpo personalizado (enviado literalmente).
Contrato de respuesta
Sección titulada «Contrato de respuesta»- Si nada necesita atención, responda con
HEARTBEAT_OK. - Las ejecuciones de latido con capacidades de herramientas pueden, en su lugar, llamar a
heartbeat_respondconnotify: falsepara no tener una actualización visible, onotify: truemásnotificationTextpara una alerta. Cuando está presente, la respuesta estructurada de la herramienta tiene prioridad sobre el texto alternativo. - Durante las ejecuciones de latido, OpenClaw trata
HEARTBEAT_OKcomo un ack cuando aparece al principio 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 el medio de una respuesta, no se trata de forma especial. - Para las alertas, no incluya
HEARTBEAT_OK; devuelva solo el texto de la alerta.
Fuera de los latidos, los HEARTBEAT_OK extraviados al principio/final de un mensaje se eliminan y registran; un mensaje que es solo HEARTBEAT_OK se descarta.
Configuración
Sección titulada «Configuración»{ agents: { defaults: { heartbeat: { every: "30m", // default: 30m (0m disables) model: "anthropic/claude-opus-4-6", includeReasoning: false, // default: false (deliver separate Thinking 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 this agent's subagent/nested lanes target: "last", // default: none | options: last | none | <channel id> (core or plugin, e.g. "imessage") 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 }, }, },}Alcance y precedencia
Sección titulada «Alcance y precedencia»agents.defaults.heartbeatestablece el comportamiento global del heartbeat.agents.list[].heartbeatse combina encima; si algún agente tiene un bloqueheartbeat, solo esos agentes ejecutan heartbeats.channels.defaults.heartbeatestablece los valores predeterminados de visibilidad para todos los canales.channels.<channel>.heartbeatanula los valores predeterminados del canal.channels.<channel>.accounts.<id>.heartbeat(canales multicuenta) anula la configuración por canal.
Latidos por agente
Sección titulada «Latidos por agente»Si alguna entrada agents.list[] incluye un bloque heartbeat, solo esos agentes ejecutan heartbeats. El bloque por agente se combina encima de agents.defaults.heartbeat (por lo que puedes establecer valores predeterminados compartidos una vez y anularlos por agente).
Ejemplo: dos agentes, solo el segundo agente ejecuta latidos.
{ 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.", }, }, ], },}Ejemplo de horas activas
Sección titulada «Ejemplo de horas activas»Restrinja los latidos al horario laboral en una zona horaria específica:
{ 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 }, }, }, },}Fuera de esta ventana (antes de las 9 a.m. o después de las 10 p.m. hora del Este), se omiten los latidos. El siguiente tick programado dentro de la ventana se ejecutará con normalidad.
Configuración 24/7
Sección titulada «Configuración 24/7»Si desea que los latidos se ejecuten todo el día, use uno de estos patrones:
- Omite
activeHourspor completo (sin restricción de ventana de tiempo; este es el comportamiento predeterminado). - Establece una ventana de día completo:
activeHours: { start: "00:00", end: "24:00" }.
Ejemplo multicuenta
Sección titulada «Ejemplo multicuenta»Usa accountId para apuntar a una cuenta específica en canales multicuenta 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" }, }, }, },}Notas de campo
Sección titulada «Notas de campo»main(predeterminado): sesión principal del agente.- Clave de sesión explícita (copiada de
openclaw sessions --jsono de la sessions CLI). - Formatos de clave de sesión: consulte Sessions y Groups.
- Omitido o
"user": usa suagents.defaults.userTimezonesi está configurado, de lo contrario, recurre a la zona horaria del sistema host. "local": siempre usa la zona horaria del sistema host.- Cualquier identificador IANA (por ejemplo,
America/New_York): se usa directamente; si no es válido, recurre al comportamiento"user"anterior. startyendno deben ser iguales para una ventana activa; los valores iguales se tratan como de ancho cero (siempre fuera de la ventana).- Fuera de la ventana activa, los heartbeats se omiten hasta el siguiente tick dentro de la ventana.
Comportamiento de entrega
Sección titulada «Comportamiento de entrega»Sesión y enrutamiento de destino
- Los latidos (heartbeats) se ejecutan en la sesión principal del agente de forma predeterminada (`agent:
:
), o globalcuandosession.scope = “global”. Establezca sessionpara anular a una sesión de canal específica (Discord/WhatsApp/etc.). -sessionsolo afecta el contexto de ejecución; la entrega se controla mediantetargetyto. - Para entregar a un canal/destinatario específico, configure target+to. Con target: “last”, la entrega utiliza el último canal externo para esa sesión. - Las entregas de latidos permiten objetivos directos/DM de forma predeterminada. Establezca directPolicy: “block”para suprimir los envíos a objetivos directos mientras aún se ejecuta el turno de latido. - Si la cola principal, el carril de la sesión de destino, el carril cron o un trabajo cron activo está ocupado, el latido se omite y se reintentará más tarde. - SiskipWhenBusy: true, los subagentes y carriles anidados con clave de sesión de este agente también difieren las ejecuciones de latido. Los carriles ocupados de otros agentes no difieren este agente. - Si target` no se resuelve en ningún destino externo, la ejecución aún ocurre pero no se envía ningún mensaje saliente.
Visibilidad y comportamiento de omisión
- Si
showOk,showAlertsyuseIndicatorestán todos deshabilitados, la ejecución se omite de inmediato comoreason=alerts-disabled. - Si solo la entrega de alertas está deshabilitada, OpenClaw aún puede ejecutar el latido, actualizar las marcas de tiempo de las tareas vencidas, restaurar la marca de tiempo de inactividad de la sesión y suprimir la carga útil de alerta externa.
- Si el destino de latido resuelto admite “escribiendo…”, OpenClaw muestra el estado de escribiendo mientras la ejecución del latido está activa. Esto utiliza el mismo destino al que el latido enviaría el resultado del chat y se deshabilita mediante
typingMode: "never".
Ciclo de vida de la sesión y auditoría
- Las respuestas solo de Heartbeat no mantienen la sesión activa. Los metadatos de Heartbeat pueden actualizar la fila de la sesión, pero la expiración por inactividad usa
lastInteractionAtdel último mensaje real de usuario/canal, y la expiración diaria usasessionStartedAt. - El historial de la interfaz de control y WebChat oculta los mensajes de Heartbeat y los reconocimientos que solo son OK. La transcripción subyacente de la sesión todavía puede contener esos turnos para auditoría/reproducción.
- Las tareas en segundo plano desacopladas pueden poner en cola un evento del sistema y activar el Heartbeat cuando la sesión principal debe notar algo rápidamente. Esa activación no hace que el Heartbeat ejecute una tarea en segundo plano.
Controles de visibilidad
Sección titulada «Controles de visibilidad»De forma predeterminada, los reconocimientos HEARTBEAT_OK se suprimen mientras se entrega el contenido de la alerta. Puede ajustar esto por canal o por cuenta:
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 accountPrecedencia: por cuenta → por canal → valores predeterminados del canal → valores predeterminados integrados.
Qué hace cada indicador
Sección titulada «Qué hace cada indicador»showOk: envía un reconocimientoHEARTBEAT_OKcuando el modelo devuelve una respuesta que es solo OK.showAlerts: envía el contenido de la alerta cuando el modelo devuelve una respuesta que no es OK.useIndicator: emite eventos de indicador para las superficies de estado de la interfaz de usuario.
Si los tres son falsos, OpenClaw omite la ejecución del Heartbeat por completo (sin llamada al modelo).
Ejemplos por canal frente a por cuenta
Sección titulada «Ejemplos por canal frente a por cuenta»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: truePatrones comunes
Sección titulada «Patrones comunes»| Objetivo | Configuración |
|---|---|
| Comportamiento predeterminado (OKs silenciosos, alertas activadas) | (no se necesita configuración) |
| Completamente 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)
Sección titulada «HEARTBEAT.md (opcional)»Si existe un archivo HEARTBEAT.md en el espacio de trabajo, el mensaje predeterminado le indica al agente que lo lea. Piense en él como su “lista de verificación de Heartbeat”: pequeño, estable y seguro de considerar cada 30 minutos.
En ejecuciones normales, HEARTBEAT.md solo se inyecta cuando la guía de heartbeat está habilitada para el agente predeterminado. Deshabilitar el cadence del heartbeat con 0m o establecer includeSystemPromptSection: false lo omite del contexto de arranque normal.
En el arnés nativo de Codex, el contenido de HEARTBEAT.md no se inyecta en el turno. Si el archivo existe y tiene contenido que no sean espacios en blanco, las instrucciones del modo de colaboración de Heartbeat dirigen a Codex al archivo y le indican que lo lea antes de continuar.
Si HEARTBEAT.md existe pero está efectivamente vacío (solo líneas en blanco y encabezados de markdown como # Heading), OpenClaw omite la ejecución de Heartbeat para ahorrar llamadas a la API. Esa omisión se reporta como reason=empty-heartbeat-file. Si falta el archivo, el Heartbeat todavía se ejecuta y el modelo decide qué hacer.
Manténgalo pequeño (lista de verificación corta o recordatorios) para evitar la hinchazón del mensaje.
Ejemplo 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.bloques tasks:
Sección titulada «bloques tasks:»HEARTBEAT.md también admite un pequeño bloque estructurado tasks: para verificaciones basadas en intervalos dentro del propio Heartbeat.
Ejemplo:
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.Behavior
- OpenClaw analiza el bloque
tasks:y comprueba cada tarea con su propiointerval. - Solo las tareas vencidas se incluyen en el prompt de heartbeat para ese tick.
- Si no hay tareas vencidas, el heartbeat se omite por completo (
reason=no-tasks-due) para evitar una llamada al modelo desperdiciada. - El contenido que no sea de tarea en
HEARTBEAT.mdse conserva y se añade como contexto adicional después de la lista de tareas vencidas. - Las marcas de tiempo de la última ejecución de la tarea se almacenan en el estado de la sesión (
heartbeatTaskState), por lo que los intervalos sobreviven a los reinicios normales. - Las marcas de tiempo de las tareas solo avanzan después de que una ejecución de heartbeat completa su ruta de respuesta normal. Las ejecuciones omitidas de
empty-heartbeat-file/no-tasks-dueno marcan las tareas como completadas.
El modo de tarea es útil cuando quieres que un archivo de heartbeat contenga varias comprobaciones periódicas sin pagar por todas ellas en cada tick.
¿Puede el agente actualizar HEARTBEAT.md?
Sección titulada «¿Puede el agente actualizar HEARTBEAT.md?»Sí: si se lo pides.
HEARTBEAT.md es solo un archivo normal en el espacio de trabajo del agente, por lo que puedes decirle al agente (en un chat normal) algo como:
- “Actualiza
HEARTBEAT.mdpara añadir una comprobación diaria del calendario.” - “Reescribe
HEARTBEAT.mdpara que sea más breve y se centre en el seguimiento de la bandeja de entrada.”
Si quieres que esto suceda de manera proactiva, también puedes incluir una línea explícita en tu prompt de heartbeat como: “Si la lista de verificación se queda obsoleta, actualiza HEARTBEAT.md con una mejor.”
Activación manual (bajo demanda)
Sección titulada «Activación manual (bajo demanda)»Puedes poner en cola un evento del sistema y activar un heartbeat inmediato con:
openclaw system event --text "Check for urgent follow-ups" --mode nowSi varios agentes tienen heartbeat configurado, una activación manual ejecuta los heartbeats de cada uno de esos agentes inmediatamente.
Usa --mode next-heartbeat para esperar el siguiente tick programado.
Entrega de razonamiento (opcional)
Sección titulada «Entrega de razonamiento (opcional)»De forma predeterminada, los heartbeats entregan solo la carga útil de “respuesta” final.
Si quieres transparencia, activa:
agents.defaults.heartbeat.includeReasoning: true
Cuando está habilitado, los latidos también entregarán un mensaje separado con el prefijo Thinking (con la misma forma que /reasoning on). Esto puede ser útil cuando el agente está gestionando múltiples sesiones/códices y quieres ver por qué decidió hacerte un ping, pero también puede filtrar más detalles internos de los deseables. Es preferible mantenerlo desactivado en los chats grupales.
Conciencia del coste
Sección titulada «Conciencia del coste»Los latidos ejecutan turnos completos del agente. Intervalos más cortos consumen más tokens. Para reducir el coste:
- Usa
isolatedSession: truepara evitar enviar el historial completo de la conversación (de ~100K tokens a ~2-5K por ejecución). - Usa
lightContext: truepara limitar los archivos de inicio (bootstrap) solo aHEARTBEAT.md. - Configura un
modelmás barato (por ejemplo,ollama/llama3.2:1b). - Mantén
HEARTBEAT.mdpequeño. - Usa
target: "none"si solo quieres actualizaciones del estado interno.
Desbordamiento de contexto después del latido
Sección titulada «Desbordamiento de contexto después del latido»Si un latido anterior dejó una sesión existente en un modelo local más pequeño, por ejemplo un modelo Ollama con una ventana de 32k, y el siguiente turno de la sesión principal informa de un desbordamiento de contexto, restablece el modelo de tiempo de ejecución de la sesión al modelo principal configurado. El mensaje de restablecimiento de OpenClaw indica esto cuando el último modelo de tiempo de ejecución coincide con el heartbeat.model configurado.
Los latidos actuales preservan el modelo de tiempo de ejecución existente de la sesión compartida después de que se completa la ejecución. Aún puedes usar isolatedSession: true para ejecutar latidos en una sesión nueva, combinarlo con lightContext: true para obtener el mensaje más pequeño, o elegir un modelo de latido con una ventana de contexto lo suficientemente grande para la sesión compartida.
Relacionado
Sección titulada «Relacionado»- Automatización — todos los mecanismos de automatización de un vistazo
- Tareas en segundo plano — cómo se rastrea el trabajo separado
- Zona horaria — cómo la zona horaria afecta la programación de los latidos
- Solución de problemas — depuración de problemas de automatización