Heartbeat (Gateway)
Heartbeat czy Cron? Wskazówki, kiedy używać każdego z nich, znajdziesz w Automatyzacja i zadania.Heartbeat uruchamia okresowe tury agenta w głównej sesji, aby model mógł zasygnalizować wszystko, co wymaga uwagi, bez zasypywania Cię wiadomościami. Heartbeat to zaplanowana tura głównej sesji — nie tworzy rekordów zadań w tle. Rekordy zadań służą do pracy odłączonej od sesji (uruchomienia ACP, subagenci, izolowane zadania Cron). Rozwiązywanie problemów: Zaplanowane zadania
Szybki start (dla początkujących)
- Pozostaw włączone heartbeaty (domyślnie
30m, albo1hdla uwierzytelniania Anthropic OAuth/token, w tym ponownego użycia Claude CLI) lub ustaw własną częstotliwość. - Utwórz małą listę kontrolną
HEARTBEAT.mdalbo bloktasks:w obszarze roboczym agenta (opcjonalne, ale zalecane). - Zdecyduj, dokąd mają trafiać wiadomości Heartbeat (
target: "none"jest domyślne; ustawtarget: "last", aby kierować je do ostatniego kontaktu). - Opcjonalnie: włącz dostarczanie uzasadnienia Heartbeat dla większej przejrzystości.
- Opcjonalnie: użyj lekkiego kontekstu początkowego, jeśli uruchomienia Heartbeat wymagają tylko
HEARTBEAT.md. - Opcjonalnie: włącz izolowane sesje, aby przy każdym Heartbeat nie wysyłać pełnej historii rozmowy.
- Opcjonalnie: ogranicz heartbeat do aktywnych godzin (czas lokalny).
Domyślne ustawienia
- Interwał:
30m(albo1h, gdy wykrytym trybem uwierzytelniania jest Anthropic OAuth/token, w tym ponowne użycie Claude CLI). Ustawagents.defaults.heartbeat.everyalboagents.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” tylko wtedy, gdy heartbeat jest włączony dla domyślnego agenta i uruchomienie jest wewnętrznie oznaczone odpowiednią flagą.
- Gdy heartbeat jest wyłączony przez
0m, zwykłe uruchomienia także pomijająHEARTBEAT.mdw kontekście bootstrap, aby model nie widział instrukcji przeznaczonych wyłącznie dla Heartbeat. - Aktywne godziny (
heartbeat.activeHours) są sprawdzane w skonfigurowanej strefie czasowej. Poza tym oknem heartbeat jest pomijany aż do następnego tyknięcia mieszczącego się w oknie.
Do czego służy prompt heartbeat
Domyślny prompt jest celowo ogólny:- Zadania w tle: „Consider outstanding tasks” skłania agenta do przejrzenia oczekujących działań następczych (skrzynka odbiorcza, kalendarz, przypomnienia, kolejka pracy) i zasygnalizowania wszystkiego, co pilne.
- Kontakt z człowiekiem: „Checkup sometimes on your human during day time” skłania do okazjonalnej lekkiej wiadomości w stylu „czy czegoś potrzebujesz?”, ale unika nocnego spamu dzięki użyciu skonfigurowanej lokalnej strefy czasowej (zobacz /concepts/timezone).
agents.defaults.heartbeat.prompt (albo agents.list[].heartbeat.prompt) na własną 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ź odrzucana, jeśli pozostała treść ma ≤ackMaxChars(domyślnie: 300). - Jeśli
HEARTBEAT_OKpojawia się w środku odpowiedzi, nie jest traktowany w sposób szczególny. - 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 rejestrowane; wiadomość, która zawiera wyłącznie HEARTBEAT_OK, jest odrzucana.
Konfiguracja
Zakres i priorytet
agents.defaults.heartbeatustawia globalne zachowanie Heartbeat.agents.list[].heartbeatjest nakładane na to ustawienie; jeśli jakikolwiek agent ma blokheartbeat, heartbeat uruchamiają tylko ci agenci.channels.defaults.heartbeatustawia domyślną widoczność dla wszystkich kanałów.channels.<channel>.heartbeatnadpisuje ustawienia domyślne kanałów.channels.<channel>.accounts.<id>.heartbeat(kanały z wieloma kontami) nadpisuje ustawienia per kanał.
Heartbeat per agent
Jeśli jakikolwiek wpisagents.list[] zawiera blok heartbeat, heartbeat uruchamiają tylko ci agenci. Blok per agent jest nakładany na agents.defaults.heartbeat
(dzięki temu możesz raz ustawić wspólne wartości domyślne i nadpisywać je dla poszczególnych agentów).
Przykład: dwóch agentów, heartbeat uruchamia tylko drugi agent.
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:- Całkowicie pomiń
activeHours(brak ograniczenia do okna czasowego; to zachowanie domyślne). - Ustaw okno całodzienne:
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 jest zawsze pomijany.
Przykład wielu kont
UżyjaccountId, aby wskazać konkretne konto w kanałach obsługujących wiele kont, takich jak Telegram:
Uwagi o polach
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 także osobną wiadomośćReasoning:, gdy jest dostępna (w tej samej postaci co/reasoning on).lightContext: gdy ustawione na true, uruchomienia Heartbeat używają lekkiego kontekstu bootstrap i zachowują tylkoHEARTBEAT.mdz plików bootstrap obszaru roboczego.isolatedSession: gdy ustawione na true, każdy heartbeat działa w świeżej sesji bez wcześniejszej historii rozmowy. Używa tego samego wzorca izolacji co CronsessionTarget: "isolated". Znacznie zmniejsza koszt tokenów na pojedynczy 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 id Plugin, na przykład
discord,matrix,telegramalbowhatsapp. none(domyślnie): uruchom heartbeat, ale nie dostarczaj go na zewnątrz.
directPolicy: kontroluje zachowanie dostarczania bezpośredniego/DM:allow(domyślnie): zezwalaj na dostarczanie Heartbeat bezpośrednio/DM.block: wycisz dostarczanie bezpośrednie/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 z wieloma kontami. Gdytarget: "last", identyfikator konta jest stosowany do rozstrzygniętego ostatniego kanału, jeśli obsługuje konta; w przeciwnym razie jest ignorowany. Jeśli identyfikator konta nie pasuje do skonfigurowanego konta dla rozstrzygniętego kanału, dostarczenie jest pomijane.prompt: nadpisuje domyślną treść promptu (bez łączenia).ackMaxChars: maks. liczba znaków dozwolona poHEARTBEAT_OKprzed dostarczeniem.suppressToolErrorWarnings: gdy ustawione na 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:00dozwolone dla końca dnia) oraz opcjonalnymtimezone.- Pominięte lub
"user": używaagents.defaults.userTimezone, jeśli ustawiono, w przeciwnym razie przechodzi 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 przejście do zachowania"user"opisanego wyż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 jest pomijany aż do następnego tyknięcia mieszczącego się w oknie.
- Pominięte lub
Zachowanie dostarczania
- Domyślnie heartbeat jest uruchamiany w głównej sesji agenta (
agent:<id>:<mainKey>), albo wglobal, gdysession.scope = "global". Ustawsession, aby nadpisać to na konkretną sesję kanału (Discord/WhatsApp/itd.). sessionwpływa tylko na kontekst uruchomienia; dostarczanie jest kontrolowane przeztargetito.- Aby dostarczać do konkretnego kanału/odbiorcy, ustaw
target+to. Przytarget: "last"dostarczanie używa ostatniego zewnętrznego kanału dla tej sesji. - Domyślnie dostarczanie Heartbeat zezwala na cele bezpośrednie/DM. Ustaw
directPolicy: "block", aby wyciszyć wysyłkę do celów bezpośrednich, jednocześnie nadal uruchamiając turę Heartbeat. - Jeśli główna kolejka jest zajęta, heartbeat zostaje pominięty i ponowiony później.
- Jeśli
targetnie zostanie rozstrzygnięty do żadnego zewnętrznego miejsca docelowego, uruchomienie i tak nastąpi, ale żadna wiadomość wychodząca nie zostanie wysłana. - Jeśli
showOk,showAlertsiuseIndicatorsą wszystkie wyłączone, uruchomienie jest pomijane z góry jakoreason=alerts-disabled. - Jeśli wyłączone jest tylko dostarczanie alertów, OpenClaw nadal może uruchomić heartbeat, zaktualizować znaczniki czasu należnych zadań, przywrócić znacznik czasu bezczynności sesji i wyciszyć zewnętrzny ładunek alertu.
- Jeśli rozstrzygnięty cel Heartbeat obsługuje wskaźnik pisania, OpenClaw pokazuje pisanie, gdy uruchomienie Heartbeat jest aktywne. Używa to tego samego celu, do którego Heartbeat wysłałby wynik czatu, i jest wyłączane przez
typingMode: "never". - Odpowiedzi wyłącznie heartbeat nie podtrzymują aktywności sesji; ostatnie
updatedAtzostaje przywrócone, aby wygasanie bezczynności działało normalnie. - Odłączone zadania w tle mogą dodać zdarzenie systemowe do kolejki i wybudzić Heartbeat, gdy główna sesja powinna szybko coś zauważyć. Takie wybudzenie nie sprawia, że uruchomienie Heartbeat staje się zadaniem w tle.
Kontrola widoczności
Domyślnie potwierdzeniaHEARTBEAT_OK są wyciszane, a treść alertów jest
dostarczana. Możesz to dostosować dla każdego kanału lub konta:
Co robi każda flaga
showOk: wysyła potwierdzenieHEARTBEAT_OK, gdy model zwraca odpowiedź zawierającą tylko 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ł a per konto
Typowe wzorce
| Cel | Konfiguracja |
|---|---|
| Zachowanie domyślne (ciche OK, alerty włączone) | (konfiguracja nie jest potrzebna) |
| Pełna cisza (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 (opcjonalnie)
Jeśli w obszarze roboczym istnieje plik HEARTBEAT.md, domyślny prompt mówi
agentowi, aby go odczytał. Potraktuj go jako swoją „listę kontrolną heartbeat”:
małą, stabilną i bezpieczną do dołączania co 30 minut.
Podczas zwykłych uruchomień HEARTBEAT.md jest wstrzykiwany tylko wtedy, gdy
wskazówki Heartbeat są włączone dla domyślnego agenta. Wyłączenie częstotliwości heartbeat przez 0m albo ustawienie includeSystemPromptSection: false powoduje pominięcie go w zwykłym kontekście bootstrap.
Jeśli HEARTBEAT.md istnieje, ale jest w praktyce 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 pliku nie ma, Heartbeat nadal działa, a model sam decyduje, co zrobić.
Plik powinien być mały (krótka lista kontrolna albo przypomnienia), aby uniknąć rozrostu promptu.
Przykład HEARTBEAT.md:
Bloki tasks:
HEARTBEAT.md obsługuje też mały ustrukturyzowany blok tasks: do kontroli
sprawdzania według interwałów wewnątrz samego Heartbeat.
Przykład:
- OpenClaw analizuje blok
tasks:i sprawdza każde zadanie względem jego własnegointerval. - Do promptu heartbeat dla danego tyknięcia dołączane są tylko zadania, które są należne.
- Jeśli żadne zadania nie są należne, heartbeat jest całkowicie pomijany (
reason=no-tasks-due), aby uniknąć niepotrzebnego wywołania modelu. - Treść spoza zadań w
HEARTBEAT.mdjest zachowywana i dołączana jako dodatkowy kontekst po liście należnych zadań. - Znaczniki czasu ostatniego uruchomienia zadań są przechowywane w stanie sesji (
heartbeatTaskState), więc interwały przetrwają zwykłe restarty. - Znaczniki czasu zadań są aktualizowane 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 mu to zlecisz.
HEARTBEAT.md to po prostu zwykły plik w obszarze roboczym agenta, więc możesz powiedzieć
agentowi (w normalnym czacie) coś takiego:
- „Zaktualizuj
HEARTBEAT.md, aby dodać codzienne sprawdzenie kalendarza.” - „Przepisz
HEARTBEAT.md, aby był krótszy i skupiał się na działaniach następczych w skrzynce odbiorczej.”
HEARTBEAT.md — staje się on częścią kontekstu promptu.
Ręczne wybudzenie (na żądanie)
Możesz dodać zdarzenie systemowe do kolejki i natychmiast wyzwolić Heartbeat poleceniem:heartbeat, ręczne wybudzenie natychmiast uruchamia Heartbeat każdego z nich.
Użyj --mode next-heartbeat, aby poczekać na następne zaplanowane tyknięcie.
Dostarczanie uzasadnienia (opcjonalnie)
Domyślnie heartbeaty dostarczają tylko końcowy ładunek „odpowiedzi”. Jeśli chcesz większej przejrzystości, włącz:agents.defaults.heartbeat.includeReasoning: true
Reasoning: (w tej samej postaci co /reasoning on). Może to być przydatne, gdy agent
zarządza wieloma sesjami/codexami i chcesz zobaczyć, dlaczego zdecydował się
Cię pingnąć — ale może też ujawnić więcej szczegółów wewnętrznych, niż chcesz. Lepiej pozostawić to wyłączone w czatach grupowych.
Świadomość kosztów
Heartbeaty uruchamiają 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 (z ~100 tys. tokenów do ~2–5 tys. na uruchomienie). - Użyj
lightContext: true, aby ograniczyć pliki bootstrap tylko doHEARTBEAT.md. - Ustaw tańszy
model(np.ollama/llama3.2:1b). - Plik
HEARTBEAT.mdpowinien być mały. - Użyj
target: "none", jeśli chcesz tylko wewnętrznych aktualizacji stanu.
Powiązane
- Automatyzacja i zadania — wszystkie mechanizmy automatyzacji w skrócie
- Zadania w tle — jak śledzona jest praca odłączona
- Strefa czasowa — jak strefa czasowa wpływa na planowanie Heartbeat
- Rozwiązywanie problemów — debugowanie problemów z automatyzacją