jpskill.com
💼 ビジネス コミュニティ 🟡 少し慣れが必要 👤 経営者・事業責任者・マーケ

💼 エージェントRuntimeHooks

agent-runtime-hooks

AIエージェントの実行中に、特定の処理の前後

⏱ 求人原稿の改善 半日 → 15分

📺 まず動画で見る(YouTube)

▶ 【自動化】AIガチ勢の最新活用術6選がこれ1本で丸分かり!【ClaudeCode・AIエージェント・AI経営・Skills・MCP】 ↗

※ jpskill.com 編集部が参考用に選んだ動画です。動画の内容と Skill の挙動は厳密には一致しないことがあります。

📜 元の英語説明(参考)

Agent runtime lifecycle hooks for observing and intercepting agent execution. Use when adding hooks to agent operations, mocking tool calls, logging step events, handling human intervention, sub-agent calls, context compression, or building eval/tracing integrations. Triggers on 'hooks', 'beforeToolCall', 'afterToolCall', 'beforeStep', 'afterStep', 'onComplete', 'onError', 'tool mock', 'agent lifecycle', 'human intervention', 'callAgent', 'compact'.

🇯🇵 日本人クリエイター向け解説

一言でいうと

AIエージェントの実行中に、特定の処理の前後

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o agent-runtime-hooks.zip https://jpskill.com/download/1265.zip && unzip -o agent-runtime-hooks.zip && rm agent-runtime-hooks.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/1265.zip -OutFile "$d\agent-runtime-hooks.zip"; Expand-Archive "$d\agent-runtime-hooks.zip" -DestinationPath $d -Force; ri "$d\agent-runtime-hooks.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して agent-runtime-hooks.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → agent-runtime-hooks フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-17
取得日時
2026-05-17
同梱ファイル
1

💬 こう話しかけるだけ — サンプルプロンプト

  • Agent Runtime Hooks で、私のビジネスを分析して改善案を3つ提案して
  • Agent Runtime Hooks を使って、来週の会議用の資料を作って
  • Agent Runtime Hooks で、現状の課題を整理してアクションプランに落として

これをClaude Code に貼るだけで、このSkillが自動発動します。

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

エージェントランタイムフック

エージェントの実行を監視およびインターセプトするためのライフサイクルフックです。フックは execAgent({ hooks }) を介して操作ごとに登録され、HookDispatcher によってディスパッチされます。

フックの種類

5つのカテゴリにわたる16種類のフックがあります。

execAgent({ hooks })
  │
  ├─ beforeStep ──────────── 各ステップの実行前
  │     │
  │     ├─ [call_llm]        LLM推論
  │     │
  │     ├─ [call_tool]
  │     │     ├─ beforeToolCall ── ツール実行前 (モックをサポート)
  │     │     ├─ (ツール実行)
  │     │     ├─ afterToolCall ─── ツール完了後 (監視のみ)
  │     │     └─ onToolCallError ─ ツールが例外をスローした
  │     │
  │     ├─ [request_human_approve]
  │     │     ├─ beforeHumanIntervention ── エージェントが一時停止する前
  │     │     ├─ afterHumanIntervention ─── 承認/拒否 + 再開後
  │     │     └─ onStopByHumanIntervention ── ユーザーが拒否し、エージェントが停止した
  │     │
  │     ├─ [compress_context]
  │     │     ├─ beforeCompact ──── 圧縮開始前
  │     │     ├─ afterCompact ───── 圧縮完了後
  │     │     └─ onCompactError ─── 圧縮に失敗した
  │     │
  │     ├─ [callAgent] (via execSubAgentTask)
  │     │     ├─ beforeCallAgent ── サブエージェント開始前
  │     │     ├─ afterCallAgent ─── サブエージェント完了後
  │     │     └─ onCallAgentError ── サブエージェントが失敗した
  │     │
  │     └─ afterStep ──────────── ステップ完了後
  │
  ├─ (次のステップ...)
  │
  ├─ onComplete ───────────── 操作が最終状態に達した
  └─ onError ──────────────── 実行中のエラー

主要ファイル

ファイル 役割
packages/agent-runtime/src/types/hooks.ts 型定義 (AgentHookType、すべてのイベントインターフェース)
src/server/services/agentRuntime/hooks/types.ts サーバーサイドの型 (AgentHook、再エクスポート)
src/server/services/agentRuntime/hooks/HookDispatcher.ts 登録、ディスパッチ、dispatchBeforeToolCall
src/server/modules/AgentRuntime/RuntimeExecutors.ts ツール/圧縮/HumanIntervention フックのディスパッチ
src/server/services/agentRuntime/AgentRuntimeService.ts ステップフック + HumanIntervention の再開/拒否
src/server/services/aiAgent/index.ts CallAgent フックのディスパッチ

登録フロー

const hooks: AgentHook[] = [
  { id: 'my-hook', type: 'afterStep', handler: async (event) => { ... } },
];
await aiAgentService.execAgent({ agentId, prompt, hooks });
// 内部処理: hookDispatcher.register(operationId, hooks)
// クリーンアップ:    hookDispatcher.unregister(operationId)

フックリファレンス

ステップレベル

beforeStep — 各ステップの前。event: AgentHookEvent afterStep — 各ステップの後。event: AgentHookEvent (content, toolsCalling, totalCost など) onComplete — 最終状態。event: AgentHookEvent (reason: done/error/interrupted/max_steps/cost_limit) onError — エラーが発生しました。event: AgentHookEvent (errorMessage, errorDetail)

ツールコールレベル

beforeToolCall — ツール実行前。event.mock() を介したモックをサポートします。

// event: ToolCallHookEvent
{
  (identifier, apiName, args, callIndex, stepIndex, operationId, mock);
}
// モックの例:
event.mock({ content: '{"error":"rate limited"}' });

ディスパッチメソッド: hookDispatcher.dispatchBeforeToolCall() (モック結果または null を返します)。

afterToolCall — ツール完了後。監視のみ。

// event: AfterToolCallHookEvent
{
  (identifier, apiName, args, callIndex, content, success, mocked, executionTimeMs, stepIndex);
}

onToolCallError — ツールが例外をスローしました (catch ブロック、success=false だけではありません)。

// event: ToolCallErrorHookEvent
{
  (identifier, apiName, args, callIndex, error, stepIndex);
}

人間による介入

beforeHumanIntervention — 承認のためにエージェントが一時停止する前。

// event: BeforeHumanInterventionHookEvent
{ operationId, stepIndex, pendingTools: [{ identifier, apiName }] }

afterHumanIntervention — 承認/拒否後、エージェントが再開します。

// event: AfterHumanInterventionHookEvent
{ operationId, action: 'approve' | 'reject' | 'rejectAndContinue', toolCallId?, rejectionReason? }

onStopByHumanIntervention — ユーザーが拒否し、エージェントが停止しました。

// event: StopByHumanInterventionHookEvent
{ operationId, toolCallId?, rejectionReason? }

コンテキスト圧縮

beforeCompact — 圧縮開始前。

// event: BeforeCompactHookEvent
{
  (operationId, stepIndex, messageCount, tokenCount);
}

afterCompact — 圧縮完了後。

// event: AfterCompactHookEvent
{
  (operationId, stepIndex, groupId, messagesBefore, messagesAfter, summary);
}

onCompactError — 圧縮に失敗しました。

// event: CompactErrorHookEvent
{
  (operationId, stepIndex, tokenCount, error);
}

サブエージェント (CallAgent)

beforeCallAgent — サブエージェントを呼び出す前。操作でディスパッチされます。

// event: BeforeCallAgentHookEvent
{
  (operationId, agentId, instruction);
}

afterCallAgent — サブエージェントが完了しました。操作でディスパッチされます。

// event: AfterCallAgentHookEvent
{
  (operationId, agentId, subOperationId, threadId, success);
}

onCallAgentError — サブエージェントが失敗しました。操作でディスパッチされます。

// event: CallAgentErrorHookEvent
{
  (operationId, agentId, error);
}

注: CallAgent フックには ExecSubAgentTaskParamsparentOperationId が必要です。

設計上の注意

  • Fire-and-forget: すべてのハンドラは Promise<void> を返します。エラーは致命的ではありません。
  • 例外: beforeToolCallevent.mock() を介したモックをサポートします — モック結果を返す dispatchBeforeToolCall() を使用します。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Agent Runtime Hooks

Lifecycle hooks for observing and intercepting agent execution. Hooks are registered per-operation via execAgent({ hooks }) and dispatched by HookDispatcher.

Hook Types

16 hook types across 5 categories:

execAgent({ hooks })
  │
  ├─ beforeStep ──────────── Before each step executes
  │     │
  │     ├─ [call_llm]        LLM inference
  │     │
  │     ├─ [call_tool]
  │     │     ├─ beforeToolCall ── Before tool executes (supports mocking)
  │     │     ├─ (tool execution)
  │     │     ├─ afterToolCall ─── After tool completes (observation only)
  │     │     └─ onToolCallError ─ Tool threw an exception
  │     │
  │     ├─ [request_human_approve]
  │     │     ├─ beforeHumanIntervention ── Before agent pauses
  │     │     ├─ afterHumanIntervention ─── After approve/reject + resume
  │     │     └─ onStopByHumanIntervention ── User rejected, agent halted
  │     │
  │     ├─ [compress_context]
  │     │     ├─ beforeCompact ──── Before compression starts
  │     │     ├─ afterCompact ───── After compression completes
  │     │     └─ onCompactError ─── Compression failed
  │     │
  │     ├─ [callAgent] (via execSubAgentTask)
  │     │     ├─ beforeCallAgent ── Before sub-agent starts
  │     │     ├─ afterCallAgent ─── After sub-agent completes
  │     │     └─ onCallAgentError ── Sub-agent failed
  │     │
  │     └─ afterStep ──────────── After step completes
  │
  ├─ (next step...)
  │
  ├─ onComplete ───────────── Operation reaches terminal state
  └─ onError ──────────────── Error during execution

Key Files

File Role
packages/agent-runtime/src/types/hooks.ts Type definitions (AgentHookType, all event interfaces)
src/server/services/agentRuntime/hooks/types.ts Server-side types (AgentHook, re-exports)
src/server/services/agentRuntime/hooks/HookDispatcher.ts Registration, dispatch, dispatchBeforeToolCall
src/server/modules/AgentRuntime/RuntimeExecutors.ts Tool/Compact/HumanIntervention hook dispatch
src/server/services/agentRuntime/AgentRuntimeService.ts Step hooks + HumanIntervention resume/reject
src/server/services/aiAgent/index.ts CallAgent hook dispatch

Registration Flow

const hooks: AgentHook[] = [
  { id: 'my-hook', type: 'afterStep', handler: async (event) => { ... } },
];
await aiAgentService.execAgent({ agentId, prompt, hooks });
// Internally: hookDispatcher.register(operationId, hooks)
// Cleanup:    hookDispatcher.unregister(operationId)

Hook Reference

Step Level

beforeStep — Before each step. event: AgentHookEvent afterStep — After each step. event: AgentHookEvent (content, toolsCalling, totalCost, etc.) onComplete — Terminal state. event: AgentHookEvent (reason: done/error/interrupted/max_steps/cost_limit) onError — Error occurred. event: AgentHookEvent (errorMessage, errorDetail)

Tool Call Level

beforeToolCall — Before tool executes. Supports mocking via event.mock().

// event: ToolCallHookEvent
{
  (identifier, apiName, args, callIndex, stepIndex, operationId, mock);
}
// Mock example:
event.mock({ content: '{"error":"rate limited"}' });

Dispatch method: hookDispatcher.dispatchBeforeToolCall() (returns mock result or null).

afterToolCall — After tool completes. Observation only.

// event: AfterToolCallHookEvent
{
  (identifier, apiName, args, callIndex, content, success, mocked, executionTimeMs, stepIndex);
}

onToolCallError — Tool threw an exception (catch block, not just success=false).

// event: ToolCallErrorHookEvent
{
  (identifier, apiName, args, callIndex, error, stepIndex);
}

Human Intervention

beforeHumanIntervention — Before agent pauses for approval.

// event: BeforeHumanInterventionHookEvent
{ operationId, stepIndex, pendingTools: [{ identifier, apiName }] }

afterHumanIntervention — After approve/reject, agent resumes.

// event: AfterHumanInterventionHookEvent
{ operationId, action: 'approve' | 'reject' | 'rejectAndContinue', toolCallId?, rejectionReason? }

onStopByHumanIntervention — User rejected, agent halted.

// event: StopByHumanInterventionHookEvent
{ operationId, toolCallId?, rejectionReason? }

Context Compression

beforeCompact — Before compression starts.

// event: BeforeCompactHookEvent
{
  (operationId, stepIndex, messageCount, tokenCount);
}

afterCompact — After compression completes.

// event: AfterCompactHookEvent
{
  (operationId, stepIndex, groupId, messagesBefore, messagesAfter, summary);
}

onCompactError — Compression failed.

// event: CompactErrorHookEvent
{
  (operationId, stepIndex, tokenCount, error);
}

Sub-Agent (CallAgent)

beforeCallAgent — Before calling sub-agent. Dispatched on parent operation.

// event: BeforeCallAgentHookEvent
{
  (operationId, agentId, instruction);
}

afterCallAgent — Sub-agent completed. Dispatched on parent operation.

// event: AfterCallAgentHookEvent
{
  (operationId, agentId, subOperationId, threadId, success);
}

onCallAgentError — Sub-agent failed. Dispatched on parent operation.

// event: CallAgentErrorHookEvent
{
  (operationId, agentId, error);
}

Note: CallAgent hooks require parentOperationId in ExecSubAgentTaskParams.

Design Notes

  • Fire-and-forget: All handlers return Promise<void>. Errors are non-fatal.
  • Exception: beforeToolCall supports mock via event.mock() — uses dispatchBeforeToolCall() which returns the mock result.
  • Sequential: Same-type hooks run in registration order.
  • Local only: beforeToolCall mock only works in local mode (in-memory hooks). Webhook mode does not support mocking.
  • Scoped per operation: Auto-cleaned via hookDispatcher.unregister() on completion.
  • Sandbox/MCP: No separate hooks — they go through executeTool, so beforeToolCall/afterToolCall cover them. Use event.identifier to filter.

Real-World Example: agent-evals

See devtools/agent-evals/helpers/runner.tscreateEvalHooks() uses afterStep, onComplete, afterToolCall, and beforeToolCall (for mock).