Heartbeat (Gateway)
Heartbeat czy Cron? Zobacz Automation & Tasks, aby uzyskać wskazówki, kiedy używać każdego z nich.Heartbeat uruchamia okresowe tury agenta w głównej sesji, dzięki czemu model może pokazać wszystko, co wymaga uwagi, bez spamowania Cię. Heartbeat to zaplanowana tura głównej sesji — nie tworzy rekordów background task. Rekordy zadań służą do pracy odłączonej (uruchomienia ACP, subagenci, izolowane zadania cron). Rozwiązywanie problemów: Scheduled Tasks
Szybki start (dla początkujących)
- Pozostaw heartbeat włączony (domyślnie
30malbo1hdla uwierzytelniania Anthropic OAuth/token, w tym ponownego użycia Claude CLI) albo ustaw własną częstotliwość. - Utwórz małą listę kontrolną
HEARTBEAT.mdlub bloktasks:w workspace agenta (opcjonalne, ale zalecane). - Zdecyduj, dokąd mają trafiać komunikaty heartbeat (
target: "none"jest wartością domyślną; ustawtarget: "last", aby kierować je do ostatniego kontaktu). - Opcjonalnie włącz dostarczanie rozumowania heartbeat dla większej przejrzystości.
- Opcjonalnie użyj lekkiego kontekstu bootstrap, jeśli uruchomienia heartbeat potrzebują tylko
HEARTBEAT.md. - Opcjonalnie włącz izolowane sesje, aby nie wysyłać pełnej historii rozmowy przy każdym heartbeat.
- Opcjonalnie ogranicz heartbeat do aktywnych godzin (czas lokalny).
Wartości domyślne
- Interwał:
30m(albo1h, gdy wykrytym trybem uwierzytelniania jest Anthropic OAuth/token, w tym ponowne użycie Claude CLI). Ustawagents.defaults.heartbeat.everyalbo per agentagents.list[].heartbeat.every; użyj0m, aby wyłączyć. - Treść promptu (konfigurowalna przez
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 jest wysyłany dosłownie jako wiadomość użytkownika. Prompt systemowy zawiera sekcję „Heartbeat”, a uruchomienie jest oznaczane wewnętrznie.
- Aktywne godziny (
heartbeat.activeHours) są sprawdzane w skonfigurowanej strefie czasowej. Poza oknem heartbeat są pomijane aż do następnego tyknięcia wewnątrz okna.
Do czego służy prompt heartbeat
Domyślny prompt jest celowo szeroki:- Background tasks: „Consider outstanding tasks” skłania agenta do przeglądania zadań do wykonania (skrzynka odbiorcza, kalendarz, przypomnienia, kolejka pracy) i sygnalizowania wszystkiego, co pilne.
- Sprawdzenie u człowieka: „Checkup sometimes on your human during day time” skłania do okazjonalnego lekkiego komunikatu „czy czegoś potrzebujesz?”, ale unika nocnego spamu dzięki użyciu Twojej skonfigurowanej lokalnej strefy czasowej (zobacz /concepts/timezone).
agents.defaults.heartbeat.prompt (lub
agents.list[].heartbeat.prompt) na niestandardową treść (wysyłaną dosłownie).
Kontrakt odpowiedzi
- Jeśli nic nie wymaga uwagi, odpowiedz
HEARTBEAT_OK. - Podczas uruchomień heartbeat OpenClaw traktuje
HEARTBEAT_OKjako potwierdzenie, gdy pojawia się na początku lub końcu odpowiedzi. Token jest usuwany, a odpowiedź jest odrzucana, jeśli pozostała treść ma ≤ackMaxChars(domyślnie: 300). - Jeśli
HEARTBEAT_OKpojawia się w środku odpowiedzi, nie jest traktowane w specjalny sposób. - W przypadku alertów nie dołączaj
HEARTBEAT_OK; zwróć tylko tekst alertu.
HEARTBEAT_OK na początku/końcu wiadomości jest usuwane
i logowane; wiadomość zawierająca wyłącznie HEARTBEAT_OK jest odrzucana.
Config
Zakres i pierwszeństwo
agents.defaults.heartbeatustawia globalne zachowanie heartbeat.agents.list[].heartbeatscala się na wierzchu; jeśli którykolwiek agent ma blokheartbeat, tylko ci agenci uruchamiają heartbeat.channels.defaults.heartbeatustawia domyślne ustawienia widoczności dla wszystkich kanałów.channels.<channel>.heartbeatnadpisuje domyślne ustawienia kanału.channels.<channel>.accounts.<id>.heartbeat(kanały wielokontowe) nadpisuje ustawienia per kanał.
Heartbeat per agent
Jeśli którykolwiek wpisagents.list[] zawiera blok heartbeat, tylko ci agenci
uruchamiają heartbeat. Blok per agent scala się na wierzchu agents.defaults.heartbeat
(dzięki czemu możesz ustawić wspólne wartości domyślne raz i nadpisać je per agent).
Przykład: dwóch agentów, tylko drugi agent uruchamia heartbeat.
Przykład aktywnych godzin
Ogranicz heartbeat do godzin pracy w określonej strefie czasowej:Konfiguracja 24/7
Jeśli chcesz, aby heartbeat działał przez cały dzień, użyj jednego z tych wzorców:- Pomiń
activeHourscałkowicie (brak ograniczenia oknem czasowym; to zachowanie domyślne). - Ustaw okno całodniowe:
activeHours: { start: "00:00", end: "24:00" }.
start i end (na przykład 08:00 do 08:00).
Jest to traktowane jako okno o zerowej szerokości, więc heartbeat są zawsze pomijane.
Przykład wielu kont
UżyjaccountId, aby kierować na konkretne konto w kanałach wielokontowych, takich jak Telegram:
Uwagi dotyczące pól
every: interwał heartbeat (ciąg czasu trwania; domyślna jednostka = minuty).model: opcjonalne nadpisanie modelu dla uruchomień heartbeat (provider/model).includeReasoning: gdy włączone, dostarcza również osobny komunikatReasoning:gdy jest dostępny (ten sam kształt co/reasoning on).lightContext: gdy true, uruchomienia heartbeat używają lekkiego kontekstu bootstrap i zachowują tylkoHEARTBEAT.mdz plików bootstrap workspace.isolatedSession: gdy true, każdy heartbeat działa w nowej sesji bez wcześniejszej historii rozmowy. Używa tego samego wzorca izolacji co cronsessionTarget: "isolated". Radykalnie obniża koszt tokenów per heartbeat. Połącz zlightContext: true, aby uzyskać maksymalne oszczędności. Routing dostarczania nadal używa kontekstu głównej sesji.session: opcjonalny klucz sesji dla uruchomień heartbeat.target:last: dostarczaj do ostatnio użytego zewnętrznego kanału.- jawny kanał: dowolny skonfigurowany kanał lub identyfikator wtyczki, na przykład
discord,matrix,telegramalbowhatsapp. none(domyślnie): uruchom heartbeat, ale nie dostarczaj niczego na zewnątrz.
directPolicy: steruje zachowaniem dostarczania direct/DM:allow(domyślnie): zezwalaj na dostarczanie heartbeat do celów direct/DM.block: wycisz dostarczanie direct/DM (reason=dm-blocked).
to: opcjonalne nadpisanie odbiorcy (identyfikator specyficzny dla kanału, np. E.164 dla WhatsApp albo identyfikator czatu Telegram). Dla tematów/wątków Telegram użyj<chatId>:topic:<messageThreadId>.accountId: opcjonalny identyfikator konta dla kanałów wielokontowych. Gdytarget: "last", identyfikator konta ma zastosowanie do rozpoznanego ostatniego kanału, jeśli obsługuje konta; w przeciwnym razie jest ignorowany. Jeśli identyfikator konta nie pasuje do skonfigurowanego konta dla rozpoznanego kanału, dostarczenie jest pomijane.prompt: nadpisuje domyślną treść promptu (bez scalania).ackMaxChars: maks. liczba znaków dozwolona poHEARTBEAT_OKprzed dostarczeniem.suppressToolErrorWarnings: gdy true, wycisza ładunki ostrzeżeń o błędach narzędzi podczas uruchomień heartbeat.activeHours: ogranicza uruchomienia heartbeat do okna czasowego. Obiekt zstart(HH:MM, włącznie; użyj00:00dla początku dnia),end(HH:MM, wyłącznie;24:00jest dozwolone dla końca dnia) oraz opcjonalnymtimezone.- Pominięte lub
"user": używa Twojegoagents.defaults.userTimezone, jeśli ustawiono, w przeciwnym razie wraca do strefy czasowej systemu hosta. "local": zawsze używa strefy czasowej systemu hosta.- Dowolny identyfikator IANA (np.
America/New_York): używany bezpośrednio; jeśli jest nieprawidłowy, następuje fallback do zachowania"user"opisanego powyżej. startiendnie mogą być równe dla aktywnego okna; równe wartości są traktowane jako zerowa szerokość (zawsze poza oknem).- Poza aktywnym oknem heartbeat są pomijane aż do następnego tyknięcia wewnątrz okna.
- Pominięte lub
Zachowanie dostarczania
- Heartbeat są domyślnie uruchamiane w głównej sesji agenta (
agent:<id>:<mainKey>), alboglobal, gdysession.scope = "global". Ustawsession, aby nadpisać na konkretną sesję kanału (Discord/WhatsApp/itd.). sessionwpływa tylko na kontekst uruchomienia; dostarczaniem sterujątargetito.- Aby dostarczyć do konkretnego kanału/odbiorcy, ustaw
target+to. Przytarget: "last"dostarczenie używa ostatniego zewnętrznego kanału dla tej sesji. - Dostarczanie heartbeat domyślnie zezwala na cele direct/DM. Ustaw
directPolicy: "block", aby wyciszyć wysyłanie do celów direct przy jednoczesnym zachowaniu tury heartbeat. - Jeśli główna kolejka jest zajęta, heartbeat jest pomijany i ponawiany później.
- Jeśli
targetnie rozpozna żadnego zewnętrznego miejsca docelowego, uruchomienie nadal następuje, ale żadna wiadomość wychodząca nie jest wysyłana. - Jeśli
showOk,showAlertsiuseIndicatorsą wszystkie wyłączone, uruchomienie jest pomijane od razu zreason=alerts-disabled. - Jeśli wyłączone jest tylko dostarczanie alertów, OpenClaw nadal może uruchomić heartbeat, zaktualizować znaczniki czasu zadań wymagających wykonania, przywrócić znacznik bezczynności sesji i wyciszyć zewnętrzny ładunek alertu.
- Odpowiedzi tylko-heartbeat nie utrzymują sesji przy życiu; ostatnie
updatedAtjest przywracane, aby wygaśnięcie bezczynności zachowywało się normalnie. - Odłączone background tasks mogą umieścić zdarzenie systemowe w kolejce i wybudzić heartbeat, gdy główna sesja powinna szybko coś zauważyć. To wybudzenie nie sprawia, że heartbeat staje się background task.
Sterowanie widocznością
Domyślnie potwierdzeniaHEARTBEAT_OK są ukrywane, podczas gdy treść alertów jest
dostarczana. Możesz to dostosować per kanał lub per konto:
Co robi każda flaga
showOk: wysyła potwierdzenieHEARTBEAT_OK, gdy model zwraca odpowiedź zawierającą wyłącznie OK.showAlerts: wysyła treść alertu, gdy model zwraca odpowiedź inną niż OK.useIndicator: emituje zdarzenia wskaźnika dla powierzchni statusu UI.
Przykłady per kanał vs per konto
Typowe wzorce
| Cel | Config |
|---|---|
| Domyślne zachowanie (ciche OK, alerty włączone) | (brak wymaganego config) |
| Całkowicie cicho (bez wiadomości, bez wskaźnika) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| Tylko wskaźnik (bez wiadomości) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| OK tylko w jednym kanale | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md (opcjonalne)
Jeśli plikHEARTBEAT.md istnieje w workspace, domyślny prompt instruuje
agenta, aby go odczytał. Pomyśl o nim jak o swojej „liście kontrolnej heartbeat”: małej, stabilnej i
bezpiecznej do dołączania co 30 minut.
Jeśli HEARTBEAT.md istnieje, ale jest praktycznie pusty (tylko puste linie i nagłówki markdown
takie jak # Heading), OpenClaw pomija uruchomienie heartbeat, aby oszczędzić wywołania API.
To pominięcie jest raportowane jako reason=empty-heartbeat-file.
Jeśli plik nie istnieje, heartbeat nadal działa, a model sam decyduje, co zrobić.
Utrzymuj go w małym rozmiarze (krótka lista kontrolna albo przypomnienia), aby uniknąć rozrostu promptu.
Przykładowy HEARTBEAT.md:
Bloki tasks:
HEARTBEAT.md obsługuje także mały ustrukturyzowany blok tasks: dla kontroli
opartych na interwałach wewnątrz samego heartbeat.
Przykład:
- OpenClaw parsuje blok
tasks:i sprawdza każde zadanie względem własnegointerval. - Do promptu heartbeat dla danego tyknięcia są dołączane tylko zadania, które mają termin wykonania.
- Jeśli żadne zadania nie mają terminu wykonania, heartbeat jest całkowicie pomijany (
reason=no-tasks-due), aby uniknąć zmarnowanego wywołania modelu. - Treść spoza zadań w
HEARTBEAT.mdjest zachowywana i dołączana jako dodatkowy kontekst po liście zadań wymagających wykonania. - Znaczniki czasu ostatniego uruchomienia zadań są przechowywane w stanie sesji (
heartbeatTaskState), więc interwały przetrwają zwykłe restarty. - Znaczniki czasu zadań są przesuwane dopiero po tym, jak uruchomienie heartbeat przejdzie normalną ścieżkę odpowiedzi. Pominięte uruchomienia
empty-heartbeat-file/no-tasks-duenie oznaczają zadań jako ukończonych.
Czy agent może aktualizować HEARTBEAT.md?
Tak — jeśli go o to poprosisz.HEARTBEAT.md to po prostu zwykły plik w workspace agenta, więc możesz powiedzieć
agentowi (na zwykłym czacie) coś takiego:
- „Zaktualizuj
HEARTBEAT.md, aby dodać codzienną kontrolę kalendarza.” - „Przepisz
HEARTBEAT.md, aby był krótszy i skupiał się na zadaniach związanych ze skrzynką odbiorczą.”
HEARTBEAT.md — staje się częścią kontekstu promptu.
Ręczne wybudzenie (na żądanie)
Możesz dodać zdarzenie systemowe do kolejki i natychmiast uruchomić heartbeat poleceniem:heartbeat, ręczne wybudzenie natychmiast uruchamia heartbeat każdego z tych
agentów.
Użyj --mode next-heartbeat, aby poczekać na następne zaplanowane tyknięcie.
Dostarczanie rozumowania (opcjonalne)
Domyślnie heartbeat dostarcza tylko końcowy ładunek „odpowiedzi”. Jeśli chcesz większej przejrzystości, włącz:agents.defaults.heartbeat.includeReasoning: true
Reasoning: (ten sam kształt co /reasoning on). Może to być przydatne, gdy agent
zarządza wieloma sesjami/codexami i chcesz zobaczyć, dlaczego zdecydował się Cię
powiadomić — ale może to także ujawnić więcej szczegółów wewnętrznych, niż chcesz. W czatach grupowych lepiej pozostawić tę opcję
wyłączoną.
Świadomość kosztów
Heartbeat uruchamia pełne tury agenta. Krótsze interwały zużywają więcej tokenów. Aby obniżyć koszt:- Użyj
isolatedSession: true, aby uniknąć wysyłania pełnej historii rozmowy (~100K tokenów spada do ~2-5K na uruchomienie). - Użyj
lightContext: true, aby ograniczyć pliki bootstrap tylko doHEARTBEAT.md. - Ustaw tańszy
model(np.ollama/llama3.2:1b). - Utrzymuj
HEARTBEAT.mdw małym rozmiarze. - Użyj
target: "none", jeśli chcesz tylko wewnętrznych aktualizacji stanu.
Powiązane
- Automation & Tasks — wszystkie mechanizmy automatyzacji w skrócie
- Background Tasks — jak śledzona jest praca odłączona
- Timezone — jak strefa czasowa wpływa na harmonogram heartbeat
- Troubleshooting — debugowanie problemów z automatyzacją