Skip to content

fix(codex): dejar de escribir el wire_api que ya no arranca - #24

Merged
borjaperfra merged 1 commit into
mainfrom
fix/codex-wire-api-responses
Sep 16, 2026
Merged

borjaperfra merged 1 commit into
mainfrom
fix/codex-wire-api-responses

Conversation

@borjaperfra

Copy link
Copy Markdown
Contributor

Un miembro reporta que Codex se cierra nada más abrirlo:

Error loading config.toml: wire_api = "chat" is no longer supported.
How to fix: set wire_api = "responses" in your provider config.
in model_providers.nan.wire_api

model_providers.nan lo escribimos nosotros, y ese valor estaba puesto a propósito: el /responses del cluster respondía en un único evento terminal, así que "responses" significaba ver la respuesta entera de golpe al final en vez de ir saliendo. Comprobado contra el cluster antes de tocar nada: el endpoint ya manda deltas. Y Codex 0.154 ha quitado "chat" del todo. El motivo del valor viejo se ha caído por los dos lados.

Qué cambia

  • El writer escribe wire_api = "responses", tanto en el config nuevo como en la sección que añade a uno existente.
  • Repara los configs ya escritos. Esto es lo que hace que el arreglo llegue a alguien. El writer salía antes de tiempo en cuanto veía api.nan.builders en el fichero, así que a un miembro con la sección ya puesta no le servía de nada actualizar el CLI: volvía a pasar por Setup y su Codex seguía sin abrir. Ahora, si la sección es nuestra y dice "chat", se reescribe esa línea y solo esa — ni el wire_api de otro proveedor, ni su key, ni el formato del fichero. Hecho a mano y no con una librería TOML porque un round trip reflowea el documento entero (comentarios, espaciado, comillas del miembro) para cambiar una palabra en una línea.
  • model_context_window va al root. Se añadía al final del fichero, y en TOML una clave suelta después de una tabla pertenece a esa tabla: a quien tuviera entradas [projects.*] le acababa dentro del último proyecto que confió, donde Codex no la lee. Ahora se inserta por encima de la primera cabecera de tabla. (Comprobado de paso: la advertencia Model metadata not found sale igualmente, se imprime antes de leer el override — el comentario que decía que esa clave la silenciaba era falso y queda corregido.)

Verificación

  • Ejecutado Codex de verdad contra el proveedor nan con wire_api = "responses", en un CODEX_HOME aparte: arranca y responde.
  • La reparación, pasada contra una copia de un ~/.codex/config.toml real con la sección ya escrita: el diff es exactamente una línea.
  • Cuatro tests nuevos en config_test.go — que se escribe un protocolo que Codex carga, que una sección vieja se repara sin tocar la del vecino ni la key, que un fichero ya reparado no se reescribe, y que la ventana de contexto cae en el root y no dentro de [projects.*].
  • go build ./..., go vet y go test ./... en verde.

Lo que esto no arregla

El texto sigue llegando de golpe al final. No es el CLI: el SSE de /responses emite response.output_item.added para el item de razonamiento pero no para el de mensaje, ni content_part.added, así que Codex registra ERROR codex_core::util: OutputTextDelta without active item, descarta esos deltas y pinta la respuesta desde output_item.done. Para recuperar el streaming hay que emitir esos dos eventos en el backend antes de los deltas. Va aparte, en el cluster.

🤖 Generated with Claude Code

Codex 0.154 no carga un config.toml con wire_api = "chat": imprime el error
y sale antes de levantar la TUI. Esa linea la escribiamos nosotros, y a
proposito - el /responses del cluster respondia en un unico evento terminal,
asi que "responses" significaba la respuesta entera de golpe al final en vez
de ir saliendo. El endpoint ya manda deltas, y el valor ya no existe, asi que
el motivo se ha caido por los dos lados.

Escribir "responses" no bastaba. El writer salia antes de tiempo en cuanto
veia api.nan.builders en el fichero, de modo que a un miembro con la seccion
ya escrita no le llegaba nunca: actualizaba el CLI, volvia a pasar por Setup
y su Codex seguia sin abrir. Ahora, si la seccion es nuestra y dice "chat",
se reescribe esa linea y solo esa - no el wire_api de otro proveedor, no su
key, no el formato del fichero.

De paso, model_context_window se anadia al final del fichero, y en TOML una
clave suelta despues de una tabla pertenece a esa tabla: a quien tuviera
entradas [projects.*] le acababa dentro del ultimo proyecto que confio, donde
Codex no la lee. Va por encima de la primera cabecera de tabla.

Queda pendiente en el cluster: el SSE de /responses no emite
response.output_item.added ni content_part.added para el item de mensaje, asi
que Codex registra "OutputTextDelta without active item", descarta los deltas
y pinta la respuesta desde output_item.done. Codex funciona; el texto sigue
llegando de golpe hasta que eso se arregle en el backend.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@borjaperfra
borjaperfra merged commit 3073e71 into main Sep 16, 2026
6 checks passed
@borjaperfra
borjaperfra deleted the fix/codex-wire-api-responses branch September 16, 2026 10:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants