Agentlus (OpenClaw)
Een agentische lus is de volledige “echte” uitvoering van een agent: intake → contextopbouw → modelinferentie → toolexecutie → streaming van antwoorden → persistentie. Het is het gezaghebbende pad dat een bericht omzet in acties en een definitief antwoord, terwijl de sessiestatus consistent blijft. In OpenClaw is een lus één enkele, geserialiseerde uitvoering per sessie die levenscyclus- en streamgebeurtenissen uitzendt terwijl het model denkt, tools aanroept en uitvoer streamt. Dit document legt uit hoe die authentieke lus end-to-end is opgebouwd.Ingangspunten
- Gateway RPC:
agentenagent.wait. - CLI: opdracht
agent.
Hoe het werkt (op hoofdlijnen)
agentRPC valideert parameters, resolveert de sessie (sessionKey/sessionId), schrijft sessiemetadata weg en retourneert{ runId, acceptedAt }onmiddellijk.agentCommandvoert de agent uit:- resolveert model + standaardwaarden voor thinking/verbose
- laadt een Skills-snapshot
- roept
runEmbeddedPiAgentaan (pi-agent-core runtime) - zendt lifecycle end/error uit als de ingebedde lus er geen uitzendt
runEmbeddedPiAgent:- serializeert runs via per-sessie- en globale wachtrijen
- resolveert model + auth-profiel en bouwt de pi-sessie
- abonneert zich op pi-events en streamt assistant/tool-delta’s
- forceert time-out -> abortussen indien overschreden
- retourneert payloads + usage-metadata
subscribeEmbeddedPiSessionoverbrugt pi-agent-core-events naar de OpenClawagent-stream:- tool-events ⇒
stream: "tool" - assistant-delta’s ⇒
stream: "assistant" - levenscyclusgebeurtenissen ⇒
stream: "lifecycle"(phase: "start" | "end" | "error")
- tool-events ⇒
agent.waitgebruiktwaitForAgentJob:- wacht op lifecycle end/error voor
runId - retourneert
{ status: ok|error|timeout, startedAt, endedAt, error? }
- wacht op lifecycle end/error voor
Wachtrij + concurrency
- Runs worden geserialiseerd per sessiesleutel (sessielane) en optioneel via een globale lane.
- Dit voorkomt tool-/sessieraces en houdt de sessiegeschiedenis consistent.
- Berichtkanalen kunnen wachtrijmodi kiezen (collect/steer/followup) die dit lanesysteem voeden. Zie Command Queue.
Sessie- en werkruimtevoorbereiding
- De werkruimte wordt geresolveerd en aangemaakt; gesandboxed runs kunnen omleiden naar een sandbox-werkruimteroot.
- Skills worden geladen (of hergebruikt vanuit een snapshot) en in env en prompt geïnjecteerd.
- Bootstrap-/contextbestanden worden geresolveerd en in het systeemprompt-rapport geïnjecteerd.
- Er wordt een schrijflock op de sessie verkregen;
SessionManagerwordt geopend en voorbereid vóór het streamen.
Promptopbouw + systeemprompt
- De systeemprompt wordt opgebouwd uit de basisprompt van OpenClaw, de Skills-prompt, bootstrapcontext en per-run overrides.
- Modelspecificieke limieten en compaction-reservetokens worden afgedwongen.
- Zie System prompt voor wat het model ziet.
Hook-punten (waar je kunt onderscheppen)
OpenClaw heeft twee hooksystemen:- Interne hooks (Gateway-hooks): eventgedreven scripts voor opdrachten en levenscyclusgebeurtenissen.
- Plugin-hooks: uitbreidingspunten binnen de agent-/toollevenscyclus en de Gateway-pijplijn.
Interne hooks (Gateway-hooks)
agent:bootstrap: draait tijdens het bouwen van bootstrapbestanden voordat de systeemprompt is afgerond. Gebruik dit om bootstrapcontextbestanden toe te voegen of te verwijderen.- Command hooks:
/new,/reset,/stopen andere command-events (zie Hooks-documentatie).
Plugin-hooks (agent- + Gateway-levenscyclus)
Deze draaien binnen de agentlus of de Gateway-pijplijn:before_agent_start: injecteert context of overschrijft de systeemprompt vóórdat de run start.agent_end: inspecteert de definitieve berichtenlijst en runmetadata na voltooiing.before_compaction/after_compaction: observeert of annoteert compaction-cycli.before_tool_call/after_tool_call: onderschept toolparameters/-resultaten.tool_result_persist: transformeert toolresultaten synchroon voordat ze in het sessietranscript worden geschreven.message_received/message_sending/message_sent: inbound- en outbound-berichthooks.session_start/session_end: grenzen van de sessielevenscyclus.gateway_start/gateway_stop: Gateway-levenscyclusgebeurtenissen.
Streaming + gedeeltelijke antwoorden
- Assistant-delta’s worden gestreamd vanuit pi-agent-core en uitgezonden als
assistant-events. - Blokstreaming kan gedeeltelijke antwoorden uitzenden op
text_endofmessage_end. - Reasoning-streaming kan als een aparte stream of als blokantwoorden worden uitgezonden.
- Zie Streaming voor chunking- en blokantwoordgedrag.
Toolexecutie + messagingtools
- Tool start/update/end-events worden uitgezonden op de
tool-stream. - Toolresultaten worden geschoond op grootte en afbeeldingspayloads vóór loggen/uitzenden.
- Verzendingen door messagingtools worden gevolgd om dubbele assistantbevestigingen te onderdrukken.
Antwoordvormgeving + onderdrukking
- Definitieve payloads worden samengesteld uit:
- assistanttekst (en optionele reasoning)
- inline toolsamenvattingen (wanneer verbose + toegestaan)
- assistantfouttekst wanneer het model faalt
NO_REPLYwordt behandeld als een stil token en gefilterd uit uitgaande payloads.- Duplicaten van messagingtools worden verwijderd uit de definitieve payloadlijst.
- Als er geen renderbare payloads overblijven en een tool faalde, wordt een fallback-toolfoutantwoord uitgezonden (tenzij een messagingtool al een voor de gebruiker zichtbaar antwoord heeft verzonden).
Compaction + retries
- Auto-compaction zendt
compaction-streamevents uit en kan een retry triggeren. - Bij retry worden in-memory buffers en toolsamenvattingen gereset om dubbele uitvoer te voorkomen.
- Zie Compaction voor de compaction-pijplijn.
Eventstreams (vandaag)
lifecycle: uitgezonden doorsubscribeEmbeddedPiSession(en als fallback dooragentCommand)assistant: gestreamde delta’s van pi-agent-coretool: gestreamde tool-events van pi-agent-core
Chatkanaalafhandeling
- Assistant-delta’s worden gebufferd tot chat
delta-berichten. - Een chat
finalwordt uitgezonden bij lifecycle end/error.
Time-outs
agent.waitstandaard: 30 s (alleen het wachten). ParametertimeoutMsoverschrijft dit.- Agent-runtime:
agents.defaults.timeoutSecondsstandaard 600 s; afgedwongen inrunEmbeddedPiAgent-aborttimer.
Waar dingen vroegtijdig kunnen eindigen
- Agent-time-out (afbreken)
- AbortSignal (annuleren)
- Gateway-ontkoppeling of RPC-time-out
agent.wait-time-out (alleen wachten; stopt de agent niet)