From ef41c4644d2fb98caaaaa8236b2ac2bdcbb28032 Mon Sep 17 00:00:00 2001 From: borjaperfra Date: Sat, 19 Sep 2026 16:14:50 +0200 Subject: [PATCH 1/2] =?UTF-8?q?fix(docs):=20la=20p=C3=A1gina=20de=20Codex?= =?UTF-8?q?=20mandaba=20poner=20lo=20=C3=BAnico=20que=20ya=20no=20arranca?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decía wire_api = "chat" y además recomendaba activamente no usar "responses", porque cuando se escribió /responses contestaba de una sola vez. Las dos razones se han caído: el endpoint ya emite la respuesta por partes, y Codex 0.154 retiró "chat" del todo. Hoy quien siga esta página a mano acaba con un fichero que no carga y un Codex que no abre. Entra también model_context_window en el ejemplo, que es lo que escribe la CLI y lo que evita que Codex compacte contra una ventana inventada. La sección de cambiar de modelo hablaba de "dejar varios proveedores declarados y elegir con --profile", que no es lo que hace un perfil. Ahora cuenta lo que son en la 0.155 - un fichero que se superpone al config - y avisa del punto: Codex pide "a plain name" y rechaza qwen3.6 como nombre de perfil aunque lo acepte como modelo. Y los problemas conocidos recogen los tres síntomas con los que aparecen de verdad: el "chat" en un fichero viejo, la model_context_window duplicada que dejaban las versiones anteriores a la 0.1.20 de la CLI, y el 401 "does not have access to the requested model" que sale cuando el proveedor ya apunta al clúster pero el model sigue siendo uno de OpenAI. Co-Authored-By: Claude Opus 5 (1M context) --- src/content/docs-es/codex.mdx | 31 ++++++++++++++++++++++++++----- src/content/docs/codex.mdx | 31 ++++++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/content/docs-es/codex.mdx b/src/content/docs-es/codex.mdx index f810cd3..39ab9b7 100644 --- a/src/content/docs-es/codex.mdx +++ b/src/content/docs-es/codex.mdx @@ -32,17 +32,19 @@ Edita `~/.codex/config.toml`: ```toml model_provider = "nan" model = "glm5.3-flash" +model_context_window = 1048576 [model_providers.nan] name = "NaN" base_url = "https://api.nan.builders/v1" env_key = "NAN_API_KEY" -wire_api = "chat" +wire_api = "responses" ``` -Tres detalles que importan: +Cuatro detalles que importan: -- **`wire_api = "chat"`** hace que Codex use `/chat/completions`. Es lo que quieres: el endpoint `/responses` del clúster contesta de una sola vez en lugar de ir emitiendo la respuesta, así que con `"responses"` verías la respuesta aparecer de golpe al final. +- **`wire_api = "responses"`** es el único valor que Codex sigue aceptando: desde la 0.154 `"chat"` no es que vaya peor, es que el fichero no carga y Codex no abre. Esta página recomendaba `"chat"` cuando `/responses` contestaba de una sola vez; ahora ese endpoint emite la respuesta por partes y la razón ya no existe. +- **`model_context_window`** hace falta porque Codex no tiene metadatos de los modelos del clúster: sin él supone una ventana y compacta la conversación mucho antes de tiempo. Pon la del modelo que uses; están en [Modelos](/docs/models). - **El identificador del proveedor no puede ser `openai`, `ollama` ni `lmstudio`**, que están reservados. Por eso se llama `nan`. - **`base_url` termina en `/v1`** y nada más. No añadas la ruta del endpoint. @@ -64,7 +66,24 @@ Puedes cambiarlo sin tocar el fichero: codex --model deepseek-v4-flash ``` -O dejar varios proveedores declarados y elegir con `--profile` si prefieres perfiles separados por tarea. +Con una pega: la `model_context_window` del fichero no cambia con el modelo, así que un modelo de 262.144 se queda con la ventana del que tengas declarado y Codex compacta cuando no toca. + +Para tener los modelos del clúster a mano, cada uno con su ventana, escribe un fichero por modelo en `~/.codex/`. Codex 0.155 lo llama perfil, y es tu `config.toml` con ese fichero encima: + +```toml +# ~/.codex/nan-qwen36.config.toml +model = "qwen3.6" +model_provider = "nan" +model_context_window = 262144 +``` + +```bash +codex --profile nan-qwen36 +``` + +Ojo con el nombre: Codex quiere "un nombre simple" y **rechaza los puntos**, así que `qwen3.6` no vale como perfil aunque sí como modelo. + +El resto del `config.toml` (tu proveedor, tus MCP, tus permisos) sigue aplicando; el perfil solo pisa lo que nombra. La [CLI de NaN](/docs/nan-cli) los escribe por ti, uno por cada modelo de chat del clúster, con el prefijo `nan-` y sin los puntos: `nan-glm53-flash`, `nan-deepseek-v4-flash`, `nan-qwen36`… Al desconectar Codex se los lleva. ## Modelo recomendado @@ -74,7 +93,9 @@ O dejar varios proveedores declarados y elegir con `--profile` si prefieres perf - **Las funciones en la nube de Codex no aplican.** Al declarar un proveedor propio, todo va contra NaN desde tu máquina. - **El razonamiento se ve distinto según el modelo.** Los modelos del clúster emiten su traza de razonamiento a su manera, y Codex no siempre la presenta como con los modelos de OpenAI. -- **Si cambias `wire_api` a `"responses"`**, la respuesta deja de aparecer poco a poco. No es un cuelgue: es que ese endpoint todavía no emite la respuesta por partes. +- **`wire_api = "chat"` en un fichero antiguo.** Codex 0.154 lo retiró: si lo tienes, ni la CLI ni la app de escritorio abren. Cámbialo a `"responses"`, o pasa por el Setup de la CLI de NaN, que lo corrige solo. +- **`model_context_window` repetida.** Las versiones de la CLI de NaN anteriores a la 0.1.20 la añadían al final del fichero una vez por cada pasada del setup. Dos son una clave duplicada y Codex no carga el fichero: la CLI dice `duplicate key` y la app abre un diálogo de error y nada más. La 0.1.20 deja una sola y la pone donde se lee. +- **`401 This API key does not have access to the requested model`.** El `model_provider` apunta al clúster pero el `model` sigue siendo uno de OpenAI. Cambia también el modelo. diff --git a/src/content/docs/codex.mdx b/src/content/docs/codex.mdx index afd379b..4bf67a5 100644 --- a/src/content/docs/codex.mdx +++ b/src/content/docs/codex.mdx @@ -32,17 +32,19 @@ Edit `~/.codex/config.toml`: ```toml model_provider = "nan" model = "glm5.3-flash" +model_context_window = 1048576 [model_providers.nan] name = "NaN" base_url = "https://api.nan.builders/v1" env_key = "NAN_API_KEY" -wire_api = "chat" +wire_api = "responses" ``` -Three details that matter: +Four details that matter: -- **`wire_api = "chat"`** makes Codex use `/chat/completions`. That is what you want: the cluster's `/responses` endpoint answers in one go instead of streaming, so with `"responses"` you would see the answer appear all at once at the end. +- **`wire_api = "responses"`** is the only value Codex still takes: since 0.154 `"chat"` does not degrade anything, it stops the file loading and Codex does not open. This page recommended `"chat"` back when `/responses` answered in one go; that endpoint streams now and the reason is gone. +- **`model_context_window`** is needed because Codex has no metadata for the cluster's models: without it it assumes a window and compacts the conversation long before it has to. Use the one for the model you run; they are in [Models](/docs/models). - **The provider identifier cannot be `openai`, `ollama` or `lmstudio`**, which are reserved. That is why it is called `nan`. - **`base_url` ends at `/v1`** and nothing more. Do not add the endpoint path. @@ -64,7 +66,24 @@ You can change it without touching the file: codex --model deepseek-v4-flash ``` -Or leave several providers declared and pick with `--profile` if you prefer separate profiles per task. +With one catch: the `model_context_window` in the file does not follow the model, so a 262,144-token model keeps the window of whichever one you declared and Codex compacts when it should not. + +To keep the cluster's models at hand, each with its own window, write one file per model in `~/.codex/`. Codex 0.155 calls it a profile, and it is your `config.toml` with that file layered on top: + +```toml +# ~/.codex/nan-qwen36.config.toml +model = "qwen3.6" +model_provider = "nan" +model_context_window = 262144 +``` + +```bash +codex --profile nan-qwen36 +``` + +Mind the name: Codex wants "a plain name" and **rejects dots**, so `qwen3.6` is not usable as a profile even though it is fine as a model. + +The rest of your `config.toml` - your provider, your MCP servers, your permissions - still applies; the profile only overrides what it names. The [NaN CLI](/docs/nan-cli) writes them for you, one per chat model on the cluster, prefixed `nan-` and with the dots dropped: `nan-glm53-flash`, `nan-deepseek-v4-flash`, `nan-qwen36`… Disconnecting Codex takes them away again. ## Recommended model @@ -74,6 +93,8 @@ Or leave several providers declared and pick with `--profile` if you prefer sepa - **Codex's cloud features do not apply.** Once you declare a provider of your own, everything goes to NaN from your machine. - **Reasoning looks different depending on the model.** The cluster's models emit their reasoning trace their own way, and Codex does not always present it the way it does with OpenAI's models. -- **If you change `wire_api` to `"responses"`**, the answer stops appearing gradually. It is not a hang: that endpoint does not stream yet. +- **`wire_api = "chat"` in an older file.** Codex 0.154 dropped it: if you have it, neither the CLI nor the desktop app opens. Change it to `"responses"`, or go through the NaN CLI's Setup, which repairs it for you. +- **A repeated `model_context_window`.** NaN CLI versions before 0.1.20 appended one at the end of the file on every setup run. Two of them is a duplicate key and Codex will not load the file: the CLI says `duplicate key` and the desktop app opens an error dialog and nothing else. 0.1.20 leaves one and puts it where it is read from. +- **`401 This API key does not have access to the requested model`.** The `model_provider` points at the cluster but `model` is still an OpenAI one. Change the model too. From 6e01938bf9dde57657ee359de5a98f6679a90ce3 Mon Sep 17 00:00:00 2001 From: borjaperfra Date: Sat, 19 Sep 2026 16:31:05 +0200 Subject: [PATCH 2/2] =?UTF-8?q?docs(codex):=20el=20error=20del=20cat=C3=A1?= =?UTF-8?q?logo=20de=20modelos=20es=20ruido,=20y=20por=20qu=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Codex 0.155 pregunta al proveedor por sus modelos al arrancar y falla contra el clúster con "missing field `models`". No es nuestro: /v1/models contesta en el formato de la API de OpenAI y Codex lo lee como si fuera su catálogo interno. Le pasa lo mismo con LM Studio, OpenRouter y los proveedores de Azure (openai/codex#22205), y features.remote_models=false no lo calla, comprobado en la 0.155. La sesión funciona igual, así que lo que hacía falta era decir que se puede ignorar. Lo que sí explica es por qué los modelos del clúster no aparecen en el selector de Codex, que es de donde salen los perfiles. Co-Authored-By: Claude Opus 5 (1M context) --- src/content/docs-es/codex.mdx | 1 + src/content/docs/codex.mdx | 1 + 2 files changed, 2 insertions(+) diff --git a/src/content/docs-es/codex.mdx b/src/content/docs-es/codex.mdx index 39ab9b7..8c476ae 100644 --- a/src/content/docs-es/codex.mdx +++ b/src/content/docs-es/codex.mdx @@ -96,6 +96,7 @@ El resto del `config.toml` (tu proveedor, tus MCP, tus permisos) sigue aplicando - **`wire_api = "chat"` en un fichero antiguo.** Codex 0.154 lo retiró: si lo tienes, ni la CLI ni la app de escritorio abren. Cámbialo a `"responses"`, o pasa por el Setup de la CLI de NaN, que lo corrige solo. - **`model_context_window` repetida.** Las versiones de la CLI de NaN anteriores a la 0.1.20 la añadían al final del fichero una vez por cada pasada del setup. Dos son una clave duplicada y Codex no carga el fichero: la CLI dice `duplicate key` y la app abre un diálogo de error y nada más. La 0.1.20 deja una sola y la pone donde se lee. - **`401 This API key does not have access to the requested model`.** El `model_provider` apunta al clúster pero el `model` sigue siendo uno de OpenAI. Cambia también el modelo. +- **`failed to refresh available models: missing field `models``** al arrancar. Es ruido y puedes ignorarlo: la sesión sigue y responde igual. El clúster contesta a `/v1/models` en el formato de la API de OpenAI (`{"object":"list","data":[…]}`) y Codex lo lee como si fuera su catálogo interno. Le pasa igual con LM Studio, OpenRouter y los proveedores de Azure ([openai/codex#22205](https://github.com/openai/codex/issues/22205)), y en la 0.155 `features.remote_models=false` tampoco lo calla. Como efecto, los modelos del clúster no salen en el selector de Codex: para eso están los perfiles de arriba. diff --git a/src/content/docs/codex.mdx b/src/content/docs/codex.mdx index 4bf67a5..b3b4a3f 100644 --- a/src/content/docs/codex.mdx +++ b/src/content/docs/codex.mdx @@ -96,5 +96,6 @@ The rest of your `config.toml` - your provider, your MCP servers, your permissio - **`wire_api = "chat"` in an older file.** Codex 0.154 dropped it: if you have it, neither the CLI nor the desktop app opens. Change it to `"responses"`, or go through the NaN CLI's Setup, which repairs it for you. - **A repeated `model_context_window`.** NaN CLI versions before 0.1.20 appended one at the end of the file on every setup run. Two of them is a duplicate key and Codex will not load the file: the CLI says `duplicate key` and the desktop app opens an error dialog and nothing else. 0.1.20 leaves one and puts it where it is read from. - **`401 This API key does not have access to the requested model`.** The `model_provider` points at the cluster but `model` is still an OpenAI one. Change the model too. +- **`failed to refresh available models: missing field `models``** on startup. It is noise and you can ignore it: the session carries on and answers fine. The cluster answers `/v1/models` in the OpenAI API's own format (`{"object":"list","data":[…]}`) and Codex reads it as if it were its internal catalogue. It does the same against LM Studio, OpenRouter and Azure providers ([openai/codex#22205](https://github.com/openai/codex/issues/22205)), and on 0.155 `features.remote_models=false` does not silence it either. The side effect is that the cluster's models do not show up in Codex's model picker - that is what the profiles above are for.