Para los modelos que no son codex, el CLI de Codex de código abierto compacta el contexto localmente: un LLM resume la conversación utilizando un prompt de compactación. Cuando el contexto compactado se utiliza posteriormente, responses.create() lo recibe con un prompt de traspaso que enmarca el resumen. Ambos prompts son visibles en el código fuente.
Para los modelos codex, el CLI en su lugar llama a la API compact(), que devuelve un blob cifrado. No sabemos si utiliza un LLM internamente, qué prompts usa, o si siquiera existe un prompt de traspaso.
A continuación, muestro cómo una simple inyección de prompt (2 llamadas a la API, 35 líneas de Python) revela que la ruta de compactación de la API sí utiliza un LLM para resumir el contexto, con su propio prompt de compactación y un prompt de traspaso antepuesto al resumen. Los prompts son casi idénticos a las versiones de código abierto.
Paso 1 — compact()
Llamo a compact() con un mensaje de usuario manipulado. Del lado del servidor, un LLM compactador procesa nuestra entrada utilizando su propio prompt de sistema oculto (que nunca he visto y quiero descubrir).
El servidor parece ensamblar el contexto del compactador de la siguiente manera:

El LLM compactador lee su prompt de sistema junto con nuestra entrada. Debido a que nuestra entrada contiene una carga de inyección (texto rojo arriba), el compactador es engañado para incluir su propio prompt de sistema en su salida. Este resumen en texto plano existe únicamente en el servidor de OpenAI. Nosotros solo vemos el blob cifrado:

En este punto no tenemos forma de leer lo que hay dentro del blob. Está cifrado con AES y la clave reside en los servidores de OpenAI. Solo esperamos que el compactador haya obedecido la inyección y haya escrito su prompt en el resumen. La única forma de descubrirlo es el Paso 2.
Paso 2 — create()
Paso el blob cifrado + un segundo mensaje de usuario a responses.create(). El servidor descifra el blob y ensambla el contexto del modelo.
Envío:

El modelo parece ver algo como esto:

Si el Paso 1 funcionó, el blob descifrado debería contener el prompt de compactación (filtrado por nuestra inyección). El servidor también antepone un prompt de traspaso al blob. Por lo tanto, si nuestra sonda logra que el modelo repita lo que ve, la salida debería revelar los tres: el prompt de sistema, el prompt de traspaso y el prompt de compactación.
Salida
A continuación se muestra la salida completa y sin editar de una ejecución de extract_prompts.py. Amarillo = prompt de sistema, verde = prompt de traspaso, rosa = prompt de compactación.

¿Cómo sabemos que estos son los prompts reales y no solo texto alucinado? El prompt de compactación y el prompt de traspaso extraídos coinciden estrechamente con los prompts conocidos utilizados para modelos que no son codex en el CLI de Codex de código abierto (prompt.md, summary_prefix.md), lo que hace improbable que el modelo los haya inventado desde cero. Los resultados varían entre ejecuciones.
El Flujo Supuesto
Uniendo todo, aquí está nuestra mejor suposición sobre lo que hace compact() del lado del servidor, basada en lo que reveló la extracción.

El Script

Pregunta Abierta
¿Por qué el CLI de Codex utiliza dos rutas de compactación completamente diferentes (LLM local para modelos que no son codex, API cifrada para modelos codex) cuando los prompts subyacentes son casi idénticos? ¿Y por qué cifrar el resumen en absoluto?
Difícil de decir. Quizás el blob cifrado lleva algo más de lo que este simple experimento puede revelar, por ejemplo, algo específico sobre cómo se compactan y restauran los resultados de herramientas. Pero no me molesté en probar más.





