概要
サブエージェントは 3 つの方法で作成できます。- プログラム的に:
query()オプションのagentsパラメータを使用します。TypeScript および Python リファレンスを参照してください - ファイルシステムベース:
.claude/agents/ディレクトリ内のマークダウンファイルとしてエージェントを定義します。ファイルとしてのサブエージェント定義を参照してください - 組み込み汎用: Claude は、何も定義することなく、Agent ツール経由でいつでも組み込みの
general-purposeサブエージェントを呼び出すことができます
サブエージェントを使用する利点
サブエージェントは個別のエージェントインスタンスであるため、サブエージェントに作業を委譲することで、4 つの利点が得られます。- コンテキスト分離: 各サブエージェントは独自の会話内で実行され、サブエージェントが現在の会話をフォークする場合を除き、新たに開始されます。いずれの場合でも、中間的なツール呼び出しと結果はサブエージェント内に留まり、最終メッセージのみが親に返されます。
research-assistantサブエージェントは、そのコンテンツが主要な会話に蓄積されることなく、数十のファイルを探索できます。親は、サブエージェントが読んだすべてのファイルではなく、簡潔なサマリーを受け取ります。サブエージェントのコンテキストに含まれるものについては、サブエージェントが継承するものを参照してください。 - 並列化: 複数のサブエージェントを同時に実行できるため、独立したサブタスクは、すべてのタスクの合計ではなく、最も遅いものの時間で完了します。コードレビュー中に、
style-checker、security-scanner、test-coverageサブエージェントを順序立てて実行するのではなく、同時に実行できます。 - 特化した指示とナレッジ: 各サブエージェントは、特定の専門知識、ベストプラクティス、制約を備えたカスタマイズされたシステムプロンプトを持つことができます。
database-migrationサブエージェントは、SQL ベストプラクティス、ロールバック戦略、データ整合性チェックに関する詳細なナレッジを持つことができます。これらは主要なエージェントの指示では不要なノイズになります。 - ツール制限: サブエージェントは特定のツールに限定でき、意図しないアクションのリスクを軽減します。
doc-reviewerサブエージェントは Read と Grep ツールのみにアクセスでき、ドキュメンテーションファイルを分析できますが、誤って変更することはありません。
サブエージェントを作成する
プログラマティック定義(推奨)
agents パラメータを使用してコード内でサブエージェントを直接定義します。Claude は Agent ツールを通じてサブエージェントを呼び出します。
このページのほとんどの例は最終結果のみを出力します。Claude がサブエージェントに委譲したのか、それとも直接回答したのかを確認するには、サブエージェント呼び出しの検出を参照してください。
この例では、読み取り専用アクセス権を持つコードレビュアーと、コマンドを実行できるテストランナーの 2 つのサブエージェントを作成します。
AgentDefinition 設定
Python SDK では、
disallowedTools や mcpServers などの複数単語のフィールド名は、Python の snake_case 規約に従うのではなく、ワイヤ形式に一致させるために camelCase スペルを保持します。詳細については、AgentDefinition リファレンスを参照してください。
サブエージェントはデフォルトでバックグラウンドで実行されます。run_in_background 入力を省略する Agent ツール呼び出しはバックグラウンドサブエージェントを起動し、Claude が続行する前に結果が必要な場合は run_in_background: false を設定します。background フィールドを true に設定して、Claude が要求する内容に関係なく、特定のエージェントに対してバックグラウンド実行を強制します。Claude Code v2.1.198 より前は、バックグラウンドデフォルトは段階的にロールアウトされており、run_in_background を省略する Agent ツール呼び出しはサブエージェントを同期的に実行できました。
サブエージェントは独自のサブエージェントを生成することもできます。そのネストがどの程度深くなるか、一度に何個のサブエージェントが実行されるか、クエリがいくら費やすかを制限するには、サブエージェントの深さ、同時実行性、および支出を制限するを参照してください。
ファイルシステムベースの定義(代替案)
.claude/agents/ ディレクトリ内のマークダウンファイルとしてサブエージェントを定義することもできます。このアプローチの詳細については、Claude Code サブエージェントドキュメントを参照してください。プログラマティックに定義されたエージェントは、同じ名前のファイルシステムベースのエージェントより優先されます。
Claude が
subagent_type なしで Agent ツールを呼び出すと、組み込みの general-purpose サブエージェントが取得されます。これは、独自のエージェントを定義しない場合でも Claude が生成できます。CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS=1を設定するとそのデフォルトが削除され、そのような呼び出しは subagent_type is required で失敗します。サブエージェントが継承するもの
サブエージェントがフォークでない限り、そのコンテキストウィンドウは新しく開始され、親の会話がありませんが、空ではありません。親からサブエージェントに渡す唯一のコンテンツは Agent ツールのプロンプト文字列であるため、サブエージェントが必要とするファイルパス、エラーメッセージ、または決定をそのプロンプトに直接含めてください。SendMessage ツールを持つサブエージェントは、セッションで実行されている他の名前付きエージェントのリストで開始されるため、メッセージを送信できる名前を認識しています。Claude Code はこのリストをサブエージェントの最初のターンに自動的に追加します。フォークは親の会話を継承するため、リストを取得しません。
サブエージェントはメインセッションの拡張思考設定も継承します。
以下の表は、フォークではないサブエージェントのコンテキストに含まれるもの、および含まれないものを示しています。
親はサブエージェントの最終レポートを受け取りますが、独自の応答でそれを要約する場合があります。サブエージェント出力をユーザー向けの応答に逐語的に保持するには、メインの
query() 呼び出しに渡すプロンプトまたは systemPrompt オプションに実行するよう指示を含めてください。v2.1.210 以降では、Claude Code は親がそれを読む前に最終メッセージを指示形パターンについてスキャンします。スキャンは 3 種類のパターンを異なる方法で処理します。- 制御タグの模倣: Claude Code は、
<system-reminder>ブロックなど、ハーネスのみが発行するタグを所定の位置で中立化します。開き角括弧の後にバックスラッシュを挿入し、何も削除しません。 - 権限設定の言及: Claude Code は、
.claude/settings.json、bypassPermissions、または--dangerously-skip-permissionsなどの権限設定への参照を記述されたとおりに保持します。 - ターンマーカー:
Human:またはAssistant:で始まる行は、メッセージが会話ターン境界を模倣できないように、コロンの前にバックスラッシュが付きます。
[harness: ...] マーカー行を先頭に付けます。ターンマーカーの一致は、マーカー行を追加しません。これらはスキャンが行う唯一の変更です。サブエージェントのテキストを削除または言い換えることはありません。サブエージェントを呼び出す
自動呼び出し
Claude はタスクと各サブエージェントのdescription に基づいて、サブエージェントを呼び出すタイミングを自動的に判断します。例えば、「クエリチューニング用のパフォーマンス最適化スペシャリスト」という説明を持つ performance-optimizer サブエージェントを定義した場合、プロンプトでクエリの最適化について言及すると、Claude はそれを呼び出します。
Claude が正しいサブエージェントにタスクをマッチングできるように、明確で具体的な説明を記述してください。
明示的な呼び出し
Claude が特定のサブエージェントを使用することを保証するには、プロンプトで名前を指定してください。動的エージェント設定
実行時の条件に基づいて、エージェント定義を動的に作成できます。この例では、異なる厳密性レベルを持つセキュリティレビュアーを作成し、厳密なレビューにはより高性能なモデルを使用しています。サブエージェント呼び出しの検出
Claude はエージェントツールを通じてサブエージェントを呼び出します。サブエージェントが呼び出されたときを検出するには、name が "Agent" である tool_use ブロックをチェックしてください。
サブエージェントのコンテキスト内からのメッセージには、parent_tool_use_id フィールドが含まれます。TypeScript では、サブエージェントが生成する各アシスタントメッセージおよびユーザーメッセージに agent_id も含まれます。これは、そのサブエージェントのタスクイベントの task_id です。agent_id には TypeScript Agent SDK v0.3.292 以降が必要です。
このツールは
tool_use ブロックでは "Agent" として表示されますが、system:init ツールリストでは "Task" として表示されます。Claude Code v2.1.63 より前では、tool_use ブロックもこれを "Task" と名付けていました。SDK バージョン間で検出が機能し続けるようにするには、block.name で両方の値に一致させてください。message.content を通じてコンテンツブロックに直接アクセスします。TypeScript では、SDKAssistantMessage が Claude API メッセージをラップするため、message.message.content を通じてコンテンツにアクセスします。
この例は、ストリーミングされたメッセージを反復処理し、サブエージェントが呼び出されたときと、その後のメッセージがそのサブエージェントの実行コンテキスト内から発信されたときをログに記録します。TypeScript 版では、agent_id を持つ各サブエージェントメッセージについて、その agent_id もログに記録します。
サブエージェントの再開
サブエージェントを再開して、最初からやり直すのではなく、中断したところから続行できます。再開されたサブエージェントは、以前のすべてのツール呼び出し、結果、推論を含む完全な会話履歴を保持します。 サブエージェントがmaxTurns の制限に達して停止すると、Claude Code はエージェントツール結果の出力を部分的なものとしてマークするため、Claude は実行が未完了であることを認識します。
サブエージェントが完了すると、エージェントツール結果には agentId: <id> を含むテキストブロックが含まれます。組み込みの Explore および Plan エージェント はワンショットであり、agentId を返さないため、再開が必要な場合はカスタムエージェントまたは general-purpose を使用してください。サブエージェントをプログラムで再開するには:
- セッション ID をキャプチャする:最初のクエリ中にメッセージから
session_idを抽出します - エージェント ID を抽出する:エージェントツール結果テキストから
agentIdを解析します - セッションを再開する:2 番目のクエリのオプションで
resume: sessionIdを渡し、プロンプトにエージェント ID を含めます。各query()呼び出しはデフォルトで新しいセッションを開始し、サブエージェントのトランスクリプトにアクセスするには同じセッションを再開する必要があります。
カスタムエージェントを使用する場合、両方のクエリの
agents パラメータで同じエージェント定義を渡してください。endpoint-finder エージェントを定義しています。最初のクエリはそれを実行し、エージェントツール結果からセッション ID とエージェント ID をキャプチャします。その後、2 番目のクエリはセッションを再開して、最初の分析からのコンテキストが必要なフォローアップ質問をします。
cleanupPeriodDays クリーンアップ期間については、Claude Code でサブエージェントを再開する を参照してください。
ツール制限
tools フィールドを使用して、サブエージェントが実行できることを制限します。
toolsを省略: サブエージェントはサブエージェントで利用可能なすべてのツールを取得します- ツールをリスト化: サブエージェントはそれらのツールのみを取得します。例えば、ファイルを編集してはいけないコードレビュアーは、
["Read", "Grep", "Glob"]を取得します
一般的なツール組み合わせ
サブエージェントの深さ、並行実行数、支出をキャップする
このセクションでは TypeScript SDK v0.3.219 および Python SDK v0.2.127 以降について説明しており、これらは Claude Code v2.1.219 以降をバンドルしたリリースです。以前のリリースでは、これらの制限の一部が欠落しているか、デフォルト値が異なるため、実行をバウンドするために依存する前にアップグレードしてください。環境変数リファレンスおよびターンと予算には、各変数を追加した Claude Code バージョンと支出キャップのサブエージェント実装が記録されています。
total_cost_usd にカウントされ、サブエージェント自体がサブエージェントを生成できるため、1 つのプロンプトはエージェントのツリーに成長する可能性があります。
この成長は 3 つの方法でキャップできます。サブエージェントがどの程度深くネストするか、一度に何個実行するか、クエリ全体がいくら支出するかです。深さと並行実行数の制限は env オプションを通じて環境変数として設定し、支出制限はクエリオプションとして設定します。
2 つの SDK は
env オプションを異なる方法で処理します。TypeScript SDK はサブプロセス環境をそれで置き換えるため、PATH のような変数を保持するために process.env をそれに展開し、Python SDK はそれを継承された環境にマージします。この例ではネストをオフにし、最大 5 個のサブエージェントを同時に許可し、推定支出が $5 に達したらクエリを停止します。
- 支出キャップ以下:
successと推定コストが表示されます。 - 支出キャップに達した:
error_max_budget_usdが $5 以上のコストで表示され、その後エラーハンドラーが実行されます。 - 並行実行数制限に達した: メッセージストリームで
Concurrent subagent limit reachedを含むtool_resultブロックが表示されます。Claude は Agent ツールの結果として同じブロックを受け取ります。
Opus 5 をサブエージェントで実行する
Claude Opus 5 は以前のモデルよりもサブエージェントへの委譲をより容易に行うため、深さ、並行実行数、支出制限は Opus 5 を実行するクエリで最も重要です。Opus 5 プロンプティングガイドには、任意のプロンプトに追加できる委譲命令があります。Claude Code が独自の命令を追加するかどうかは、使用するシステムプロンプトによって異なります。claude_codeプリセット: モデルが Opus 5 の場合、Claude Code はシステムプロンプトに 1 行追加して、尋ねられない限り Agent ツールを呼び出さないよう Claude に指示します。Agent ツールは利用可能なままです。- カスタムプロンプト、または
systemPromptなし: Claude Code はシステムプロンプトを構築しないため、その行は存在しません。プロンプティングガイドの委譲命令を独自のプロンプトに追加してください。
動的ワークフローでスケールアップ
サブエージェントは、ターンごとに数個の委譲されたタスクに適しています。数十から数百のエージェントを調整する実行の場合は、Workflow ツールを使用してください。これにより、オーケストレーションを会話コンテキストの外で実行時が実行するスクリプトに移動します。動的ワークフローを参照して、ワークフローがターンごとのサブエージェント委譲とどのように異なるかを確認してください。
Workflow ツールは TypeScript Agent SDK v0.3.149 以降で利用可能です。allowedTools に Workflow を含めてワークフロー実行を自動承認します。ツール入力および出力スキーマは TypeScript リファレンスに記載されています。
トラブルシューティング
Claude がサブエージェントに委譲していない
Claude がサブエージェントに委譲する代わりにタスクを直接完了する場合:- 明示的なプロンプトを使用する: プロンプトでサブエージェントを名前で言及します。例えば「code-reviewer エージェントを使用して認証モジュールをチェックする」のように
- 明確な説明を書く: サブエージェントをいつ使用すべきかを正確に説明し、Claude がタスクを適切にマッチングできるようにします
ファイルシステムベースのエージェントが読み込まれていない
Claude Code は~/.claude/agents/ と .claude/agents/ を監視し、数秒以内に新しいまたは編集されたエージェントファイルを検出します。再起動は不要です。定義が表示されない場合は、以下の原因を確認してください:
- 新しい
agentsディレクトリ: ウォッチャーはセッション開始時に存在していたディレクトリのみをカバーするため、新しいディレクトリ内の最初のファイルはセッション再起動が必要です。これが最も一般的な原因です。 - 無効なフロントマターまたは重複した
name: ファイルの YAML を確認し、既存のエージェントが同じnameを使用していないか確認してください。 --disable-slash-commands: このフラグで開始されたセッションはこれらのディレクトリを監視せず、新しいファイルを読み込むには常に再起動が必要です。- 追加されたディレクトリ下のファイル: Claude Code は
add_dirs(Python)またはadditionalDirectories(TypeScript)オプション、または CLI の--add-dirまたは/add-dirで追加されたディレクトリから.claude/agents/を読み込みますが、監視しないため、そこにある新しいまたは編集されたファイルはセッション再起動が必要です。 - 同じ名前のプログラマティックエージェント:
query()に渡されるagentsは、同じ名前のファイルシステムエージェントをオーバーライドします。
関連ドキュメント
- Claude Code サブエージェント:ファイルシステムベースの定義を含むサブエージェントドキュメント
- 動的ワークフロー:スクリプトから多くのサブエージェントをオーケストレートして、1 つの会話には大きすぎるジョブを実行します
- SDK 概要:Claude Agent SDK の開始方法