
OpenCodeで軽量なモデルのサブエージェントを使用する
背景
OpenCode でコードを書いているとき、サブエージェントが orchestrator と同じモデルを使っていることに気づきました。
superpowers でサブエージェント駆動開発に頼りきっているからこそ、この疑問は見過ごせません。
Claude Code や Codex では orchestrator 側でサブエージェントのモデルを指定できるため、これまで意識することもなかったのですが。
OpenCode は様々なプロバイダに対応しているため、モデルを動的に選択しない仕様自体は合理的です。
とはいえ、軽量なタスクに軽量モデルを割り当てれば、コストとレイテンシの両面で有利になるはずです。
これを設定でどう実現するか、試してみました。
やってみた
ビルトインエージェントのモデルを差し替える
OpenCode には general と explore というビルトインのサブエージェントが存在します。
この2つを軽量モデルに差し替えます。
// opencode.jsonc
{
"model": "<provider>/deepseek-v4-pro",
"agent": {
"general": {
"model": "<provider>/deepseek-v4-flash",
},
"explore": {
"model": "<provider>/deepseek-v4-flash",
},
},
}
<provider> は利用するプロバイダの識別子に置き換えてください(opencode.jsonc の model フィールドのプレフィックス部分、たとえば opencode-go などが入ります)。
.opencode/agent/ 配下に同名のエージェント定義ファイルを置くことでも差し替えられます。
ただ、description やプロンプトを変える必要はないため、今回は opencode.jsonc で設定しています。
設定を反映するには OpenCode を再起動してください。
モデルごとのサブエージェントを追加する
さらに、独自のサブエージェントを .opencode/agent/ に追加します。
ファイル名は任意です。ここではモデル名に合わせて deepseek-v4-flash.md、deepseek-v4-pro.md としました。
.opencode/agent/deepseek-v4-flash.md:
---
description: fast, lightweight. Best for simple searches, reading files, codebase exploration, straightforward edits, code review, and other small-scope tasks.
mode: subagent
model: <provider>/deepseek-v4-flash
permission:
edit: allow
bash: ask
---
.opencode/agent/deepseek-v4-pro.md:
---
description: high-precision, heavy reasoning. Best for complex architecture decisions, root-cause analysis, heavy refactoring, debugging, and difficult tasks.
mode: subagent
model: <provider>/deepseek-v4-pro
permission:
edit: allow
bash: ask
---
description に得意なタスクを記述しておくことで、orchestrator がタスクの内容に応じてエージェントを選びやすくなります。
動作確認
設定したエージェント定義がどう使われるか、mitmproxy で OpenCode と Fireworks API の通信を記録して確認しました。
task ツールの description には .opencode/agent/ の定義が注入され、以下の一覧が LLM に送信されます。
Available agent types and the tools they have access to:
- deepseek-v4-flash: fast, lightweight. Best for simple searches, reading files, codebase exploration, straightforward edits, code review, and other small-scope tasks.
- deepseek-v4-pro: high-precision, heavy reasoning. Best for complex architecture decisions, root-cause analysis, heavy refactoring, debugging, and difficult tasks.
- explore: Fast agent specialized for exploring codebases...
- general: General-purpose agent for researching complex questions and executing multi-step tasks...
この一覧をもとに、orchestrator はタスクの内容に応じて subagent_type を選びます。
ブログを書く時のセッションで記録されたサブエージェント呼び出しを集計したところ、次のように振り分けられていました。
サブエージェント選択の内訳:
deepseek-v4-pro: 154 (43%) ← 複雑な執筆・リファクタリング
deepseek-v4-flash: 141 (39%) ← 考察・軽量な編集
general: 58 (16%) ← Hello World などのテストタスク
explore: 2 (<1%)
description に従って、orchestrator がタスクの内容に応じてエージェントを一貫して選び分けていました。
「Write blog limitations」のような考察タスクは flash へ、「Rewrite proxy section」のような構成変更は pro へ回されています。
もちろん LLM の推論に依存する以上、100%意図通りにはなりません。
ただ、少なくとも今回の範囲では、タスクの重さに応じたモデルの使い分けが実用レベルで機能していると言えそうです。
まとめ
ビルトインエージェントの差し替えと、モデル別エージェントの追加。
2つの方法を組み合わせることで、OpenCode のサブエージェントに軽量モデルを割り当てられます。
実際に2日間使ってみたところ、タスクの内容に応じて flash と pro がおよそ半々で選択されていました。
LLM の推論に依存する以上、必ず意図通りになるわけではありません。
とはいえ、今回の範囲では description ベースの振り分けが実用レベルで機能しています。
設定ファイルを数行書くだけで、高性能モデルを無駄遣いする感覚からは解放されました。
あとは「コードレビュー担当」「テスト担当」のようなロールベースのエージェントを試して、さらに粒度を詰めていきたいところです。






