どうもこんにちは。
以下のイベントでGitHub Copilotを使って色々やってみようというもくもくタイムがあったのですが、そこでサブエージェントの作られ方のロジックについて勉強してみたので、その内容を記事にしようと思います。
サブエージェントの仕組み
作る意味
Claude CodeやCodexなどのよくあるAIコーディングツールでは、メインエージェント1つでたくさんのタスクを実行するとエージェントのコンテキストが汚れてしまい、エージェントの精度が低下してしまいます。これを回避するために、メインエージェントのタスクを最小限にし、調査,コーディング,レビュー,ドキュメント更新などのタスクを専門タスクとしてサブエージェントに委譲します。
人間でいう、「おれちょっとキャパオーバーになるからこのタスクは任せたわ!」みたいなことをエージェントにもやってもらう感じです。
サブエージェントってどうやって動く?
Claude Codeの場合、公式ドキュメントの冒頭に以下のような記載があります。
サブエージェントは、特定の種類のタスクを処理する特化した AI アシスタントです。各サブエージェントは、カスタムシステムプロンプト、特定のツールアクセス、および独立した権限を備えた独自のコンテキストウィンドウで実行されます。Claude がサブエージェントの説明に一致するタスクに遭遇すると、そのサブエージェントに委譲され、サブエージェントは独立して動作し、結果を返します。
このことから、サブエージェントはメインエージェントの実行タスクとサブエージェントのYAMLフロントマタープロパティの説明と一致した場合に呼び出され、タスクが委譲されることがわかります。また、サブエージェントはメインエージェントとは独立したコンテキストにて動作するということがわかります。
また、GitHub Copilotも同様で、公式ドキュメントには以下のように記述があります。
The AI model being used by the CLI can choose to delegate a task to a subsidiary subagent process, that operates using a custom agent with specific expertise, if it judges that this would result in the work being completed more effectively. The model may equally choose to handle the work directly in the main agent.
ここで記載されていることは、 メインエージェントが「サブエージェントを使った方がタスクを効率的に完了できる」と判断した場合、特定のサブエージェントにタスクを委任することを選択できる。また、メインエージェントが直接作業することも選択できる。 ということです。
つまり、サブエージェントにタスクを委任するかどうかは、メインエージェントの判断次第ということになります。この部分についてはClaude Codeと同様です。
メインエージェントに作成したサブエージェントを指定して動かすことは可能です。そのため、「このタスクはこいつに任せたい!」という時には、そのエージェントを指定して実行することができます。
メインエージェントの判断次第なのは、あくまでも 処理実行中の中でのタスクの割り振り です。
メインエージェントのコンテキストを汚さないためにもサブエージェントが呼ばれやすくする
コンテキストをなるべく汚さず、圧迫しないためにも、専門タスクはサブエージェントに委譲したいものです。ただ、それはメインエージェントの判断次第です。
しかし、メインエージェントへのシステムプロンプト次第でコントロールすることは可能であるため、私はCLAUDE.mdもしくは/.claude/rules/のドキュメントに以下のように記述をしておくのが良いと思っています。
* どれだけ小さなタスクでも専門エージェントにタスクを委譲すること
これを加えることでサブエージェントへのタスク委譲の確率を上げることができます。
また、Skillsを作成している場合、Skillのルールセクションなどを設けて、「このタスクは専門エージェントに委譲して」というようなルールを設定しておけば、Skill経由でサブエージェントへのタスク以上が行われるようになります。
Github Copilot CLIではすでに用意されているエージェントがいる
Github Copilot CLIでは、以下のようにタスクを委譲できるサブエージェントが用意されています。簡単な開発業務などについては以下のサブエージェントで足りそうです。
| エージェント | 説明 |
|---|---|
explore |
コードベースの分析・質問応答。メインのコンテキストに影響しない |
task |
ビルド・テスト等のコマンド実行。成功時は要約のみ、失敗時は全出力を返す |
general-purpose |
複雑なマルチステップタスク。別コンテキストで高品質に実行 |
code-review |
本当に重要な問題のみに絞ったコードレビュー |
サブエージェントの動作する仕組み
以下のような流れでサブエージェントが起動します。
- ユーザーがメインエージェントにプロンプトを送る
- タスク内容を分析し、サブエージェントに委譲すべきか判断
- 適切と判断した場合、サブエージェントを一時的に生成
- サブエージェントが独自のコンテキストウィンドウで作業を実行
- 結果をメインエージェントに返す
- メインエージェントは結果を受け取り、次の計画・調整を続ける
GitHub Copilot CLI でサブエージェントを構築する方法
ここでは、Copilotと共同でサブエージェントを構築する方法と自分で作成していく方法を説明します。
まず、以下のコマンドでセッションを起動します。
$ copilot
初めての場合には、GitHubでログインする必要がありますので、表示に従ってログインをしてください。
セッションが起動したら、以下のスラッシュコマンドを実行します。
> /agent
すると、以下のように選択肢が表示されます。
Custom Agents
Select Agent:
❯ 1. Default (current)
2. aws-cdk-researcher
Manage Agents:
3. Create new agent...
4. Learn more about custom agents
1. Default (current)は現在チャットしている親エージェント, 2. aws-cdk-researcherは私が作成したサブエージェントです。新しくサブエージェントを作成する場合には、3. Create new agent...を選択します。(↓を2回とEnterで選択できます。)
次に、サブエージェントのスコープを選択します。
Create New Agent
Where should the agent be created?
❯ 1. Project (.github/agents/)
2. User (~/.copilot/agents)
1. Project (.github/agents/)を選択すると、セッションを開いたプロジェクトでのみ使用できるサブエージェントになります。2. User (~/.copilot/agents)を選択すると、すべてのプロジェクトで使用できるサブエージェントになります。
同名エージェントが存在する場合、User (~/.copilot/agents/)のサブエージェントが優先して使用されます。
ただし、前述したデフォルトで組み込まれているエージェントと同名になっている場合には、デフォルトエージェントが使用されます。
なので、code-reviewという名前のサブエージェントを作るのはダメですね。
次に、エージェントをどのように作るかを選択します。
Create New Agent
How would you like to create your agent?
❯ 1. Create with Copilot
2. Create manually
1. Create with Copilotでは、Copilotと共同で作成する方法です。2. Create manuallyを選択すると、自分でサブエージェントの定義をすることになります。
今回は、1. Create with Copilotで解説します。
2. Create manuallyを選択しても良いですが、1. Create with Copilotで作成する方が正確で早い気がします。(個人の感想です。)
1. Create with Copilotを選択したら、以下のような画面が表示されます。
Create New Agent
Describe your agent:
What should it do? When should it be used?
╭─────────────────────────────────────────────────────────────────────────────────╮
│e.g., An agent that reviews React components for accessibility issues... │
│ │
│ │
│ │
│ │
╰───────────────────────────────────────────────────────────────────────────-─────╯
ここで、作成したいエージェントが何をするエージェントなのかを記載します。
例えば、こんな感じ。
╭─────────────────────────────────────────────────────────────────────────────────╮
│ AWS CDKのソースコードをレビューするサブエージェント。AWS IaC MCP サーバを使って、AWS CDKの │
│ 仕様を確認して記述に問題がないことを確認する。問題がある場合には、それを報告する。 │
│ │
│ │
│ │
╰───────────────────────────────────────────────────────────────────────────-─────╯
上記のように入力してEnterを実行したら、Copilotによってエージェントの作成が開始されます。
1度に複数のエージェントの作成はできないので注意
すると、以下のように選択肢が表示されるので、1. Continueを選択します。
Create New Agent
✓ Agent generation successful!
Name: aws-cdk-reviewer · Instructions: 4,778 chars
What would you like to do?
❯ 1. Continue
2. Review content
3. Try again
4. Quit
すると、エージェントのできる範囲を選択できるようになります。
Create New Agent
Which tools should this agent have access to?
❯ 1. All tools
2. Select by category..
今回は、AWS CDKのコードレビューエージェントを作りたいので、ファイルの編集などは許可したくないです。なので、2. Select by category..を選択します。
すると、以下のような画面が表示されるので、Edit files/Subagentsのチェックを外します。(Spaceキーでチェックの付け外しができます。)
Select tool categories (7/7 enabled)
❯ [✓] Shell
[✓] Read files
[✓] Edit files
[✓] Subagents
[✓] Skills
[✓] Web
[✓] Ask user
上記の選択が完了すると、/.github/agents/xxxxxxxxxx.agent.mdが作成され、サブエージェントの定義が記載されています。
作成されたxxxxxx.agent.md
Skillと同様に、上部にYAMLプロパティが記載され、細かい定義が本文に記載されます。
プロパティについては以下です。
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
name |
string | 任意 | エージェント名。 省略時はファイル名を使用 |
description |
string | 必須 | エージェントの目的・専門領域の説明 |
tools |
list / string | 任意 | 使用可能なツール名のリスト。 省略すると全ツールが使用可能 |
model |
string | 任意 | 使用する AI モデル。 省略するとメインエージェントを継承 |
disable-model-invocation |
boolean | 任意 |
true にするとメインエージェントがサブエージェントを自動選択しない(手動のみ)。デフォルト false
|
user-invocable |
boolean | 任意 |
false にするとユーザーがサブエージェントを手動選択不可。デフォルト true
|
mcp-servers |
object | 任意 | エージェントが接続できる MCPサーバを設定 |
target |
string | 任意 |
vscode または github-copilot で環境を限定 |
前述した手順では、name, description, toolsが自動で記載されます。
私としては、以下のように指定してあげると良いのではないかと考えます。
| プロパティ | 説明 |
|---|---|
model |
メインエージェントがclaude-opus-4.6が使用している場合には、claude-sonnet-4.6を指定 |
disable-model-invocation |
false |
user-invocable |
true |
メインのエージェント定義については、こちら側が「何をしたいエージェントなのか」を記述するときにちゃんと詳細を記述していれば、基本的にはCopilotが記載してくれた内容で問題がないかなと思います。
問題があれば、またCopilotと一緒に修正をしていくのが良いと思います。
まとめ
今回はGithub Copilotをベースにして、サブエージェントの仕組みとその作成方法について調査しました。
私はHomebrewを使ってCopilot CLIをインストールしたのですが、CLIのコードを読んで仕組みを理解することも大事だなと感じました。
CodexやClaude Codeについても、npmやらcurlやらでインストールしているので、時間があればそちらも読んでみようかなと思っています。
以上