Agent tool missing 'model' parameter for team agent model selection

Resolved 💬 10 comments Opened Mar 5, 2026 by marcoabreu Closed Mar 10, 2026

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: false and does not include model in its properties
  • Passing model as a parameter is silently stripped by schema validation
  • PreToolUse hooks that read .tool_input.model always 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

  1. 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
``

  1. Spawn an agent with model parameter:

``
Agent(name="test", subagent_type="general-purpose", model="opus", team_name="my-team", prompt="hello")
``

  1. 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

View original on GitHub ↗

This issue has 10 comments on GitHub. Read the full discussion on GitHub ↗