Pętla agenta (OpenClaw)
Pętla agentowa to pełny, „rzeczywisty” przebieg agenta: przyjęcie → złożenie kontekstu → inferencja modelu → wykonanie narzędzi → strumieniowanie odpowiedzi → utrwalenie. Jest to autorytatywna ścieżka, która zamienia wiadomość w działania i odpowiedź końcową, jednocześnie utrzymując spójny stan sesji. W OpenClaw pętla to pojedyncze, zserializowane uruchomienie na sesję, które emituje zdarzenia cyklu życia i strumieni w trakcie myślenia modelu, wywołań narzędzi oraz strumieniowania wyjścia. Ten dokument wyjaśnia, jak ta właściwa pętla jest połączona end-to-end.Punkty wejścia
- RPC Gateway:
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 model + domyślne ustawienia thinking/verbose
- ładuje migawkę skills
- wywołuje
runEmbeddedPiAgent(środowisko uruchomieniowe pi-agent-core) - emituje lifecycle end/error, jeśli osadzona pętla nie wyemituje takiego zdarzenia
runEmbeddedPiAgent:- serializuje uruchomienia przez kolejki per-sesja + globalne
- rozwiązuje model + profil uwierzytelniania i buduje sesję pi
- subskrybuje zdarzenia pi i strumieniuje delty asystenta/narzędzi
- wymusza limit czasu -> przerywa działanie, jeśli przekroczony
- zwraca ładunki + 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żywawaitForAgentJob:- 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ść
- Uruchomienia są serializowane per klucz sesji (pas sesji) i opcjonalnie przez pas globalny.
- Zapobiega to wyścigom narzędzi/sesji i utrzymuje spójność historii sesji.
- Kanały komunikacyjne mogą wybierać tryby kolejek (collect/steer/followup), które zasilają ten system pasów. Zobacz Command Queue.
Przygotowanie sesji + obszaru roboczego
- Obszar roboczy jest rozwiązywany i tworzony; uruchomienia w sandboxie mogą przekierowywać do katalogu głównego obszaru roboczego sandbox.
- Skills są ładowane (lub ponownie używane z migawki) i wstrzykiwane do środowiska oraz promptu.
- Pliki bootstrap/kontekstu są rozwiązywane i wstrzykiwane do raportu promptu systemowego.
- Uzyskiwana jest blokada zapisu sesji;
SessionManagerjest otwierany i przygotowywany przed strumieniowaniem.
Składanie promptu + prompt systemowy
- Prompt systemowy jest budowany z bazowego promptu OpenClaw, promptu skills, kontekstu bootstrap oraz nadpisań per-uruchomienie.
- Egzekwowane są limity specyficzne dla modelu oraz rezerwa tokenów na kompaktowanie.
- Zobacz System prompt, aby dowiedzieć się, 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 wtyczek: punkty rozszerzeń wewnątrz cyklu życia agenta/narzędzi oraz potoku gateway.
Hooki wewnętrzne (hooki Gateway)
agent:bootstrap: uruchamiany podczas budowania plików bootstrap przed finalizacją promptu systemowego. Użyj tego, aby dodać/usunąć pliki kontekstu bootstrap.- Hooki poleceń:
/new,/reset,/stoporaz inne zdarzenia poleceń (zobacz dokumentację Hooków).
Hooki wtyczek (cykl życia agenta + gateway)
Działają one wewnątrz pętli agenta lub potoku gateway:before_agent_start: wstrzykuje kontekst lub nadpisuje prompt systemowy przed startem uruchomienia.agent_end: inspekcja końcowej listy wiadomości i metadanych uruchomienia po zakończeniu.before_compaction/after_compaction: obserwacja lub adnotacja cykli kompaktowania.before_tool_call/after_tool_call: przechwytywanie parametrów/wyników narzędzi.tool_result_persist: synchroniczna transformacja wyników narzędzi przed zapisaniem ich do transkryptu 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.
Strumieniowanie + odpowiedzi częściowe
- Delty asystenta są strumieniowane z pi-agent-core i emitowane jako zdarzenia
assistant. - Strumieniowanie blokowe może emitować odpowiedzi częściowe na
text_endlubmessage_end. - Strumieniowanie rozumowania może być emitowane jako osobny strumień lub jako odpowiedzi blokowe.
- Zobacz Streaming w celu informacji o dzieleniu na fragmenty i zachowaniu odpowiedzi blokowych.
Wykonanie narzędzi + narzędzia komunikacyjne
- Zdarzenia start/update/end narzędzi są emitowane na strumieniu
tool. - Wyniki narzędzi są sanityzowane pod kątem rozmiaru i ładunków obrazów przed logowaniem/emisją.
- Wysyłki narzędzi komunikacyjnych są śledzone w celu tłumienia zduplikowanych potwierdzeń asystenta.
Kształtowanie odpowiedzi + tłumienie
- Końcowe ładunki są składane z:
- tekstu asystenta (i opcjonalnego rozumowania)
- wbudowanych podsumowań narzędzi (gdy verbose + dozwolone)
- tekstu błędu asystenta, gdy model zwróci błąd
NO_REPLYjest traktowany jako cichy token i filtrowany z wychodzących ładunków.- Duplikaty narzędzi komunikacyjnych są usuwane z końcowej listy ładunków.
- Jeśli nie pozostaną renderowalne ładunki, a narzędzie zwróciło błąd, emitowana jest zapasowa odpowiedź błędu narzędzia (chyba że narzędzie komunikacyjne już wysłało odpowiedź widoczną dla użytkownika).
Kompaktowanie + ponowienia
- Automatyczne kompaktowanie emituje zdarzenia strumienia
compactioni może wyzwolić ponowienie. - Przy ponowieniu bufory w pamięci i podsumowania narzędzi są resetowane, aby uniknąć zduplikowanego wyjścia.
- Zobacz Compaction w celu poznania potoku kompaktowania.
Strumienie zdarzeń (obecnie)
lifecycle: emitowane przezsubscribeEmbeddedPiSession(oraz jako fallback 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. - Wiadomość czatu
finaljest emitowana przy lifecycle end/error.
Limity czasu
- Domyślnie
agent.wait: 30 s (tylko oczekiwanie). ParametrtimeoutMsnadpisuje. - Czas działania agenta: domyślnie
agents.defaults.timeoutSeconds600 s; egzekwowane wrunEmbeddedPiAgentprzez timer przerwania.
Gdzie proces może zakończyć się wcześniej
- Limit czasu agenta (przerwanie)
- AbortSignal (anulowanie)
- Rozłączenie gateway lub timeout RPC
- Limit czasu
agent.wait(tylko oczekiwanie, nie zatrzymuje agenta)