Plugin-hooks zijn in-process uitbreidingspunten voor OpenClaw-plugins. Gebruik ze wanneer een plugin agentruns, toolaanroepen, berichtenstroom, sessielevenscyclus, subagent-routering, installaties of Gateway-opstart moet inspecteren of wijzigen. Gebruik in plaats daarvan interne hooks wanneer je een klein, door een operator geïnstalleerdDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
HOOK.md-script wilt voor opdracht- en Gateway-gebeurtenissen zoals
/new, /reset, /stop, agent:bootstrap of gateway:startup.
Snel aan de slag
Registreer getypeerde plugin-hooks metapi.on(...) vanuit je plugin-entry:
priority. Hooks met
dezelfde prioriteit behouden de registratievolgorde.
api.on(name, handler, opts?) accepteert:
priority— handler-volgorde (hoger wordt eerst uitgevoerd).timeoutMs— optioneel budget per hook. Wanneer dit is ingesteld, breekt de hook-runner die handler af nadat het budget is verstreken en gaat door met de volgende, in plaats van trage setup of recall-werk de door de aanroeper geconfigureerde model-timeout te laten verbruiken. Laat dit weg om de standaard observatie-/beslissingstime-out te gebruiken die de hook-runner generiek toepast.
event.context.pluginConfig, de opgeloste configuratie voor de
plugin die die handler heeft geregistreerd. Gebruik dit voor hook-beslissingen die
huidige plugin-opties nodig hebben; OpenClaw injecteert dit per handler zonder het
gedeelde event-object te muteren dat andere plugins zien.
Hook-catalogus
Hooks zijn gegroepeerd op het oppervlak dat ze uitbreiden. Namen in vet accepteren een beslissingsresultaat (blokkeren, annuleren, overschrijven of goedkeuring vereisen); alle andere zijn alleen voor observatie. Agentbeurtbefore_model_resolve— overschrijf provider of model voordat sessieberichten ladenagent_turn_prepare— verwerk in de wachtrij geplaatste plugin-turn-injecties en voeg context voor dezelfde beurt toe vóór prompt-hooksbefore_prompt_build— voeg dynamische context of systeemprompttekst toe vóór de modelaanroepbefore_agent_start— gecombineerde fase alleen voor compatibiliteit; geef de voorkeur aan de twee hooks hierbovenbefore_agent_reply— beëindig de modelbeurt vroegtijdig met een synthetisch antwoord of stiltebefore_agent_finalize— inspecteer het natuurlijke eindantwoord en vraag één extra modelpassage aanagent_end— observeer eindberichten, successtatus en uitvoeringsduurheartbeat_prompt_contribution— voeg alleen-Heartbeat-context toe voor achtergrondmonitor- en lifecycle-plugins
model_call_started/model_call_ended— observeer opgeschoonde provider-/modelaanroepmetadata, timing, uitkomst en begrensde request-id-hashes zonder prompt- of responsinhoudllm_input— observeer providerinvoer (systeemprompt, prompt, geschiedenis)llm_output— observeer provideruitvoer
before_tool_call— herschrijf toolparameters, blokkeer uitvoering of vereis goedkeuringafter_tool_call— observeer toolresultaten, fouten en duurtool_result_persist— herschrijf het assistentbericht dat uit een toolresultaat wordt geproduceerdbefore_message_write— inspecteer of blokkeer een lopende berichtschrijfactie (zeldzaam)
inbound_claim— claim een inkomend bericht vóór agent-routering (synthetische antwoorden)message_received— observeer inkomende inhoud, afzender, thread en metadatamessage_sending— herschrijf uitgaande inhoud of annuleer afleveringmessage_sent— observeer succes of mislukking van uitgaande afleveringbefore_dispatch— inspecteer of herschrijf een uitgaande dispatch vóór overdracht aan het kanaalreply_dispatch— neem deel aan de uiteindelijke reply-dispatch-pipeline
session_start/session_end— volg grenzen van de sessielevenscyclusbefore_compaction/after_compaction— observeer of annoteer Compaction-cyclibefore_reset— observeer sessie-resetgebeurtenissen (/reset, programmatische resets)
subagent_spawning/subagent_delivery_target/subagent_spawned/subagent_ended— coördineer subagent-routering en afleveren van voltooiing
gateway_start/gateway_stop— start of stop plugin-eigen services met de Gatewaycron_changed— observeer gateway-eigen Cron-levenscycluswijzigingen (toegevoegd, bijgewerkt, verwijderd, gestart, voltooid, gepland)before_install— inspecteer Skills- of plugin-installatiescans en blokkeer optioneel
Toolaanroepbeleid
before_tool_call ontvangt:
event.toolNameevent.params- optioneel
event.runId - optioneel
event.toolCallId - contextvelden zoals
ctx.agentId,ctx.sessionKey,ctx.sessionId,ctx.runId,ctx.jobId(ingesteld bij Cron-gestuurde runs) en diagnostischectx.trace
block: trueis terminaal en slaat handlers met lagere prioriteit over.block: falsewordt behandeld als geen beslissing.paramsherschrijft de toolparameters voor uitvoering.requireApprovalpauzeert de agentrun en vraagt de gebruiker om goedkeuring via plugin-goedkeuringen. De opdracht/approvekan zowel exec- als plugin-goedkeuringen goedkeuren.- Een
block: truemet lagere prioriteit kan nog steeds blokkeren nadat een hook met hogere prioriteit goedkeuring heeft gevraagd. onResolutionontvangt de opgeloste goedkeuringsbeslissing —allow-once,allow-always,deny,timeoutofcancelled.
api.registerTrustedToolPolicy(...). Deze worden uitgevoerd vóór gewone
before_tool_call-hooks en vóór beslissingen van externe plugins. Gebruik ze alleen
voor door de host vertrouwde poorten zoals workspacebeleid, budgethandhaving of
gereserveerde workflowveiligheid. Externe plugins moeten normale before_tool_call-hooks gebruiken.
Persistentie van toolresultaten
Toolresultaten kunnen gestructureerdedetails bevatten voor UI-rendering, diagnostiek,
mediaroutering of plugin-eigen metadata. Behandel details als runtimemetadata,
niet als promptinhoud:
- OpenClaw verwijdert
toolResult.detailsvóór provider-replay en Compaction-invoer, zodat metadata geen modelcontext wordt. - Gepersisteerde sessie-items behouden alleen begrensde
details. Te grote details worden vervangen door een compacte samenvatting enpersistedDetailsTruncated: true. tool_result_persistenbefore_message_writeworden uitgevoerd vóór de uiteindelijke persistentielimiet. Hooks moeten geretourneerdedetailsnog steeds klein houden en vermijden promptrelevante tekst alleen indetailste plaatsen; zet voor het model zichtbare tooluitvoer incontent.
Prompt- en model-hooks
Gebruik de fasespecifieke hooks voor nieuwe plugins:before_model_resolve: ontvangt alleen de huidige prompt en attachment-metadata. RetourneerproviderOverrideofmodelOverride.agent_turn_prepare: ontvangt de huidige prompt, voorbereide sessieberichten en alle exactly-once wachtrij-injecties die voor deze sessie zijn verwerkt. RetourneerprependContextofappendContext.before_prompt_build: ontvangt de huidige prompt en sessieberichten. RetourneerprependContext,appendContext,systemPrompt,prependSystemContextofappendSystemContext.heartbeat_prompt_contribution: wordt alleen uitgevoerd voor Heartbeat-beurten en retourneertprependContextofappendContext. Het is bedoeld voor achtergrondmonitors die de huidige status moeten samenvatten zonder door de gebruiker geïnitieerde beurten te wijzigen.
before_agent_start blijft bestaan voor compatibiliteit. Geef de voorkeur aan de expliciete hooks hierboven,
zodat je plugin niet afhankelijk is van een verouderde gecombineerde fase.
before_agent_start en agent_end bevatten event.runId wanneer OpenClaw de
actieve run kan identificeren. Dezelfde waarde is ook beschikbaar op ctx.runId.
Cron-gestuurde runs stellen ook ctx.jobId bloot (de id van de oorspronkelijke cronjob), zodat
plugin-hooks statistieken, neveneffecten of status aan een specifieke geplande
job kunnen koppelen.
agent_end is een observatiehook en wordt fire-and-forget uitgevoerd na de beurt. De
hook-runner past een time-out van 30 seconden toe, zodat een vastgelopen plugin of embedding-
endpoint de hook-promise niet voor altijd open kan laten staan. Een time-out wordt gelogd en
OpenClaw gaat door; het annuleert plugin-eigen netwerkwerk niet tenzij de
plugin ook zijn eigen abortsignaal gebruikt.
Gebruik model_call_started en model_call_ended voor provider-call-telemetrie
die geen ruwe prompts, geschiedenis, responses, headers, request
bodies of provider-request-id’s mag ontvangen. Deze hooks bevatten stabiele metadata zoals
runId, callId, provider, model, optioneel api/transport, terminale
durationMs/outcome en upstreamRequestIdHash wanneer OpenClaw een
begrensde provider-request-id-hash kan afleiden.
before_agent_finalize wordt alleen uitgevoerd wanneer een harness op het punt staat een natuurlijk
eindantwoord van de assistent te accepteren. Het is niet het /stop-annuleringspad en wordt niet
uitgevoerd wanneer de gebruiker een beurt afbreekt. Retourneer { action: "revise", reason } om
de harness om nog één modelpassage te vragen vóór finalisatie, { action: "finalize", reason? } om finalisatie af te dwingen, of laat een resultaat weg om door te gaan.
Native Codex-Stop-hooks worden aan deze hook doorgegeven als OpenClaw-
before_agent_finalize-beslissingen.
Niet-gebundelde plugins die llm_input, llm_output,
before_agent_finalize of agent_end nodig hebben, moeten instellen:
plugins.entries.<id>.hooks.allowPromptInjection=false.
Sessie-extensies en next-turn-injecties
Workflow-plugins kunnen kleine JSON-compatibele sessiestatus persisteren metapi.registerSessionExtension(...) en deze bijwerken via de Gateway-
methode sessions.pluginPatch. Sessierijen projecteren geregistreerde extensiestatus
via pluginExtensions, zodat Control UI en andere clients plugin-eigen status kunnen renderen
zonder plugin-internals te leren kennen.
Gebruik api.enqueueNextTurnInjection(...) wanneer een plugin duurzame context nodig heeft om
de volgende modelbeurt precies één keer te bereiken. OpenClaw verwerkt wachtrij-injecties vóór
prompt-hooks, verwijdert verlopen injecties en dedupliceert per plugin op idempotencyKey.
Dit is het juiste punt voor goedkeuringshervattingen, beleidssamenvattingen,
achtergrondmonitor-delta’s en opdrachtvoortzettingen die op de volgende beurt zichtbaar moeten zijn voor
het model, maar geen permanente systeemprompttekst moeten worden.
Opruimsemantiek maakt deel uit van het contract. Callbacks voor het opruimen van sessie-extensies en
runtimelevenscyclus ontvangen reset, delete, disable of
restart. De host verwijdert de persistente sessie-extensiestatus van de eigenaarplugin
en openstaande next-turn-injecties voor reset/delete/disable; restart behoudt
duurzame sessiestatus terwijl opruimcallbacks plugins scheduler-
jobs, runcontext en andere out-of-band resources voor de oude runtime-
generatie laten vrijgeven.
Berichthooks
Gebruik berichthooks voor kanaalniveau-routering en afleveringsbeleid:message_received: observeer inkomende inhoud, afzender,threadId,messageId,senderId, optionele run-/sessiecorrelatie en metadata.message_sending: herschrijfcontentof retourneer{ cancel: true }.message_sent: observeer uiteindelijk succes of mislukking.
content het verborgen gesproken transcript bevatten, zelfs wanneer de kanaalpayload geen zichtbare tekst/bijschrift heeft. Het herschrijven van die content werkt alleen het voor hooks zichtbare transcript bij; het wordt niet weergegeven als mediabijschrift.
Message-hookcontexten stellen stabiele correlatievelden beschikbaar wanneer die beschikbaar zijn: ctx.sessionKey, ctx.runId, ctx.messageId, ctx.senderId, ctx.trace, ctx.traceId, ctx.spanId, ctx.parentSpanId en ctx.callDepth. Geef de voorkeur aan deze eersteklas velden voordat je verouderde metadata leest.
Geef de voorkeur aan getypte threadId- en replyToId-velden voordat je kanaalspecifieke metadata gebruikt.
Beslissingsregels:
message_sendingmetcancel: trueis terminaal.message_sendingmetcancel: falsewordt behandeld als geen beslissing.- Herschreven
contentgaat door naar hooks met lagere prioriteit, tenzij een latere hook de levering annuleert.
Hooks installeren
before_install wordt uitgevoerd na de ingebouwde scan voor Skills- en Plugin-installaties. Retourneer aanvullende bevindingen of { block: true, blockReason } om de installatie te stoppen.
block: true is terminaal. block: false wordt behandeld als geen beslissing.
Gateway-levenscyclus
Gebruikgateway_start voor Plugin-services die Gateway-beheerde status nodig hebben. De context stelt ctx.config, ctx.workspaceDir en ctx.getCron?.() beschikbaar voor Cron-inspectie en updates. Gebruik gateway_stop om langlopende resources op te ruimen.
Vertrouw niet op de interne gateway:startup-hook voor Plugin-beheerde runtimeservices.
cron_changed wordt geactiveerd voor Gateway-beheerde Cron-levenscyclusgebeurtenissen met een getypte gebeurtenispayload die de redenen added, updated, removed, started, finished en scheduled dekt. De gebeurtenis bevat een PluginHookGatewayCronJob-snapshot (inclusief state.nextRunAtMs, state.lastRunStatus en state.lastError wanneer aanwezig) plus een PluginHookGatewayCronDeliveryStatus van not-requested | delivered | not-delivered | unknown. Verwijderde gebeurtenissen bevatten nog steeds de snapshot van de verwijderde taak, zodat externe planners de status kunnen reconciliëren. Gebruik ctx.getCron?.() en ctx.config uit de runtimecontext bij het synchroniseren van externe wake-planners, en behoud OpenClaw als de bron van waarheid voor controles op vervallen taken en uitvoering.
Aankomende deprecaties
Enkele hook-aangrenzende oppervlakken zijn deprecated, maar worden nog steeds ondersteund. Migreer vóór de volgende major release:- Plattetekst-kanaalenveloppen in
inbound_claim- enmessage_received-handlers. LeesBodyForAgenten de gestructureerde gebruikerscontextblokken in plaats van platte enveloptekst te parsen. Zie Plattetekst-kanaalenveloppen → BodyForAgent. before_agent_startblijft bestaan voor compatibiliteit. Nieuwe Plugins moetenbefore_model_resolveenbefore_prompt_buildgebruiken in plaats van de gecombineerde fase.onResolutioninbefore_tool_callgebruikt nu de getyptePluginApprovalResolution-union (allow-once/allow-always/deny/timeout/cancelled) in plaats van een vrijestring.
command-auth → command-status — Plugin SDK-migratie → Actieve deprecaties.
Gerelateerd
- Plugin SDK-migratie — actieve deprecaties en verwijderingstijdlijn
- Plugins bouwen
- Plugin SDK-overzicht
- Plugin-entrypoints
- Interne hooks
- Interne Plugin-architectuur