Heartbeat (Gateway)
Heartbeat чи Cron? Див. Automation & Tasks, щоб зрозуміти, коли що використовувати.Heartbeat запускає періодичні цикли агента в основній сесії, щоб модель могла показувати все, що потребує уваги, не засипаючи вас повідомленнями. Heartbeat — це запланований цикл основної сесії — він не створює записи background task. Записи завдань призначені для відокремленої роботи (запуски ACP, subagent, ізольовані cron-завдання). Усунення несправностей: Scheduled Tasks
Швидкий старт (для початківців)
- Залиште heartbeat увімкненим (за замовчуванням це
30m, або1hдля Anthropic OAuth/token auth, включно з повторним використанням Claude CLI) або задайте власну частоту. - Створіть невеликий контрольний список
HEARTBEAT.mdабо блокtasks:у робочому просторі агента (необов’язково, але рекомендовано). - Вирішіть, куди мають надходити повідомлення heartbeat (
target: "none"— значення за замовчуванням; установітьtarget: "last", щоб спрямовувати їх до останнього контакту). - Необов’язково: увімкніть доставку reasoning heartbeat для більшої прозорості.
- Необов’язково: використовуйте полегшений bootstrap-контекст, якщо для запусків heartbeat потрібен лише
HEARTBEAT.md. - Необов’язково: увімкніть ізольовані сесії, щоб не надсилати повну історію розмови під час кожного heartbeat.
- Необов’язково: обмежте heartbeat активними годинами (за місцевим часом).
Значення за замовчуванням
- Інтервал:
30m(або1h, коли виявленим режимом auth є Anthropic OAuth/token, включно з повторним використанням Claude CLI). Установітьagents.defaults.heartbeat.everyабо для окремого агентаagents.list[].heartbeat.every; використовуйте0m, щоб вимкнути. - Тіло prompt (налаштовується через
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. - Prompt heartbeat надсилається дослівно як повідомлення користувача. System prompt містить розділ “Heartbeat”, а запуск внутрішньо позначається відповідним прапорцем.
- Активні години (
heartbeat.activeHours) перевіряються в налаштованому часовому поясі. Поза межами цього вікна heartbeat пропускаються до наступного тіку в межах вікна.
Для чого потрібен prompt heartbeat
Prompt за замовчуванням навмисно зроблено широким:- Фонові завдання: “Consider outstanding tasks” підштовхує агента переглядати наступні дії (вхідні, календар, нагадування, завдання в черзі) і показувати все термінове.
- Людська перевірка: “Checkup sometimes on your human during day time” підштовхує до періодичного легкого повідомлення на кшталт “чи щось потрібно?”, але уникає нічного спаму завдяки використанню вашого налаштованого місцевого часового поясу (див. /concepts/timezone).
agents.defaults.heartbeat.prompt (або
agents.list[].heartbeat.prompt) у власне тіло prompt, яке надсилатиметься дослівно.
Контракт відповіді
- Якщо нічого не потребує уваги, дайте відповідь
HEARTBEAT_OK. - Під час запусків heartbeat OpenClaw трактує
HEARTBEAT_OKяк підтвердження, якщо він з’являється на початку або в кінці відповіді. Токен видаляється, а відповідь відкидається, якщо решта вмісту має ≤ackMaxChars(типово: 300). - Якщо
HEARTBEAT_OKз’являється в середині відповіді, він не обробляється особливим чином. - Для сповіщень не включайте
HEARTBEAT_OK; повертайте лише текст сповіщення.
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 робочими годинами в певному часовому поясі:Налаштування 24/7
Якщо ви хочете, щоб heartbeat працювали весь день, використовуйте один із цих варіантів:- Повністю опустіть
activeHours(без обмеження часовим вікном; це поведінка за замовчуванням). - Установіть повноденне вікно:
activeHours: { start: "00:00", end: "24:00" }.
start і end (наприклад, 08:00 до 08:00).
Це вважається вікном нульової ширини, тому heartbeat завжди пропускаються.
Приклад із кількома обліковими записами
ВикористовуйтеaccountId, щоб націлитися на конкретний обліковий запис у multi-account каналах, таких як Telegram:
Примітки щодо полів
every: інтервал heartbeat (рядок тривалості; одиниця за замовчуванням = хвилини).model: необов’язкове перевизначення моделі для запусків heartbeat (provider/model).includeReasoning: якщо ввімкнено, також доставляє окреме повідомленняReasoning:, коли воно доступне (така сама форма, як у/reasoning on).lightContext: якщоtrue, запуски heartbeat використовують полегшений bootstrap-контекст і залишають лишеHEARTBEAT.mdіз bootstrap-файлів робочого простору.isolatedSession: якщоtrue, кожен heartbeat виконується в новій сесії без попередньої історії розмов. Використовує той самий шаблон ізоляції, що й cronsessionTarget: "isolated". Різко зменшує витрати токенів на кожен heartbeat. Поєднуйте зlightContext: trueдля максимальної економії. Маршрутизація доставки все одно використовує контекст основної сесії.session: необов’язковий ключ сесії для запусків heartbeat.main(типово): основна сесія агента.- Явний ключ сесії (скопіюйте з
openclaw sessions --jsonабо з sessions CLI). - Формати ключів сесій: див. Sessions і Groups.
target:last: доставити в останній використаний зовнішній канал.- явний канал: будь-який налаштований канал або id plugin, наприклад
discord,matrix,telegramабоwhatsapp. none(типово): виконати heartbeat, але не доставляти його назовні.
directPolicy: керує поведінкою доставки в direct/DM:allow(типово): дозволяти доставку heartbeat у direct/DM.block: приглушити доставку в direct/DM (reason=dm-blocked).
to: необов’язкове перевизначення отримувача (id, специфічний для каналу, наприклад E.164 для WhatsApp або id чату Telegram). Для тем/тредів Telegram використовуйте<chatId>:topic:<messageThreadId>.accountId: необов’язковий id облікового запису для multi-account каналів. Якщоtarget: "last", id облікового запису застосовується до визначеного останнього каналу, якщо він підтримує облікові записи; інакше ігнорується. Якщо id облікового запису не відповідає налаштованому обліковому запису для визначеного каналу, доставка пропускається.prompt: перевизначає типове тіло prompt (не зливається).ackMaxChars: макс. кількість символів, дозволена післяHEARTBEAT_OKперед доставкою.suppressToolErrorWarnings: якщоtrue, приглушує payload попереджень про помилки інструментів під час запусків heartbeat.activeHours: обмежує запуски heartbeat часовим вікном. Об’єкт ізstart(HH:MM, включно; використовуйте00:00для початку дня),end(HH:MM, невключно; для кінця дня дозволено24:00) і необов’язковимtimezone.- Пропущено або
"user": використовує вашagents.defaults.userTimezone, якщо задано, інакше повертається до системного часового поясу хоста. "local": завжди використовує системний часовий пояс хоста.- Будь-який ідентифікатор IANA (наприклад,
America/New_York): використовується напряму; якщо він недійсний, відбувається fallback до поведінки"user", описаної вище. startіendне повинні бути однаковими для активного вікна; однакові значення вважаються нульовою шириною (завжди поза вікном).- Поза активним вікном heartbeat пропускаються до наступного тіку в межах вікна.
- Пропущено або
Поведінка доставки
- Heartbeat за замовчуванням виконуються в основній сесії агента (
agent:<id>:<mainKey>), або вglobal, колиsession.scope = "global". Установітьsession, щоб перевизначити це на конкретну сесію каналу (Discord/WhatsApp тощо). sessionвпливає лише на контекст запуску; доставкою керуютьtargetіto.- Щоб доставляти в конкретний канал/отримувача, задайте
target+to. Зtarget: "last"доставка використовує останній зовнішній канал для цієї сесії. - Доставки heartbeat за замовчуванням дозволяють цілі direct/DM. Установіть
directPolicy: "block", щоб приглушити надсилання на direct-цілі, але все одно виконати цикл heartbeat. - Якщо основна черга зайнята, heartbeat пропускається й повторюється пізніше.
- Якщо
targetне розв’язується в жодну зовнішню ціль, запуск усе одно відбувається, але вихідне повідомлення не надсилається. - Якщо
showOk,showAlertsіuseIndicatorусі вимкнені, запуск пропускається одразу зreason=alerts-disabled. - Якщо вимкнено лише доставку сповіщень, OpenClaw усе одно може виконати heartbeat, оновити часові позначки належних завдань, відновити часову позначку idle сесії та приглушити зовнішній payload сповіщення.
- Відповіді лише heartbeat не підтримують активність сесії; останнє значення
updatedAtвідновлюється, тому завершення строку бездіяльності працює нормально. - Відокремлені background tasks можуть ставити системну подію в чергу та пробуджувати heartbeat, коли основній сесії потрібно швидко помітити щось важливе. Таке пробудження не робить запуск heartbeat фоновим завданням.
Керування видимістю
За замовчуванням підтвердженняHEARTBEAT_OK приглушуються, а вміст сповіщень
доставляється. Ви можете налаштувати це для кожного каналу або облікового запису:
Що робить кожен прапорець
showOk: надсилає підтвердженняHEARTBEAT_OK, коли модель повертає відповідь лише з OK.showAlerts: надсилає вміст сповіщення, коли модель повертає відповідь не-OK.useIndicator: видає події індикатора для поверхонь статусу 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, prompt за замовчуванням каже
агенту його прочитати. Сприймайте його як свій “контрольний список heartbeat”: невеликий, стабільний і
безпечний для включення кожні 30 хвилин.
Якщо HEARTBEAT.md існує, але фактично порожній (лише порожні рядки та markdown-заголовки
на кшталт # Heading), OpenClaw пропускає запуск heartbeat, щоб заощадити виклики API.
Такий пропуск позначається як reason=empty-heartbeat-file.
Якщо файлу немає, heartbeat усе одно виконується, і модель сама вирішує, що робити.
Тримайте його маленьким (короткий контрольний список або нагадування), щоб уникнути роздування prompt.
Приклад HEARTBEAT.md:
Блоки tasks:
HEARTBEAT.md також підтримує невеликий структурований блок tasks: для перевірок
за інтервалами всередині самого heartbeat.
Приклад:
- OpenClaw розбирає блок
tasks:і перевіряє кожне завдання щодо його власногоinterval. - До prompt heartbeat для цього тіку включаються лише належні завдання.
- Якщо немає жодного належного завдання, heartbeat повністю пропускається (
reason=no-tasks-due), щоб уникнути марного виклику моделі. - Вміст у
HEARTBEAT.md, який не є завданнями, зберігається й додається як додатковий контекст після списку належних завдань. - Часові позначки останнього запуску завдань зберігаються в стані сесії (
heartbeatTaskState), тому інтервали переживають звичайні перезапуски. - Часові позначки завдань просуваються вперед лише після того, як запуск heartbeat проходить свій звичайний шлях відповіді. Пропущені запуски
empty-heartbeat-file/no-tasks-dueне позначають завдання як завершені.
Чи може агент оновлювати HEARTBEAT.md?
Так — якщо ви його про це попросите.HEARTBEAT.md — це просто звичайний файл у робочому просторі агента, тож ви можете сказати
агенту (у звичайному чаті) щось на кшталт:
- “Онови
HEARTBEAT.md, додавши щоденну перевірку календаря.” - “Перепиши
HEARTBEAT.md, щоб він був коротшим і зосередженим на подальших діях щодо вхідних.”
HEARTBEAT.md — він стає частиною контексту prompt.
Ручне пробудження (на вимогу)
Ви можете поставити системну подію в чергу й одразу запустити heartbeat за допомогою:heartbeat налаштовано для кількох агентів, ручне пробудження негайно запустить heartbeat кожного з них.
Використовуйте --mode next-heartbeat, щоб дочекатися наступного запланованого тіку.
Доставка reasoning (необов’язково)
За замовчуванням heartbeat доставляють лише фінальний payload “відповіді”. Якщо ви хочете більшої прозорості, увімкніть:agents.defaults.heartbeat.includeReasoning: true
Reasoning: (така сама форма, як у /reasoning on). Це може бути корисно, коли агент
керує кількома сесіями/codex і ви хочете бачити, чому він вирішив вам написати
— але це також може розкрити більше внутрішніх деталей, ніж вам хотілося б. У групових чатах краще залишати це
вимкненим.
Усвідомлення вартості
Heartbeat запускають повноцінні цикли агента. Коротші інтервали спалюють більше токенів. Щоб зменшити витрати:- Використовуйте
isolatedSession: true, щоб не надсилати повну історію розмови (~100K токенів зменшується до ~2-5K на запуск). - Використовуйте
lightContext: true, щоб обмежити bootstrap-файли лишеHEARTBEAT.md. - Задайте дешевшу
model(наприклад,ollama/llama3.2:1b). - Тримайте
HEARTBEAT.mdневеликим. - Використовуйте
target: "none", якщо вам потрібні лише внутрішні оновлення стану.
Пов’язане
- Automation & Tasks — огляд усіх механізмів автоматизації
- Background Tasks — як відстежується відокремлена робота
- Timezone — як часовий пояс впливає на планування heartbeat
- Troubleshooting — налагодження проблем автоматизації