Volver al blog

IA para principiantesGuía

Por qué un chat largo de IA cuesta más: la API reenvía el historial

Cada mensaje nuevo en un chat de IA reenvía todo el historial, así que la entrada crece en cada turno. Mira la aritmética y 3 formas de reducir el coste.

Por CheapTokens TeamPublicado el Actualizado el 6 min de lectura

Portada: «Por qué un chat largo cuesta más con cada mensaje» — la API reenvía todo el historial en cada turno
En esta página
  1. La respuesta corta
  2. Un ejemplo resuelto con números inventados
  3. Cuánto cuesta con precios reales
  4. Tres formas de mantenerlo bajo
  5. 1. Empieza un chat nuevo cuando cambie el tema
  6. 2. Recorta el historial
  7. 3. Sustituye los turnos antiguos por un resumen
  8. Compruébalo en tu propio código
  9. Dónde ejecutar chats largos

Los primeros mensajes de un chat son baratos. El mensaje cincuenta cuesta notablemente más que el mensaje diez, aunque hayas escrito la misma cantidad. Nada está roto: así funcionan las APIs de chat.

La respuesta corta#

Un modelo no recuerda tus peticiones anteriores. La documentación de OpenAI lo dice directamente: "cada solicitud de generación de texto es independiente y sin estado", y para una conversación de varios turnos incluyes los mensajes anteriores y la respuesta previa del modelo en la siguiente petición. La API Messages de Anthropic describe el mismo patrón: conversaciones multiturno sin estado, donde los turnos anteriores se pasan en el parámetro messages.

Así que la ventana de chat que ves en una app es una ilusión construida por la app. Detrás de ella, cada mensaje nuevo es una petición nueva que lleva toda la conversación hasta ese momento. Pagas por tokens de entrada en cada petición, y el historial forma parte de esa entrada. Si eres nuevo en estos términos, lee primero Qué es un token y Tokens de entrada vs salida.

OpenAI indica explícitamente el lado de la facturación para sus cadenas de respuestas: todos los tokens de entrada anteriores en la cadena se facturan como tokens de entrada. El mismo principio se aplica a cualquier API en la que envíes tú mismo el historial: lo que envías es lo que se cuenta.

Un ejemplo resuelto con números inventados#

Los números de abajo son un ejemplo didáctico, no una medición. Supón que cada uno de tus mensajes tiene unos 200 tokens y cada respuesta unos 300 tokens. Un intercambio terminado añade 500 tokens al historial.

Turno Historial anterior reenviado Mensaje nuevo Entrada de esta petición Salida
1 0 200 200 300
5 500 × 4 = 2.000 200 2.200 300
10 500 × 9 = 4.500 200 4.700 300
20 500 × 19 = 9.500 200 9.700 300

La respuesta mantiene la misma longitud, pero la entrada del turno 20 es casi cincuenta veces la entrada del turno 1. La salida no crece; la entrada sí.

Ahora el total de un chat de 20 turnos. El historial se reenvía 0, 1, 2 ... 19 veces tantos intercambios, lo que es una suma sencilla:

  • Intercambios antiguos reenviados: 500 × 190 = 95.000 tokens (190 es 0 + 1 + 2 + ... + 19).
  • Mensajes nuevos: 200 × 20 = 4.000 tokens.
  • Entrada total del chat: 95.000 + 4.000 = 99.000 tokens.
  • Salida total: 300 × 20 = 6.000 tokens.

Si el modelo lo recordara todo gratis, la entrada sería solo 200 × 20 = 4.000 tokens. El resto es el historial reenviándose de nuevo. Duplicar el número de turnos no duplica el coste del historial, lo cuadruplica aproximadamente, porque la suma crece con el cuadrado del número de turnos.

Cuánto cuesta con precios reales#

Aquí está el mismo chat de 20 turnos (99.000 de entrada, 6.000 de salida) con los precios actuales. La tabla está en vivo y se actualiza cuando cambian las tarifas; la última columna es el precio de referencia de OpenRouter para comparar.

Modelo Costo OpenRouter
GLM-5.3-Flash $0.0022 $0.0045
DeepSeek-V4-Flash $0.0021 $0.0056
MiniMax-M2.7 $0.0059 $0.0369

99.000 tokens de entrada y 6000 tokens de salida en total. Los precios por 1M de tokens son actuales y cambian junto con nuestras tarifas; la columna de OpenRouter muestra precios de referencia para la misma carga de trabajo.

Para una comprobación rápida en texto: en MiniMax-M2.7 toda esta conversación cuesta $0.0059. Para un chat como este, donde domina la entrada, el precio de entrada es lo que más importa: en MiniMax-M2.7 es más barato que el precio de referencia de OpenRouter. Por 1M de tokens, MiniMax-M2.7 está a $0.05 de entrada y $0.15 de salida.

Tres formas de mantenerlo bajo#

1. Empieza un chat nuevo cuando cambie el tema#

El historial más barato es uno vacío. Si terminaste de depurar una función y ahora quieres una receta, un chat nuevo envía 200 tokens en lugar de 9.700. En una app esto es un botón; en código es history = []. Hazlo siempre que el contexto anterior ya no ayude a la siguiente pregunta.

2. Recorta el historial#

Conserva solo los últimos mensajes y descarta el resto. Supón que conservas los últimos tres intercambios, así que el historial nunca supera 500 × 3 = 1.500 tokens:

  • Los turnos 1-3 crecen con normalidad: 0 + 500 + 1.000 = 1.500 tokens de historial.
  • Los turnos 4-20 llevan cada uno el tope de 1.500: 1.500 × 17 = 25.500 tokens.
  • Total del historial: 1.500 + 25.500 = 27.000 tokens, más 4.000 de mensajes nuevos = 31.000 tokens de entrada.

Eso es 31.000 en lugar de 99.000 para los mismos 20 turnos, y en MiniMax-M2.7 sale a $0.0025. El precio de recortar es que el modelo olvida la primera parte del chat, así que mantén el system prompt y cualquier dato que no deba perderse fuera de la parte recortada.

3. Sustituye los turnos antiguos por un resumen#

Cuando el historial se alarga, pide al modelo una vez que lo resuma y luego continúa con el resumen en lugar del texto completo. En el ejemplo anterior, nueve intercambios son 4.500 tokens; un resumen de unos 300 tokens lleva los puntos principales hacia adelante. Pagas una petición extra para escribir el resumen, y cada petición posterior es más ligera. Esto conserva más significado que el recorte simple, a costa de un poco de detalle.

La ventana de contexto es un límite aparte: limita cuántos tokens puede contener una petición, incluida la respuesta. El historial acabará alcanzando ese techo; ¿Por qué una respuesta de IA se corta a mitad de frase? lo explica.

Compruébalo en tu propio código#

La respuesta contiene un objeto usage, así que puedes observar el crecimiento tú mismo. Este es un ejemplo: sustituye la clave y toma el id del modelo de la documentación de CheapTokens, porque los ids difieren entre proveedores.

python
from openai import OpenAI

client = OpenAI(base_url='https://api.cheaptokens.dev/v1', api_key='YOUR_KEY')

system = {'role': 'system', 'content': 'You are a helpful assistant.'}
history = []
KEEP = 7  # new message + last 3 exchanges (6 messages); None keeps everything

def ask(text):
    history.append({'role': 'user', 'content': text})
    r = client.chat.completions.create(
        model='MODEL_ID_FROM_DOCS',
        messages=[system] + (history[-KEEP:] if KEEP else history),
    )
    answer = r.choices[0].message.content
    history.append({'role': 'assistant', 'content': answer})
    print(r.usage.prompt_tokens, r.usage.completion_tokens)
    return answer

Llama a ask() varias veces seguidas e imprime prompt_tokens: con KEEP = None sube en cada turno, con KEEP = 7 se estabiliza. Para los agentes que recorren muchos pasos, el mismo efecto se aplica a cada paso; Cómo estimar el coste de un agente de IA muestra cómo presupuestarlo.

Dónde ejecutar chats largos#

Los diálogos largos y los bucles de agentes son exactamente las cargas de trabajo donde domina el volumen de entrada, así que tanto una ventana de contexto grande como espacio para respuestas largas importan:

  • MiniMax-M2.7: contexto de 180K, hasta 8.192 tokens por respuesta, entrada y salida más baratas que el precio de referencia de OpenRouter.
  • DeepSeek-V4-Flash: contexto de 380K, hasta 32.768 tokens por respuesta, salida más barata que el precio de referencia de OpenRouter.

CheapTokens tiene un único saldo para todos los modelos, un precio fijo por modelo sin horas punta, y una API compatible con OpenAI Chat Completions y Anthropic Messages, así que el código de arriba funciona cambiando la URL base. Recarga el saldo y envía tu primera petición siguiendo Tu primera petición a la API con CheapTokens.