Skip to main content
Heartbeat или Cron? Рекомендации по выбору подходящего варианта см. в разделе «Автоматизация».
Heartbeat выполняет периодические ходы агента в основном сеансе, чтобы модель могла сообщать обо всём, что требует внимания, не засоряя вас сообщениями. Heartbeat — это запланированный ход в основном сеансе; он не создаёт записи фоновых задач. Записи задач предназначены для обособленной работы (запусков ACP, субагентов, изолированных заданий Cron). Устранение неполадок: Запланированные задачи

Быстрый старт (для начинающих)

1

Выберите периодичность

Оставьте Heartbeat включённым (по умолчанию 30m или 1h, если настроена аутентификация Anthropic через OAuth/токен, включая повторное использование Claude CLI) либо задайте собственную периодичность.
2

Добавьте HEARTBEAT.md (необязательно)

Создайте в рабочем пространстве агента небольшой список проверок HEARTBEAT.md или блок tasks:.
3

Выберите, куда отправлять сообщения Heartbeat

Значение по умолчанию — target: "none"; задайте target: "last", чтобы направлять сообщения последнему контакту.
4

Необязательная настройка

  • Включите передачу рассуждений Heartbeat для прозрачности.
  • Используйте облегчённый начальный контекст, если запускам Heartbeat требуется только HEARTBEAT.md.
  • Включите изолированные сеансы, чтобы не отправлять полную историю переписки при каждом Heartbeat.
  • Ограничьте Heartbeat активными часами (по местному времени).
Пример конфигурации:

Значения по умолчанию

  • Интервал: 30m. Применение настроек провайдера Anthropic по умолчанию увеличивает его до 1h, когда определённый режим аутентификации — OAuth/токен (включая повторное использование Claude CLI), но только пока heartbeat.every не задан. Задайте 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 без заданного значения используют agents.defaults.timeoutSeconds, если он указан. В противном случае используется периодичность Heartbeat с ограничением в 600 секунд. Для более продолжительной работы Heartbeat задайте agents.defaults.heartbeat.timeoutSeconds или agents.list[].heartbeat.timeoutSeconds для отдельного агента.
  • Запрос Heartbeat отправляется без изменений в качестве пользовательского сообщения. Системный запрос содержит раздел «Heartbeats» только тогда, когда Heartbeat включён для агента по умолчанию (и includeSystemPromptSection не равен false); запуск при этом помечается внутренним флагом.
  • Когда Heartbeat отключён с помощью 0m, обычные запуски также исключают HEARTBEAT.md из начального контекста, чтобы модель не видела инструкции, предназначенные только для Heartbeat.
  • Активные часы (heartbeat.activeHours) проверяются в настроенном часовом поясе. Вне этого временного окна Heartbeat пропускается до следующего запуска внутри окна.
  • Heartbeat автоматически откладывается, пока выполняется или ожидает выполнения работа Cron. Задайте heartbeat.skipWhenBusy: true, чтобы также откладывать запуск агента, когда заняты его собственный привязанный к ключу сеанса субагент или вложенные каналы выполнения команд; агенты того же уровня больше не приостанавливаются только из-за того, что другой агент выполняет работу субагента.

Для чего предназначен запрос Heartbeat

Запрос по умолчанию намеренно сформулирован широко:
  • Фоновые задачи: фраза «Рассмотри незавершённые задачи» побуждает агента проверить последующие действия (входящие сообщения, календарь, напоминания, работу в очереди) и сообщить обо всём срочном.
  • Проверка состояния пользователя: фраза «Иногда в течение дня интересуйся состоянием своего пользователя» побуждает изредка отправлять короткое сообщение «Вам что-нибудь нужно?», но позволяет избежать ночного потока сообщений благодаря настроенному местному часовому поясу (см. раздел «Часовой пояс»).
Heartbeat может реагировать на завершённые фоновые задачи, но сам запуск Heartbeat не создаёт запись задачи. Если Heartbeat должен выполнять конкретное действие (например, «проверить статистику Gmail PubSub» или «проверить работоспособность Gateway»), задайте в agents.defaults.heartbeat.prompt (или agents.list[].heartbeat.prompt) собственный текст, который будет отправлен без изменений.

Контракт ответа

  • Если ничто не требует внимания, ответьте HEARTBEAT_OK.
  • Вместо этого запуск Heartbeat может вызвать heartbeat_respond с notify: false, если видимое обновление не требуется, либо notify: true вместе с notificationText для оповещения. При наличии структурированный ответ инструмента имеет приоритет над резервным текстовым ответом.
  • Во время запусков Heartbeat OpenClaw считает HEARTBEAT_OK подтверждением, если он находится в начале или конце ответа. Токен удаляется, а ответ отбрасывается, если длина оставшегося содержимого составляет ackMaxChars (по умолчанию: 300).
  • Если HEARTBEAT_OK находится в середине ответа, он не обрабатывается особым образом.
  • Для оповещений не включайте HEARTBEAT_OK; возвращайте только текст оповещения.
Вне запусков Heartbeat случайный HEARTBEAT_OK в начале или конце сообщения удаляется и записывается в журнал; сообщение, состоящее только из 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 выполняет только второй.

Пример активных часов

Ограничьте Heartbeat рабочими часами в определённом часовом поясе:
Вне этого окна (до 9 утра или после 10 вечера по восточному времени) Heartbeat пропускается. Следующий запланированный запуск внутри окна выполнится как обычно.

Работа 24/7

Чтобы Heartbeat выполнялся круглосуточно, используйте один из следующих вариантов:
  • Полностью исключите activeHours (без ограничения временным окном; это поведение по умолчанию).
  • Задайте окно на весь день: activeHours: { start: "00:00", end: "24:00" }.
Не задавайте одинаковое время start и end (например, с 08:00 до 08:00). Это считается окном нулевой длительности, поэтому Heartbeat всегда будет пропускаться.

Пример с несколькими учётными записями

Используйте accountId, чтобы указать определённую учётную запись в каналах с несколькими учётными записями, таких как Telegram:

Описание полей

string
Интервал Heartbeat (строка длительности; единица по умолчанию — минуты).
string
Необязательное переопределение модели для запусков Heartbeat (provider/model).
boolean
по умолчанию:"false"
Если включено, при наличии также доставляется отдельное сообщение Thinking (в том же формате, что и /reasoning on).
boolean
по умолчанию:"false"
При значении true запуски Heartbeat используют облегчённый начальный контекст и сохраняют из файлов начального контекста рабочего пространства только HEARTBEAT.md.
boolean
по умолчанию:"false"
При значении true каждый Heartbeat выполняется в новом сеансе без предыдущей истории переписки. Используется тот же принцип изоляции, что и для Cron sessionTarget: "isolated". Это значительно снижает расход токенов на каждый Heartbeat. Для максимальной экономии объедините с lightContext: true. Маршрутизация доставки по-прежнему использует контекст основного сеанса.
boolean
по умолчанию:"false"
При значении true запуски Heartbeat откладываются, когда заняты дополнительные каналы этого агента: его собственный привязанный к ключу сеанса субагент или вложенная работа с командами. Каналы Cron всегда откладывают Heartbeat даже без этого флага, поэтому хосты с локальными моделями не выполняют запросы Cron и Heartbeat одновременно.
string
Необязательный ключ сеанса для запусков Heartbeat.
  • main (по умолчанию): основной сеанс агента.
  • Явно заданный ключ сеанса (скопируйте из openclaw sessions --json или CLI сеансов).
  • Форматы ключей сеансов: см. разделы «Сеансы» и «Группы».
string
  • last: доставлять в последний использованный внешний канал.
  • явно указанный канал: любой настроенный канал или идентификатор плагина, например discord, matrix, telegram или whatsapp.
  • none (по умолчанию): запускать Heartbeat, но не доставлять сообщения во внешние каналы.
"allow" | "block"
по умолчанию:"allow"
Управляет доставкой напрямую и в личные сообщения. allow: разрешить доставку Heartbeat напрямую и в личные сообщения. block: запретить доставку напрямую и в личные сообщения (reason=dm-blocked).
string
Необязательное переопределение получателя (идентификатор, зависящий от канала, например E.164 для WhatsApp или идентификатор чата Telegram). Для тем и веток Telegram используйте <chatId>:topic:<messageThreadId>.
string
Необязательный идентификатор учётной записи для каналов с несколькими учётными записями. При target: "last" идентификатор учётной записи применяется к определённому последнему каналу, если тот поддерживает учётные записи; в противном случае он игнорируется. Если идентификатор не соответствует настроенной учётной записи определённого канала, доставка пропускается.
string
Переопределяет тело запроса по умолчанию (без объединения).
boolean
по умолчанию:"true"
Определяет, добавляется ли раздел системного запроса ## Heartbeats агента по умолчанию. Установите false, чтобы сохранить поведение Heartbeat во время выполнения (периодичность, доставку, HEARTBEAT.md), но исключить инструкции Heartbeat из системного запроса агента.
number
по умолчанию:"300"
Максимальное число символов после HEARTBEAT_OK, при котором разрешена доставка.
boolean
Если задано значение true, предупреждения об ошибках инструментов не включаются в полезную нагрузку во время запусков Heartbeat.
number
по умолчанию:"global timeout or min(every, 600)"
Максимальное время в секундах, отведённое на ход агента Heartbeat до его прерывания. Не задавайте значение, чтобы использовать agents.defaults.timeoutSeconds, если оно установлено; в противном случае используется период Heartbeat, ограниченный 600 секундами.
object
Ограничивает запуски Heartbeat временным окном. Объект с start (HH:MM, включительно; используйте 00:00 для начала суток), end (HH:MM, не включительно; для конца суток допускается 24:00) и необязательным timezone.
  • Не указано или "user": используется ваш agents.defaults.userTimezone, если он задан; в противном случае используется часовой пояс системы узла.
  • "local": всегда используется часовой пояс системы узла.
  • Любой идентификатор IANA (например, America/New_York): используется напрямую; если он недопустим, применяется описанное выше поведение "user".
  • Для активного окна значения start и end не должны совпадать; совпадающие значения считаются окном нулевой ширины (время всегда находится вне окна).
  • Вне активного окна Heartbeat пропускаются до следующего такта, попадающего в это окно.

Поведение доставки

  • По умолчанию Heartbeat выполняются в основном сеансе агента (agent:<id>:<mainKey>) или в global, когда session.scope = "global". Задайте session, чтобы переопределить это значение и использовать сеанс определённого канала (Discord/WhatsApp и т. д.).
  • session влияет только на контекст выполнения; доставка управляется параметрами target и to.
  • Чтобы доставлять сообщения в определённый канал или определённому получателю, задайте target и to. При target: "last" для доставки используется последний внешний канал этого сеанса.
  • По умолчанию Heartbeat можно доставлять напрямую и в личные сообщения. Задайте directPolicy: "block", чтобы запретить отправку напрямую, не отключая выполнение хода Heartbeat.
  • Если заняты основная очередь, линия целевого сеанса, линия Cron или активное задание Cron, Heartbeat пропускается и повторяется позже.
  • Если skipWhenBusy: true, линии субагентов с ключом сеанса и вложенные линии этого агента также откладывают запуски Heartbeat. Занятые линии других агентов не откладывают Heartbeat этого агента.
  • Если target не определяет внешнее назначение, выполнение всё равно происходит, но исходящее сообщение не отправляется.
  • Если showOk, showAlerts и useIndicator отключены, запуск сразу пропускается как reason=alerts-disabled.
  • Если отключена только доставка оповещений, OpenClaw всё равно может выполнить Heartbeat, обновить временные метки наступивших задач, восстановить временную метку бездействия сеанса и не отправлять полезную нагрузку внешнего оповещения.
  • Если определённое назначение Heartbeat поддерживает индикатор набора текста, OpenClaw отображает его во время выполнения Heartbeat. Используется то же назначение, куда Heartbeat отправил бы вывод чата; эта функция отключается параметром typingMode: "never".
  • Ответы, относящиеся только к Heartbeat, не поддерживают сеанс активным. Метаданные Heartbeat могут обновлять строку сеанса, однако истечение срока из-за бездействия определяется по lastInteractionAt из последнего реального сообщения пользователя или канала, а ежедневное истечение срока — по sessionStartedAt.
  • В истории Control UI и WebChat скрываются запросы Heartbeat и подтверждения, содержащие только OK. Эти ходы могут сохраняться в исходной стенограмме сеанса для аудита и повторного воспроизведения.
  • Отделённые фоновые задачи могут поставить системное событие в очередь и активировать Heartbeat, когда основной сеанс должен быстро обратить на что-либо внимание. Такая активация не превращает запуск Heartbeat в фоновую задачу.

Управление видимостью

По умолчанию подтверждения HEARTBEAT_OK не отображаются, а содержимое оповещений доставляется. Это можно настроить отдельно для каждого канала или учётной записи:
Приоритет: настройки учётной записи → настройки канала → настройки канала по умолчанию → встроенные значения по умолчанию.

Назначение каждого флага

  • showOk: отправляет подтверждение HEARTBEAT_OK, когда модель возвращает ответ, содержащий только OK.
  • showAlerts: отправляет содержимое оповещения, когда модель возвращает ответ, отличный от OK.
  • useIndicator: создаёт события индикатора для отображения состояния в интерфейсе.
Если все три параметра имеют значение false, OpenClaw полностью пропускает запуск Heartbeat (модель не вызывается).

Примеры настроек для канала и учётной записи

Распространённые схемы

HEARTBEAT.md (необязательно)

Если в рабочей области существует файл HEARTBEAT.md, запрос по умолчанию предписывает агенту прочитать его. Считайте его «контрольным списком Heartbeat»: небольшим, стабильным и безопасным для проверки каждые 30 минут. При обычных запусках HEARTBEAT.md добавляется только тогда, когда рекомендации Heartbeat включены для агента по умолчанию. Отключение периодичности Heartbeat с помощью 0m или установка includeSystemPromptSection: false исключает его из обычного начального контекста. В нативной среде Codex содержимое HEARTBEAT.md не добавляется в ход так же, как другие начальные файлы. Если файл существует и содержит непробельные символы, примечание о режиме совместной работы Heartbeat указывает Codex на этот файл и предписывает прочитать его перед продолжением. Если HEARTBEAT.md существует, но фактически пуст (содержит только пустые строки, комментарии Markdown/HTML, заголовки Markdown вроде # Heading, маркеры блоков или пустые заготовки контрольного списка), OpenClaw пропускает запуск Heartbeat, чтобы сократить число вызовов API. Такой пропуск обозначается как reason=empty-heartbeat-file. Если файл отсутствует, Heartbeat всё равно выполняется, а модель сама решает, что делать. Оставляйте его небольшим (короткий контрольный список или напоминания), чтобы не раздувать запрос. Пример HEARTBEAT.md:

Блоки tasks:

HEARTBEAT.md также поддерживает небольшой структурированный блок tasks: для проверок по интервалам внутри самого Heartbeat. Пример:
  • OpenClaw разбирает блок tasks: и проверяет каждую задачу с учётом её собственного interval.
  • В запрос Heartbeat для текущего такта включаются только наступившие задачи.
  • Если ни одна задача не наступила, Heartbeat полностью пропускается (reason=no-tasks-due), чтобы не тратить вызов модели.
  • Содержимое HEARTBEAT.md, не относящееся к задачам, сохраняется и добавляется как дополнительный контекст после списка наступивших задач.
  • Временные метки последнего выполнения задач хранятся в состоянии сеанса (heartbeatTaskState), поэтому интервалы сохраняются после обычных перезапусков.
  • Временные метки задач обновляются только после того, как запуск Heartbeat завершит обычный путь ответа. Пропущенные запуски empty-heartbeat-file / no-tasks-due не помечают задачи как выполненные.
Режим задач удобен, когда один файл Heartbeat должен содержать несколько периодических проверок, но вы не хотите выполнять их все на каждом такте.

Может ли агент обновлять HEARTBEAT.md?

Да — если вы его об этом попросите. HEARTBEAT.md — это обычный файл в рабочей области агента, поэтому в обычном чате можно сказать агенту, например:
  • «Обнови HEARTBEAT.md, добавив ежедневную проверку календаря».
  • «Перепиши HEARTBEAT.md, чтобы сделать его короче и сосредоточить на дальнейшей работе с входящими сообщениями».
Если это должно происходить заблаговременно, можно также добавить в запрос Heartbeat явную строку: «Если контрольный список устареет, замени содержимое HEARTBEAT.md более подходящим вариантом».
Не помещайте секреты (ключи API, номера телефонов, закрытые токены) в HEARTBEAT.md — его содержимое становится частью контекста запроса.

Ручная активация (по требованию)

Используйте openclaw system event, чтобы поставить системное событие в очередь и при необходимости немедленно запустить Heartbeat:
Если --session-key не указан и для нескольких агентов настроен heartbeat, то --mode now немедленно запускает Heartbeat каждого из этих агентов. Связанные элементы управления Heartbeat в той же группе CLI:

Передача рассуждений (необязательно)

По умолчанию Heartbeat передаёт только итоговую полезную нагрузку «ответа». Чтобы обеспечить прозрачность, включите:
  • agents.defaults.heartbeat.includeReasoning: true
После включения Heartbeat также будет передавать отдельное сообщение с префиксом Thinking (того же формата, что и /reasoning on). Это может быть полезно, когда агент управляет несколькими сеансами или экземплярами Codex и вы хотите видеть, почему он решил отправить вам уведомление, однако при этом может раскрыться больше внутренних сведений, чем вам хотелось бы. В групповых чатах рекомендуется оставлять эту функцию отключённой.

Учёт затрат

Heartbeat выполняет полные проходы агента. Чем короче интервалы, тем больше расход токенов. Чтобы снизить затраты:
  • Используйте isolatedSession: true, чтобы не отправлять полную историю диалога (сокращение примерно со ~100K до ~2-5K токенов на запуск).
  • Используйте lightContext: true, чтобы ограничить загрузочные файлы только файлом HEARTBEAT.md.
  • Укажите более дешёвую модель в model (например, ollama/llama3.2:1b).
  • Сохраняйте значение HEARTBEAT.md небольшим.
  • Используйте target: "none", если нужны только внутренние обновления состояния.

Переполнение контекста после Heartbeat

После завершения запуска Heartbeat сохраняет существующую модель среды выполнения общего сеанса, поэтому Heartbeat, переключивший сеанс на локальную модель меньшего размера (например, модель Ollama с окном 32k), может оставить эту модель активной для следующего прохода основного сеанса. Если при следующем проходе возникает переполнение контекста, а последняя модель среды выполнения сеанса совпадает с настроенной в heartbeat.model, сообщение OpenClaw о восстановлении указывает в качестве вероятной причины утечку модели из Heartbeat и предлагает исправление. Чтобы избежать этого, используйте isolatedSession: true для запуска Heartbeat в новом сеансе (при необходимости совместно с lightContext: true для минимального промпта) либо выберите для Heartbeat модель с окном контекста, достаточно большим для общего сеанса.

Связанные материалы