amazon-bedrock provider: namespace_tools capability breaks Bedrock Mantle (validation_error)

Resolved 💬 3 comments Opened May 29, 2026 by kingdoooo Closed Jun 5, 2026

Bug

The built-in amazon-bedrock provider sets namespace_tools: true in its capabilities (mod.rs:60). This causes Codex to serialize tools using the {"type": "namespace", ...} wrapper format. However, Bedrock Mantle's Responses API schema validator only accepts "function" and "mcp" tool types, rejecting "namespace" with:

{"error":{"code":"validation_error","message":"Failed to deserialize the JSON body into the target type: ?[13]: Invalid 'tools': unknown variant `namespace`, expected `function` or `mcp` at line 1 column 107773","param":null,"type":"invalid_request_error"}}

This is a separate issue from the URL path bug (#23650 / #21352). Even after fixing the /openai/v1 → /v1 path, users with any meaningful number of tools (MCP servers, built-in shell/apply_patch, etc.) will hit this error because namespace_tools: true wraps all tool definitions in the unsupported format.

Reproduction

  1. Fix the Mantle URL path (per #23650) so requests actually reach the server
  2. Use the amazon-bedrock provider with default config (any registered MCP servers or built-in tools)
  3. Run codex exec "hello" → HTTP 400 validation_error about namespace

With a minimal config (no MCP, features like code_mode/multi_agent_v2 off), the namespace wrapping doesn't fire for the few remaining tools, so it works. But any real-world config triggers it.

Root Cause

// codex-rs/model-provider/src/amazon_bedrock/mod.rs:58-62
fn capabilities(&self) -> ProviderCapabilities {
    ProviderCapabilities {
        namespace_tools: true,   // ← Mantle doesn't support this
        image_generation: false,
        web_search: false,
    }
}

When namespace_tools is true, core/src/tools/spec_plan.rs:876 wraps Function tools into Namespace:

ToolSpec::Function(tool) => ToolSpec::Namespace(ResponsesApiNamespace { ... })

The "namespace" tool type is an OpenAI-proprietary extension that Bedrock Mantle has not implemented.

Suggested Fix

fn capabilities(&self) -> ProviderCapabilities {
    ProviderCapabilities {
        namespace_tools: false,  // Mantle only accepts "function" and "mcp"
        image_generation: false,
        web_search: false,
    }
}

Environment

  • Codex CLI v0.135.0
  • Bedrock Mantle all regions (us-east-1, us-west-2, etc.)
  • AWS Account with openai.gpt-oss-120b model access
  • Tested 2026-05-29

View original on GitHub ↗

3 Comments

kingdoooo · 3 months ago

Workaround (verified on v0.135.0)

Add one line to your config.toml:

[features]
multi_agent_v2 = true

This is the only setting needed for model_provider = "amazon-bedrock" + openai.gpt-oss-120b.

(If using a custom provider pointing at Mantle — i.e. not the built-in amazon-bedrock provider — you also need web_search = "disabled" because custom providers inherit ProviderCapabilities::default() which has web_search: true.)

Why this works

The root cause is the Collab V1 code path. By default:

  • Feature::Collab = true (stable, default_enabled: true)
  • Feature::MultiAgentV2 = false (default_enabled: false, under development)

This combination triggers add_collaboration_tools() → V1 path → create_spawn_agent_tool_v1() which hardcodes ToolSpec::Namespace { name: "multi_agent_v1", ... }.

Setting multi_agent_v2 = true switches to the V2 path, where tool_namespace defaults to None → multi_agent_v2_handler(handler, None) returns the handler directly as ToolSpec::Function — no namespace wrapping.

This is an upgrade, not a workaround

| | V1 path (default) | V2 path (multi_agent_v2 = true) |
|--|---|---|
| Tool format | ToolSpec::Namespace (hardcoded) | ToolSpec::Function |
| Mantle direct | ❌ rejected | ✅ works |
| Via LiteLLM | Silent degradation (sub-tools lost, replaced by empty litellm_unnamed_tool_N) | ✅ tools properly exposed |
| Multi-agent collab | Non-functional on both paths | Fully functional |

With V1, the 5 collab tools (spawn_agent, send_message, wait_agent, list_agents, stop_agent) were never actually usable on Bedrock — either rejected by Mantle or silently dropped by LiteLLM's transform layer. V2 makes them work for the first time.

Impact of multi_agent_v2 = true

No functionality loss. Same collab tools (spawn_agent, send_message, etc.) are exposed as plain {"type":"function"} instead of being wrapped in a namespace group. All coding capabilities (shell, apply_patch, etc.) are completely unaffected.

Version history of namespace_tools for amazon-bedrock

| Version range | namespace_tools | Behavior |
|---|---|---|
| ≤ v0.124 (before PR #19442) | true (default) | namespace sent → Mantle rejects |
| v0.128 ~ v0.134 (PR #19442) | false | namespace filtered out → no error, but collab tools completely unavailable |
| v0.135.0 (PR #24713) | true | namespace sent → Mantle rejects (this issue) |
| v0.135.0 + multi_agent_v2=true | true (unchanged) | V2 path produces Function format → Mantle accepts ✅ |

PR #24713 commit message states "Client-side namespace tools are now supported by bedrock" — this is incorrect. Neither Bedrock Mantle nor Bedrock Runtime accepts "type": "namespace" (both verified via curl 2026-05-29/06-01).

kivocsa99 · 2 months ago
## Workaround (verified on v0.135.0) Add one line to your config.toml: [features] multi_agent_v2 = true This is the only setting needed for model_provider = "amazon-bedrock" + openai.gpt-oss-120b. (If using a custom provider pointing at Mantle — i.e. not the built-in amazon-bedrock provider — you also need web_search = "disabled" because custom providers inherit ProviderCapabilities::default() which has web_search: true.) ### Why this works The root cause is the Collab V1 code path. By default: Feature::Collab = true (stable, default_enabled: true) Feature::MultiAgentV2 = false (default_enabled: false, under development) This combination triggers add_collaboration_tools() → V1 path → create_spawn_agent_tool_v1() which hardcodes ToolSpec::Namespace { name: "multi_agent_v1", ... }. Setting multi_agent_v2 = true switches to the V2 path, where tool_namespace defaults to None → multi_agent_v2_handler(handler, None) returns the handler directly as ToolSpec::Function — no namespace wrapping. ### This is an upgrade, not a workaround V1 path (default) V2 path (multi_agent_v2 = true) Tool format ToolSpec::Namespace (hardcoded) ToolSpec::Function Mantle direct ❌ rejected ✅ works Via LiteLLM Silent degradation (sub-tools lost, replaced by empty litellm_unnamed_tool_N) ✅ tools properly exposed Multi-agent collab Non-functional on both paths Fully functional With V1, the 5 collab tools (spawn_agent, send_message, wait_agent, list_agents, stop_agent) were never actually usable on Bedrock — either rejected by Mantle or silently dropped by LiteLLM's transform layer. V2 makes them work for the first time. ### Impact of multi_agent_v2 = true No functionality loss. Same collab tools (spawn_agent, send_message, etc.) are exposed as plain {"type":"function"} instead of being wrapped in a namespace group. All coding capabilities (shell, apply_patch, etc.) are completely unaffected. ### Version history of namespace_tools for amazon-bedrock Version range namespace_tools Behavior ≤ v0.124 (before PR #19442) true (default) namespace sent → Mantle rejects v0.128 ~ v0.134 (PR #19442) false namespace filtered out → no error, but collab tools completely unavailable v0.135.0 (PR #24713) true namespace sent → Mantle rejects (this issue) v0.135.0 + multi_agent_v2=true true (unchanged) V2 path produces Function format → Mantle accepts ✅ PR #24713 commit message states "Client-side namespace tools are now supported by bedrock" — this is incorrect. Neither Bedrock Mantle nor Bedrock Runtime accepts "type": "namespace" (both verified via curl 2026-05-29/06-01).

can confirm that this didn't work for me .
version 0.136
on gpt-5.5

kingdoooo · 2 months ago

Bedrock openai.gpt-5.5 already support namespace tool type, so i think this issue may close.