agents パラメータを使用して SDK でサブエージェントを定義および使用する方法について説明します。
概要
サブエージェントは 3 つの方法で作成できます。- プログラム的に:
query()オプションのagentsパラメータを使用します。TypeScript および Python リファレンスを参照してください - ファイルシステムベース:
.claude/agents/ディレクトリ内のマークダウンファイルとしてエージェントを定義します。ファイルとしてサブエージェントを定義するを参照してください - 組み込みの汎用: Claude は、何も定義することなく、Agent ツールを介して組み込みの
general-purposeサブエージェントをいつでも呼び出すことができます
description フィールドに基づいて、それらを呼び出すかどうかを判断します。サブエージェントをいつ使用すべきかを説明する明確な説明を書いてください。Claude は自動的に適切なタスクを委譲します。プロンプトでサブエージェントを名前で明示的にリクエストすることもできます。例えば「code-reviewer エージェントを使用して…」のようにです。
サブエージェントを使用する利点
コンテキスト分離
各サブエージェントは独自の新しい会話で実行されます。中間的なツール呼び出しと結果はサブエージェント内に留まり、最終メッセージだけが親に返されます。サブエージェントが継承するものを参照して、サブエージェントのコンテキストに正確に何が含まれているかを確認してください。 例:research-assistant サブエージェントは、そのコンテンツがメイン会話に蓄積されることなく、数十のファイルを探索できます。親は、サブエージェントが読んだすべてのファイルではなく、簡潔なサマリーを受け取ります。
並列化
複数のサブエージェントを同時に実行でき、独立したサブタスクはすべての合計ではなく、最も遅いものの時間で完了します。 例: コードレビュー中に、style-checker、security-scanner、test-coverage サブエージェントを順序立てて実行するのではなく、同時に実行できます。
特殊な指示と知識
各サブエージェントは、特定の専門知識、ベストプラクティス、制約を備えたカスタマイズされたシステムプロンプトを持つことができます。 例:database-migration サブエージェントは、SQL ベストプラクティス、ロールバック戦略、データ整合性チェックに関する詳細な知識を持つことができます。これらはメインエージェントの指示では不要なノイズになります。
ツール制限
サブエージェントは特定のツールに制限でき、意図しないアクションのリスクを軽減します。 例:doc-reviewer サブエージェントは Read と Grep ツールのみにアクセスでき、ドキュメントファイルを分析できますが、誤って変更することはありません。
サブエージェントの作成
プログラム的な定義(推奨)
agents パラメータを使用してコード内でサブエージェントを直接定義します。Claude はサブエージェントを Agent ツール経由で呼び出すため、allowedTools に Agent を含めて、パーミッション プロンプトなしでサブエージェント呼び出しを自動承認する必要があります。
このページのほとんどの例は最終結果のみを出力します。Claude がサブエージェントに委譲したことを確認するには、サブエージェント呼び出しの検出を参照してください。
この例では、読み取り専用アクセスを持つコードレビュアーとコマンドを実行できるテストランナーの 2 つのサブエージェントを作成します。
AgentDefinition 設定
Python SDK では、
disallowedTools や mcpServers などの複数単語のフィールド名は、Python の snake_case 規約に従うのではなく、wire フォーマットに一致するように camelCase を保持します。詳細については、AgentDefinition リファレンスを参照してください。
Claude Code v2.1.198 でサブエージェントの動作が 2 つ変更されました。
- サブエージェントはデフォルトでバックグラウンドで実行されます。
run_in_background入力を省略する Agent ツール呼び出しはバックグラウンドサブエージェントを起動し、Claude が続行する前に結果が必要な場合はrun_in_background: falseを設定します。v2.1.198 より前は、run_in_backgroundを省略するとサブエージェントが同期的に実行されていました。特定のエージェントに対してバックグラウンド実行を強制するには、backgroundフィールドをtrueに設定してください。これは Claude が要求する内容に関わらず適用されます。 - サブエージェントはメインセッションの拡張思考設定を継承します。以前のバージョンでは、メインセッションの設定に関わらず、サブエージェント内で拡張思考が無効になっていました。
Claude Code v2.1.172 以降、サブエージェントは独自のサブエージェントを生成できます。メインエージェントの 5 レベル下のサブエージェントは、フォアグラウンドまたはバックグラウンドで実行されるかどうかに関わらず、それ以上のサブエージェントを生成できません。サブエージェントが他のサブエージェントを生成するのを防ぐには、その
tools 配列から Agent を省略するか、disallowedTools に追加してください。完全な深さルールについては、ネストされたサブエージェントを参照してください。ファイルシステムベースの定義(代替)
.claude/agents/ ディレクトリ内のマークダウンファイルとしてサブエージェントを定義することもできます。このアプローチの詳細については、Claude Code サブエージェントドキュメントを参照してください。プログラム的に定義されたエージェントは、同じ名前のファイルシステムベースのエージェントより優先されます。
カスタムサブエージェントを定義しなくても、Claude は組み込みの
general-purpose サブエージェントを生成できます。これは、特殊なエージェントを作成せずに研究または探索タスクを委譲するのに便利です。allowedTools に Agent を含めて、これらの呼び出しがパーミッション プロンプトなしで自動承認されるようにしてください。サブエージェントが継承するもの
サブエージェントのコンテキストウィンドウは新しく開始されます(親の会話なし)が、空ではありません。親からサブエージェントへの唯一のチャネルは Agent ツールのプロンプト文字列なので、サブエージェントが必要とするファイルパス、エラーメッセージ、または決定をそのプロンプトに直接含めてください。SendMessage ツールを持つサブエージェントは、セッションで実行されている他の名前付きエージェントのリストで開始されるため、メッセージを送信できる名前を認識しています。Claude Code はセッションの最初のターンでサブエージェントにリストを自動的に追加します。フォークは親の会話を継承するため、リストを取得しません。このリストには Claude Code v2.1.206 以降が必要です。
親はサブエージェントの最終メッセージを Agent ツール結果として逐語的に受け取りますが、独自の応答で要約する場合があります。サブエージェント出力を逐語的にユーザー向けの応答で保持するには、メイン
query() 呼び出しに渡すプロンプトまたは systemPrompt オプションに指示を含めてください。サブエージェントの呼び出し
自動呼び出し
Claude は、タスクと各サブエージェントのdescription に基づいて、サブエージェントをいつ呼び出すかを自動的に決定します。例えば、説明が「クエリチューニング用のパフォーマンス最適化スペシャリスト」である performance-optimizer サブエージェントを定義した場合、プロンプトでクエリの最適化について言及すると、Claude はそれを呼び出します。
Claude がタスクを正しいサブエージェントにマッチングできるように、明確で具体的な説明を書いてください。
明示的な呼び出し
Claude が特定のサブエージェントを使用することを保証するには、プロンプトで名前を言及してください:動的エージェント設定
実行時の条件に基づいて、エージェント定義を動的に作成できます。この例では、異なる厳密性レベルを持つセキュリティレビュアーを作成し、厳密なレビューにはより強力なモデルを使用します。サブエージェント呼び出しの検出
Claude はサブエージェントを Agent ツール経由で呼び出します。サブエージェントが呼び出されたときを検出するには、name が "Agent" である tool_use ブロックをチェックしてください。サブエージェントのコンテキスト内からのメッセージには parent_tool_use_id フィールドが含まれます。
ツール名は Claude Code v2.1.63 で
"Task" から "Agent" に変更されました。現在の SDK リリースは tool_use ブロックで "Agent" を出力しますが、system:init ツールリストと result.permission_denials[].tool_name では引き続き "Task" を使用します。SDK バージョン全体での互換性を確保するために、block.name で両方の値をチェックしてください。message.content 経由で直接アクセスされます。TypeScript では、SDKAssistantMessage が Claude API メッセージをラップするため、コンテンツは message.message.content 経由でアクセスされます。
この例は、ストリーミングされたメッセージを反復処理し、サブエージェントが呼び出されたときと、その後のメッセージがそのサブエージェントの実行コンテキスト内から発信されたときをログに記録します。
サブエージェントの再開
サブエージェントを再開して、中断したところから続行できます。再開されたサブエージェントは、以前のすべてのツール呼び出し、結果、推論を含む完全な会話履歴を保持します。 サブエージェントが完了すると、Agent ツール結果にはagentId: <id> を含むテキストブロックが含まれます。組み込みの Explore および Plan エージェント はワンショットであり、agentId を返さないため、再開が必要な場合はカスタムエージェントまたは general-purpose を使用してください。サブエージェントをプログラム的に再開するには:
- セッション ID をキャプチャする: 最初のクエリ中にメッセージから
session_idを抽出します - エージェント ID を抽出する: Agent ツール結果テキストから
agentIdを解析します - セッションを再開する: 2 番目のクエリのオプションで
resume: sessionIdを渡し、プロンプトにエージェント ID を含めます
サブエージェントのトランスクリプトにアクセスするには、同じセッションを再開する必要があります。各
query() 呼び出しはデフォルトで新しいセッションを開始するため、同じセッションで続行するには resume: sessionId を渡してください。カスタムエージェントを使用する場合は、両方のクエリの agents パラメータで同じエージェント定義を渡してください。endpoint-finder エージェントを定義しています。最初のクエリはそれを実行し、Agent ツール結果からセッション ID とエージェント ID をキャプチャします。その後、2 番目のクエリはセッションを再開して、最初の分析からのコンテキストが必要なフォローアップ質問をします。
- メイン会話の圧縮: メイン会話が圧縮されると、サブエージェントのトランスクリプトは影響を受けません。これらは別のファイルに保存されます。
- セッション永続化: サブエージェントのトランスクリプトはセッション内で永続化されます。同じセッションを再開することで、Claude Code を再起動した後にサブエージェントを再開できます。
- 自動クリーンアップ: トランスクリプトは
cleanupPeriodDays設定に基づいてクリーンアップされます(デフォルト:30 日)。
ツール制限
サブエージェントはtools フィールド経由で制限されたツールアクセスを持つことができます。
- フィールドを省略: エージェントは利用可能なすべてのツールを継承します(デフォルト)
- ツールを指定: エージェントはリストされたツールのみを使用できます
一般的なツール組み合わせ
動的ワークフローでスケールアップ
サブエージェントは、ターンごとに数個の委譲されたタスクに適しています。数十から数百のエージェントを調整する実行の場合は、Workflow ツールを使用してください。これにより、オーケストレーションを会話コンテキストの外で実行時が実行するスクリプトに移動します。動的ワークフローを参照して、ワークフローがターンごとのサブエージェント委譲とどのように異なるかを確認してください。
Workflow ツールは TypeScript Agent SDK v0.3.149 以降で利用可能です。allowedTools に Workflow を含めてワークフロー実行を自動承認します。ツール入力および出力スキーマは TypeScript リファレンスに記載されています。
トラブルシューティング
Claude がサブエージェントに委譲していない
Claude がサブエージェントに委譲する代わりにタスクを直接完了する場合:- Agent ツールの呼び出しが承認されていることを確認する:
allowedToolsにAgentを含めて、サブエージェント呼び出しを自動承認します。これがない場合、Agent 呼び出しはcanUseToolコールバックにフォールスルーするか、dontAskモードでは拒否されます - 明示的なプロンプトを使用する: プロンプトでサブエージェントを名前で言及します。例えば「code-reviewer エージェントを使用して…」のように
- 明確な説明を書く: サブエージェントをいつ使用すべきかを正確に説明し、Claude がタスクを適切にマッチングできるようにします
ファイルシステムベースのエージェントが読み込まれていない
Claude Code は~/.claude/agents/ と .claude/agents/ を監視し、数秒以内に新しいまたは編集されたエージェントファイルを検出します。再起動は不要です。定義が表示されない場合は、以下の原因を確認してください:
- 新しい
agentsディレクトリ: ウォッチャーはセッション開始時に存在していたディレクトリのみをカバーするため、新しいディレクトリ内の最初のファイルはセッション再起動が必要です。これが最も一般的な原因です。 - 無効なフロントマターまたは重複した
name: ファイルの YAML を確認し、既存のエージェントが同じnameを使用していないか確認してください。 --disable-slash-commands: このフラグで開始されたセッションはこれらのディレクトリを監視せず、新しいファイルを読み込むには常に再起動が必要です。- 同じ名前のプログラマティックエージェント:
query()に渡されるagentsは、同じ名前のファイルシステムエージェントをオーバーライドします。
Windows での長いプロンプトの失敗
Windows では、非常に長いプロンプトを持つサブエージェントは、コマンドラインの長さ制限である 8191 文字により失敗する場合があります。プロンプトを簡潔に保つか、複雑な指示にはファイルシステムベースのエージェントを使用してください。関連ドキュメント
- Claude Code サブエージェント:ファイルシステムベースの定義を含む包括的なサブエージェントドキュメント
- 動的ワークフロー:スクリプトから多くのサブエージェントをオーケストレートして、1 つの会話には大きすぎるジョブを実行します
- SDK 概要:Claude Agent SDK の開始方法