Cuenta tokens antes de enviar una petición: tiktoken en Python
Estima el número de tokens de un prompt sin conexión con tiktoken, compruébalo contra la ventana de contexto, ponle precio y compáralo con el campo usage de la API.

En esta página
Puedes contar los tokens de un prompt en tu propia máquina antes de enviarlo: instala tiktoken, codifica el texto y toma len() del resultado. tiktoken es el tokenizador de OpenAI, así que para los modelos DeepSeek, GLM y MiniMax el número es una estimación. La cifra real vuelve en usage. tras la primera llamada, y comparar ambas lleva una línea más.
¿Para qué molestarse? Porque la factura y los errores empiezan ambos por el tamaño de la entrada. Pega un contrato largo en un script y descubrirás que era demasiado grande solo cuando la API responda con un 400. Ejecuta un lote de cinco mil correos y descubrirás cuánto costó solo cuando el saldo sea menor. Contar primero convierte ambas sorpresas en un número que puedes leer de antemano.
Cinco líneas que cuentan tokens#
El README de tiktoken (consultado el 1 de noviembre de 2026) muestra toda la idea: elige una codificación, codifica el texto y la longitud de la lista es el número de tokens.
pip install tiktokenimport tiktoken
enc = tiktoken.get_encoding('o200k_base')
text = 'Hello world'
tokens = enc.encode(text)
print(len(tokens)) # how many tokens the text is
enc. devuelve el texto original, lo que es una comprobación útil de que estás viendo el mismo texto que verá el modelo. El README también menciona tiktoken., que elige el tokenizador para un modelo de OpenAI concreto. Esa es la trampa que conviene recordar: los tokenizadores pertenecen a familias de modelos. La regla general del README es de unos cuatro bytes de texto por token, y describe solo los tokenizadores de OpenAI.
Entonces, ¿qué haces para un modelo DeepSeek? Usa el mismo recuento como estimación de trabajo y calíbralo, como se muestra abajo.
Adivina el número
¿Aproximadamente cuántos tokens es un texto en inglés de 2.000 caracteres?
Tu respuesta
02000
Mostrar respuesta
Respuesta: 500
Unos 500. Con la regla general del README de cuatro bytes por token, y el texto en inglés simple a aproximadamente un byte por carácter, 2.000 ÷ 4 = 500. Otros idiomas y los emoji ocupan más bytes por carácter, así que los mismos 2.000 caracteres suelen implicar más tokens según esa regla.
¿Cabe el prompt en la ventana?#
Cada modelo tiene una ventana de contexto, y tu entrada más la respuesta que permites tienen que caber en ella. Las ventanas de los modelos que servimos: DeepSeek-V4-Flash 380K, GLM-5.3-Flash 390K, MiniMax-M2.7 180K tokens. La respuesta más larga es de 32.768 tokens para DeepSeek-V4-Flash y de 8.192 para los otros dos (lista de modelos de CheapTokens, 1 de noviembre de 2026).
Una comprobación antes de la llamada son cuatro líneas:
CONTEXT = {
'deepseek-ai/DeepSeek-V4-Flash-0731': 380_000,
'zai-org/GLM-5.3-Flash': 390_000,
'MiniMaxAI/MiniMax-M2.7': 180_000,
}
def fits(prompt_tokens, max_tokens, model):
return prompt_tokens + max_tokens <= CONTEXT[model]Supón que tienes un documento de 250.000 tokens. fits(250_ es False, así que envías ese trabajo a un modelo con una ventana mayor o divides el documento, y el 400 nunca ocurre. fits(250_ es True. Si quieres la historia completa de cómo se ve el error, request too long: 400 vs 413, context window and max_tokens lo recorre.
¿Cuánto costará?#
Ahora el presupuesto. Toma un elemento típico, cuéntalo y multiplica. Supón que clasificas 5.000 correos de pedidos. Cuentas un correo representativo y obtienes unos 800 tokens de entrada, y limitas la etiqueta y una razón breve a 200 tokens de salida. Los totales: 5.000 × 800 = 4.000.000 tokens de entrada y 5.000 × 200 = 1.000.000 tokens de salida.
La tabla de abajo pone precio exactamente a esa carga de trabajo con precios en vivo, con entrada y salida contadas juntas:
| Modelo | Entrada $/1M | Salida $/1M | Por solicitud | 5000 solicitudes | OpenRouter, 5000 solicitudes |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000024 | $0.12 | $0.217 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.000032 | $0.16 | $0.42 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.00007 | $0.35 | $4.20 |
800 tokens de entrada y 200 tokens de salida por solicitud. 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.
En total, con entrada y salida contadas juntas, la columna de CheapTokens es más barata que OpenRouter para estos modelos. Cambia los tres números por tus propios recuentos y tendrás un presupuesto antes de la primera petición. Para la diferencia entre los dos lados de la factura, consulta input vs output tokens: what an AI API bills you for, y para ejemplos medidos reales how many tokens an API request uses. Los precios actuales están siempre en la página de precios.

Compara la estimación con el uso#
La estimación es una conjetura sobre el tokenizador de otro, así que compruébala una vez contra la clave de respuestas. Cada respuesta lleva un campo usage, y usage. es lo que la API contó para tu entrada. Pon los dos números uno al lado del otro y divide.
Paso a paso
Ejecuta la comparación
Configuración
Instala los paquetes y pon la clave en una variable de entorno. Nunca la pegues en el script.
pip install tiktoken openai
export CHEAPTOKENS_API_KEY='your-key-here'Ejecuta el script
Guarda esto como compare.py. Cuenta localmente, envía la petición a https:/ e imprime ambos números. El id del modelo es el completo de la lista de modelos de CheapTokens, ya que no se aceptan nombres abreviados.
import os
import tiktoken
from openai import OpenAI
MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'
enc = tiktoken.get_encoding('o200k_base')
messages = [{'role': 'user',
'content': 'Classify this email as order, refund or other: Hi, my parcel from last Tuesday has not arrived yet.'}]
estimate = sum(len(enc.encode(m['content'])) for m in messages)
client = OpenAI(base_url='https://api.cheaptokens.dev/v1',
api_key=os.environ['CHEAPTOKENS_API_KEY'])
r = client.chat.completions.create(model=MODEL, messages=messages, max_tokens=200)
real = r.usage.prompt_tokens
print(f'estimate {estimate}, usage.prompt_tokens {real}, ratio {real / estimate:.2f}')Lee la diferencia
La última línea imprime tres números. Supón que muestra estimate 24, usage.. Entonces multiplica tus estimaciones futuras por el ratio antes de presupuestar. Un prompt real también va envuelto en el formato de chat, así que el recuento real puede salir algo por encima de la estimación en texto plano. Ejecútalo con varios prompts típicos, no con uno, y usa el ratio medio.
A partir de ahí la rutina es: estima localmente, comprueba la ventana, aplica tu ratio al presupuesto y deja que usage en cada respuesta te mantenga honesto. Si también quieres el total acumulado de un trabajo completo, track AI agent token cost in Python lo construye sobre el mismo campo. ¿Eres nuevo en la conexión en sí? Your first API request with CheapTokens lo cubre, y la documentación tiene el resto.
Emparejar los pares
Empareja cada nombre con lo que te dice
Toca un elemento de la izquierda, luego su par
- len(enc.encode(text))Tu estimación local del tamaño de la entrada
- usage.prompt_tokensEl tamaño de la entrada tal como lo contó la API
- usage.completion_tokensEl tamaño de la respuesta, con precio en el lado de salida
- max_tokensEl límite de longitud de respuesta que reservas en la comprobación de la ventana
Contar es barato, local y lleva segundos. Hazlo antes de la llamada que cuesta dinero.



