Regression: Responses Lite makes deferred MultiAgentV1 tools unreachable because tool_search is hidden in AdditionalTools
What version of Codex CLI is running?
v0.144.0
This is visible from the planner and Responses request serialization code path rather than from a local environment-specific crash.
What subscription do you have?
Not subscription-specific. Pro 20x.
Which model were you using?
Any model/runtime configuration with all of:
use_responses_lite = truesupports_search_tool = truemulti_agent_version = None[features] multi_agent = true[features] multi_agent_v2 = false
The current known practical case is GPT-5.6-style Responses Lite metadata where multi_agent_version = null in a custom models.json lets feature flags select V1.
What platform is your computer?
Not platform-specific.
What terminal emulator and version are you using (if applicable)?
Not terminal-specific.
Codex doctor report
Not applicable. This is a request-framing / tool-surface bug.
What issue are you seeing?
Responses Lite can make the V1 multi-agent tools unreachable when tool_search is enabled.
The configuration below correctly resolves to MultiAgentVersion::V1:
use_responses_lite = true
supports_search_tool = true
multi_agent_version = None
features.multi_agent = true
features.multi_agent_v2 = false
The planner then correctly defers the V1 collaboration tools because tool search is available:
spawn_agentsend_inputresume_agentwait_agentclose_agent
However, the serialized Responses Lite request currently moves the entire tool list into a developer input item of type additional_tools and omits top-level tools. That means the special hosted/client-executed tool_search entrypoint is also hidden inside additional_tools instead of being sent as a top-level Responses tool.
In the live Responses Lite path, that leaves the model with neither:
- directly visible V1 tools, nor
- a usable top-level
tool_searchtool to discover them.
So V1 agent tools are deferred but unreachable.
This is distinct from the workaround of setting supports_search_tool = false, which exposes the V1 tools directly. That workaround avoids the unreachable state, but it disables deferred tool discovery globally for the model and is not the right fix.
What steps can reproduce the bug?
- Use model metadata / config that resolves to:
``text``
use_responses_lite = true
supports_search_tool = true
multi_agent_version = None
features.multi_agent = true
features.multi_agent_v2 = false
- Start a Codex turn with V1 multi-agent selected by feature fallback.
- Inspect the final serialized Responses request, not just the planner registry.
- Observe that:
- the request uses Responses Lite framing,
- top-level
toolsis absent, - a developer
additional_toolsinput item is present, - V1 agent tools are not directly exposed because they were deferred,
tool_searchis not available as a usable top-level tool.
- Ask for a subagent/delegation action requiring
spawn_agent. - The model has no reachable way to discover or call the V1 agent tools.
What is the expected behavior?
Responses Lite should still expose a usable tool_search entrypoint when deferred tool discovery is enabled.
For the V1 multi-agent case:
- The first Responses Lite request should keep ordinary Lite tools in the developer
additional_toolsitem. - The same request should expose hosted/client-executed
tool_searchas a top-level Responses tool, withtype = "tool_search"andexecution = "client". - V1 multi-agent tools should remain deferred and should not be directly exposed in either top-level
toolsoradditional_tools. - A
tool_searchcall forspawn agentshould return themulti_agent_v1namespace containingspawn_agent. - A subsequent model call to
multi_agent_v1.spawn_agentshould route to the registered V1 handler. - Responses Lite should continue to set
parallel_tool_calls = false.
Additional information
Relevant source areas:
- V1 tools become deferred when search is available:
codex-rs/core/src/tools/spec_plan.rstool_searchis appended when deferred runtimes have search metadata:codex-rs/core/src/tools/spec_plan.rs- Responses Lite request framing moves tools into
AdditionalToolsand omits top-leveltools: codex-rs/core/src/client.rs- Multi-agent version fallback from model metadata to feature flags:
codex-rs/core/src/session/mod.rs
Related but not identical issue:
- #31894 reports code-mode/exec tools not being exposed under Responses Lite. This issue is narrower:
tool_searchitself is the hosted/client-executed discovery entrypoint for deferred V1 collaboration tools, so hiding it insideadditional_toolsmakes the deferred V1 tools unreachable.
Short implementation plan based on local verification:
- In
ModelClient::build_responses_request, split Lite tool specs before JSON serialization byToolSpecvariant, not by serialized JSON strings. - For Responses Lite:
- keep non-
ToolSearchspecs in the developerResponseItem::AdditionalToolsitem, - keep
ToolSpec::ToolSearch { .. }in top-leveltools, - omit top-level
toolsonly when there is noToolSearchspec, - leave non-Lite behavior unchanged.
- Preserve
parallel_tool_calls: prompt.parallel_tool_calls && !model_info.use_responses_lite. - (test coverage) Add a combined integration regression under the Responses Lite suite that:
- configures
use_responses_lite = true,supports_search_tool = true, modelmulti_agent_version = None, V1 selected by feature fallback, - uses the remote-aware integration builder (
build_with_auto_env), - asserts the first request omits top-level
instructions, hasparallel_tool_calls = false, and has exactly one top-level hosted tool:type = "tool_search",execution = "client", - asserts V1 agent tools do not leak directly in top-level
toolsoradditional_tools, including post-search parent requests, - simulates a
tool_search_callforspawn agent, - asserts the next request contains a completed client
tool_search_outputwithmulti_agent_v1.spawn_agent, - simulates calling
multi_agent_v1.spawn_agent, - asserts the child prompt is routed to the child turn and the parent follow-up contains a
function_call_outputwith anagent_id.
This should allow GPT-5.6-style Responses Lite models to keep supports_search_tool = true without making every deferred V1 collaboration tool direct.
Reference implementation
A tested reference patch is available in a durable fork snapshot:
It implements the split Responses Lite serialization described above and covers deferred V1 tool discovery, spawn_agent routing, child request delivery, and the parent function_call_output.
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗