In February a post here said Claude Code's built-in Explore subagent is hard-coded to Haiku. I measured something different last week: on 2.1.318, an Opus session's Explore calls all ran on Opus.
Both were right. I ran 205 headless sessions across 26 Claude Code versions to find out when it changed.
- Up to 2.1.197: Explore ran on Haiku in every run.
- From 2.1.198: Explore runs on whatever model your main session uses.
- Cost on Opus: a delegated code search went from $0.18 to $0.37 per run (+105%).
-
The fix:
CLAUDE_CODE_SUBAGENT_MODEL=haikuplusCLAUDE_CODE_SUBAGENT_MODEL_FORCE=1. Explore went back to Haiku in 36 of 36 runs, cost dropped 60%, and it found the same answers.
The setup
Each run asks Claude Code a "find every place" question in an open-source repo (undici, fastify, cachetools, Python-Markdown, anyio, zod) and tells it to use the Explore subagent. Headless claude -p, read-only tools, stream-json logs. The subagent's model comes from its own messages and the per-model cost split in the log.
- Version history: 18 versions from 2.1.0 to 2.1.318, then a bisection over the npm releases in between. Main model fixed to Opus 4.5, because the API refuses Opus 5.5 below 2.1.280.
- Settings test: 2.1.318 with Opus 5.5 on 12 questions × 3 runs, under three settings.
Pre-registered on GitHub before the runs, with two dated amendments (one is my own bisection bug, explained below).
The settings
| Setting | Explore ran on | Found | Cost/run |
|---|---|---|---|
| Default | Opus 5.5 | 100% | $0.38 |
CLAUDE_CODE_SUBAGENT_MODEL=claude-haiku-5-5 |
Opus 5.5 | 99% | $0.37 |
CLAUDE_CODE_SUBAGENT_MODEL=haiku + CLAUDE_CODE_SUBAGENT_MODEL_FORCE=1
|
Haiku 5.5 | 100% | $0.15 |
Setting the subagent model alone did nothing for Explore. That matches the sub-agents docs: CLAUDE_CODE_SUBAGENT_MODEL is only a default, and the FORCE flag (2.1.257+) is what applies it to every subagent. The docs also mention a project subagent named Explore with model: haiku. I didn't test that route.
To use it, put both in your shell or in settings.json:
{ "env": { "CLAUDE_CODE_SUBAGENT_MODEL": "haiku", "CLAUDE_CODE_SUBAGENT_MODEL_FORCE": "1" } }
Note that FORCE applies to every subagent, not only Explore.
A mistake I made on the way
My first bisection said the switch was at 2.1.176. The script checked for Haiku with a regex that could never match the log format, so every probe looked like "not Haiku". When I read the raw logs, 2.1.176 through 2.1.186 were all Haiku. I fixed the check, re-ran the bisection and logged it as an amendment. The wrong-step probes are in the data too.
Limits
Two questions per version in the history, so it shows which model ran, not how good it was. One machine, one account, one prompt. Defaults can change again.
Data
All 205 runs (model, cost split, recall, every answer) are public under CC BY 4.0:
- Data page: https://tokensave.app/data/claude-subagent-model-by-version
- GitHub (pre-registration, scripts): https://github.com/johnisking/token-cost-by-language/tree/main/claude-subagent-model-by-version
Previous round: telling Claude Code to use subagents found nothing more and cost up to 221% more.

Top comments (0)