Responses API returns 500 when combining `tool_search` + `web_search` + deferred function tool named `"web"`

Hi again :waving_hand:

We’ve noticed an issue when using 5.4. The Responses API returns a 500 Internal Server Error when a request includes all three of:

  1. tool_search (client-mode)
  2. web_search (built-in)
  3. A function tool with defer_loading: true named "web"

Renaming the function tool to anything other than "web" (e.g. "web_browsing") resolves the issue (our current workaround!). The collision appears to be between the function tool name "web" and the web_search built-in tool’s internal namespace.

Reproduction Steps

Tested with gpt-5.4 via the OpenAI Ruby gem (ruby-openai v8.3.0). The bug is deterministic.

require "openai"
client = OpenAI::Client.new(access_token: ENV["OPENAI_API_KEY"])

# Client-mode tool_search (required when using defer_loading)
tool_search = {
  type: "tool_search",
  execution: "client",
  description: "Search for and load tools needed for the current task.",
  parameters: {
    type: "object",
    properties: { goal: { type: "string" } },
    required: ["goal"],
    additionalProperties: false
  }
}

web_search = { type: "web_search" }

# A deferred function tool named "web" — this name causes the collision
web_tool = {
  type: "function",
  name: "web",
  description: "Browse the web to find information",
  parameters: {
    type: "object",
    properties: { url: { type: "string" } },
    required: ["url"]
  },
  defer_loading: true
}

regular_tools = %w[get_time save_note send_message].map do |name|
  {
    type: "function",
    name: name,
    description: "Perform #{name.tr('_', ' ')} operation",
    parameters: { type: "object", properties: {} }
  }
end

# This returns 500:
response = client.responses.create(parameters: {
  model: "gpt-5.4",
  input: [{ role: "user", content: "Hello" }],
  tools: regular_tools + [tool_search, web_tool, web_search],
  tool_choice: "auto",
  store: false
})

Isolation Matrix

tool_search Deferred "web" web_search Result
no no yes OK
yes yes no OK
yes yes yes 500 Server Error
yes "web_browsing" yes OK

The 500 requires all three components. Renaming the function tool from "web" to anything else resolves it, confirming a naming collision rather than a general incompatibility.

Expected Behaviour

The API should either:

  1. Accept a function tool named "web" without conflicting with the web_search built-in, or
  2. Return a 400 validation error explaining the naming conflict

A 500 Internal Server Error should not occur for a valid tool configuration.

Environment

  • Model: gpt-5.4 (also reproducible on gpt-5.2)
  • API: Responses API (/v1/responses)
  • Client: ruby-openai gem v8.3.0
  • Date observed: 2026-03-06
  • Reproducible: 100% deterministic
  • Sample failing request ID: req_7c913ace1827465dab2ff47b02e14585

Thanks!

1 Like