gpt-5.6 Responses Lite turns do not expose exec/code-mode tools in codex exec
Summary
codex exec with gpt-5.6-sol can report that shell/code-mode tools are unavailable, while the same prompt works with gpt-5.5.
The issue appears to be the Responses Lite request shape: for use_responses_lite=true models, Codex currently moves client tool schemas into an input[0] item of type additional_tools and omits top-level tools. In the live 5.6 path I tested, those additional_tools are not exposed as callable tools, so the model does not see the public code-mode exec tool.
Environment
- Codex CLI:
codex-cli 0.144.0 - OS: Ubuntu 26.04 x86_64
- Model that works:
gpt-5.5 - Model that fails:
gpt-5.6-sol
Reproduction
This works with gpt-5.5:
codex exec --model gpt-5.5 --json --ephemeral --skip-git-repo-check --sandbox read-only 'please run ls and tell me if it works'
Observed: Codex emits a command execution item and runs /bin/bash -lc ls successfully.
This fails with gpt-5.6-sol:
codex exec --model gpt-5.6-sol --json --ephemeral --skip-git-repo-check --sandbox read-only 'please run ls and tell me if it works'
Observed assistant message:
I can’t run `ls` because no shell execution tool is available in this session.
Request capture
Using a local Responses capture provider, the gpt-5.5 request includes top-level tools:
{
"model": "gpt-5.5",
"tool_names": [
"exec_command",
"write_stdin",
"list_mcp_resources",
"list_mcp_resource_templates",
"read_mcp_resource",
"update_plan",
"request_user_input",
"request_plugin_install",
"apply_patch",
"view_image",
"tool_search",
"web_search"
]
}
The gpt-5.6-sol request has no top-level tools:
{
"model": "gpt-5.6-sol",
"tools": null,
"parallel_tool_calls": false
}
But input[0] contains the code-mode tools as additional_tools:
{
"type": "additional_tools",
"role": "developer",
"tool_names": ["exec", "wait", "request_user_input", "collaboration"]
}
The exec additional tool description includes nested tools.exec_command(...), but the live model does not appear to receive exec as callable.
Expected behavior
gpt-5.6-sol should be able to call the public code-mode exec tool, and from there call nested tools.exec_command(...), so simple shell prompts work as they do with gpt-5.5.
Suspected cause
codex-rs/core/src/client.rs has a Responses Lite branch in build_responses_request that inserts ResponseItem::AdditionalTools { tools, ... } into input, then sends tools: None at the top level.
If the live Responses Lite path does not promote additional_tools into callable tool declarations, then the model is left with no callable code-mode tools.
Candidate fix
Keep the existing additional_tools item for the Responses Lite input contract, but also send the same client-executed tool schemas in top-level tools.
I have a small patch ready that:
- clones the generated tool schemas into
additional_tools - preserves
tools: Some(tools)at the top level for Responses Lite turns - updates HTTP and websocket regression tests to assert both locations match
Related issues
These are related to the same 5.6 custom exec/code-mode tool path, but appear to describe crashes after an exec tool call is emitted rather than the model not seeing exec at all:
- #30861
- #31475
7 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Patch branch is available here:
Attempting to create the PR via
gh pr create/API currently fails for this account with:I dug into this and can confirm the root cause is exactly where you pointed, in
codex-rs/core/src/client.rs::build_responses_request:For
use_responses_litemodels the tool schemas are moved into theadditional_toolsinput item and the top-leveltoolsfield is set toNone. Non-lite turns (e.g.gpt-5.5) keepSome(tools), which matches the request captures in the issue:gpt-5.5sends top-level tools,gpt-5.6-solsends"tools": null. If the live Responses Lite path doesn't promoteadditional_toolsinto callable declarations, the model is left with no callable code-modeexectool — which is the symptom here.Minimal client-side change: clone the schemas into
additional_toolsand preserve them at the top level for lite turns:I also wrote a fail-before/pass-after regression next to
responses_lite_sets_all_turns_context_and_disables_parallel_tool_callsincore/tests/suite/client.rs, asserting a lite turn sends a non-empty top-leveltoolsarray and that it mirrors theadditional_toolsschemas. It fails onmain(top-leveltoolsis absent) and passes with the change.I reproduced this on Windows with Codex CLI 0.144.1.
Environment:
!work correctlygit,gh, the working directory, and GitHub authentication are all functionalA/B test in the same Codex session, directory, and permissions:
gpt-5.6-solmax: reports that no integrated shell tool is exposedgpt-5.6-terraxhigh: reports that no integrated shell tool is exposedgpt-5.5medium: successfully executesgit status --shortwith exit code 0Prompt used:
This suggests that the issue also affects GPT-5.6 Terra, not only Sol, and persists in the current stable CLI 0.144.1.
The manual
!git status --shortpath works, confirming that the local shell and executable environment are healthy; only model-initiated tool execution is unavailable.I can reproduce the same Responses Lite capability boundary for native web search on Windows Codex Desktop with a custom Responses provider.
Environment:
26.707.8168.00.144.0-alpha.4gpt-5.6-solControl cases with the same provider:
gpt-5.5exposed a hostedweb_searchtool and native search worked.gpt-5.6-solused the Responses Lite /additional_toolsshape and exposed no usable native web-search tool to the conversation./v1/responsesendpoint with an explicit hostedweb_searchtool succeeds.That separates basic model/provider support from the Codex client-side tool-routing path.
The
rust-v0.144.0source snapshot is consistent with the behavior: Responses Lite omits hosted Responses tools in the tool plan, while standaloneweb.runis separately gated by provider/auth conditions and calls analpha/searchendpoint rather than ordinary/v1/responses. A custom provider that supports explicit hosted web search over/v1/responsestherefore may still have no route that Codex exposes for a Lite turn.I published a privacy-safe, synthetic evidence bundle with the source links, reproduction matrix, and an optional direct probe here:
https://github.com/F111111shhh/codex-web-search-routing-evidence
It may be useful to treat this as another manifestation of the same Lite tool-declaration boundary. A documented provider capability requirement, a clear diagnostic, or a supported fallback to hosted
web_searchwould prevent the capability from silently disappearing. No credentials, endpoint details, raw logs, or conversation content are included in the repository.Additional controlled A/B evidence from Codex CLI
0.147.0supports this report.Environment held constant across three separately authorized, one-shot runs:
CODEX_HOMEcodex exec --json --ephemeralnever, sandboxdanger-full-access, reasoning efforthighOnly the model changed:
| Evidence |
gpt-5.6-luna|gpt-5.6-sol|gpt-5.5|| --- | --- | --- | --- |
| Process exit | 0 | 0 | 0 |
| Turn completed | yes | yes | yes |
| Schema-valid claimed success | yes | yes | yes |
| Command execution observed | no | no | yes |
| Required file created | no | no | yes |
| Exact file bytes independently verified | no | no | yes |
| Unexpected paths / Git drift | none | none | none |
| Outcome | target missing | target missing | PASS |
For Luna and Sol, the whole-fixture filesystem digest was unchanged and no
command_executionitem was observed, despite a schema-valid success response claiming the operation and verification had completed. GPT-5.5 executed the command and produced exactly the one allowed regular file with the expected bytes under the same deterministic verifier.The Sol run also passed a no-model effective-config and exact prompt-input preflight bound to the final launch digest; GPT-5.5 passed the corresponding exact bundled-model and launch-bundle preflight. Raw JSONL, stderr, final prose, thread IDs, checkout names, network addresses, and credential material were deliberately not retained.
This A/B does not prove the upstream cause, but it makes a prompt, host, authentication, sandbox, or verifier explanation materially less likely. It is consistent with the version-bound catalog/request-shape distinction described here: the 5.6 variants use
tool_mode: "code_mode_only"anduse_responses_lite: true, whereas GPT-5.5 usestool_mode: nullanduse_responses_lite: false.any update on the matter?