Retour au blog

Optimisation des coûtsGuide

Compter les tokens avant d'envoyer une requête : tiktoken en Python

Estimez hors ligne le nombre de tokens d'un prompt avec tiktoken, vérifiez-le par rapport à la fenêtre de contexte, chiffrez-le, et comparez avec le champ usage de l'API.

Par CheapTokens TeamPublié le 5 min de lecture

Terminal affichant pip install tiktoken et un compte de tokens en une ligne
Sur cette page
  1. Cinq lignes qui comptent les tokens
  2. Le prompt tient-il dans la fenêtre ?
  3. Combien cela va-t-il coûter ?
  4. Comparez l'estimation avec l'usage

Vous pouvez compter les tokens d'un prompt sur votre propre machine avant de l'envoyer : installez tiktoken, encodez le texte, prenez len() du résultat. tiktoken est le tokeniseur d'OpenAI, donc pour les modèles DeepSeek, GLM et MiniMax, le nombre est une estimation. Le chiffre réel revient dans usage.prompt_tokens après le premier appel, et comparer les deux ne prend qu'une ligne de plus.

Pourquoi s'en soucier ? Parce que la facture et les erreurs commencent toutes deux par la taille de l'entrée. Collez un long contrat dans un script, et vous découvrez qu'il était trop gros seulement quand l'API répond par un 400. Lancez un lot de cinq mille e-mails, et vous découvrez ce qu'il a coûté seulement quand le solde est plus bas. Compter d'abord transforme ces deux surprises en un nombre que vous pouvez lire à l'avance.

Cinq lignes qui comptent les tokens#

Le README de tiktoken (vérifié le 1er novembre 2026) montre toute l'idée : choisir un encodage, encoder le texte, et la longueur de la liste est le nombre de tokens.

bash
pip install tiktoken
python
import tiktoken

enc = tiktoken.get_encoding('o200k_base')
text = 'Hello world'
tokens = enc.encode(text)
print(len(tokens))  # how many tokens the text is
Les cinq lignes dans un fichier nommé estimate.py
Le compteur complet : get_encoding, encode, len.

enc.decode(tokens) renvoie le texte d'origine, ce qui est une vérification de bon sens pratique pour s'assurer que vous regardez le même texte que le modèle verra. Le README mentionne aussi tiktoken.encoding_for_model('gpt-4o'), qui choisit le tokeniseur pour un modèle OpenAI spécifique. C'est le piège à retenir : les tokeniseurs appartiennent à des familles de modèles. La règle empirique du README est d'environ quatre octets de texte par token, et elle ne décrit que les tokeniseurs d'OpenAI.

Alors que faire pour un modèle DeepSeek ? Utilisez le même compte comme estimation de travail, et calibrez-le, comme montré ci-dessous.

Devinez le nombre

Environ combien de tokens représente un texte anglais de 2 000 caractères ?

Afficher la réponse

Réponse: 500

Environ 500. Avec la règle empirique du README de quatre octets par token, et un texte anglais simple à environ un octet par caractère, 2 000 ÷ 4 = 500. Les autres langues et les emoji prennent plus d'octets par caractère, donc les mêmes 2 000 caractères signifient généralement plus de tokens selon cette règle.

Le prompt tient-il dans la fenêtre ?#

Chaque modèle a une fenêtre de contexte, et votre entrée plus la réponse que vous autorisez doit y tenir. Les fenêtres des modèles que nous servons : DeepSeek-V4-Flash 380K, GLM-5.3-Flash 390K, MiniMax-M2.7 180K tokens. La réponse la plus longue est de 32 768 tokens pour DeepSeek-V4-Flash et de 8 192 pour les deux autres (liste des modèles CheapTokens, 1er novembre 2026).

Une garde avant l'appel tient en quatre lignes :

python
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]

Disons que vous avez un document de 250 000 tokens. fits(250_000, 8_192, 'MiniMaxAI/MiniMax-M2.7') vaut False, donc vous routez cette tâche vers un modèle avec une fenêtre plus grande ou vous découpez le document, et le 400 n'arrive jamais. fits(250_000, 8_192, 'deepseek-ai/DeepSeek-V4-Flash-0731') vaut True. Si vous voulez l'histoire complète de ce à quoi ressemble l'erreur, request too long: 400 vs 413, context window and max_tokens la détaille.

Combien cela va-t-il coûter ?#

Maintenant le budget. Prenez un élément typique, comptez-le, et multipliez. Supposez que vous classiez 5 000 e-mails de commande. Vous comptez un e-mail représentatif et obtenez environ 800 tokens d'entrée, et vous plafonnez le label et une courte raison à 200 tokens de sortie. Les totaux : 5 000 × 800 = 4 000 000 tokens d'entrée et 5 000 × 200 = 1 000 000 tokens de sortie.

Le tableau ci-dessous chiffre exactement cette charge de travail aux prix actuels, entrée et sortie comptées ensemble :

Modèle Par requête 5 000 requêtes OpenRouter, 5 000 requêtes
GLM-5.3-Flash $0.000024 $0.12 $0.217
DeepSeek-V4-Flash $0.000032 $0.16 $0.42
MiniMax-M2.7 $0.00007 $0.35 $4.20

800 tokens d'entrée et 200 tokens de sortie par requête. Les prix par million de tokens sont actuels et évoluent avec nos tarifs ; la colonne OpenRouter indique des prix de référence pour la même charge de travail.

Au total, entrée et sortie comptées ensemble, la colonne CheapTokens est moins chère qu'OpenRouter pour ces modèles. Changez les trois nombres pour vos propres comptes et vous avez un budget avant la première requête. Pour la différence entre les deux côtés de la facture, voir input vs output tokens: what an AI API bills you for, et pour des exemples réellement mesurés how many tokens an API request uses. Les prix actuels sont toujours sur la page de tarification.

Le flux d'estimation du texte jusqu'au compte d'usage réel
Estimer hors ligne, garder la fenêtre, envoyer, puis comparer avec l'usage.

Comparez l'estimation avec l'usage#

L'estimation est une supposition sur le tokeniseur de quelqu'un d'autre, alors vérifiez-la une fois contre le corrigé. Chaque réponse porte un champ usage, et usage.prompt_tokens est ce que l'API a compté pour votre entrée. Mettez les deux nombres côte à côte et divisez.

Étape par étape

Lancer la comparaison

Configuration

Installez les paquets et placez la clé dans une variable d'environnement. Ne la collez jamais dans le script.

bash
pip install tiktoken openai
export CHEAPTOKENS_API_KEY='your-key-here'

Lancer le script

Enregistrez ceci sous compare.py. Il compte localement, envoie la requête à https://api.cheaptokens.dev/v1, et affiche les deux nombres. L'id du modèle est le complet de la liste des modèles CheapTokens, car les noms raccourcis ne sont pas acceptés.

python
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}')

Lire l'écart

La dernière ligne affiche trois nombres. Disons qu'elle montre estimate 24, usage.prompt_tokens 31, ratio 1.29. Multipliez alors vos estimations futures par le ratio avant de budgéter. Un vrai prompt est aussi enveloppé dans un formatage de chat, donc le compte réel peut sortir un peu au-dessus de l'estimation en texte brut. Lancez-le sur quelques prompts typiques, pas un seul, et utilisez le ratio moyen.

À partir de là, la routine est : estimer localement, garder la fenêtre, appliquer votre ratio au budget, et laisser usage dans chaque réponse vous garder honnête. Si vous voulez aussi le total cumulé sur toute une tâche, track AI agent token cost in Python le construit sur le même champ. Nouveau sur la connexion elle-même ? Your first API request with CheapTokens la couvre, et la documentation a le reste.

Associer les paires

Associez chaque nom à ce qu'il vous dit

  • len(enc.encode(text))Votre estimation locale de la taille de l'entrée
  • usage.prompt_tokensLa taille de l'entrée telle que l'API l'a comptée
  • usage.completion_tokensLa taille de la réponse, facturée du côté sortie
  • max_tokensLe plafond de longueur de réponse que vous réservez dans la vérification de fenêtre

Compter est bon marché, local et prend quelques secondes. Faites-le avant l'appel qui coûte de l'argent.