フックは、Gateway 内で何かが起きたときに実行される小さなスクリプトです。ディレクトリから検出でき、Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
openclaw hooks で検査できます。Gateway は、フックを有効化するか、少なくとも 1 つのフックエントリ、フックパック、レガシーハンドラー、または追加フックディレクトリを設定した後にのみ内部フックを読み込みます。
OpenClaw には 2 種類のフックがあります。
- 内部フック(このページ):
/new、/reset、/stop、ライフサイクルイベントなど、エージェントイベントが発火したときに Gateway 内で実行されます。 - Webhooks: 他のシステムが OpenClaw で作業をトリガーできる外部 HTTP エンドポイントです。Webhooks を参照してください。
openclaw hooks list は、スタンドアロンフックと plugin 管理フックの両方を表示します。
クイックスタート
イベントタイプ
| イベント | 発火するタイミング |
|---|---|
command:new | /new コマンドが発行されたとき |
command:reset | /reset コマンドが発行されたとき |
command:stop | /stop コマンドが発行されたとき |
command | 任意のコマンドイベント(汎用リスナー) |
session:compact:before | Compaction が履歴を要約する前 |
session:compact:after | Compaction が完了した後 |
session:patch | セッションプロパティが変更されたとき |
agent:bootstrap | ワークスペースのブートストラップファイルが注入される前 |
gateway:startup | チャンネルが開始し、フックが読み込まれた後 |
gateway:shutdown | Gateway のシャットダウンが開始したとき |
gateway:pre-restart | 予定された Gateway 再起動の前 |
message:received | 任意のチャンネルからの受信メッセージ |
message:transcribed | 音声の文字起こしが完了した後 |
message:preprocessed | メディアとリンクの前処理が完了、またはスキップされた後 |
message:sent | 送信メッセージが配信されたとき |
フックを書く
フック構造
各フックは、2 つのファイルを含むディレクトリです。HOOK.md 形式
metadata.openclaw):
| フィールド | 説明 |
|---|---|
emoji | CLI で表示する絵文字 |
events | 待ち受けるイベントの配列 |
export | 使用する名前付きエクスポート(既定は "default") |
os | 必須プラットフォーム(例: ["darwin", "linux"]) |
requires | 必須の bins、anyBins、env、または config パス |
always | 適格性チェックをバイパスする(真偽値) |
install | インストール方法 |
ハンドラー実装
type、action、sessionKey、timestamp、messages(ユーザーに送信するには push)、context(イベント固有データ)が含まれます。エージェントおよびツール plugin のフックコンテキストには、trace も含めることができます。これは読み取り専用の W3C 互換診断トレースコンテキストで、plugins は OTEL 相関のために構造化ログへ渡せます。
イベントコンテキストの要点
コマンドイベント(command:new、command:reset): context.sessionEntry、context.previousSessionEntry、context.commandSource、context.workspaceDir、context.cfg。
メッセージイベント(message:received): context.from、context.content、context.channelId、context.metadata(senderId、senderName、guildId などを含むプロバイダー固有データ)。context.content は、コマンドのようなメッセージでは空でないコマンド本文を優先し、その後に生の受信本文と汎用本文へフォールバックします。スレッド履歴やリンク要約など、エージェント専用の拡張情報は含まれません。
メッセージイベント(message:sent): context.to、context.content、context.success、context.channelId。
メッセージイベント(message:transcribed): context.transcript、context.from、context.channelId、context.mediaPath。
メッセージイベント(message:preprocessed): context.bodyForAgent(最終的に拡張された本文)、context.from、context.channelId。
ブートストラップイベント(agent:bootstrap): context.bootstrapFiles(変更可能な配列)、context.agentId。
セッションパッチイベント(session:patch): context.sessionEntry、context.patch(変更されたフィールドのみ)、context.cfg。権限を持つクライアントのみがパッチイベントをトリガーできます。
Compaction イベント: session:compact:before には messageCount、tokenCount が含まれます。session:compact:after には compactedCount、summaryLength、tokensBefore、tokensAfter が追加されます。
command:stop は、ユーザーが /stop を発行するのを監視します。これはキャンセル/コマンドのライフサイクルであり、エージェントの最終化ゲートではありません。自然な最終回答を検査し、エージェントにもう一度処理させる必要がある plugins は、代わりに型付き plugin フック before_agent_finalize を使用してください。Plugin フック を参照してください。
Gateway ライフサイクルイベント: gateway:shutdown には reason と restartExpectedMs が含まれ、Gateway のシャットダウンが開始したときに発火します。gateway:pre-restart には同じコンテキストが含まれますが、シャットダウンが予定された再起動の一部であり、有限の restartExpectedMs 値が指定されている場合にのみ発火します。シャットダウン中、各ライフサイクルフックの待機はベストエフォートかつ上限付きであるため、ハンドラーが停止してもシャットダウンは続行されます。
gateway:shutdown(または gateway:pre-restart)イベントと残りのシャットダウンシーケンスの間に、Gateway はプロセス停止時にまだアクティブだったすべてのセッションについて、型付き session_end plugin フックも発火します。イベントの reason は、通常の SIGTERM/SIGINT 停止では shutdown、予定された再起動の一部としてクローズがスケジュールされた場合は restart です。このドレインは上限付きであるため、遅い session_end ハンドラーがプロセス終了をブロックすることはありません。また、replace / reset / delete / compaction によってすでに最終化されたセッションは、二重発火を避けるためにスキップされます。
フック検出
フックは、上書き優先度が低い順に、次のディレクトリから検出されます。- バンドルフック: OpenClaw に同梱
- Plugin フック: インストール済み plugins 内にバンドルされたフック
- 管理フック:
~/.openclaw/hooks/(ユーザーがインストールし、ワークスペース間で共有)。hooks.internal.load.extraDirsからの追加ディレクトリもこの優先度を共有します。 - ワークスペースフック:
<workspace>/hooks/(エージェントごと。明示的に有効化されるまで既定では無効)
openclaw hooks enable <name> でバンドルまたは管理フックを有効化するか、フックパックをインストールするか、hooks.internal.enabled=true を設定してオプトインしてください。名前付きフックを 1 つ有効化すると、Gateway はそのフックのハンドラーのみを読み込みます。hooks.internal.enabled=true、追加フックディレクトリ、レガシーハンドラーは広範な検出にオプトインします。
フックパック
フックパックは、package.json の openclaw.hooks 経由でフックをエクスポートする npm パッケージです。次でインストールします。
バンドルフック
| フック | イベント | 動作 |
|---|---|---|
| session-memory | command:new, command:reset | セッションコンテキストを <workspace>/memory/ に保存します |
| bootstrap-extra-files | agent:bootstrap | glob パターンから追加のブートストラップファイルを注入します |
| command-logger | command | すべてのコマンドを ~/.openclaw/logs/commands.log に記録します |
| compaction-notifier | session:compact:before, session:compact:after | セッション Compaction の開始/終了時に表示されるチャット通知を送信します |
| boot-md | gateway:startup | Gateway 起動時に BOOT.md を実行します |
session-memory の詳細
最後の 15 件のユーザー/アシスタントメッセージを抽出し、ホストのローカル日付を使用して<workspace>/memory/YYYY-MM-DD-HHMM.md に保存します。メモリキャプチャはバックグラウンドで実行されるため、/new と /reset の確認応答は、トランスクリプト読み取りや任意の slug 生成によって遅延しません。設定済みモデルで説明的なファイル名 slug を生成するには、hooks.internal.entries.session-memory.llmSlug: true を設定します。workspace.dir が設定されている必要があります。
bootstrap-extra-files 設定
AGENTS.md、SOUL.md、TOOLS.md、IDENTITY.md、USER.md、HEARTBEAT.md、BOOTSTRAP.md、MEMORY.md)。
command-logger の詳細
すべてのスラッシュコマンドを~/.openclaw/logs/commands.log に記録します。
compaction-notifier の詳細
OpenClaw がセッショントランスクリプトの圧縮を開始および完了したときに、現在の会話へ短いステータスメッセージを送信します。これにより、チャット画面で長いターンが分かりやすくなります。ユーザーは、アシスタントがコンテキストを要約しており、Compaction 後に続行することを確認できます。boot-md の詳細
Gateway 起動時に、アクティブなワークスペースからBOOT.md を実行します。
Plugin フック
Plugins は、より深い統合のために Plugin SDK を通じて型付きフックを登録できます。 ツール呼び出しのインターセプト、プロンプトの変更、メッセージフローの制御などができます。before_tool_call、before_agent_reply、before_install、またはその他のプロセス内ライフサイクルフックが必要な場合は、plugin フックを使用してください。
完全な plugin フックリファレンスについては、Plugin フック を参照してください。
設定
従来の
hooks.internal.handlers 配列設定形式は後方互換性のため引き続きサポートされていますが、新しいフックでは検出ベースのシステムを使用する必要があります。CLI リファレンス
ベストプラクティス
- ハンドラーを高速に保つ。 フックはコマンド処理中に実行されます。重い作業は
void processInBackground(event)で投げっぱなしにします。 - エラーを適切に処理する。 リスクのある操作は try/catch でラップします。他のハンドラーが実行できるように、throw しないでください。
- イベントを早めに絞り込む。 イベントの type/action が関連しない場合はすぐに return します。
- 具体的なイベントキーを使う。 オーバーヘッドを減らすため、
"events": ["command"]よりも"events": ["command:new"]を優先します。
トラブルシューティング
フックが検出されない
フックが対象にならない
フックが実行されない
- フックが有効になっていることを確認します:
openclaw hooks list - フックが再読み込みされるように Gateway プロセスを再起動します。
- Gateway ログを確認します:
./scripts/clawlog.sh | grep hook
関連
- CLI リファレンス: フック
- Webhook
- Plugin フック — プロセス内 Plugin ライフサイクルフック
- 設定