HOOK.md-Skript für Befehls- und Gateway-Ereignisse wie
/new, /reset, /stop, agent:bootstrap oder gateway:startup möchten.
Schnellstart
Registrieren Sie typisierte Plugin-Hooks mitapi.on(...) aus Ihrem Plugin-Einstiegspunkt:
priority ausgeführt. Hooks mit derselben Priorität
behalten die Reihenfolge der Registrierung bei.
Hook-Katalog
Hooks sind nach der Oberfläche gruppiert, die sie erweitern. Namen in Fettdruck akzeptieren ein Entscheidungsergebnis (blockieren, abbrechen, überschreiben oder Genehmigung anfordern); alle anderen dienen nur der Beobachtung. Agenten-Zugbefore_model_resolve— Provider oder Modell überschreiben, bevor Sitzungsnachrichten geladen werdenbefore_prompt_build— vor dem Modellaufruf dynamischen Kontext oder Systemprompt-Text hinzufügenbefore_agent_start— kombinierte Phase nur aus Kompatibilitätsgründen; bevorzugen Sie die beiden Hooks obenbefore_agent_reply— den Modellzug mit einer synthetischen Antwort oder Stille kurzschließenagent_end— finale Nachrichten, Erfolgsstatus und Laufdauer beobachten
model_call_started/model_call_ended— bereinigte Provider-/Modellaufruf-Metadaten, Zeitmessung, Ergebnis und begrenzte Request-ID-Hashes ohne Prompt- oder Antwortinhalt beobachtenllm_input— Provider-Eingabe beobachten (Systemprompt, Prompt, Verlauf)llm_output— Provider-Ausgabe beobachten
before_tool_call— Tool-Parameter umschreiben, Ausführung blockieren oder Genehmigung anfordernafter_tool_call— Tool-Ergebnisse, Fehler und Dauer beobachtentool_result_persist— die aus einem Tool-Ergebnis erzeugte Assistentennachricht umschreibenbefore_message_write— einen laufenden Nachrichtenschreibvorgang prüfen oder blockieren (selten)
inbound_claim— eine eingehende Nachricht vor dem Agenten-Routing beanspruchen (synthetische Antworten)message_received— eingehenden Inhalt, Absender, Thread und Metadaten beobachtenmessage_sending— ausgehenden Inhalt umschreiben oder Zustellung abbrechenmessage_sent— Erfolg oder Fehler der ausgehenden Zustellung beobachtenbefore_dispatch— einen ausgehenden Dispatch vor der Kanalübergabe prüfen oder umschreibenreply_dispatch— an der finalen Reply-Dispatch-Pipeline teilnehmen
session_start/session_end— Grenzen des Sitzungslebenszyklus verfolgenbefore_compaction/after_compaction— Compaction-Zyklen beobachten oder annotierenbefore_reset— Sitzungs-Reset-Ereignisse beobachten (/reset, programmatische Resets)
subagent_spawning/subagent_delivery_target/subagent_spawned/subagent_ended— Routing und Abschlusszustellung von Subagenten koordinieren
gateway_start/gateway_stop— plugin-eigene Dienste mit dem Gateway starten oder stoppenbefore_install— Scans für Skill- oder Plugin-Installationen prüfen und optional blockieren
Richtlinie für Tool-Aufrufe
before_tool_call erhält:
event.toolNameevent.params- optional
event.runId - optional
event.toolCallId - Kontextfelder wie
ctx.agentId,ctx.sessionKey,ctx.sessionIdund Diagnoseinformationen inctx.trace
block: trueist terminal und überspringt Handler mit niedrigerer Priorität.block: falsewird als keine Entscheidung behandelt.paramsschreibt die Tool-Parameter für die Ausführung um.requireApprovalpausiert den Agentenlauf und fragt den Benutzer über Plugin-Genehmigungen. Der Befehl/approvekann sowohl Ausführungs- als auch Plugin-Genehmigungen genehmigen.- Ein
block: truemit niedrigerer Priorität kann weiterhin blockieren, nachdem ein Hook mit höherer Priorität eine Genehmigung angefordert hat. onResolutionerhält die aufgelöste Genehmigungsentscheidung —allow-once,allow-always,deny,timeoutodercancelled.
Prompt- und Modell-Hooks
Verwenden Sie für neue Plugins die phasenspezifischen Hooks:before_model_resolve: erhält nur den aktuellen Prompt und Attachment-Metadaten. Geben SieproviderOverrideodermodelOverridezurück.before_prompt_build: erhält den aktuellen Prompt und Sitzungsnachrichten. Geben SieprependContext,systemPrompt,prependSystemContextoderappendSystemContextzurück.
before_agent_start bleibt aus Kompatibilitätsgründen erhalten. Bevorzugen Sie die expliziten Hooks oben,
damit Ihr Plugin nicht von einer veralteten kombinierten Phase abhängt.
before_agent_start und agent_end enthalten event.runId, wenn OpenClaw den aktiven Lauf identifizieren kann.
Derselbe Wert ist auch unter ctx.runId verfügbar.
Verwenden Sie model_call_started und model_call_ended für Telemetrie von Provider-Aufrufen,
die keine rohen Prompts, Verläufe, Antworten, Header, Request-Bodys oder
Provider-Request-IDs erhalten soll. Diese Hooks enthalten stabile Metadaten wie
runId, callId, provider, model, optional api/transport,
abschließendes durationMs/outcome und upstreamRequestIdHash, wenn OpenClaw
einen begrenzten Hash der Provider-Request-ID ableiten kann.
Nicht gebündelte Plugins, die llm_input, llm_output oder agent_end benötigen, müssen Folgendes setzen:
plugins.entries.<id>.hooks.allowPromptInjection=false deaktiviert werden.
Nachrichten-Hooks
Verwenden Sie Nachrichten-Hooks für Routing und Zustellrichtlinien auf Kanalebene:message_received: eingehenden Inhalt, Absender,threadId,messageId,senderId, optionale Lauf-/Sitzungskorrelation und Metadaten beobachten.message_sending:contentumschreiben oder{ cancel: true }zurückgeben.message_sent: endgültigen Erfolg oder Fehler beobachten.
content das verborgene gesprochene Transkript
enthalten, auch wenn die Kanallast keinen sichtbaren Text/keine sichtbare Caption hat.
Das Umschreiben dieses content aktualisiert nur das für Hooks sichtbare Transkript;
es wird nicht als Medien-Caption gerendert.
Kontexte von Nachrichten-Hooks stellen, sofern verfügbar, stabile Korrelationsfelder bereit:
ctx.sessionKey, ctx.runId, ctx.messageId, ctx.senderId, ctx.trace,
ctx.traceId, ctx.spanId, ctx.parentSpanId und ctx.callDepth. Bevorzugen Sie
diese erstklassigen Felder, bevor Sie veraltete Metadaten lesen.
Bevorzugen Sie typisierte Felder threadId und replyToId, bevor Sie kanalspezifische
Metadaten verwenden.
Entscheidungsregeln:
message_sendingmitcancel: trueist terminal.message_sendingmitcancel: falsewird als keine Entscheidung behandelt.- Umgeschriebener
contentwird an Hooks mit niedrigerer Priorität weitergegeben, es sei denn, ein späterer Hook bricht die Zustellung ab.
Install-Hooks
before_install läuft nach dem eingebauten Scan für Skill- und Plugin-Installationen.
Geben Sie zusätzliche Findings oder { block: true, blockReason } zurück, um die
Installation zu stoppen.
block: true ist terminal. block: false wird als keine Entscheidung behandelt.
Gateway-Lifecycle
Verwenden Siegateway_start für Plugin-Dienste, die einen dem Gateway gehörenden Zustand benötigen. Der
Kontext stellt ctx.config, ctx.workspaceDir und ctx.getCron?.() für
Cron-Inspektion und -Aktualisierungen bereit. Verwenden Sie gateway_stop, um lang laufende
Ressourcen zu bereinigen.
Verlassen Sie sich für plugin-eigene Laufzeitdienste nicht auf den internen Hook gateway:startup.
Bevorstehende Deprecations
Einige hook-nahe Oberflächen sind veraltet, werden aber weiterhin unterstützt. Migrieren Sie vor dem nächsten Major Release:- Plaintext channel envelopes in
inbound_claim- undmessage_received- Handlern. Lesen SieBodyForAgentund die strukturierten Benutzerkontextblöcke, statt flachen Hüllentext zu parsen. Siehe Plaintext channel envelopes → BodyForAgent. before_agent_startbleibt aus Kompatibilitätsgründen erhalten. Neue Plugins solltenbefore_model_resolveundbefore_prompt_buildstatt der kombinierten Phase verwenden.onResolutioninbefore_tool_callverwendet jetzt die typisierte UnionPluginApprovalResolution(allow-once/allow-always/deny/timeout/cancelled) statt eines Freitext-string.
command-auth → command-status — finden Sie unter
Plugin SDK migration → Active deprecations.
Verwandt
- Plugin SDK migration — aktive Deprecations und Zeitplan für die Entfernung
- Plugins erstellen
- Plugin SDK overview
- Plugin entry points
- Interne Hooks
- Interne Plugin-Architektur