Costos: prompt caching y Batch API

Resumen

Optimizar costos con prompt caching y batch API es lo que separa una app con inteligencia artificial que funciona de una que además es sostenible. Si construyes productos sobre la API de OpenAI y quieres reducir el gasto en tokens sin sacrificar calidad, estas dos herramientas de producción son tu punto de partida.

Esta guía es para developers que ya trabajan con el Responses API y necesitan escalar sin que la factura crezca al mismo ritmo que el uso.

Qué es el prompt caching y cómo ahorra hasta 90% en tokens

El prompt caching es una función de OpenAI que reutiliza la parte inicial de tus prompts para evitar procesarla de nuevo. Según su documentación, puede reducir entre un 80% y un 90% el costo de los input tokens [00:20].

La clave está en el prefijo. Todo lo que sea system prompt o instrucciones al inicio del prompt original se toma como un bloque fijo. Mientras ese prefijo no cambie, el caché lo reconoce y no lo vuelve a cobrar completo.

¿Qué es el prompt caching? Es una función que guarda el inicio repetido de tus prompts para no reprocesarlo. Si el prefijo se mantiene igual, ahorras hasta un 90% del costo de los input tokens.

Por qué se rompe el caché cuando cambias el inicio del prompt

OpenAI lo explica con una gráfica de figuras. En un segundo llamado, el caché detecta que todo es igual excepto los últimos dos ítems: en lugar de cuadrado y círculo, ahora son círculo y círculo [00:44]. Aunque el último coincide, el anterior no, y ahí se rompe el caché parcialmente. Aun así, un 80% del costo se ahorra porque el resto ya estaba guardado.

El problema aparece cuando agregas algo nuevo al inicio. Si antepones un triángulo, todas las figuras se corren a la derecha, el prefijo cambia por completo y el modelo lo interpreta como un prompt totalmente nuevo [01:20]. Cero ahorro.

Un detalle técnico importante: el prompt caching se activa automáticamente para prompts de 1.024 tokens o más [01:35]. Debajo de ese umbral no aplica.

¿Cuándo se activa el prompt caching? Se activa de forma automática cuando tu prompt tiene 1.024 tokens o más. No necesitas configurarlo manualmente.

Cómo funciona el cache routing en una API request

Cada solicitud pasa por el cache routing, que incluye tres momentos:

  • Cache lookup: busca si el prefijo ya existe guardado.
  • Cache hit: encuentra coincidencia y reutiliza la información.
  • Cache miss: no hay coincidencia y procesa todo de nuevo.

Esto es exactamente lo que muestra la gráfica de las figuras, aplicado a cada llamado real [01:44].

Cómo implementar prompt caching en Python paso a paso

Para mantener el código ordenado, creamos un archivo nuevo dentro de la carpeta app llamado optimization.py, donde vivirán tanto el prompt caching como el batch API [02:05].

Las importaciones iniciales son directas:

  • json para exportar y leer formato JSON.
  • time para agregar un delay entre llamados.
  • El client que ya configuramos, que trae la conexión a OpenAI.

Luego definimos las instrucciones estables, que funcionan como prefijo fijo:

python stable_instructions = "Eres el generador oficial de contenido de la marca. Usa siempre un tono cercano, claro y educativo, evita hype exagerado y promesas irreales"

def generate_with_cache(prompt: str) -> str: response = client.responses.create( model="gpt-5.4", instructions=stable_instructions, input=prompt, ) return response.output_text

En main.py cambiamos el import para apuntar al nuevo archivo app.optimization y llamamos a generate_with_cache pidiendo un post sobre un workshop de IA [03:00].

Qué pasa cuando ejecutas el mismo prompt dos veces

En la primera ejecución obtienes una respuesta normal, aunque note que faltan lugar, fecha y hora del evento [03:40]. La magia aparece al ejecutarlo otra vez.

Como el prompt es idéntico, el prefijo está completamente cachado y la respuesta llega mucho más rápido, con mejor uso de recursos y sin costar lo mismo que el primer llamado [04:00]. Esa velocidad es la señal visible del ahorro.

Qué es el Batch API y cuándo conviene usarlo

No siempre necesitas respuestas inmediatas. Cuando tienes muchas tareas o pueden esperar, como pedir múltiples reportes o analizar varios archivos, el batch API de OpenAI procesa todo con delay a un costo mucho menor [04:20].

¿Cuándo usar el Batch API en vez del Responses API? Úsalo cuando no necesitas inmediatez y tienes tareas en volumen, como clasificar ideas o generar reportes. El costo puede ser menos de la mitad.

Cómo construir el archivo JSONL para el Batch API

El primer paso es armar un archivo con múltiples líneas, una por tarea. La función build_batch_file recibe una lista de ideas y escribe un archivo batch/request.jsonl, con un elemento por línea [04:40].

Dentro del body de cada línea apunta al endpoint de respuestas y usa el modelo gpt-5.4-mini, mucho más económico. Como no buscamos velocidad, ese modelo encaja perfecto. El input de cada línea es "clasifica esta idea por canal recomendado" seguido de cada idea.

Probamos con cinco ideas concretas [05:30]:

  1. Un workshop de IA para developers en Barranquilla.
  2. Un newsletter semanal sobre prompts útiles.
  3. Un reel corto mostrando una demo de la app.
  4. Un webinar sobre integración de la OpenAI API en un producto.
  5. Un hilo de Twitter con tips de prompt engineering.

Si la carpeta batch no existe, la ejecución falla, así que hay que crearla a la misma altura de main.py antes de correr el script [06:20].

Cómo enviar y recuperar los resultados del batch

Con el archivo listo, la función submit_batch lee batch/request.jsonl, lo sube con client.files.create y crea el trabajo con client.batches.create. Ahí defines el input file, el endpoint de responses y el completion_window, un parámetro obligatorio que por defecto queda en 24 horas [07:00].

Como la respuesta no llega al instante, la función save_batch_results hace polling: revisa el estado cada 10 segundos e imprime en terminal si va en validating, in progress o finalizing [08:00]. Si el estado final no es completado, lanza una excepción. Cuando termina, descarga el contenido con client.files.content y guarda una línea por resultado usando el custom_id y el texto generado.

En la ejecución real, el proceso tomó 3 minutos con 20 segundos: el primer minuto validando, dos minutos en progreso y los últimos 10 segundos finalizando [10:10].

Qué devuelve el Batch API en el archivo de resultados

El archivo results.txt aparece junto a request.jsonl con una clasificación por cada idea. Para cada una entrega canal recomendado, un porqué y recomendaciones concretas [10:40].

La quinta idea, la del hilo de Twitter, incluso propone un formato sugerido: un gancho con promesa clara, tip uno más ejemplo, tip dos más ejemplo, y un cierre con call to action de guardar, responder o seguir.

Y aquí viene lo interesante: si hubiésemos usado el Responses API directo, el costo habría sido más del doble. Pudimos esperar tres o cuatro minutos y pagar mucho menos por el mismo resultado [11:20].

¿Ya sabes en cuál de tus procesos podrías cambiar el Responses API por el Batch API? Cuéntanos en los comentarios qué tarea vas a optimizar primero.