Pętla agentowa to pełne „rzeczywiste” uruchomienie agenta: przyjęcie → składanie kontekstu → inferencja modelu → wykonanie narzędzi → strumieniowanie odpowiedzi → utrwalanie. To autorytatywna ścieżka, która zamienia wiadomość w działania i końcową odpowiedź, zachowując spójny stan sesji. W OpenClaw pętla to pojedyncze, zserializowane uruchomienie na sesję, które emituje zdarzenia cyklu życia i strumienia, gdy model myśli, wywołuje narzędzia i strumieniuje wynik. Ten dokument wyjaśnia, jak ta autentyczna pętla jest połączona od początku do końca.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Punkty wejścia
- Gateway RPC:
agentiagent.wait. - CLI: polecenie
agent.
Jak to działa (ogólnie)
- RPC
agentwaliduje parametry, rozwiązuje sesję (sessionKey/sessionId), utrwala metadane sesji i natychmiast zwraca{ runId, acceptedAt }. agentCommanduruchamia agenta:- rozwiązuje model oraz domyślne wartości thinking/verbose/trace
- ładuje snapshot Skills
- wywołuje
runEmbeddedPiAgent(runtime pi-agent-core) - emituje koniec/błąd cyklu życia, jeśli osadzona pętla nie wyemituje takiego zdarzenia
runEmbeddedPiAgent:- serializuje uruchomienia przez kolejki na sesję i kolejki globalne
- rozwiązuje model oraz profil uwierzytelniania i buduje sesję pi
- subskrybuje zdarzenia pi i strumieniuje delty asystenta/narzędzi
- wymusza limit czasu -> przerywa uruchomienie, jeśli zostanie przekroczony
- dla tur serwera aplikacji Codex przerywa zaakceptowaną turę, która przestaje wytwarzać postęp serwera aplikacji przed zdarzeniem terminalnym
- zwraca payloady i metadane użycia
subscribeEmbeddedPiSessionmostkuje zdarzenia pi-agent-core do strumieniaagentOpenClaw:- 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 koniec/błąd cyklu życia dla
runId - zwraca
{ status: ok|error|timeout, startedAt, endedAt, error? }
- czeka na koniec/błąd cyklu życia dla
Kolejkowanie i współbieżność
- Uruchomienia są serializowane według klucza sesji (pas sesji) i opcjonalnie przez pas globalny.
- Zapobiega to wyścigom narzędzi/sesji i utrzymuje spójną historię sesji.
- Kanały wiadomości mogą wybierać tryby kolejki (collect/steer/followup), które zasilają ten system pasów. Zobacz Kolejka poleceń.
- Zapisy transkryptu są także chronione przez blokadę zapisu sesji na pliku sesji. Blokada jest
świadoma procesu i oparta na pliku, więc wykrywa zapisujących, którzy omijają kolejkę w procesie albo pochodzą
z innego procesu. Procesy zapisujące transkrypt sesji czekają do
session.writeLock.acquireTimeoutMsprzed zgłoszeniem sesji jako zajętej; domyślnie jest to60000ms. - Blokady zapisu sesji domyślnie nie są reentrantne. Jeśli helper celowo zagnieżdża pozyskanie
tej samej blokady, zachowując jednego logicznego zapisującego, musi jawnie włączyć to przez
allowReentrant: true.
Przygotowanie sesji i obszaru roboczego
- Obszar roboczy jest rozwiązywany i tworzony; uruchomienia w sandboxie mogą przekierować do katalogu głównego obszaru roboczego sandboxa.
- Skills są ładowane (albo ponownie używane ze snapshota) i wstrzykiwane do środowiska oraz promptu.
- Pliki bootstrap/kontekstu są rozwiązywane i wstrzykiwane do raportu promptu systemowego.
- Pozyskiwana jest blokada zapisu sesji;
SessionManagerjest otwierany i przygotowywany przed strumieniowaniem. Każda późniejsza ścieżka przepisywania transkryptu, Compaction lub obcinania musi pobrać tę samą blokadę przed otwarciem albo modyfikacją pliku transkryptu.
Składanie promptu i prompt systemowy
- Prompt systemowy jest budowany z bazowego promptu OpenClaw, promptu Skills, kontekstu bootstrap i nadpisań dla danego uruchomienia.
- Limity specyficzne dla modelu i tokeny rezerwowe Compaction są wymuszane.
- 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: punkty rozszerzeń w cyklu życia agenta/narzędzia i potoku gateway.
Hooki wewnętrzne (hooki Gateway)
agent:bootstrap: działa podczas budowania plików bootstrap, zanim prompt systemowy zostanie sfinalizowany. Użyj tego, aby dodać/usunąć pliki kontekstu bootstrap.- Hooki poleceń:
/new,/reset,/stopi inne zdarzenia poleceń (zobacz dokument o hookach).
Hooki Plugin (cykl życia agenta i gateway)
Działają one wewnątrz pętli agenta albo potoku gateway:before_model_resolve: działa przed sesją (bezmessages), aby deterministycznie nadpisać dostawcę/model przed rozwiązaniem modelu.before_prompt_build: działa po załadowaniu sesji (zmessages), aby wstrzyknąćprependContext,systemPrompt,prependSystemContextalboappendSystemContextprzed przesłaniem promptu. UżyjprependContextdla dynamicznego tekstu na turę oraz pól kontekstu systemowego dla stabilnych wskazówek, które powinny znaleźć się w przestrzeni promptu systemowego.before_agent_start: starszy hook zgodności, który może działać w dowolnej fazie; preferuj jawne hooki powyżej.before_agent_reply: działa po akcjach inline i przed wywołaniem LLM, pozwalając pluginowi przejąć turę i zwrócić syntetyczną odpowiedź albo całkowicie wyciszyć turę.agent_end: sprawdza końcową listę wiadomości i metadane uruchomienia po zakończeniu.before_compaction/after_compaction: obserwuje lub adnotuje cykle Compaction.before_tool_call/after_tool_call: przechwytuje parametry/wyniki narzędzi.before_install: sprawdza wbudowane wyniki skanowania i opcjonalnie blokuje instalacje skill lub plugin.tool_result_persist: synchronicznie przekształca wyniki narzędzi, zanim zostaną zapisane do transkryptu sesji należącego do OpenClaw.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 terminalne i zatrzymuje handlery o niższym priorytecie.before_tool_call:{ block: false }jest no-op i nie czyści wcześniejszej blokady.before_install:{ block: true }jest terminalne i zatrzymuje handlery o niższym priorytecie.before_install:{ block: false }jest no-op i nie czyści wcześniejszej blokady.message_sending:{ cancel: true }jest terminalne i zatrzymuje handlery o niższym priorytecie.message_sending:{ cancel: false }jest no-op i nie czyści wcześniejszego anulowania.
Strumieniowanie i częściowe odpowiedzi
- Delty asystenta są strumieniowane z pi-agent-core i emitowane jako zdarzenia
assistant. - Strumieniowanie bloków 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 porcjowania i odpowiedzi blokowych.
Wykonywanie narzędzi i narzędzia wiadomości
- Zdarzenia start/update/end narzędzia są emitowane w strumieniu
tool. - Wyniki narzędzi są sanityzowane pod kątem rozmiaru i payloadów obrazów przed logowaniem/emitowaniem.
- Wysyłki narzędzi wiadomości są śledzone, aby tłumić zduplikowane potwierdzenia asystenta.
Kształtowanie i tłumienie odpowiedzi
- Końcowe payloady są składane z:
- tekstu asystenta (i opcjonalnego rozumowania)
- podsumowań narzędzi inline (gdy verbose + dozwolone)
- tekstu błędu asystenta, gdy model zgłasza błąd
- Dokładny cichy token
NO_REPLY/no_replyjest filtrowany z wychodzących payloadów. - Duplikaty narzędzi wiadomości są usuwane z końcowej listy payloadów.
- Jeśli nie pozostają żadne renderowalne payloady i narzędzie zgłosiło błąd, emitowana jest zastępcza odpowiedź błędu narzędzia (chyba że narzędzie wiadomości już wysłało odpowiedź widoczną dla użytkownika).
Compaction i ponowne próby
- Auto-Compaction emituje zdarzenia strumienia
compactioni może wyzwolić ponowną próbę. - Przy ponownej próbie bufory w pamięci i podsumowania narzędzi są resetowane, aby uniknąć duplikacji wyniku.
- 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 w wiadomościach czatu
delta. - Czat
finaljest emitowany przy końcu/błędzie cyklu życia.
Limity czasu
- Domyślne
agent.wait: 30 s (tylko oczekiwanie). ParametrtimeoutMsnadpisuje tę wartość. - Runtime agenta: domyślne
agents.defaults.timeoutSecondsto 172800 s (48 godzin); wymuszane przez timer przerwania wrunEmbeddedPiAgent. - Runtime Cron: izolowane agent-turn
timeoutSecondsnależy do cron. Scheduler uruchamia ten timer, gdy rozpoczyna się wykonanie, przerywa bazowe uruchomienie w skonfigurowanym terminie, a następnie wykonuje ograniczone sprzątanie przed zapisaniem limitu czasu, aby przestarzała sesja potomna nie mogła zablokować pasa. - Diagnostyka żywotności sesji: przy włączonej diagnostyce
diagnostics.stuckSessionWarnMsklasyfikuje długie sesjeprocessing, które nie mają zaobserwowanej odpowiedzi, narzędzia, statusu, bloku ani postępu ACP. Aktywne osadzone uruchomienia, wywołania modelu i wywołania narzędzi są raportowane jakosession.long_running; aktywna praca bez niedawnego postępu jest raportowana jakosession.stalled;session.stuckjest zarezerwowane dla przestarzałej księgowości sesji bez aktywnej pracy. Przestarzała księgowość sesji natychmiast zwalnia dotknięty pas sesji; zatrzymane osadzone uruchomienia są przerywane i drenowane dopiero podiagnostics.stuckSessionAbortMs(domyślnie: co najmniej 10 minut i 5x próg ostrzeżenia), aby praca w kolejce mogła zostać wznowiona bez odcinania jedynie powolnych uruchomień. Odzyskiwanie emituje ustrukturyzowane wyniki requested/completed, a stan diagnostyczny jest oznaczany jako bezczynny tylko wtedy, gdy ta sama generacja przetwarzania nadal jest aktualna. Powtarzające się diagnostykisession.stuckstosują wycofanie, dopóki sesja pozostaje niezmieniona. - Limit bezczynności modelu: OpenClaw przerywa żądanie modelu, gdy przed upływem okna bezczynności nie nadejdą żadne porcje odpowiedzi.
models.providers.<id>.timeoutSecondswydłuża ten watchdog bezczynności dla powolnych dostawców lokalnych/samodzielnie hostowanych; w przeciwnym razie OpenClaw używaagents.defaults.timeoutSeconds, gdy jest skonfigurowane, domyślnie ograniczone do 120 s. Uruchomienia wyzwalane przez Cron bez jawnego limitu czasu modelu lub agenta wyłączają watchdog bezczynności i polegają na zewnętrznym limicie czasu cron. - Limit czasu żądania HTTP dostawcy:
models.providers.<id>.timeoutSecondsdotyczy fetchy HTTP modelu tego dostawcy, w tym połączenia, nagłówków, treści, limitu czasu żądania SDK, całkowitej obsługi przerwania guarded-fetch oraz watchdoga bezczynności strumienia modelu. Używaj tego dla powolnych dostawców lokalnych/samodzielnie hostowanych, takich jak Ollama, zanim zwiększysz limit czasu runtime całego agenta.
Gdzie rzeczy mogą zakończyć się wcześniej
- Limit czasu agenta (przerwanie)
- AbortSignal (anulowanie)
- Rozłączenie Gateway albo limit czasu RPC
- Limit czasu
agent.wait(tylko oczekiwanie, nie zatrzymuje agenta)
Powiązane
- Narzędzia — dostępne narzędzia agenta
- Hooki — skrypty sterowane zdarzeniami wyzwalane przez zdarzenia cyklu życia agenta
- Compaction — jak podsumowywane są długie konwersacje
- Zatwierdzenia Exec — bramki zatwierdzania dla poleceń powłoki
- Thinking — konfiguracja poziomu thinking/reasoning