← Artículos

Cómo contar los tokens de Claude de verdad

· 7 min de lectura

Los tokens de Claude se cuentan con el endpoint oficial POST /v1/messages/count_tokens, que recibe el modelo como parámetro porque cada generación tokeniza distinto. tiktoken es de OpenAI y subestima. Después de cada respuesta, el prompt real es la suma de input_tokens, cache_creation_input_tokens y cache_read_input_tokens, no el primer campo solo.

Si estimas el gasto de Claude con una calculadora de tokens genérica, el número que te sale no es tu factura. Y desde el tokenizador nuevo, la diferencia creció.

Esta guía es el método correcto: el endpoint oficial, los campos de la respuesta que de verdad importan, y cómo medir tu propio delta entre dos modelos en cinco minutos.

Por qué tiktoken no sirve para Claude

`tiktoken` es el tokenizador de OpenAI. Cuenta bien los tokens de los modelos de OpenAI y no cuenta los de Claude: para texto normal subestima, y para código o para idiomas que no son inglés subestima más.

No es un detalle académico. Si presupuestas con un conteo que se queda corto, el tope de gasto que configuraste salta antes de lo que esperabas y la ventana de contexto se llena antes de lo que calculaste.

La regla es simple: el conteo de tokens de Claude se pide a Claude.

El endpoint de conteo

Anthropic expone `POST /v1/messages/count_tokens`. Recibe la misma forma que una petición normal — modelo, mensajes, sistema, herramientas — y devuelve cuántos tokens de entrada tendría esa petición, sin ejecutarla ni cobrarte generación.

En Python:

```python

from anthropic import Anthropic

client = Anthropic()

resp = client.messages.count_tokens(

model="claude-sonnet-5",

messages=[{"role": "user", "content": open("documento.md").read()}],

)

print(resp.input_tokens)

```

El campo `model` no es decorativo. El conteo es específico del modelo: los modelos de la generación 4.7 en adelante usan un tokenizador distinto al de Sonnet 4.6 y anteriores, así que el mismo texto devuelve números distintos según lo que pongas ahí.

Desde la terminal, con el CLI oficial:

```bash

ant messages count-tokens --model claude-sonnet-5 --message '{role: user, content: "@./documento.md"}' --transform input_tokens -r

```

El `@` delante de la ruta inyecta el contenido del archivo en el campo.

Mide tu propio delta entre dos modelos

Anthropic dice que el tokenizador nuevo produce aproximadamente un 30 % más de tokens para el mismo texto, y avisa que el aumento exacto depende del contenido y de la forma de tu carga de trabajo. Tu 30 % puede ser un 18 % o un 40 %.

Averígualo con tus propios textos, no con el promedio de nadie:

```python

texto = open("documento.md").read()

def contar(modelo):

return client.messages.count_tokens(

model=modelo,

messages=[{"role": "user", "content": texto}],

).input_tokens

viejo = contar("claude-sonnet-4-6")

nuevo = contar("claude-sonnet-5")

print(viejo, nuevo, f"{(nuevo / viejo - 1) * 100:.1f}% más")

```

Córrelo sobre cinco o seis archivos representativos de lo que realmente le mandas al modelo. Ese porcentaje es el tuyo, y es el que debes usar para recalcular presupuestos y topes.

Los cuatro campos de `usage` que importan

Contar antes te da la estimación. Después de cada respuesta real, el objeto `usage` te da la verdad:

Aquí está la trampa que confunde a casi todo el mundo: `input_tokens` no es el tamaño de tu prompt. Es solo el pedazo que no estaba cacheado. El prompt completo es la suma de los tres campos de entrada:

```python

total = (r.usage.input_tokens

+ r.usage.cache_creation_input_tokens

+ r.usage.cache_read_input_tokens)

```

Si tu agente lleva horas corriendo y `input_tokens` marca cuatro mil, no es que el prompt sea pequeño: es que casi todo se está sirviendo desde la caché. Mira la suma, no el campo suelto.

Y al revés: si `cache_read_input_tokens` sale en cero petición tras petición con el mismo prefijo, la caché no está funcionando. Casi siempre es una marca de tiempo, un identificador aleatorio o un JSON serializado sin ordenar metido al principio del prompt.

Qué revisar hoy

  1. Busca en tu código cualquier estimador que no sea el endpoint oficial y reemplázalo.
  2. Vuelve a medir los textos representativos contra el modelo que usas hoy, no contra el que usabas hace tres meses.
  3. Recalcula los topes que están expresados en tokens: límites de salida, umbrales de compactación, alertas de gasto.
  4. Comprueba que `cache_read_input_tokens` no sea cero si esperabas caché.

El dato honesto

Contar tokens no reduce la factura por sí solo: solo la hace predecible. La mayoría del ahorro real viene de la caché de prompt y de no mandar contexto que no hace falta.

Pero sin un conteo correcto no puedes saber si algo de eso está funcionando, porque estarías midiendo con una regla que no es la tuya.

Preguntas frecuentes

¿Cómo cuento los tokens de un texto para Claude?
Con el endpoint oficial POST /v1/messages/count_tokens, o con el método count_tokens del SDK. Recibe la misma forma que una petición normal, incluido el identificador del modelo, y devuelve cuántos tokens de entrada tendría esa petición sin ejecutarla ni cobrar generación. El modelo es obligatorio porque el conteo cambia entre generaciones.
¿Puedo usar tiktoken para estimar tokens de Claude?
No conviene. tiktoken es el tokenizador de OpenAI y no corresponde al de Anthropic: subestima el conteo real de Claude, y la diferencia es mayor en código y en idiomas distintos del inglés. Un presupuesto calculado con tiktoken se queda corto frente a la factura real, así que la estimación deja de servir justo cuando más importa.
¿Por qué input_tokens es más chico que mi prompt?
Porque input_tokens cuenta solamente los tokens de entrada que no venían de la caché. El tamaño real del prompt es la suma de input_tokens, cache_creation_input_tokens y cache_read_input_tokens. Si un agente lleva horas corriendo y ese campo marca una cifra baja, significa que la mayor parte del contexto se está sirviendo desde la caché de prompt.
¿Cómo sé si la caché de prompt está funcionando?
Revisa cache_read_input_tokens en respuestas sucesivas que compartan el mismo prefijo. Si sale cero una y otra vez, algo está invalidando la caché: lo más común es una marca de tiempo, un identificador aleatorio o un JSON serializado sin ordenar colocado al principio del prompt, porque cualquier byte que cambie invalida todo lo que viene después.
¿Cuánto más tokeniza el modelo nuevo sobre el mismo texto?
Anthropic indica aproximadamente un 30 % más para los modelos de la generación 4.7 en adelante, y advierte que el aumento exacto depende del contenido y de la forma de la carga de trabajo. Lo correcto es medir tu propio porcentaje: cuenta los mismos archivos contra el modelo viejo y el nuevo y compara los dos números.

Fuentes

MÁQUINA IA

La comunidad donde dejas de usar IA y empiezas a dirigirla.

Entrar a la comunidad →