openai / openai/codex

Codex Desktop automation + DeepSeek Responses: standalone automation_update output lacks call_id (HTTP 400)

Open
#41,690 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

app app-server automations bug custom-model windows-os
Dominant language
Rust
Stars
125k
Forks
19.4k
PR merge metrics
PR metrics pending

Description

Codex Desktop automation + DeepSeek Responses: standalone automation_update output lacks call_id (HTTP 400)

Summary

Codex Desktop automations configured with a third-party provider using the DeepSeek Responses API fail immediately on the first model request when the app-server injects a standalone function_call_output for codex_app__automation_update.

The injected item has id, name, namespace, and output, but no call_id. DeepSeek's /responses deserializer rejects the request with:

Failed to deserialize the JSON body into the target type:
input: missing field `call_id` at line 1 column 81274

The same request works with an OpenAI model because the OpenAI Responses endpoint accepts this named standalone output form, but strict third-party implementations may require a call_id.

Environment

  • Windows
  • Codex Desktop app build: 26.825.51511
  • Embedded app-server / command runner: 0.151.0-alpha.7.2
  • Model provider: DeepSeek official Responses API
  • Config:
    • model_provider = "deepseek"
    • base_url = "https://api.deepseek.com/"
    • wire_api = "responses"
    • model = "deepseek-v4-flash-vision-exp"

Evidence

Failures happen in the first turn of a cron automation with the name openviking 去旧上传续跑.

Session rollouts contain:

{
  "type": "function_call_output",
  "id": "fco_01a052c0-99ea-7633-b588-3c2651e9b332",
  "name": "automation_update",
  "namespace": "codex_app",
  "output": "Automation: openviking 去旧上传续跑\nAutomation ID: openviking\n..."
}

No call_id is present.

Failed session IDs:

  • 01a052bf-96a8-7931-b67a-30860fab6506
  • 01a052c0-973a-7781-bd29-f906210589d4
  • 01a052d7-c75e-7440-a514-6c2d7eb67084

task_complete records:

Failed to deserialize the JSON body into the target type:
input: missing field `call_id` at line 1 column 81274

Minimal reproduction

Send a request to https://api.deepseek.com/responses with a function_call_output item that has no call_id:

{
  "model": "deepseek-v4-flash-vision-exp",
  "input": [
    {
      "type": "function_call_output",
      "id": "fco_orphan",
      "name": "automation_update",
      "namespace": "codex_app",
      "output": "test result"
    }
  ]
}

DeepSeek returns:

400
missing field `call_id`

Related issue

This is related to the root-oneOf tool schema problem for codex_app__automation_update, reported in:

  • openai/codex#37786
  • openai/codex#30523

The schema issue can also fail independently on DeepSeek:

Invalid schema for function 'codex_app__automation_update':
schema must be a JSON Schema of 'type: "object"', got 'type: null'.

Expected behavior

  • App-server should either synthesize a call_id for standalone named function_call_output items before sending them to third-party Responses providers, or normalize them into a message item that the provider accepts.
  • Alternatively, expose a provider capability/feature flag so strict Responses providers receive compatible tool output shape.
  • The automation_update tool schema should be emitted with a valid object root for third-party providers.

Workaround verified locally

A local reverse proxy that listens on 127.0.0.1 normalizes the request before forwarding to DeepSeek:

  • converts the standalone output into a developer message when no call_id exists;
  • flattens the root oneOf tool schema;
  • reorders function_call_output immediately after its matching function_call.

After the workaround, a real Codex Desktop automation run completed without an error and produced no repeated uploads.

Note

This report intentionally contains no API key or other credentials.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the request against DeepSeek's /responses endpoint and trace the app-server handling of standalone function_call_output items for automation_update. Done means third-party Responses requests use a provider-compatible output shape with call_id handling and a valid object-root tool schema.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
api, backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.