HOOK.md dla poleceń i zdarzeń Gateway, takich jak
/new, /reset, /stop, agent:bootstrap albo gateway:startup.
Szybki start
Rejestruj typowane haki Plugin za pomocąapi.on(...) z punktu wejścia Plugin:
priority. Hooki o tym samym priorytecie
zachowują kolejność rejestracji.
Katalog hooków
Hooki są pogrupowane według powierzchni, którą rozszerzają. Nazwy pogrubione (…) akceptują wynik decyzyjny (block, cancel, override albo require approval); wszystkie pozostałe służą tylko do obserwacji. Tura agentabefore_model_resolve— nadpisuje dostawcę albo model przed załadowaniem wiadomości sesjibefore_prompt_build— dodaje dynamiczny kontekst albo tekst promptu systemowego przed wywołaniem modelubefore_agent_start— faza łączona tylko dla zgodności; preferuj dwa powyższe hookibefore_agent_reply— skraca turę modelu przez syntetyczną odpowiedź albo ciszęagent_end— obserwuje końcowe wiadomości, stan powodzenia i czas trwania uruchomienia
llm_input— obserwuje wejście dostawcy (prompt systemowy, prompt, historia)llm_output— obserwuje wyjście dostawcy
before_tool_call— przepisuje parametry narzędzia, blokuje wykonanie albo wymaga zatwierdzeniaafter_tool_call— obserwuje wyniki narzędzia, błędy i czas trwaniatool_result_persist— przepisuje wiadomość asystenta utworzoną z wyniku narzędziabefore_message_write— sprawdza albo blokuje trwający zapis wiadomości (rzadkie)
inbound_claim— przejmuje przychodzącą wiadomość przed routingiem agenta (syntetyczne odpowiedzi)message_received— obserwuje treść przychodzącą, nadawcę, wątek i metadanemessage_sending— przepisuje treść wychodzącą albo anuluje dostarczeniemessage_sent— obserwuje powodzenie albo niepowodzenie dostarczenia wychodzącegobefore_dispatch— sprawdza albo przepisuje wychodzący dispatch przed przekazaniem do kanałureply_dispatch— uczestniczy w końcowym potoku dispatch odpowiedzi
session_start/session_end— śledzą granice cyklu życia sesjibefore_compaction/after_compaction— obserwują albo adnotują cykle Compactionbefore_reset— obserwuje zdarzenia resetowania sesji (/reset, resetowania programowe)
subagent_spawning/subagent_delivery_target/subagent_spawned/subagent_ended— koordynują routing subagentów i dostarczanie po zakończeniu
gateway_start/gateway_stop— uruchamiają albo zatrzymują usługi należące do Plugin wraz z Gatewaybefore_install— sprawdza skanowanie instalacji Skills albo Plugin i opcjonalnie blokuje
Zasady wywołań narzędzi
before_tool_call otrzymuje:
event.toolNameevent.params- opcjonalne
event.runId - opcjonalne
event.toolCallId - pola kontekstu, takie jak
ctx.agentId,ctx.sessionKey,ctx.sessionId, oraz diagnostycznectx.trace
block: truejest końcowe i pomija handlery o niższym priorytecie.block: falsejest traktowane jak brak decyzji.paramsprzepisuje parametry narzędzia do wykonania.requireApprovalwstrzymuje uruchomienie agenta i pyta użytkownika przez zatwierdzenia Plugin. Polecenie/approvemoże zatwierdzać zarówno zatwierdzenia exec, jak i Plugin.block: trueo niższym priorytecie nadal może zablokować po tym, jak hook o wyższym priorytecie zażądał zatwierdzenia.onResolutionotrzymuje rozstrzygniętą decyzję zatwierdzenia —allow-once,allow-always,deny,timeoutalbocancelled.
Hooki promptu i modelu
Dla nowych Plugin używaj hooków specyficznych dla faz:before_model_resolve: otrzymuje tylko bieżący prompt i metadane załączników. ZwróćproviderOverridealbomodelOverride.before_prompt_build: otrzymuje bieżący prompt i wiadomości sesji. ZwróćprependContext,systemPrompt,prependSystemContextalboappendSystemContext.
before_agent_start pozostaje dla zgodności. Preferuj powyższe jawne hooki,
aby Plugin nie zależał od starszej fazy łączonej.
before_agent_start i agent_end zawierają event.runId, gdy OpenClaw może
zidentyfikować aktywne uruchomienie. Ta sama wartość jest też dostępna w ctx.runId.
Pluginy niedołączone, które potrzebują llm_input, llm_output albo agent_end, muszą ustawić:
plugins.entries.<id>.hooks.allowPromptInjection=false.
Hooki wiadomości
Używaj hooków wiadomości do routingu na poziomie kanału i zasad dostarczania:message_received: obserwuje przychodzącą treść, nadawcę,threadId,messageId,senderId, opcjonalną korelację uruchomienia/sesji i metadane.message_sending: przepisujecontentalbo zwraca{ cancel: true }.message_sent: obserwuje końcowe powodzenie albo niepowodzenie.
content może zawierać ukryty transkrypt mowy
nawet wtedy, gdy ładunek kanału nie ma widocznego tekstu/podpisu. Przepisanie tego
content aktualizuje tylko transkrypt widoczny dla hooka; nie jest renderowane jako
podpis mediów.
Konteksty hooków wiadomości udostępniają stabilne pola korelacji, gdy są dostępne:
ctx.sessionKey, ctx.runId, ctx.messageId, ctx.senderId, ctx.trace,
ctx.traceId, ctx.spanId, ctx.parentSpanId i ctx.callDepth. Preferuj te pola
pierwszej klasy przed odczytywaniem starszych metadanych.
Preferuj typowane pola threadId i replyToId przed użyciem metadanych specyficznych dla kanału.
Zasady decyzji:
message_sendingzcancel: truejest końcowe.message_sendingzcancel: falsejest traktowane jak brak decyzji.- Przepisane
contenttrafia dalej do hooków o niższym priorytecie, chyba że późniejszy hook anuluje dostarczenie.
Hooki instalacji
before_install działa po wbudowanym skanowaniu instalacji Skills i Plugin.
Zwróć dodatkowe ustalenia albo { block: true, blockReason }, aby zatrzymać
instalację.
block: true jest końcowe. block: false jest traktowane jak brak decyzji.
Cykl życia Gateway
Używajgateway_start dla usług Plugin, które potrzebują stanu należącego do Gateway.
Kontekst udostępnia ctx.config, ctx.workspaceDir i ctx.getCron?.() do
inspekcji i aktualizacji Cron. Używaj gateway_stop, aby czyścić długotrwałe
zasoby.
Nie polegaj na wewnętrznym hooku gateway:startup dla usług runtime należących do Plugin.
Nadchodzące przestarzałości
Kilka powierzchni powiązanych z hookami jest przestarzałych, ale nadal obsługiwanych. Zmigruj przed następnym dużym wydaniem:- Plaintext channel envelopes w handlerach
inbound_claimimessage_received. OdczytujBodyForAgenti ustrukturyzowane bloki kontekstu użytkownika zamiast parsować płaski tekst envelope. Zobacz Plaintext channel envelopes → BodyForAgent. before_agent_startpozostaje dla zgodności. Nowe Pluginy powinny używaćbefore_model_resolveibefore_prompt_buildzamiast fazy łączonej.onResolutionwbefore_tool_callużywa teraz typowanego uniiPluginApprovalResolution(allow-once/allow-always/deny/timeout/cancelled) zamiast dowolnegostring.
command-auth → command-status — znajdziesz w
Plugin SDK migration → Active deprecations.
Powiązane
- Plugin SDK migration — aktywne przestarzałości i harmonogram usunięcia
- Tworzenie Plugin
- Przegląd Plugin SDK
- Punkty wejścia Plugin
- Hooki wewnętrzne
- Wewnętrzna architektura Plugin