この記事は何
Claude Codeのv2.1.172から、サブエージェントのネスト呼び出しが可能になりました。
このアップデート、個人的には体験が大きく変わるアップデートだなと思っていたのですが、あまり騒がれている印象がなかったので、僕的に嬉しいことをまとめてみようと思います。
サブエージェントのネスト呼び出しとは
Claude Codeにはサブエージェント機能があります。
これは、いわゆるプロセスのフォークのように、コンテキストなどを分離して特定の作業をさせるための機能です。
コンテキストをうまく分離することで、コンテキストの肥大化と忘却を防ぐことができるため、長時間のワークフローなどを組む際は非常に大事な機能です。
しかし、このサブエージェント機能、今まではメインのエージェントから呼び出すことはできても、サブエージェント内から入れ子で呼ぶことはできませんでした。
これは、サブエージェント呼び出しの無限ループを防ぐための仕様として、このような挙動になっていました。
最大五階層まで、サブエージェント内からでもサブエージェントを呼び出すことが可能になりました。
それにより、今まではできなかったことが色々できるようになっています。
できるようになったこと
これによる大きな体験の変化はズバリ「context: forkをつけたSkillの柔軟性が上がった」ことかなと思います。
Claude Codeでは、Skillのfrontmatterにcontext: forkをつけると、そのSkillはサブエージェントとして実行されるようになります。
この機能を使うことで、手軽にSkillのコンテキストをメインのコンテキストから分離させることが可能です。
しかし、v2.1.172よりも前は、サブエージェントのネスト呼び出しができなかったため、
-
context: forkをつけたSkill内でのサブエージェントの呼び出し -
context: forkをつけたSkillからcontext: forkをつけたSkillの呼び出し - サブエージェントから呼び出すSkillでは、内部で参照しているすべてのSkillで
context: forkが使えない
など、さまざま制約がありました。
サブエージェントのネスト呼び出しができるようになると、このような「context: forkをつけたSkillがどこから呼び出されるか」「サブエージェント内から呼び出したいSkillにcontext: forkがついていないか」をほぼ考慮せずに、気軽にSkill単位でサブエージェント化し、コンテキスト汚染を防ぐことができるようになります。
実際のイメージ
例えば今までは以下のようなシーンでcontext: forkをつけたSkillを作ると、色々なことを考慮しなくてはなりませんでした。
まず最初に、commit-pushというSkillをcontext: forkをつけて作成するとします。
---
name: commit-push
description: コード変更を適切なgitコミット戦略でgit commitし、pushします。基本的には既存のgitコミットへのsquash戦略を採用し、必要に応じてブランチ全体のgitコミット履歴を再構成します。実装完了時やユーザーがgit commitを依頼した時に使用します。
model: haiku
context: fork
---
# Commit and Push Code Changes
コード変更を適切なgitコミット戦略でgit commitし、pushするためのスキルです。
このスキルが呼び出された際には、Instructionsに従って、コード変更のgit commitとpushを行ってください。
# Instructions
## 実行ステップ
以下のステップでコード変更のgit commitとpushを行ってください。
### ステップ1: ブランチとgitコミット履歴の確認
...
その後に、以下のように、commit-pushスキルを参照した処理をSkillとして実装しようとします。
---
name: create-pr
description: GitHubでPull Request(PR)を作成します。PRのdescriptionには指定されたテンプレートを使用し、必要な情報を記載します。PR作成後、PRのURLを報告します。
argument-hint: "[issue-number]"
context: fork
---
# Create Pull Request
このスキルは、GitHubでPull Request(PR)を作成するためのスキルです。
このスキルが呼び出された際には、Instructionsに従って、PRの作成を行ってください。
# Instructions
PRは以下のステップで作成します。
## 1. コミットを作成する
commit-push skillを用いて、コミットを作成します。
## 2. PRを作成する
...
このような書き方をした瞬間、
- commit-push
- create-pr
のどちらかのcontext: forkを外す必要が出てきます。
また、create-prからcontext: forkを外したとしても、commit-pushでcontext: forkを使っているため、create-prはサブエージェントから呼び出すことはできません。
このように、単純に呼び出したSkillにcontext: forkがついているかだけではなく、そのSkillが依存しているSkillまですべてチェックして、サブエージェント内でも呼び出せるかなどを考慮しなくてはなりませんでした。
しかし、今後は「よびだしたSkillはどこかでcontext: forkを使っているか」を(5階層までは)特に考える必要がなくなるため、例のようにcreate-prを作成しても、文字通りどこからでも呼び出せるようになります。
終わりに
紹介したとおり、サブエージェントからネスト呼び出しができるようになることで、書き手で考慮することが一気に減ります。
今まで使い勝手の悪さを理由にcontext: forkやサブエージェントをうまく使えていなかった方は、これを機にぜひ使ってみてください。