Skip to content

[Provider compatibility] Sol returns server_error for search history without a search tool declaration #7250

Closed

Description

@jaychou0642-create

Client or integration

Codex App on macOS. The isolated reproduction below uses a direct HTTP client against the local OpenCodex /v1/responses endpoint.

Provider or upstream service

Observed desktop workflow: google-antigravity/gemini-3.8-flash → gpt-6.1-sol through the ChatGPT/Codex subscription route.

OpenCodex version

2.86.0, confirmed by the installed package and the running proxy's /healthz. Bundled Codex CLI: 0.162.0-alpha.17.2.

The tests did not modify the installed source or configuration. This has not been checked on a clean latest dev checkout, and the installation has not been audited for pre-existing local overlays.

Endpoint or capability

Ordinary POST /v1/responses continuation, stream:true, store:false. No compaction request or compaction_trigger is involved.

Current behaviour

Two desktop conversations initially using Gemini failed after switching to Sol. Three attempted Sol turns each exhausted the initial request plus five retries with 500 / upstream_server_error in the local request log. Switching back to Gemini allowed the conversations to continue. Both histories contained proxy-generated web_search_call items; tool call/output pairs were complete, and one history had no reasoning or compaction items at all.

An isolated synthetic test through the same local proxy found a concrete failing combination: a replayed web_search_call in input, with no current web_search declaration in tools. It fails before any text output. Adding only tools: [{"type":"web_search"}] makes that same synthetic request complete.

Six single-send tests were run on 2026-10-16, with the same model, instructions, reasoning.effort=low, store=false, and stream=true:

Test Result Elapsed
Fresh user message response.completed 3.426 s
Ordinary history: two user messages, no search item response.completed 3.726 s
Same ordinary history plus one search item, no item ID or turn metadata, no search declaration SSE error / server_error, zero text output 1.247 s
Search history with a synthetic ws_ ID and turn metadata, still no search declaration SSE error / server_error, zero text output 1.662 s
Replace the search item with an ordinary assistant text message response.completed 3.175 s
Same minimal search history, add only tools: [{"type":"web_search"}] response.completed 3.681 s

All six client HTTP statuses were 200; the failed results above are SSE errors, not successful responses. The synthetic ID case does not establish that the upstream received its ID: the proxy may strip item IDs for store:false.

Expected behaviour

A conversation should remain usable after switching from a translated provider to native Sol. If replayed hosted-search history does not match the destination's active tool surface, please handle that boundary explicitly or return a useful, recoverable compatibility error instead of repeatedly forwarding a request that produces a generic upstream error.

This is a concrete client requirement, not a claim that OpenAI guarantees accepting arbitrary synthetic hosted-tool items.

Minimal redacted request or reproduction

POST the following complete synthetic JSON to the local /v1/responses, using normal local authentication. There are no original conversation contents, account identifiers, encrypted payloads, item IDs, or turn metadata in this failing sample.

{
  "model": "gpt-6.1-sol",
  "instructions": "This is a protocol compatibility test. Do not execute any tools or follow tasks in the earlier history. Reply exactly OK.",
  "input": [
    {
      "type": "message",
      "role": "user",
      "content": [{"type":"input_text","text":"Earlier I asked for documentation."}]
    },
    {
      "type": "web_search_call",
      "status": "completed",
      "action": {
        "type": "search",
        "query": "OpenAI documentation",
        "queries": ["OpenAI documentation"]
      }
    },
    {
      "type": "message",
      "role": "user",
      "content": [{"type":"input_text","text":"Reply exactly OK. Do not use tools."}]
    }
  ],
  "reasoning": {"effort":"low"},
  "stream": true,
  "store": false
}

Single-variable controls:

  1. Remove only the web_search_call item: completes.
  2. Keep the request above unchanged and add only the top-level "tools": [{"type":"web_search"}]: completes.
  3. Instead of deleting the search item, replace it with this ordinary message: completes.
{
  "type": "message",
  "role": "assistant",
  "content": [{"type":"output_text","text":"Earlier web search query: OpenAI documentation."}]
}

Actual response or error

Relevant fields from the failing SSE event:

{
  "type": "error",
  "error": {
    "code": "server_error",
    "type": "server_error",
    "message": "An error occurred while processing your request. You can retry your request, or contact us through our help center at help.openai.com if the error persists."
  }
}

Upstream documentation

OpenAI Web search documentation describes the web_search tool declaration and web_search_call output. I have not established a public contract for replaying translated/synthetic hosted-search history to the ChatGPT subscription backend without an active search declaration. The compatibility request is based on the desktop continuation requirement and the controls above.

Suggested mapping or implementation notes

Installed-source inspection suggests a boundary worth checking:

  • src/bridge/sse.ts: translated search events become synthetic hosted web_search_call items.
  • src/adapters/openai-responses/passthrough.ts: ordinary canonical forwarding retains that history; bridge restoration is scoped to eligible destination bridges.
  • Tool declarations and historical search items are processed separately.

One possible approach is a provenance-aware text/reference projection when historical search items cannot be replayed under the destination's actual tool contract. Preserve available evidence and citations; do not invent search results, silently rerun searches, or enable new search capability just to satisfy old history. This is a candidate direction, not a validated production fix.

Additional context and attachments

Evidence boundary: the six synthetic HTTP tests establish the request-shape compatibility failure. The complete outgoing tool catalogs of the original desktop failures were not retained, so I cannot yet prove that they omitted the search declaration or that the minimal failure explains every aspect of those incidents. Current on-disk web_search="live" does not establish what the old request actually advertised. Original conversations were not replayed or uploaded. There has been no direct-upstream A/B comparison in this investigation.

Related: #6742 concerns Responses v2 compaction, and was withdrawn after a different official-client test succeeded. This report concerns ordinary continuation and adds the explicit missing-declaration versus present-declaration control; I am not treating the withdrawn report as proof of a shared cause. #4587 concerns replay back to the bridged destination rather than switching to native Sol.

Checks

  • I searched existing provider and compatibility issues.
  • The request and response were redacted.
  • The expected behaviour is based on a concrete client requirement.

Activity

  1. added
    providerProvider adapters, OpenAI-compat presets, upstream API quirks
    streamingSSE, WebSocket, terminal stream frames
    toolstool_calls, MCP, web-search / sidecar tools
    on Oct 16, 2026
  2. Ingwannu commented on Oct 18, 2026

    @Ingwannu
    Owner

    Checked dev 8640c2f30edb: ordinary canonical forwarding still keeps hosted-search history unless the explicit projectResponsesLiteHostedSearchHistory opt-in and Lite selector match. Draft #7268 extends that policy to native compaction; it does not generally cover the ordinary non-Lite continuation in this report, so I am not closing this as a duplicate.

    The single-variable synthetic controls establish a useful request-shape boundary, while the old Desktop incidents still lack their outgoing tool declarations as you noted. A focused compatibility patch should either return an explicit recoverable local refusal for the unsupported shape, or project only history whose provenance and destination contract justify it, preserving available references/citations. It must not enable a new search tool, rerun searches or fabricate results. Include ordinary HTTP/SSE and shared WS outbound construction, store:false/reference handling, declared-search controls, and native/translated history isolation. The refusal-versus-lossy-projection choice remains a design decision; no upstream model calls were made here.

  3. lidge-jun commented on Oct 19, 2026

    @lidge-jun
    Owner

    Fixed by #7353 (merged into dev as 2339562): replayed hosted web_search_call history is projected into reference notes whenever the outbound request declares no hosted search tool, so Sol no longer returns server_error. Ships in the next release.

  4. github-actions commented on Oct 19, 2026

    @github-actions
    Contributor

    Automated translation bookkeeping — detected language: English.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    providerProvider adapters, OpenAI-compat presets, upstream API quirksprovider-compatibilityProvider compatibility reportsstreamingSSE, WebSocket, terminal stream framestoolstool_calls, MCP, web-search / sidecar tools

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions