Skip to content

Codex Desktop: automation_update schema (root oneOf, type null) 400s on strict providers like DeepSeek (Responses API) #37786

Open

Description

@xjimlinx

Summary

automation_update is emitted with a root-level oneOf JSON Schema and no top-level "type": "object" (type ends up null). OpenAI's own Responses endpoint tolerates this schema, but strict OpenAI-compatible providers that validate function schemas server-side reject every request that carries the codex_app tool namespace with a 400:

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

This is the same failure class as #30132 (Azure), which was closed as completed — but it still reproduces on the DeepSeek official integration (Responses API, wire_api = "responses", deepseek-v4-flash) on app version 26.803.41515 (current upstream ChatGPT.dmg).

Repro

  1. Configure DeepSeek per the official guide (model_provider = "deepseek", base_url = "https://api.deepseek.com/", wire_api = "responses", model = "deepseek-v4-flash", plus the custom models.json catalog).
  2. Start any thread in the ChatGPT/Codex desktop app.
  3. Requests that include codex_app__automation_update (it is always eager-loaded — deferLoading is explicitly removed for it) fail with the 400 above.

DeepSeek's strict JSON Schema validation documents supported keywords (enum, anyOf, ...) but rejects oneOf at the root; a schema whose top-level type is null is also rejected. The same schema works with OpenAI models because the OpenAI backend does not enforce this.

Suggested fix

Normalize automation_update's emitted schema so it is a valid object schema for strict validators:

  • emit a top-level "type": "object" (currently null), and/or
  • flatten the root oneOf variants into a merged properties/required object when building the tool payload for non-OpenAI providers.

A runtime normalization (merge oneOf variants' properties, set type: "object") is sufficient and has been validated locally against DeepSeek.

Related

Activity

  1. added
    bugSomething isn't working
    appIssues related to the Codex desktop app
    app-serverIssues involving app server protocol or interfaces
    custom-modelIssues related to custom model providers (including local models)
    on Aug 10, 2026
  2. github-actions commented on Aug 10, 2026

    @github-actions
    Contributor

    Potential duplicates detected. Please review them and close your issue if it is a duplicate.

    Powered by Codex Action

  3. wenlinl commented on Sep 15, 2026

    @wenlinl

    Additional root cause found on the current build (Desktop 26.818.61809 / CLI 0.149.0-alpha.4.3), DeepSeek Responses provider: automation_update is no longer eager-loaded here — it is deferred (deferLoading: true) and is not part of the initial tool manifest.

    The failure is now triggered by the built-in tool_search tool. When a search matches a deferred app/MCP tool, the next request carries that tool with an empty schema (parameters: {}), and the whole request is rejected with the same 400. After that the thread stays broken — every later turn fails before the model can answer (verified over ~6 consecutive turns in two threads).

    Minimal repro and payload matrix (namespace tool with parameters: {} = exact error, parameters: null or a real schema = accepted): #45585

  4. wenlinl commented on Sep 15, 2026

    @wenlinl

    Confirming the suggested fix from the other direction: adding a root "type": "object" while leaving oneOf/$defs untouched is sufficient. DeepSeek only validates the root type — nested oneOf, $ref and $defs are accepted as-is.

    Verified against api.deepseek.com/responses with deepseek-v4-flash (Desktop 26.818.61809 / CLI 0.149.0-alpha.4.3):

    • real automation_update schema as-is → 400 got 'type: null'
    • identical schema + root "type": "object" → 200

    Same behaviour when the tool is reached through the deferred tool_search path (details in #45585). So a one-line normalization on the client side is enough; no need to flatten the oneOf variants.

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

    appIssues related to the Codex desktop appapp-serverIssues involving app server protocol or interfacesautomationsbugSomething isn't workingcustom-modelIssues related to custom model providers (including local models)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions