Agent tool missing 'model' parameter for team agent model selection
Bug Report: Agent tool schema missing model parameter
Summary
The Agent tool does not expose a model parameter in its JSON schema (additionalProperties: false), making it impossible to specify which Claude model (opus, sonnet, haiku) a spawned team agent should use. This prevents proper model selection for team workflows where different roles need different model tiers.
Expected Behavior
The Agent tool should accept a model parameter (e.g., "opus", "sonnet", "haiku") so that team leads can control which model each spawned teammate uses. For example:
- Architects and implementers → opus (complex reasoning)
- Assistants/verifiers → sonnet (verification work)
- Utility/ephemeral agents → haiku (lightweight tasks)
Current Behavior
- The Agent tool schema has
additionalProperties: falseand does not includemodelin its properties - Passing
modelas a parameter is silently stripped by schema validation - PreToolUse hooks that read
.tool_input.modelalways see an empty value - All spawned agents inherit the parent's model with no override mechanism
Impact
- Teams that need mixed-model agents (opus for complex work, sonnet for verification) cannot enforce model selection
- PreToolUse guard hooks cannot validate model requirements because the parameter never reaches them
- No alternative mechanism exists to control teammate model selection
Reproduction
- Create a PreToolUse hook on Agent that reads
.tool_input.model:
``bash``
MODEL=$(echo "$INPUT" | jq -r '.tool_input.model // empty')
echo "Model: '$MODEL'" # Always empty
- Spawn an agent with
modelparameter:
````
Agent(name="test", subagent_type="general-purpose", model="opus", team_name="my-team", prompt="hello")
- The hook receives
MODEL=""because the schema strips the unknown property
Proposed Fix
Add model to the Agent tool's JSON schema:
{
"model": {
"description": "The Claude model to use for this agent (e.g., 'opus', 'sonnet', 'haiku'). If omitted, inherits the parent model.",
"type": "string"
}
}
Comparison
For comparison, here's what 2.1.66 returned:
|Parameter|Type|Required|Description|
|:-|:-|:-|:-|
|subagent\_type|string|Yes|The type of specialized agent to use|
|prompt|string|Yes|The task for the agent to perform|
|description|string|Yes|A short (3-5 word) description of the task|
|name|string|No|Name for the spawned agent|
|team\_name|string|No|Team name for spawning; uses current team context if omitted|
|resume|string|No|Agent ID to resume from a previous execution|
|run\_in\_background|boolean|No|Run agent in background; you'll be notified when it completes|
|mode|enum|No|Permission mode: "acceptEdits", "bypassPermissions", "default", "dontAsk", "plan"|
|model|enum|No|Model override: "sonnet", "opus", "haiku"|
|isolation|enum|No|Set to "worktree" to run in an isolated git worktree|
|max\_turns|integer|No|Max agentic turns before stopping (internal use)|
And here's what 2.1.69 returns:
|Parameter|Type|Required|Description|
|:-|:-|:-|:-|
|description|string|Yes|Short (3-5 word) description of the task|
|prompt|string|Yes|The task for the agent to perform|
|subagent\_type|string|Yes|The type of specialized agent to use|
|name|string|No|Name for the spawned agent|
|mode|string|No|Permission mode: acceptEdits, bypassPermissions, default, dontAsk, plan|
|isolation|string|No|Set to "worktree" to run in an isolated git worktree|
|resume|string|No|Agent ID to resume a previous execution|
|run\_in\_background|boolean|No|Run agent in background (returns output file path)|
|team\_name|string|No|Team name for spawning; uses current team context if omitted|
The \model\ parameter is missing from the schema.
Environment
- Claude Code CLI (agent teams feature enabled)
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1- macOS, March 2026
This issue has 10 comments on GitHub. Read the full discussion on GitHub ↗