Heartbeat чи cron? Див. Автоматизацію, щоб зрозуміти, коли використовувати кожен із них.
Швидкий старт (для початківців)
Виберіть інтервал
Залиште heartbeats увімкненими (типово
30m, або 1h для автентифікації Anthropic OAuth/токеном, включно з повторним використанням Claude CLI) або задайте власний інтервал.Додайте HEARTBEAT.md (необов’язково)
Створіть короткий контрольний список
HEARTBEAT.md або блок tasks: у робочій області агента.Вирішіть, куди мають надходити повідомлення heartbeat
target: "none" — типове значення; установіть target: "last", щоб спрямовувати їх останньому контакту.Необов’язкове налаштування
- Увімкніть доставку міркувань heartbeat для прозорості.
- Використовуйте легкий контекст початкового завантаження, якщо для запусків heartbeat потрібен лише
HEARTBEAT.md. - Увімкніть ізольовані сеанси, щоб не надсилати всю історію розмови під час кожного heartbeat.
- Обмежте heartbeats активними годинами (місцевий час).
Типові значення
- Інтервал:
30m(або1h, коли виявлений режим автентифікації — Anthropic OAuth/токен, включно з повторним використанням Claude CLI). Задайте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 секунд. Задайтеagents.defaults.heartbeat.timeoutSecondsабоagents.list[].heartbeat.timeoutSecondsдля окремого агента, якщо потрібна довша робота heartbeat. - Запит heartbeat надсилається дослівно як повідомлення користувача. Системний запит містить розділ “Heartbeat” лише коли heartbeats увімкнені для типового агента, а запуск позначається внутрішньо.
- Коли heartbeats вимкнено через
0m, звичайні запуски також не включаютьHEARTBEAT.mdу контекст початкового завантаження, щоб модель не бачила інструкції лише для heartbeat. - Активні години (
heartbeat.activeHours) перевіряються в налаштованому часовому поясі. Поза вікном heartbeats пропускаються до наступного такту всередині вікна. - Heartbeats автоматично відкладаються, доки cron-робота активна або перебуває в черзі. Установіть
heartbeat.skipWhenBusy: true, щоб також відкладати агента на його власних прив’язаних до ключа сеансу субагентських або вкладених командних смугах; суміжні агенти більше не призупиняються лише тому, що інший агент має субагентську роботу в процесі.
Для чого призначений запит heartbeat
Типовий запит навмисно широкий:- Фонові завдання: “Consider outstanding tasks” підштовхує агента переглядати подальші дії (вхідні, календар, нагадування, роботу в черзі) і виводити на поверхню все термінове.
- Перевірка людини: “Checkup sometimes on your human during day time” підштовхує інколи надсилати легке повідомлення “щось потрібно?”, але уникає нічного спаму завдяки вашому налаштованому місцевому часовому поясу (див. Часовий пояс).
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_OK на початку/в кінці повідомлення вилучається й журналюється; повідомлення, що складається лише з HEARTBEAT_OK, відкидається.
Конфігурація
Область дії та пріоритет
agents.defaults.heartbeatзадає глобальну поведінку heartbeat.agents.list[].heartbeatнакладається зверху; якщо будь-який агент має блокheartbeat, heartbeats запускають лише ці агенти.channels.defaults.heartbeatзадає типові параметри видимості для всіх каналів.channels.<channel>.heartbeatперевизначає типові параметри каналу.channels.<channel>.accounts.<id>.heartbeat(канали з кількома обліковими записами) перевизначає параметри для каналу.
Heartbeats для окремого агента
Якщо будь-який записagents.list[] містить блок heartbeat, heartbeats запускають лише ці агенти. Блок окремого агента накладається поверх agents.defaults.heartbeat (тобто можна один раз задати спільні типові значення й перевизначати їх для агента).
Приклад: два агенти, heartbeats запускає лише другий агент.
Приклад активних годин
Обмежте heartbeats робочими годинами в певному часовому поясі:Налаштування 24/7
Якщо ви хочете, щоб heartbeats запускалися весь день, використайте один із цих шаблонів:- Повністю опустіть
activeHours(без обмеження часовим вікном; це типова поведінка). - Задайте вікно на весь день:
activeHours: { start: "00:00", end: "24:00" }.
Приклад кількох облікових записів
ВикористовуйтеaccountId, щоб націлитися на конкретний обліковий запис у каналах із кількома обліковими записами, як-от Telegram:
Примітки до полів
Інтервал heartbeat (рядок тривалості; типова одиниця = хвилини).
Необов’язкове перевизначення моделі для heartbeat-запусків (
provider/model).Коли ввімкнено, також доставляє окреме повідомлення
Thinking, якщо воно доступне (та сама форма, що й /reasoning on).Коли
true, heartbeat-запуски використовують легкий контекст початкового завантаження й залишають лише HEARTBEAT.md із файлів початкового завантаження робочої області.Коли
true, кожен heartbeat запускається у свіжому сеансі без попередньої історії розмови. Використовує той самий шаблон ізоляції, що й cron sessionTarget: "isolated". Різко зменшує вартість токенів на кожен heartbeat. Поєднуйте з lightContext: true для максимальної економії. Маршрутизація доставки все одно використовує контекст основного сеансу.Коли
true, heartbeat-запуски відкладаються на додаткових зайнятих смугах цього агента: його власній прив’язаній до ключа сеансу субагентській або вкладеній командній роботі. Cron-смуги завжди відкладають heartbeats, навіть без цього прапорця, щоб хости локальних моделей не запускали cron і heartbeat-запити одночасно.Необов’язковий ключ сеансу для heartbeat-запусків.
main(типово): основний сеанс агента.- Явний ключ сеансу (скопіюйте з
openclaw sessions --jsonабо sessions CLI). - Формати ключів сеансу: див. Сеанси і Групи.
last: доставити до останнього використаного зовнішнього каналу.- явний канал: будь-який налаштований канал або id Plugin, наприклад
discord,matrix,telegramабоwhatsapp. none(типово): запустити heartbeat, але не доставляти назовні.
Керує поведінкою доставки напряму/DM.
allow: дозволити доставку heartbeat напряму/DM. block: придушити доставку напряму/DM (reason=dm-blocked).Необов’язкове перевизначення отримувача (специфічний для каналу id, наприклад E.164 для WhatsApp або id чату Telegram). Для тем/тредів Telegram використовуйте
<chatId>:topic:<messageThreadId>.Необов’язковий ідентифікатор облікового запису для каналів із кількома обліковими записами. Коли
target: "last", ідентифікатор облікового запису застосовується до визначеного останнього каналу, якщо він підтримує облікові записи; інакше його ігнорують. Якщо ідентифікатор облікового запису не відповідає налаштованому обліковому запису для визначеного каналу, доставку пропускають.Перевизначає стандартне тіло запиту (без об’єднання).
Максимальна кількість символів, дозволена після
HEARTBEAT_OK перед доставкою.Коли має значення true, пригнічує payload попереджень про помилки інструментів під час запусків Heartbeat.
Максимальна кількість секунд, дозволена для ходу агента Heartbeat до його переривання. Не задавайте, щоб використовувати
agents.defaults.timeoutSeconds, якщо встановлено, інакше використовується cadence Heartbeat з обмеженням у 600 секунд.Обмежує запуски 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 за замовчуванням дозволяють прямі/DM-цілі. Установіть
directPolicy: "block", щоб пригнічувати надсилання до прямих цілей, водночас продовжуючи виконувати хід Heartbeat. - Якщо основна черга, lane цільового сеансу, lane cron або активне завдання cron зайняті, Heartbeat пропускається й повторюється пізніше.
- Якщо
skipWhenBusy: true, підлеглий агент цього агента з ключем сеансу та вкладені lanes також відкладають запуски Heartbeat. Зайняті lanes інших агентів не відкладають цього агента. - Якщо
targetне визначає жодного зовнішнього призначення, запуск усе одно відбувається, але вихідне повідомлення не надсилається.
Видимість і поведінка пропуску
Видимість і поведінка пропуску
- Якщо
showOk,showAlertsіuseIndicatorусі вимкнені, запуск пропускається наперед ізreason=alerts-disabled. - Якщо вимкнено лише доставку сповіщень, OpenClaw все ще може запустити Heartbeat, оновити часові мітки належних завдань, відновити часову мітку простою сеансу та приглушити зовнішній payload сповіщення.
- Якщо визначена ціль 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: емiтує події індикатора для поверхонь статусу UI.
Приклади для каналу й для облікового запису
Поширені шаблони
| Мета | Конфігурація |
|---|---|
| Стандартна поведінка (тихі 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 додається лише тоді, коли настанови Heartbeat увімкнено для стандартного агента. Вимкнення cadence Heartbeat через 0m або встановлення includeSystemPromptSection: false вилучає його зі звичайного bootstrap-контексту.
У нативному harness Codex вміст HEARTBEAT.md не додається до ходу. Якщо файл існує й має вміст, відмінний від пробільних символів, інструкції режиму співпраці Heartbeat спрямовують Codex до файла й кажуть прочитати його перед продовженням.
Якщо HEARTBEAT.md існує, але фактично порожній (лише порожні рядки, коментарі Markdown/HTML, заголовки Markdown на кшталт # Heading, маркери fence або порожні заготовки контрольного списку), 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.md?
Так — якщо ви попросите його про це.HEARTBEAT.md — це просто звичайний файл у робочій області агента, тож ви можете сказати агенту (у звичайному чаті) щось на кшталт:
- “Update
HEARTBEAT.mdto add a daily calendar check.” - “Rewrite
HEARTBEAT.mdso it’s shorter and focused on inbox follow-ups.”
Ручне пробудження (на вимогу)
Ви можете поставити системну подію в чергу й негайно запустити Heartbeat за допомогою:heartbeat налаштовано для кількох агентів, ручне пробудження негайно запускає Heartbeat кожного з цих агентів.
Використовуйте --mode next-heartbeat, щоб дочекатися наступного запланованого тіку.
Доставка reasoning (необов’язково)
За замовчуванням Heartbeat доставляє лише фінальний payload «answer». Якщо вам потрібна прозорість, увімкніть:agents.defaults.heartbeat.includeReasoning: true
Thinking (та сама форма, що й /reasoning on). Це може бути корисно, коли агент керує кількома сеансами/codexes і ви хочете бачити, чому він вирішив написати вам, але це також може розкрити більше внутрішніх деталей, ніж ви хочете. Краще тримати це вимкненим у групових чатах.
Обізнаність про вартість
Heartbeat запускає повні ходи агента. Коротші інтервали спалюють більше токенів. Щоб зменшити вартість:- Використовуйте
isolatedSession: true, щоб не надсилати повну історію розмови (від ~100K токенів до ~2-5K за запуск). - Використовуйте
lightContext: true, щоб обмежити bootstrap-файли лишеHEARTBEAT.md. - Установіть дешевшу
model(наприклад,ollama/llama3.2:1b). - Тримайте
HEARTBEAT.mdмалим. - Використовуйте
target: "none", якщо вам потрібні лише оновлення внутрішнього стану.
Переповнення контексту після Heartbeat
Якщо Heartbeat раніше залишив наявний сеанс на меншій локальній моделі, наприклад моделі Ollama з вікном 32k, а наступний хід основного сеансу повідомляє про переповнення контексту, скиньте runtime-модель сеансу назад до налаштованої основної моделі. Повідомлення скидання OpenClaw вказує на це, коли остання runtime-модель збігається з налаштованоюheartbeat.model.
Поточні Heartbeat зберігають наявну runtime-модель спільного сеансу після завершення запуску. Ви все ще можете використовувати isolatedSession: true, щоб запускати Heartbeat у свіжому сеансі, поєднати це з lightContext: true для найменшого запиту або вибрати модель Heartbeat із достатньо великим контекстним вікном для спільного сеансу.
Пов’язане
- Автоматизація — усі механізми автоматизації з першого погляду
- Фонові завдання — як відстежується відокремлена робота
- Часовий пояс — як часовий пояс впливає на планування Heartbeat
- Усунення несправностей — налагодження проблем автоматизації