Skip to content

[Bug]: DeepSeek V4 Flash Responses continuation still drops reasoning_text on 2.12.0 #1477

Description

@0disoft

Client or integration

Codex Desktop using OpenCodex as the local Responses API proxy.

Summary

On OpenCodex 2.12.0, the official DeepSeek V4 Flash Responses route can still fail after tool calls with:

The `reasoning_text` in the thinking mode must be passed back to the API.

This reproduces even though the built-in deepseek registry entry already sets preserveResponsesReasoningContent: true and the router is expected to merge that registry capability into the effective provider config.

This appears to be a regression or an uncovered reasoning-replay path related to #875 and #1193, rather than a missing user configuration flag.

Reproduction

  1. Start a Codex Desktop turn using deepseek/deepseek-v4-flash with High reasoning.
  2. Give it a coding task that requires several shell/tool calls.
  3. Let the model issue tools and return their results.
  4. Observe the continuation request after the tool results.

The failure occurred twice in the same thread. In both attempts, several shell reads completed successfully and the next model continuation failed with the same upstream error.

Actual result

The turn ends in systemError with an upstream 400 payload:

{
  "error": {
    "message": "The `reasoning_text` in the thinking mode must be passed back to the API.",
    "type": "invalid_request_error",
    "param": null,
    "code": "invalid_request_error"
  }
}

Plain turns and earlier requests can succeed; the failure appears specifically on a tool-call continuation that needs prior reasoning replay.

Expected result

For DeepSeek thinking-mode continuations, OpenCodex should pass the prior plaintext reasoning item back to the upstream Responses API so the tool loop can continue.

Version

OpenCodex 2.12.0, installed through npm.

Operating system

Windows 11.

Provider and route details

  • Provider: official DeepSeek API (https://api.deepseek.com)
  • Provider ID: deepseek
  • Model: deepseek/deepseek-v4-flash
  • Reasoning effort: High
  • Inbound API: Codex Responses API
  • Upstream route: DeepSeek POST /responses

Why this does not look like a local config omission

The 2.12.0 source already contains all of the following:

  • the built-in DeepSeek registry entry sets preserveResponsesReasoningContent: true;
  • router.ts merges that registry value when the saved provider does not explicitly override it;
  • openai-responses.ts preserves raw reasoning content when the effective provider flag is true.

The saved provider does not explicitly set the flag to false. Therefore adding the same value manually would only duplicate the built-in default and should not be required.

Related issues

This reproduction is on the current 2.12.0 release and uses the native DeepSeek Responses route, so it may be a new replay/state edge case or a regression after those fixes.

I can provide sanitized request/debug rows if a narrower capture is needed.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingtoolstool_calls, MCP, web-search / sidecar tools

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions