Пульс (Gateway)¶
Heartbeat или Cron? См. Cron vs Heartbeat — рекомендации, когда использовать каждый из вариантов.
Heartbeat выполняет периодические ходы агента в основном сеансе, чтобы модель могла выявлять то, что требует внимания, не засыпая вас сообщениями.
Устранение неполадок: /automation/troubleshooting
Быстрый старт (для начинающих)¶
- Оставьте heartbeat включённым (по умолчанию —
30m, или1hдля Anthropic OAuth/setup-token) либо задайте собственную периодичность. - Создайте небольшой чек‑лист
HEARTBEAT.mdв рабочем пространстве агента (необязательно, но рекомендуется). - Определите, куда должны отправляться сообщения heartbeat (по умолчанию —
target: "last"). - Необязательно: включите доставку рассуждений heartbeat для прозрачности.
- Необязательно: ограничьте heartbeat активными часами (локальное время).
Пример конфига:
{
agents: {
defaults: {
heartbeat: {
every: "30m",
target: "last",
// activeHours: { start: "08:00", end: "24:00" },
// includeReasoning: true, // optional: send separate `Reasoning:` message too
},
},
},
}
Значения по умолчанию¶
- Интервал:
30m(или1h, когда обнаружен режим аутентификации Anthropic OAuth/setup-token). Задайтеagents.defaults.heartbeat.everyили для каждого агентаagents.list[].heartbeat.every; используйте0mдля отключения. - Тело промпта (настраивается через
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. - Промпт heartbeat отправляется дословно как пользовательское сообщение. Системный промпт включает раздел «Heartbeat», а запуск помечается внутренним флагом.
- Активные часы (
heartbeat.activeHours) проверяются в настроенном часовом поясе. Вне окна heartbeat пропускаются до следующего тика внутри окна.
Для чего нужен промпт heartbeat¶
Промпт по умолчанию намеренно общий:
- Фоновые задачи: «Consider outstanding tasks» побуждает агента просматривать последующие действия (входящие, календарь, напоминания, очередь работ) и выносить срочное.
- Человеческий чек‑ин: «Checkup sometimes on your human during day time» побуждает к редкому, лёгкому сообщению «нужно ли что‑нибудь?», избегая ночного спама за счёт использования вашего локального часового пояса (см. /concepts/timezone).
Если вы хотите, чтобы heartbeat делал что‑то строго определённое (например,
«проверять статистику Gmail PubSub» или «проверять здоровье шлюза»), задайте
agents.defaults.heartbeat.prompt (или agents.list[].heartbeat.prompt) с пользовательским телом (отправляется дословно).
Контракт ответа¶
- Если внимания ничего не требует, ответьте
HEARTBEAT_OK. - Во время запусков heartbeat OpenClaw рассматривает
HEARTBEAT_OKкак подтверждение, если токен находится в начале или в конце ответа. Токен удаляется, а ответ отбрасывается, если оставшееся содержимое ≤ackMaxChars(по умолчанию: 300). - Если
HEARTBEAT_OKнаходится в середине ответа, он не обрабатывается особым образом. - Для алертов не включайте
HEARTBEAT_OK; возвращайте только текст алерта.
Вне heartbeat случайный HEARTBEAT_OK в начале/конце сообщения удаляется и логируется;
сообщение, состоящее только из HEARTBEAT_OK, отбрасывается.
Конфигурация¶
{
agents: {
defaults: {
heartbeat: {
every: "30m", // default: 30m (0m disables)
model: "anthropic/claude-opus-4-6",
includeReasoning: false, // default: false (deliver separate Reasoning: message when available)
target: "last", // last | none | <channel id> (core or plugin, e.g. "bluebubbles")
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
},
},
},
}
Область действия и приоритеты¶
agents.defaults.heartbeatзадаёт глобальное поведение heartbeat.agents.list[].heartbeatнакладывается поверх; если у любого агента есть блокheartbeat, heartbeat выполняются только для этих агентов.channels.defaults.heartbeatзадаёт видимость по умолчанию для всех каналов.channels.<channel>.heartbeatпереопределяет настройки каналов.channels.<channel>.accounts.<id>.heartbeat(каналы с несколькими аккаунтами) переопределяет настройки на уровне аккаунта.
Heartbeat для каждого агента¶
Если любая запись agents.list[] содержит блок heartbeat, heartbeat выполняются
только для этих агентов. Блок для агента накладывается поверх agents.defaults.heartbeat
(что позволяет задать общие значения по умолчанию и переопределять их для агента).
Пример: два агента, heartbeat запускается только у второго.
{
agents: {
defaults: {
heartbeat: {
every: "30m",
target: "last",
},
},
list: [
{ id: "main", default: true },
{
id: "ops",
heartbeat: {
every: "1h",
target: "whatsapp",
to: "+15551234567",
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.",
},
},
],
},
}
Пример активных часов¶
Ограничьте heartbeat рабочими часами в конкретном часовом поясе:
{
agents: {
defaults: {
heartbeat: {
every: "30m",
target: "last",
activeHours: {
start: "09:00",
end: "22:00",
timezone: "America/New_York", // optional; uses your userTimezone if set, otherwise host tz
},
},
},
},
}
Вне этого окна (до 9:00 или после 22:00 по восточному времени) heartbeat пропускаются. Следующий запланированный тик внутри окна выполнится как обычно.
Пример с несколькими аккаунтами¶
Используйте accountId, чтобы нацелиться на конкретный аккаунт в каналах с
несколькими аккаунтами, таких как Telegram:
{
agents: {
list: [
{
id: "ops",
heartbeat: {
every: "1h",
target: "telegram",
to: "12345678",
accountId: "ops-bot",
},
},
],
},
channels: {
telegram: {
accounts: {
"ops-bot": { botToken: "YOUR_TELEGRAM_BOT_TOKEN" },
},
},
},
}
Пояснения к полям¶
every: интервал heartbeat (строка длительности; единица по умолчанию — минуты).model: необязательное переопределение модели для запусков heartbeat (provider/model).includeReasoning: при включении дополнительно доставляет отдельное сообщениеReasoning:, когда доступно (та же структура, что у/reasoning on).session: необязательный ключ сеанса для запусков heartbeat.main(по умолчанию): основной сеанс агента.- Явный ключ сеанса (скопируйте из
openclaw sessions --jsonили из sessions CLI). - Форматы ключей сеанса: см. Sessions и Groups.
target:last(по умолчанию): доставка в последний использованный внешний канал.- явный канал:
whatsapp/telegram/discord/googlechat/slack/msteams/signal/imessage. none: выполнить heartbeat, но не доставлять вовне.to: необязательное переопределение получателя (идентификатор, специфичный для канала, например E.164 для WhatsApp или chat id Telegram).accountId: необязательный id аккаунта для каналов с несколькими аккаунтами. Когдаtarget: "last", id аккаунта применяется к разрешённому последнему каналу, если он поддерживает аккаунты; иначе игнорируется. Если id аккаунта не совпадает с настроенным аккаунтом для разрешённого канала, доставка пропускается.prompt: переопределяет тело промпта по умолчанию (не объединяется).ackMaxChars: максимальное число символов, разрешённое послеHEARTBEAT_OKперед доставкой.activeHours: ограничивает запуски heartbeat временным окном. Объект сstart(HH:MM, включительно),end(HH:MM, исключительно; допускается24:00для конца дня) и необязательнымtimezone.- Отсутствует или
"user": используется вашagents.defaults.userTimezone, если задан, иначе — часовой пояс хоста. "local": всегда использует часовой пояс хоста.- Любой идентификатор IANA (например,
America/New_York): используется напрямую; если некорректен, происходит откат к поведению"user"выше. - Вне активного окна heartbeat пропускаются до следующего тика внутри окна.
Поведение доставки¶
- Heartbeat по умолчанию выполняются в основном сеансе агента (
agent:<id>:<mainKey>), или вglobal, когдаsession.scope = "global". Задайтеsession, чтобы переопределить на конкретный сеанс канала (Discord/WhatsApp и т. д.). sessionвлияет только на контекст запуска; доставка контролируетсяtargetиto.- Для доставки в конкретный канал/получателю задайте
target+to. Приtarget: "last"доставка использует последний внешний канал для этого сеанса. - Если основная очередь занята, heartbeat пропускается и будет повторён позже.
- Если
targetне разрешается во внешний пункт назначения, запуск всё равно происходит, но исходящее сообщение не отправляется. - Ответы, предназначенные только для heartbeat, не поддерживают активность сеанса;
последний
updatedAtвосстанавливается, поэтому истечение простоя ведёт себя обычно.
Управление видимостью¶
По умолчанию подтверждения HEARTBEAT_OK подавляются, а содержимое алертов доставляется. Вы можете настроить это для каждого канала или аккаунта:
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 account
Приоритет: аккаунт → канал → значения канала по умолчанию → встроенные значения по умолчанию.
Что делает каждый флаг¶
showOk: отправляет подтверждениеHEARTBEAT_OK, когда модель возвращает ответ только с OK.showAlerts: отправляет содержимое алерта, когда модель возвращает ответ не OK.useIndicator: генерирует события‑индикаторы для поверхностей статуса UI.
Если все три равны false, OpenClaw полностью пропускает запуск heartbeat (без вызова модели).
Примеры: канал vs аккаунт¶
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: true
Распространённые шаблоны¶
| Цель | Конфиг |
|---|---|
| Поведение по умолчанию (тихие OK, алерты включены) | (конфиг не нужен) |
| Полностью тихо (нет сообщений, нет индикатора) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| Только индикатор (без сообщений) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| OK только в одном канале | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md (необязательно)¶
Если в рабочем пространстве существует файл HEARTBEAT.md, промпт по умолчанию
предписывает агенту прочитать его. Думайте об этом как о «чек‑листе heartbeat»:
небольшом, стабильном и безопасном для включения каждые 30 минут.
Если HEARTBEAT.md существует, но фактически пуст (только пустые строки и
markdown‑заголовки вроде # Heading), OpenClaw пропускает запуск heartbeat,
чтобы сэкономить API‑вызовы.
Если файла нет, heartbeat всё равно выполняется, и
модель решает, что делать.
Держите его маленьким (короткий чек‑лист или напоминания), чтобы избежать раздувания промпта.
Пример 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.
Может ли агент обновлять HEARTBEAT.md?¶
Да — если вы его об этом попросите.
HEARTBEAT.md — это обычный файл в рабочем пространстве агента, поэтому вы можете
сказать агенту (в обычном чате), например:
- «Обнови
HEARTBEAT.md, добавив ежедневную проверку календаря». - «Перепиши
HEARTBEAT.md, чтобы он был короче и сосредоточен на обработке входящих».
Если вы хотите, чтобы это происходило проактивно, можно также добавить явную строку в промпт heartbeat, например: «Если чек‑лист устарел, обнови HEARTBEAT.md на более удачный».
Примечание по безопасности: не помещайте секреты (ключи API, номера телефонов,
приватные токены) в HEARTBEAT.md — он становится частью контекста промпта.
Ручной запуск (по требованию)¶
Вы можете поставить в очередь системное событие и немедленно запустить heartbeat с помощью:
openclaw system event --text "Check for urgent follow-ups" --mode now
Если у нескольких агентов настроен heartbeat, ручной запуск немедленно выполнит
heartbeat каждого из этих агентов.
Используйте --mode next-heartbeat, чтобы дождаться следующего запланированного тика.
Доставка рассуждений (необязательно)¶
По умолчанию heartbeat доставляет только финальный «ответ».
Если нужна прозрачность, включите:
agents.defaults.heartbeat.includeReasoning: true
При включении heartbeat также будет доставлять отдельное сообщение с префиксом
Reasoning: (та же структура, что у /reasoning on). Это может быть полезно,
когда агент управляет несколькими сеансами/кодексами и вы хотите видеть, почему он
решил вас уведомить, — но это также может раскрывать больше внутренних деталей,
чем вам нужно. В групповых чатах предпочтительно оставлять выключенным.
Осознание стоимости¶
Heartbeat выполняют полноценные ходы агента. Более короткие интервалы сжигают больше токенов. Держите HEARTBEAT.md небольшим и рассмотрите более дешёвую model или
target: "none", если вам нужны только обновления внутреннего состояния.