Un repositorio con un único archivo y nueve líneas de Express acabó consumiendo 7.0 millones de tokens de entrada. Tras ocho minutos y medio, Codex Security CLI se detuvo al alcanzar un tope de $6.00, después de generar un modelo de amenazas de 1,605 palabras y sin encontrar nada. La conclusión para quien esté pensando en llevarlo a CI es clara: el coste no depende del número de líneas, sino de cuánto se prolongue el ciclo de razonamiento del agente. Configura --max-cost antes que cualquier otra opción.
Aun así, merece la pena entender esta herramienta. Es la primera versión de Codex Security que puedes ejecutar sin dar acceso a tu repositorio a una GitHub App.
Qué aporta la CLI y qué no debes esperar de ella
Codex Security no nació con esta CLI. OpenAI lo lanzó en vista previa de investigación en marzo de 2026 como servicio alojado: conectas un repositorio de GitHub, el servicio crea un modelo de amenazas, revisa el historial de commits en un entorno aislado y publica los hallazgos en un espacio de trabajo de ChatGPT. SecurityWeek informó de su disponibilidad para clientes de ChatGPT Pro, Enterprise, Business y Edu.
Lo que llegó el 28 de julio de 2026 es otra pieza distinta. openai/codex-security es una CLI y un SDK de TypeScript bajo Apache-2.0, publicado en npm como versión 0.1.0 a las 17:09 UTC; la 0.1.1 llegó ese mismo día a las 23:48 UTC. En el momento de escribir esto, el proyecto muestra 1.8k estrellas y 28 incidencias abiertas. Es un proyecto recién estrenado.
La instalación requiere Node.js 22 o superior y Python 3.10 o superior, ya que el motor de análisis se distribuye como un plugin de Python incluido:
npm install @openai/codex-security
npx codex-security info
El comando info permite comprobar rápidamente qué se ha instalado:
sdkVersion: 0.1.1
bundledPluginVersion: 0.1.14
cliVersion: 0.1.1
codexVersion: 0.144.6
model: gpt-5.6-sol
reasoningEffort: xhigh
Las dos últimas líneas explican el coste. En esta instalación, los análisis usan por defecto GPT-5.6 Sol con esfuerzo de razonamiento xhigh. Puedes cambiar el modelo con --model, pero el plugin está diseñado alrededor de un ciclo agéntico profundo, y ese ciclo es lo que acabas pagando.
La superficie de comandos es más amplia de lo que sugiere el producto alojado: scan, validate, patch, scans para listar, mostrar, repetir, comparar y buscar coincidencias, bulk-scan, export a CSV, JSON o SARIF, install-hook y un modo mcp que registra la herramienta como servidor MCP. Conviene tener en cuenta que info también muestra scanMcp: false: los análisis no se pueden cancelar a través del transporte MCP.
Dos formas de autenticarse, y una barrera adicional
npx codex-security login inicia sesión con una cuenta de ChatGPT; --device-auth sirve para máquinas sin interfaz, y OPENAI_API_KEY cubre los casos de CI. Si existen tanto una clave como una sesión iniciada, los análisis interactivos preguntan cuál usar; en ejecuciones no interactivas, tiene prioridad la API key.
Hay una advertencia de la documentación oficial que conviene leer dos veces: los análisis de repositorios completos pueden requerir además Trusted Access for Cyber. Ni iniciar sesión ni definir una API key lo conceden. Hay que prever una solicitud de acceso, no solo un login.
Ejecutar OpenAI Codex Security CLI contra un endpoint compatible
El primer error habitual es definir OPENAI_API_KEY con una clave de un proveedor externo y esperar que el tráfico se enrute allí:
codex-security: Authentication failed using OPENAI_API_KEY.
La clave por sí sola no redirige las solicitudes. El runtime integrado de Codex sigue apuntando a la URL base de OpenAI e ignora OPENAI_BASE_URL. Hay que sobrescribir la configuración del proveedor mediante --codex, que acepta valores TOML:
OPENAI_API_KEY=sk-... npx codex-security scan . --auth api-key --max-cost 5 \
--codex 'model_provider="relay"' \
--codex 'model_providers.relay.name="relay"' \
--codex 'model_providers.relay.base_url="https://your-endpoint/api/v1"' \
--codex 'model_providers.relay.env_key="OPENAI_API_KEY"' \
--codex 'model_providers.relay.wire_api="responses"'
Dos detalles me costaron una ejecución cada uno. Los valores sin comillas fallan con Invalid --codex TOML value. Además, Codex 0.144.6 rechaza directamente wire_api="chat": el error remite a la discusión #7782 e indica que debes usar responses. Tu endpoint tiene que implementar la Responses API, no únicamente Chat Completions.
El destino real de la factura del modelo se deriva de esa misma configuración. La CLI siempre calcula su estimación con las tarifas de lista de OpenAI para GPT-5.6 Sol, independientemente del endpoint configurado. Por tanto, su acumulado es un cálculo de tokens, no tu factura. Si enrutas el mismo tráfico por un endpoint que cobra la mitad de la tarifa de lista, la ejecución de $6.03 de abajo te costará aproximadamente $3, aunque la CLI siga mostrando $6.03.
El precio de un solo análisis
Estas cifras tienen una condición importante: las cinco ejecuciones pasaron por endpoints de terceros compatibles con OpenAI, porque no disponía de una sesión de ChatGPT Business o Enterprise para probar la ruta oficial. Lo que sigue mide la CLI tal como puede ejecutarla hoy un desarrollador normal, no el comportamiento del servicio alojado con una cuenta autorizada.
El repositorio de prueba era pequeño a propósito y también vulnerable a propósito: nueve líneas con cuatro fallos introducidos deliberadamente.
const express = require('express');
const { exec } = require('child_process');
const db = require('./db');
const app = express();
const API_KEY = "sk-live-9f3a2b7c1d4e5f6a8b9c0d1e2f3a4b5c";
app.get('/u', (req, res) => db.query("SELECT * FROM users WHERE id = " + req.query.id, (e, r) => res.json(r)));
app.get('/ping', (req, res) => exec("ping -c 1 " + req.query.host, (e, o) => res.send(o)));
app.get('/f', (req, res) => res.sendFile(__dirname + "/files/" + req.query.name));
app.listen(3000);
Hay SQL construido por concatenación de cadenas, child_process.exec sobre un parámetro de consulta, una ruta de sendFile sin sanitizar y una clave codificada en el código. El entorno fue macOS, Node v22.17.0, Python 3.14.6, @openai/[email protected], plugin incluido 0.1.14; todas las ejecuciones se hicieron el 2026-07-29 entre las 02:20 y las 03:05 UTC.
| Ejecución | Objetivo | Presupuesto | Se detuvo en | Duración | Entrada en caché | Entrada nueva | Salida | Hallazgos |
|---|---|---|---|---|---|---|---|---|
| 1 | Repositorio completo, modo estándar | $1.00 | $1.46 | 3m23s | 1,092,608 | 121,396 | 10,300 | 0 |
| 2 | Repositorio completo, modo estándar | $6.00 | $6.03 | 8m33s | 6,654,720 | 331,330 | 34,946 | 0 |
| 3 | Árbol de trabajo, diff de una línea | $3.00 | $3.06 | 9m46s | 2,035,712 | 240,448 | 28,120 | 0 |
| 4 | Repositorio completo, proyecto completo | $8.00 | $8.54 | 8m00s | 7,299,840 | 634,419 | 57,223 | 0 |
| 5 | Repositorio completo, reasoning_effort=low | $3.00 | $3.20 | 4m13s | 1,749,248 | 366,841 | 16,269 | 0 |
Las cifras en dólares son la estimación de la propia CLI, que aparece durante el análisis y queda guardada en scans list. Se calculan a partir de los tokens y de las tarifas de lista de OpenAI, no de lo que realmente facture el endpoint. La entrada en caché explica por qué los totales parecen bajos frente al volumen de tokens. La ejecución 2 cuadra exactamente con $5.00 por millón de entrada nueva, $0.50 por millón de entrada en caché y $30.00 por millón de salida:
331,330 x $5.00/M = $1.657
6,654,720 x $0.50/M = $3.327
34,946 x $30.00/M = $1.048
------
$6.032 (la CLI informó $6.03239)
Esas mismas tres tarifas reproducen al céntimo el total de las cinco ejecuciones. Es una comprobación útil si tus propios números parecen no cuadrar.
Ninguna de las cinco terminó. Todas se detuvieron por presupuesto, y scans list registra cada una como phase: preflight, status: failed con coverage: worklistRows 0. En otras palabras, ninguna llegó a la fase que informa de vulnerabilidades.
La ejecución 4 sirve como control. Mi primer repositorio estaba incompleto deliberadamente: no tenía package.json y se importaba ./db, pero el módulo no existía. El propio modelo de amenazas de la herramienta lo señaló como una incógnita explícita. Al reconstruirlo correctamente con cuatro archivos, trece líneas y dependencias declaradas, costó más, no menos: $8.54 y 7.9M tokens de entrada.
La curva no es lineal. El coste avanza lentamente durante los tres primeros minutos y después salta dos veces; cada salto coincide con una ampliación del trabajo del agente. El registro revela el mecanismo una vez, a los 51 segundos: Preflight: worker delegation supported (up to 8 worker slots).
El 95% de los tokens de entrada fueron lecturas de caché. Eso indica que el mismo contexto se reenviaba turno tras turno, en lugar de leerse de nuevo. Cada token es barato, pero sigue siendo la partida más grande de la factura. Siete millones de tokens suman, incluso con tarifas de entrada en caché, frente a un archivo de nueve líneas.
Aquí es donde se derrumba la estimación, muy repetida, de unos $0.02 por cada 1,000 líneas de código. A ese precio, este repositorio debería haber costado una fracción de céntimo.
Bajar el razonamiento ayuda menos de lo esperado
La ejecución 5 establece model_reasoning_effort="low" en el mismo proyecto de la ejecución 4. El consumo bajó de aproximadamente 1.0M tokens por minuto a 0.5M por minuto, de modo que el mismo dinero compra el doble de tiempo de ejecución. Aun así, alcanzó el límite en la misma fase de preflight y no tuvo nada que informar. Reducir a la mitad el ritmo de gasto no basta si el pipeline requiere más turnos de los que cubre el presupuesto en ambos casos.
--max-cost marca un punto de control, no frena en seco
La documentación oficial de la CLI indica que las solicitudes que ya están en curso pueden finalizar por encima del límite. No aclara cuánto pueden excederlo. En cinco ejecuciones, el exceso osciló entre el 0.5% y el 46%: el límite de $1.00 se detuvo en $1.46, el de $6.00 en $6.03 y los tres límites intermedios acabaron entre un 2% y un 7% por encima. El exceso equivale a lo que el agente tuviera en vuelo; una expansión de workers cerca del límite es el caso caro. Configura el tope por debajo de la cifra que no puedes superar.
El hook pre-commit tampoco es la opción barata
La respuesta evidente ante un análisis completo disparado de coste es revisar solo los cambios. Hice commit de una base limpia, añadí una línea vulnerable —una cláusula LIKE creada por concatenación— y ejecuté --working-tree --base HEAD.
Costó más que el primer análisis completo: 9m46s, 2,276,160 tokens de entrada y una detención en $3.06 con un límite de $3.00. Sí avanzó más que los análisis completos: escribió una lista de trabajo de revisión priorizada, rank_input.jsonl y deep_review_input.jsonl, antes de agotar el presupuesto. Pero tampoco produjo hallazgos. Limitar el alcance a un diff no reduce el contexto por turno: el agente sigue leyendo el repositorio, redactando un modelo de amenazas completo y distribuyendo trabajo entre workers.
install-hook conecta la herramienta a un hook pre-commit de Git que bloquea los hallazgos de gravedad alta y los errores de análisis. Antes de instalarlo en un equipo, calcula el precio de un único análisis de diff en tu propia base de código: es un hook que puede añadir minutos y dólares a cada commit.
Sus puntos ciegos siguen siendo importantes
El modelo de amenazas que la herramienta redactó para nueve líneas es un buen trabajo. Identifica los cuatro límites de confianza, marca el módulo ausente ./db como una incógnita explícita y se niega a atribuir a Express protecciones que no puede verificar. También expone claramente su propio límite: "Controls not present in the repository must not be assumed."
Ahí está la restricción estructural. El código fuente es la única entrada, así que todo lo que se decide durante el despliegue queda fuera de su vista: política de CORS, modo de depuración activado, TLS débil, cabeceras de seguridad ausentes, cache poisoning y autorización en tiempo de ejecución entre servicios. Los fallos de autorización a nivel de objeto, en particular, requieren peticiones autenticadas desde dos identidades reales para confirmarse; leer el código no puede proporcionar eso.
La profundidad de cobertura entre lenguajes también parece desigual. Un análisis práctico del servicio alojado sitúa la mejor cobertura en Python, JavaScript, TypeScript, Go y Java, con Ruby, PHP y Kotlin por detrás. Yo solo probé JavaScript, así que tómalo como información de segunda mano.
¿Merece la pena ejecutarlo?
Instálalo hoy si te interesa el modelo de amenazas. Es el único artefacto que recibí en cada ejecución: un documento de 1,605 palabras que delimita fronteras de confianza, enumera escenarios de ataque y define qué significan los niveles critical, high, medium y low para ese servicio concreto. También resulta útil como entrada para otras herramientas, ya que --knowledge-base admite tus propios documentos de arquitectura y el modelo generado se puede editar.
Espera si necesitas gasto predecible o una lista real de hallazgos. En cinco configuraciones no obtuve ninguna de las dos cosas, con costes de $1.46 a $8.54 por ejecución en un repositorio que puedes leer en diez segundos. Los resultados documentados en fases posteriores, findings.json, coverage.json y report.md, son archivos a los que nunca llegué. La pregunta abierta que estas pruebas no pueden responder es si una cuenta autorizada de ChatGPT Business se comporta de otra manera.
Ninguno de los dos controles de coste más evidentes funcionó aquí: ni limitarse al diff ni bajar el esfuerzo de razonamiento evitaron el mismo muro. Lo que sí cambia la aritmética es la tarifa del modelo. Como la estimación se calcula a partir del número de tokens y del precio de lista, un endpoint que cobre la mitad reduce a la mitad el coste de la misma ejecución. Presupuesta a partir de ejecuciones medidas, no del tamaño del repositorio, y fija el límite por debajo de tu máximo real en el equivalente a una ronda de workers: mi peor exceso fue el 46% del límite.
Preguntas frecuentes
¿Codex Security CLI es gratis?
La CLI y el SDK tienen licencia Apache-2.0 y no cuesta nada instalarlos. Los análisis no son gratuitos: consumen tokens de GPT-5.6 Sol con las credenciales que uses para autenticarte, y la CLI muestra una estimación acumulada según las tarifas de lista de OpenAI.
¿Necesito un plan ChatGPT Business o Enterprise?
Para la integración alojada con GitHub, sí: esa vía está limitada a Pro, Enterprise, Business y Edu. La CLI acepta una OPENAI_API_KEY convencional, pero la documentación advierte que los análisis de repositorios completos pueden seguir requiriendo Trusted Access for Cyber, algo que ningún plan concede automáticamente.
¿Puede ejecutarse en CI?
Sí. Define OPENAI_API_KEY, añade --fail-on-severity para que los hallazgos generen un código de salida distinto de cero y dirige CODEX_SECURITY_STATE_DIR a una ruta escribible fuera del repositorio. Por defecto, los análisis solo generan informes.
¿Funciona con un endpoint de terceros compatible con OpenAI?
Sí, siempre que el endpoint implemente la Responses API. Debes sobrescribir la configuración del proveedor de Codex con opciones --codex, porque limitarse a definir OPENAI_API_KEY provoca un error de autenticación.
¿En qué se diferencia la CLI del plugin Codex Security?
Comparten el motor de análisis, pero cambian el punto de entrada. El plugin se ejecuta en la infraestructura de OpenAI contra un repositorio de GitHub conectado. La CLI se ejecuta en tu máquina sobre una ruta local, guarda el historial en un directorio de estado local y añade análisis acotados a diffs, un hook pre-commit, exportación SARIF y registro MCP.
Lecturas relacionadas: Guía de precios de GPT-5.6 · Modo automático de Codex
