Zadania crona (Gateway scheduler)
Cron czy Heartbeat? Zobacz Cron vs Heartbeat, aby uzyskać wskazówki, kiedy używać każdego z nich.Cron to wbudowany harmonogram Gateway. Przechowuje zadania, wybudza agenta we właściwym czasie i opcjonalnie może dostarczać wyjście z powrotem do czatu. Jeśli chcesz „uruchamiaj to każdego ranka” albo „szturchnij agenta za 20 minut”, cron jest właściwym mechanizmem. Rozwiązywanie problemów: /automation/troubleshooting
TL;DR
- Cron działa wewnątrz Gateway (nie wewnątrz modelu).
- Zadania są przechowywane w
~/.openclaw/cron/, więc restarty nie powodują utraty harmonogramów. - Dwa style wykonania:
- Sesja główna: dodanie zdarzenia systemowego do kolejki, a następnie uruchomienie przy następnym heartbeat.
- Izolowany: uruchomienie dedykowanej tury agenta w
cron:<jobId>, z dostarczaniem (domyślnie ogłoszenie lub brak).
- Wybudzenia są elementem pierwszej klasy: zadanie może zażądać „obudź teraz” zamiast „przy następnym heartbeat”.
Szybki start (konkretne działania)
Utwórz jednorazowe przypomnienie, sprawdź, czy istnieje, i uruchom je natychmiast:Odpowiedniki wywołań narzędzi (narzędzie cron Gateway)
Kanoniczne kształty JSON i przykłady znajdziesz w Schemacie JSON dla wywołań narzędzi.Gdzie przechowywane są zadania cron
Zadania cron są domyślnie zapisywane na hoście Gateway w~/.openclaw/cron/jobs.json.
Gateway ładuje plik do pamięci i zapisuje go ponownie przy zmianach, dlatego ręczne edycje
są bezpieczne tylko wtedy, gdy Gateway jest zatrzymany. Preferuj openclaw cron add/edit lub
API wywołań narzędzi cron do wprowadzania zmian.
Przegląd przyjazny dla początkujących
Myśl o zadaniu cron jako o: kiedy uruchomić + co zrobić.-
Wybierz harmonogram
- Jednorazowe przypomnienie →
schedule.kind = "at"(CLI:--at) - Zadanie cykliczne →
schedule.kind = "every"lubschedule.kind = "cron" - Jeśli znacznik czasu ISO pomija strefę czasową, jest traktowany jako UTC.
- Jednorazowe przypomnienie →
-
Wybierz miejsce wykonania
sessionTarget: "main"→ uruchomienie podczas następnego heartbeat z głównym kontekstem.sessionTarget: "isolated"→ uruchomienie dedykowanej tury agenta wcron:<jobId>.
-
Wybierz ładunek
- Sesja główna →
payload.kind = "systemEvent" - Sesja izolowana →
payload.kind = "agentTurn"
- Sesja główna →
schedule.kind = "at") są domyślnie usuwane po powodzeniu. Ustaw
deleteAfterRun: false, aby je zachować (zostaną wyłączone po powodzeniu).
Pojęcia
Zadania
Zadanie cron to zapisany rekord z:- harmonogramem (kiedy ma się uruchomić),
- ładunkiem (co ma zrobić),
- opcjonalnym trybem dostarczania (ogłoszenie lub brak).
- opcjonalnym powiązaniem z agentem (
agentId): uruchom zadanie pod konkretnym agentem; jeśli brak lub nieznany, gateway wraca do domyślnego agenta.
jobId (używany przez CLI/API Gateway).
W wywołaniach narzędzi agenta jobId jest kanoniczne; starsze id jest akceptowane dla zgodności.
Zadania jednorazowe są domyślnie automatycznie usuwane po powodzeniu; ustaw deleteAfterRun: false, aby je zachować.
Harmonogramy
Cron obsługuje trzy rodzaje harmonogramów:at: jednorazowy znacznik czasu przezschedule.at(ISO 8601).every: stały interwał (ms).cron: 5-polowe wyrażenie cron z opcjonalną strefą czasową IANA.
croner. Jeśli strefa czasowa jest pominięta, używana jest
lokalna strefa czasowa hosta Gateway.
Wykonanie główne vs izolowane
Zadania sesji głównej (zdarzenia systemowe)
Zadania główne dodają zdarzenie systemowe do kolejki i opcjonalnie wybudzają runner heartbeat. Muszą używaćpayload.kind = "systemEvent".
wakeMode: "now"(domyślnie): zdarzenie wyzwala natychmiastowe uruchomienie heartbeat.wakeMode: "next-heartbeat": zdarzenie czeka na następny zaplanowany heartbeat.
Zadania izolowane (dedykowane sesje cron)
Zadania izolowane uruchamiają dedykowaną turę agenta w sesjicron:<jobId>.
Kluczowe zachowania:
- Prompt jest poprzedzony
[cron:<jobId> <job name>]dla identyfikowalności. - Każde uruchomienie rozpoczyna świeże ID sesji (bez przenoszenia wcześniejszej rozmowy).
- Domyślne zachowanie: jeśli
deliveryjest pominięte, zadania izolowane ogłaszają podsumowanie (delivery.mode = "announce"). delivery.mode(tylko izolowane) określa, co się dzieje:announce: dostarcza podsumowanie do kanału docelowego i publikuje krótkie podsumowanie w sesji głównej.none: tylko wewnętrznie (brak dostarczania, brak podsumowania sesji głównej).
wakeModekontroluje moment publikacji podsumowania sesji głównej:now: natychmiastowy heartbeat.next-heartbeat: czeka na następny zaplanowany heartbeat.
Kształty ładunków (co jest uruchamiane)
Obsługiwane są dwa rodzaje ładunków:systemEvent: tylko sesja główna, kierowane przez prompt heartbeat.agentTurn: tylko sesja izolowana, uruchamia dedykowaną turę agenta.
agentTurn:
message: wymagany tekst promptu.model/thinking: opcjonalne nadpisania (zobacz poniżej).timeoutSeconds: opcjonalne nadpisanie limitu czasu.
delivery.mode:none|announce.delivery.channel:lastlub konkretny kanał.delivery.to: cel specyficzny dla kanału (telefon/czat/id kanału).delivery.bestEffort: unika niepowodzenia zadania, jeśli dostarczenie ogłoszenia się nie powiedzie.
delivery.channel/delivery.to,
aby skierować wiadomość bezpośrednio do czatu. Gdy delivery.mode = "none", żadne podsumowanie nie jest publikowane w sesji głównej.
Jeśli delivery jest pominięte dla zadań izolowanych, OpenClaw domyślnie ustawia announce.
Przepływ dostarczania typu announce
Gdydelivery.mode = "announce", cron dostarcza bezpośrednio przez adaptery kanałów wychodzących.
Główny agent nie jest uruchamiany, aby tworzyć lub przekazywać wiadomość.
Szczegóły zachowania:
- Treść: dostarczanie używa wychodzących ładunków (tekst/media) z uruchomienia izolowanego, z normalnym dzieleniem na fragmenty i formatowaniem kanału.
- Odpowiedzi tylko-heartbeat (
HEARTBEAT_OKbez rzeczywistej treści) nie są dostarczane. - Jeśli uruchomienie izolowane już wysłało wiadomość do tego samego celu przez narzędzie wiadomości, dostarczanie jest pomijane, aby uniknąć duplikatów.
- Brakujące lub nieprawidłowe cele dostarczania powodują niepowodzenie zadania, chyba że
delivery.bestEffort = true. - Krótkie podsumowanie jest publikowane w sesji głównej tylko gdy
delivery.mode = "announce". - Podsumowanie sesji głównej respektuje
wakeMode:nowwyzwala natychmiastowy heartbeat, anext-heartbeatczeka na następny zaplanowany heartbeat.
Nadpisania modelu i „thinking”
Zadania izolowane (agentTurn) mogą nadpisywać model i poziom myślenia:
model: ciąg dostawca/model (np.anthropic/claude-sonnet-4-20250514) lub alias (np.opus)thinking: poziom myślenia (off,minimal,low,medium,high,xhigh; tylko modele GPT-5.2 + Codex)
model także dla zadań sesji głównej, ale zmienia to współdzielony model
sesji głównej. Zalecamy nadpisania modelu wyłącznie dla zadań izolowanych, aby uniknąć
nieoczekiwanych zmian kontekstu.
Priorytet rozstrzygania:
- Nadpisanie w ładunku zadania (najwyższy)
- Domyślne ustawienia specyficzne dla hooka (np.
hooks.gmail.model) - Domyślna konfiguracja agenta
Dostarczanie (kanał + cel)
Zadania izolowane mogą dostarczać wyjście do kanału poprzez konfigurację najwyższego poziomudelivery:
delivery.mode:announce(dostarczenie podsumowania) lubnone.delivery.channel:whatsapp/telegram/discord/slack/mattermost(wtyczka) /signal/imessage/last.delivery.to: cel odbiorcy specyficzny dla kanału.
sessionTarget: "isolated").
Jeśli delivery.channel lub delivery.to jest pominięte, cron może wrócić do „ostatniej trasy”
sesji głównej (ostatniego miejsca, w którym agent odpowiedział).
Przypomnienia dot. formatu celów:
- Cele Slack/Discord/Mattermost (wtyczka) powinny używać jawnych prefiksów (np.
channel:<id>,user:<id>), aby uniknąć niejednoznaczności. - Tematy Telegrama powinny używać formy
:topic:(zobacz poniżej).
Cele dostarczania Telegram (tematy / wątki forum)
Telegram obsługuje tematy forum poprzezmessage_thread_id. Dla dostarczania cron możesz zakodować
temat/wątek w polu to:
-1001234567890(tylko id czatu)-1001234567890:topic:123(zalecane: jawny znacznik tematu)-1001234567890:123(skrót: numeryczny sufiks)
telegram:... / telegram:group:..., są również akceptowane:
telegram:group:-1001234567890:topic:123
Schemat JSON dla wywołań narzędzi
Używaj tych kształtów, wywołując bezpośrednio narzędzia Gatewaycron.* (wywołania narzędzi agenta lub RPC).
Flagi CLI akceptują czytelne czasy trwania, takie jak 20m, ale wywołania narzędzi powinny używać ciągu ISO 8601
dla schedule.at oraz milisekund dla schedule.everyMs.
Parametry cron.add
Jednorazowe zadanie sesji głównej (zdarzenie systemowe):schedule.kind:at(at),every(everyMs) lubcron(expr, opcjonalnietz).schedule.atakceptuje ISO 8601 (strefa czasowa opcjonalna; przy braku traktowana jako UTC).everyMsto milisekundy.sessionTargetmusi być"main"lub"isolated"i musi odpowiadaćpayload.kind.- Pola opcjonalne:
agentId,description,enabled,deleteAfterRun(domyślnie true dlaat),delivery. wakeModedomyślnie ma wartość"now", gdy jest pominięte.
Parametry cron.update
jobIdjest kanoniczne;idjest akceptowane dla zgodności.- Użyj
agentId: nullw patchu, aby wyczyścić powiązanie agenta.
Parametry cron.run i cron.remove
Przechowywanie i historia
- Magazyn zadań:
~/.openclaw/cron/jobs.json(JSON zarządzany przez Gateway). - Historia uruchomień:
~/.openclaw/cron/runs/<jobId>.jsonl(JSONL, automatycznie przycinany). - Nadpisanie ścieżki magazynu:
cron.storew konfiguracji.
Konfiguracja
cron.enabled: false(konfiguracja)OPENCLAW_SKIP_CRON=1(env)
Szybki start CLI
Jednorazowe przypomnienie (UTC ISO, automatyczne usunięcie po powodzeniu):--due, aby uruchamiać tylko, gdy należne):
Powierzchnia API Gateway
cron.list,cron.status,cron.add,cron.update,cron.removecron.run(force lub due),cron.runsDla natychmiastowych zdarzeń systemowych bez zadania użyjopenclaw system event.
Rozwiązywanie problemów
„Nic się nie uruchamia”
- Sprawdź, czy cron jest włączony:
cron.enabledorazOPENCLAW_SKIP_CRON. - Sprawdź, czy Gateway działa w sposób ciągły (cron działa wewnątrz procesu Gateway).
- Dla harmonogramów
cron: potwierdź strefę czasową (--tz) względem strefy hosta.
Powtarzające się zadanie opóźnia się po niepowodzeniach
- OpenClaw stosuje wykładnicze opóźnienie ponownych prób dla zadań cyklicznych po kolejnych błędach: 30 s, 1 min, 5 min, 15 min, następnie 60 min między próbami.
- Opóźnienie resetuje się automatycznie po następnym udanym uruchomieniu.
- Zadania jednorazowe (
at) są wyłączane po uruchomieniu terminalnym (ok,errorlubskipped) i nie są ponawiane.
Telegram dostarcza w złe miejsce
- Dla tematów forum użyj
-100…:topic:<id>, aby było to jawne i jednoznaczne. - Jeśli w logach lub zapisanych celach „ostatniej trasy” widzisz prefiksy
telegram:..., to normalne; dostarczanie cron je akceptuje i nadal poprawnie parsuje identyfikatory tematów.