CommandCodeAI / CommandCodeAI/command-code

Provider API /v1/responses rejects Codex's tool_search_call / tool_search_output input items with 400 "Invalid input"

Aperta
#893 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Lingua principale
Nessun dato sulla lingua
Stelle
4k
Fork
350
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

Summary

POST /provider/v1/responses returns HTTP 400 {"error":{"message":"Invalid input","type":"invalid_request_error","param":"input"}} for any request whose input array contains a tool_search_call or tool_search_output item.

Codex emits these items natively on the Responses wire (wire_api = "responses"), so every turn in which the model performs a tool search is killed before the model runs, and the task ends as a system error. On deepseek/deepseek-v4.1-flash this makes every MCP / plugin tool unusable: Codex defers MCP tools (js, js_reset, ...) behind a tool search, so the first time the agent reaches for Chrome or Computer Use the conversation history gains a tool_search_call/tool_search_output pair and the next request 400s.

Expected Behavior

The endpoint should accept tool_search_call / tool_search_output input items, or at minimum accept the request and ignore them. They are client-executed history items, the same class as function_call / function_call_output, which the endpoint already accepts today.

Actual Behavior

The whole request is rejected with 400 before any model output. Body is 84 bytes:

{"error":{"message":"Invalid input","type":"invalid_request_error","param":"input"}}
Steps to reproduce the issue

Baseline (200 OK):

curl -sS https://api.commandcode.ai/provider/v1/responses \
  -H "Authorization: Bearer $CMDCODE_KEY" \
  -H 'content-type: application/json' \
  -d '{
    "model": "deepseek/deepseek-v4.1-flash",
    "stream": false,
    "max_output_tokens": 16,
    "input": [{"role":"user","content":[{"type":"input_text","text":"hi"}]}]
  }'

Now append one tool_search_call item to input:

"input": [
  {"role":"user","content":[{"type":"input_text","text":"hi"}]},
  {"type":"tool_search_call","call_id":"call_x1","status":"completed","execution":"client","arguments":{"query":"cua"}}
]

Result: HTTP 400, the 84-byte body above.

Same with tool_search_output:

{"type":"tool_search_output","call_id":"call_x1","status":"completed","execution":"client","tools":[]}

Result: HTTP 400, same body.

Matrix measured against https://api.commandcode.ai/provider/v1/responses with model deepseek/deepseek-v4.1-flash:

input contents result
plain user message 200
+ tool_search_call (full fields) 400
+ tool_search_call, minimal fields (type/call_id/arguments), no tools array on the request 400
+ tool_search_call, arguments as a JSON string instead of an object 400
+ tool_search_output, tools: [] 400
+ tool_search_output, one real function tool in tools 400
+ function_call and function_call_output 200

The trigger is the item type itself, not a missing or extra field.

Real-world impact (Codex Desktop 0.155.0-alpha.9.2, macOS, zsh)

Turn 01a0bcca-9210-7650-bc44-862ddf3a9baf:

  1. The user asks the agent to drive Chrome. The agent's js / js_reset calls start coming back as unsupported call: js (the mcp__cua_repl namespace is missing from the emitted calls).
  2. The model then issues one tool search (arguments: {"query": "cua_repl javascript execution browser control"}) and Codex writes a tool_search_call + tool_search_output pair into the conversation history.
  3. The next request 400s and the turn ends as:
{"type":"task_complete","error":{"message":"{\"error\":{\"message\":\"Invalid input\",\"type\":\"invalid_request_error\",\"param\":\"input\"}}","codex_error_info":"other"}}

A parallel thread on the same provider that never triggered a tool search ran to completion, matching the repro above.

Command Code Version

Provider API (gateway), server-side. Client: Codex Desktop 0.155.0-alpha.9.2, wire_api = "responses", base_url = https://api.commandcode.ai/provider/v1, model deepseek/deepseek-v4.1-flash.

Operating System

macOS

Terminal/IDE

Codex Desktop

Shell

zsh

Session file (optional)

No response

Fix prompt (optional)

POST /provider/v1/responses in the Provider API gateway rejects any request whose input array contains a tool_search_call or tool_search_output item, returning 400 {"error":{"message":"Invalid input","param":"input"}}. The endpoint already accepts function_call / function_call_output items, so extend the same history-item handling to tool_search_call / tool_search_output: parse them as client-executed history items and either carry them through the upstream translation or drop them, instead of failing request validation.

Reproduce: POST a request with a plain user message -> 200; append one tool_search_call item -> 400. Exact bodies are in the issue.

Check: both item types return a normal completion, and a Codex turn that performs a tool search no longer dies with param: "input".

Additional context
  • Related and already closed: #885 (tools.N.type on /v1/responses), #745 (tool_search invocation on /chat/completions), #832 (Responses support). This is a follow-up on the same endpoint: the tools array is accepted now, but the input history items still are not.
  • tool_search_output.tools[] can itself contain {"type":"namespace","name":"mcp__node_repl", ...} entries with nested function tools, so whatever translation is added may need to tolerate nested namespace entries as well.
  • Happy to dogfood a preview build and return full request/response traces.

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia dal punto di ingresso POST /provider/v1/responses e dalla validazione dei relativi elementi della cronologia di input, confrontando la gestione esistente di function_call con tool_search_call e tool_search_output. Esegui le repro con curl presenti nell’issue; il lavoro è completo quando entrambi i tipi di elemento ricevono una completion normale e un turno Codex che li contiene non fallisce più con param: "input".

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Ambito
api, backend
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Attiva
Chiarezza
Specificata chiaramente
Idoneità per principianti
70/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.