Pętla agenta (OpenClaw)
Pętla agentowa to pełny, „rzeczywisty” przebieg działania agenta: przyjęcie danych wejściowych → zbudowanie kontekstu → wnioskowanie modelu → wykonanie narzędzi → strumieniowanie odpowiedzi → trwały zapis. To autorytatywna ścieżka, która przekształca wiadomość w działania i końcową odpowiedź, zachowując przy tym spójność stanu sesji. W OpenClaw pętla to pojedynczy, serializowany przebieg na sesję, który emituje zdarzenia cyklu życia i strumienia, gdy model myśli, wywołuje narzędzia i strumieniuje dane wyjściowe. Ten dokument wyjaśnia, jak ta autentyczna pętla jest połączona od początku do końca.Punkty wejścia
- Gateway RPC:
agentiagent.wait. - CLI: polecenie
agent.
Jak to działa (wysoki poziom)
- RPC
agentweryfikuje parametry, rozwiązuje sesję (sessionKey/sessionId), zapisuje metadane sesji i natychmiast zwraca{ runId, acceptedAt }. agentCommanduruchamia agenta:- rozwiązuje domyślne wartości modelu + thinking/verbose/trace
- wczytuje snapshot Skills
- wywołuje
runEmbeddedPiAgent(środowisko uruchomieniowe pi-agent-core) - emituje lifecycle end/error, jeśli osadzona pętla tego nie zrobi
runEmbeddedPiAgent:- serializuje przebiegi przez kolejki per sesja i globalne
- rozwiązuje profil modelu + auth i buduje sesję pi
- subskrybuje zdarzenia pi i strumieniuje delty asystenta/narzędzi
- wymusza limit czasu -> przerywa przebieg po jego przekroczeniu
- zwraca payloady + metadane użycia
subscribeEmbeddedPiSessionmostkuje zdarzenia pi-agent-core do strumienia OpenClawagent:- zdarzenia narzędzi =>
stream: "tool" - delty asystenta =>
stream: "assistant" - zdarzenia cyklu życia =>
stream: "lifecycle"(phase: "start" | "end" | "error")
- zdarzenia narzędzi =>
agent.waitużywawaitForAgentRun:- czeka na lifecycle end/error dla
runId - zwraca
{ status: ok|error|timeout, startedAt, endedAt, error? }
- czeka na lifecycle end/error dla
Kolejkowanie + współbieżność
- Przebiegi są serializowane per klucz sesji (pas sesji), a opcjonalnie także przez pas globalny.
- Zapobiega to wyścigom narzędzi/sesji i utrzymuje spójność historii sesji.
- Kanały wiadomości mogą wybierać tryby kolejki (collect/steer/followup), które zasilają ten system pasów. Zobacz Kolejka poleceń.
Przygotowanie sesji + obszaru roboczego
- Obszar roboczy jest rozwiązywany i tworzony; przebiegi w sandbox mogą zostać przekierowane do katalogu głównego obszaru roboczego sandbox.
- Skills są wczytywane (lub ponownie używane ze snapshotu) i wstrzykiwane do środowiska oraz promptu.
- Pliki bootstrap/kontekstu są rozwiązywane i wstrzykiwane do raportu promptu systemowego.
- Uzyskiwana jest blokada zapisu sesji; przed rozpoczęciem strumieniowania
SessionManagerjest otwierany i przygotowywany.
Składanie promptu + prompt systemowy
- Prompt systemowy jest budowany z bazowego promptu OpenClaw, promptu Skills, kontekstu bootstrap i nadpisań dla danego przebiegu.
- Wymuszane są limity specyficzne dla modelu oraz tokeny zarezerwowane dla Compaction.
- Zobacz Prompt systemowy, aby sprawdzić, co widzi model.
Punkty hooków (gdzie można przechwycić)
OpenClaw ma dwa systemy hooków:- Hooki wewnętrzne (hooki Gateway): skrypty sterowane zdarzeniami dla poleceń i zdarzeń cyklu życia.
- Hooki Pluginów: punkty rozszerzeń wewnątrz cyklu życia agenta/narzędzi i potoku Gateway.
Hooki wewnętrzne (hooki Gateway)
agent:bootstrap: uruchamia się podczas budowania plików bootstrap, zanim prompt systemowy zostanie ostatecznie sfinalizowany. Użyj tego, aby dodawać/usuwać pliki kontekstu bootstrap.- Hooki poleceń:
/new,/reset,/stopi inne zdarzenia poleceń (zobacz dokumentację Hooków).
Hooki Pluginów (cykl życia agenta + Gateway)
Są one uruchamiane wewnątrz pętli agenta lub potoku Gateway:before_model_resolve: uruchamiany przed sesją (bezmessages), aby deterministycznie nadpisać dostawcę/model przed rozstrzygnięciem modelu.before_prompt_build: uruchamiany po wczytaniu sesji (zmessages), aby wstrzyknąćprependContext,systemPrompt,prependSystemContextlubappendSystemContextprzed wysłaniem promptu. UżywajprependContextdla dynamicznego tekstu per tura, a pól kontekstu systemowego dla stabilnych wskazówek, które powinny znajdować się w przestrzeni promptu systemowego.before_agent_start: hook zgodności wstecznej; może działać w dowolnej z obu faz — preferuj powyższe hooki jawne.before_agent_reply: uruchamiany po działaniach inline i przed wywołaniem LLM, pozwalając Pluginowi przejąć turę i zwrócić odpowiedź syntetyczną lub całkowicie wyciszyć turę.agent_end: umożliwia inspekcję końcowej listy wiadomości i metadanych przebiegu po zakończeniu.before_compaction/after_compaction: obserwują lub adnotują cykle Compaction.before_tool_call/after_tool_call: przechwytują parametry/wyniki narzędzi.before_install: umożliwia inspekcję wyników wbudowanego skanowania i opcjonalne zablokowanie instalacji Skills lub Pluginów.tool_result_persist: synchronicznie przekształca wyniki narzędzi, zanim zostaną zapisane w transkrypcie sesji.message_received/message_sending/message_sent: hooki wiadomości przychodzących i wychodzących.session_start/session_end: granice cyklu życia sesji.gateway_start/gateway_stop: zdarzenia cyklu życia Gateway.
before_tool_call:{ block: true }jest rozstrzygające i zatrzymuje handlery o niższym priorytecie.before_tool_call:{ block: false }nic nie robi i nie usuwa wcześniejszej blokady.before_install:{ block: true }jest rozstrzygające i zatrzymuje handlery o niższym priorytecie.before_install:{ block: false }nic nie robi i nie usuwa wcześniejszej blokady.message_sending:{ cancel: true }jest rozstrzygające i zatrzymuje handlery o niższym priorytecie.message_sending:{ cancel: false }nic nie robi i nie usuwa wcześniejszego anulowania.
Strumieniowanie + częściowe odpowiedzi
- Delty asystenta są strumieniowane z pi-agent-core i emitowane jako zdarzenia
assistant. - Strumieniowanie blokowe może emitować częściowe odpowiedzi na
text_endalbomessage_end. - Strumieniowanie rozumowania może być emitowane jako osobny strumień albo jako odpowiedzi blokowe.
- Zobacz Strumieniowanie, aby poznać zachowanie fragmentacji i odpowiedzi blokowych.
Wykonywanie narzędzi + narzędzia wiadomości
- Zdarzenia rozpoczęcia/aktualizacji/zakończenia narzędzia są emitowane w strumieniu
tool. - Wyniki narzędzi są oczyszczane pod względem rozmiaru i payloadów obrazów przed logowaniem/emisją.
- Wysłania przez narzędzia wiadomości są śledzone, aby tłumić zduplikowane potwierdzenia asystenta.
Kształtowanie odpowiedzi + tłumienie
- Końcowe payloady są składane z:
- tekstu asystenta (i opcjonalnie rozumowania)
- podsumowań narzędzi inline (gdy
verbosejest włączone i dozwolone) - tekstu błędu asystenta, gdy model zwróci błąd
- Dokładny token wyciszający
NO_REPLY/no_replyjest filtrowany z wychodzących payloadów. - Duplikaty z narzędzi wiadomości są usuwane z końcowej listy payloadów.
- Jeśli nie pozostaną żadne renderowalne payloady, a narzędzie zwróciło błąd, emitowana jest awaryjna odpowiedź o błędzie narzędzia (chyba że narzędzie wiadomości już wysłało odpowiedź widoczną dla użytkownika).
Compaction + ponowienia
- Auto-Compaction emituje zdarzenia strumienia
compactioni może uruchomić ponowienie. - Przy ponowieniu bufory w pamięci i podsumowania narzędzi są resetowane, aby uniknąć zduplikowanego wyjścia.
- Zobacz Compaction, aby poznać potok Compaction.
Strumienie zdarzeń (obecnie)
lifecycle: emitowany przezsubscribeEmbeddedPiSession(oraz awaryjnie przezagentCommand)assistant: strumieniowane delty z pi-agent-coretool: strumieniowane zdarzenia narzędzi z pi-agent-core
Obsługa kanału czatu
- Delty asystenta są buforowane do wiadomości czatu
delta. - Końcowe
finalczatu jest emitowane przy lifecycle end/error.
Limity czasu
- Domyślny
agent.wait: 30 s (tylko oczekiwanie). ParametrtimeoutMsgo nadpisuje. - Czas działania agenta: domyślne
agents.defaults.timeoutSecondsto 172800 s (48 godzin); wymuszane przez timer przerwania wrunEmbeddedPiAgent. - Limit bezczynności LLM:
agents.defaults.llm.idleTimeoutSecondsprzerywa żądanie modelu, gdy w oknie bezczynności nie nadejdą żadne fragmenty odpowiedzi. Ustaw tę wartość jawnie dla wolnych modeli lokalnych albo dostawców rozumowania/wywołań narzędzi; ustaw na 0, aby wyłączyć. Jeśli nie jest ustawiona, OpenClaw używaagents.defaults.timeoutSeconds, jeśli jest skonfigurowane, w przeciwnym razie 120 s. Przebiegi wyzwalane przez Cron bez jawnego limitu czasu LLM lub agenta wyłączają watchdog bezczynności i polegają na zewnętrznym limicie czasu Cron.
Gdzie wszystko może zakończyć się wcześniej
- Limit czasu agenta (przerwanie)
- AbortSignal (anulowanie)
- Rozłączenie Gateway lub limit czasu RPC
- Limit czasu
agent.wait(dotyczy tylko oczekiwania, nie zatrzymuje agenta)
Powiązane
- Narzędzia — dostępne narzędzia agenta
- Hooki — skrypty sterowane zdarzeniami, wyzwalane przez zdarzenia cyklu życia agenta
- Compaction — jak długie rozmowy są podsumowywane
- Zgody na Exec — bramki zatwierdzania poleceń powłoki
- Thinking — konfiguracja poziomu thinking/rozumowania