/new、/reset、/stop、agent:bootstrap、gateway:startup などのコマンドや Gateway イベント向けに、オペレーターがインストールする小さな HOOK.md スクリプトが必要な場合は、代わりに internal hooks を使用してください。
クイックスタート
Plugin エントリからapi.on(...) で型付き Plugin フックを登録します。
priority の降順で順番に実行されます。同じ優先度のフックは登録順を維持します。
フックカタログ
フックは、拡張する対象ごとにグループ化されています。太字 の名前は決定結果(block、cancel、override、または require approval)を受け付けます。それ以外はすべて監視専用です。 エージェントターンbefore_model_resolve— セッションメッセージの読み込み前に provider または model を上書きbefore_prompt_build— モデル呼び出し前に動的コンテキストまたは system-prompt テキストを追加before_agent_start— 互換性専用の結合フェーズ。上記 2 つのフックを優先してくださいbefore_agent_reply— 合成返信または無応答でモデルターンを短絡agent_end— 最終メッセージ、成功状態、実行時間を監視
model_call_started/model_call_ended— prompt や response 内容なしで、サニタイズ済みの provider/model 呼び出しメタデータ、タイミング、結果、および制限された request-id ハッシュを監視llm_input— provider 入力(system prompt、prompt、履歴)を監視llm_output— provider 出力を監視
before_tool_call— ツールパラメータの書き換え、実行のブロック、または承認必須化after_tool_call— ツール結果、エラー、実行時間を監視tool_result_persist— ツール結果から生成された assistant メッセージを書き換えbefore_message_write— 進行中のメッセージ書き込みを検査またはブロック(まれ)
inbound_claim— エージェントルーティング前に受信メッセージを claim(合成返信)message_received— 受信内容、送信者、スレッド、メタデータを監視message_sending— 送信内容の書き換え、または配信のキャンセルmessage_sent— 送信配信の成功または失敗を監視before_dispatch— チャネル引き渡し前に送信 dispatch を検査または書き換えreply_dispatch— 最終返信 dispatch パイプラインに参加
session_start/session_end— セッションライフサイクル境界を追跡before_compaction/after_compaction— Compaction サイクルを監視または注釈追加before_reset— セッションリセットイベント(/reset、プログラムによるリセット)を監視
subagent_spawning/subagent_delivery_target/subagent_spawned/subagent_ended— サブエージェントのルーティングと完了配信を調整
gateway_start/gateway_stop— Gateway とともに Plugin 所有サービスを開始または停止before_install— Skill または Plugin のインストールスキャンを検査し、必要に応じてブロック
ツール呼び出しポリシー
before_tool_call は次を受け取ります。
event.toolNameevent.params- 省略可能な
event.runId - 省略可能な
event.toolCallId ctx.agentId、ctx.sessionKey、ctx.sessionId、および診断用のctx.traceなどのコンテキストフィールド
block: trueは終端であり、より低い優先度のハンドラーをスキップします。block: falseは決定なしとして扱われます。paramsは実行用のツールパラメータを書き換えます。requireApprovalはエージェント実行を一時停止し、plugin approvals を通じてユーザーに確認します。/approveコマンドは exec 承認と plugin 承認の両方を承認できます。- より高い優先度のフックが承認を要求した後でも、より低い優先度の
block: trueでブロックできます。 onResolutionは解決された承認決定allow-once、allow-always、deny、timeout、またはcancelledを受け取ります。
プロンプトとモデルのフック
新しい Plugin ではフェーズ固有のフックを使用してください。before_model_resolve: 現在の prompt と添付メタデータのみを受け取ります。providerOverrideまたはmodelOverrideを返します。before_prompt_build: 現在の prompt とセッションメッセージを受け取ります。prependContext、systemPrompt、prependSystemContext、またはappendSystemContextを返します。
before_agent_start は互換性のために残されています。Plugin がレガシーな結合フェーズに依存しないよう、上記の明示的なフックを優先してください。
before_agent_start と agent_end には、OpenClaw がアクティブな実行を識別できる場合 event.runId が含まれます。同じ値は ctx.runId でも利用できます。
生の prompt、履歴、response、ヘッダー、request body、または provider request ID を受け取るべきでない provider 呼び出しテレメトリには、model_call_started と model_call_ended を使用してください。これらのフックには、runId、callId、provider、model、省略可能な api / transport、最終的な durationMs / outcome、および OpenClaw が制限された provider request-id ハッシュを導出できる場合の upstreamRequestIdHash などの安定したメタデータが含まれます。
バンドルされていない Plugin で llm_input、llm_output、または agent_end が必要な場合は、次を設定する必要があります。
plugins.entries.<id>.hooks.allowPromptInjection=false で無効化できます。
メッセージフック
チャネルレベルのルーティングと配信ポリシーには、メッセージフックを使用してください。message_received: 受信内容、送信者、threadId、messageId、senderId、省略可能な実行/セッション相関、およびメタデータを監視message_sending:contentを書き換えるか、{ cancel: true }を返しますmessage_sent: 最終的な成功または失敗を監視
content に非表示の発話文字起こしが含まれる場合があります。その content を書き換えると、フックから見える文字起こしだけが更新され、メディア caption としてはレンダリングされません。
メッセージフックのコンテキストは、利用可能な場合に安定した相関フィールドを公開します:
ctx.sessionKey、ctx.runId、ctx.messageId、ctx.senderId、ctx.trace、ctx.traceId、ctx.spanId、ctx.parentSpanId、ctx.callDepth。レガシーなメタデータを読む前に、まずこれらのファーストクラスフィールドを優先してください。
チャネル固有メタデータを使う前に、型付きの threadId と replyToId を優先してください。
決定ルール:
message_sendingでcancel: trueは終端です。message_sendingでcancel: falseは決定なしとして扱われます。- 書き換えられた
contentは、後続のフックが配信をキャンセルしない限り、より低い優先度のフックへ渡されます。
インストールフック
before_install は、Skill と Plugin のインストールに対する組み込みスキャンの後に実行されます。追加の findings を返すか、{ block: true, blockReason } を返してインストールを停止します。
block: true は終端です。block: false は決定なしとして扱われます。
Gateway ライフサイクル
Gateway 所有状態が必要な Plugin サービスにはgateway_start を使用してください。コンテキストは ctx.config、ctx.workspaceDir、および Cron の検査と更新のための ctx.getCron?.() を公開します。長時間動作するリソースのクリーンアップには gateway_stop を使用してください。
Plugin 所有のランタイムサービスに対して内部の gateway:startup フックに依存しないでください。
今後の非推奨項目
フック隣接の一部の対象は非推奨ですが、まだサポートされています。次のメジャーリリース前に移行してください。inbound_claimとmessage_receivedハンドラー内のプレーンテキストチャネルエンベロープ。フラットなエンベロープテキストを解析するのではなく、BodyForAgentと構造化されたユーザーコンテキストブロックを読んでください。参照: Plaintext channel envelopes → BodyForAgent。before_agent_startは互換性のために残されています。新しい Plugin では、結合フェーズの代わりにbefore_model_resolveとbefore_prompt_buildを使用してください。before_tool_callのonResolutionは、自由形式のstringではなく、型付きPluginApprovalResolutionユニオン(allow-once/allow-always/deny/timeout/cancelled)を使用するようになりました。
command-auth → command-status のリネーム — については、
Plugin SDK migration → Active deprecations を参照してください。