Chaque requête envoyée à GPT-4, Claude ou n'importe quel autre LLM a un prix, et ce prix se calcule en tokens. Le souci : la plupart des gens envoient leurs prompts sans la moindre idée de ce qu'ils consomment. La facture tombe à la fin du mois, et c'est la surprise. tiktoken est la petite bibliothèque open source publiée par OpenAI, celle-là même qui compte les tokens en interne quand tu appelles l'API. En quelques lignes, tu sais exactement ce que ton texte va te coûter avant même d'appuyer sur Entrée.
Étape 1 — Installe tiktoken
Rien de plus simple : c'est un paquet Python classique qui s'installe en une commande. Il embarque les dictionnaires de découpage, donc une fois installé, tout se passe en local, sans aucun appel réseau.
python -m pip install tiktokenÉtape 2 — Compte tes premiers tokens
Chaque modèle utilise un encodage, c'est-à-dire un dictionnaire qui découpe le texte en morceaux : les tokens. Un token n'est pas un mot, c'est souvent un bout de mot. GPT-4 utilise l'encodage cl100k_base. On le charge, puis on compte.
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
texte = "L'intelligence artificielle expliquée aux humains."
tokens = enc.encode(texte)
print(len(tokens)) # 14Notre phrase fait 14 tokens, alors qu'elle ne contient que 6 mots. encode() renvoie la liste des identifiants, decode() fait l'inverse : enc.decode(tokens) redonne exactement la phrase de départ.
Étape 3 — Le piège français
Voici où ça devient intéressant. Compare la même idée en français et en anglais, et le tokenizer te raconte une histoire : il a été entraîné sur un corpus très majoritairement anglophone. Les lettres accentuées cassent les regroupements de lettres qu'il sait faire en anglais. Résultat, le français coûte plus de tokens à contenu égal.
enc.encode("expliquée") # 3 tokens
enc.encode("explained") # 1 token
enc.encode("développement") # 5 tokens
enc.encode("development") # 1 tokenLe mot développement explose en 5 tokens, quand son équivalent anglais n'en demande qu'un seul. À l'échelle d'une phrase complète, l'écart se confirme : notre phrase de l'étape 2 fait 14 tokens en français, et 7 en anglais. Retiens ce chiffre : à contenu égal, le français consomme environ deux fois plus de tokens que l'anglais. Ce n'est pas un bug, ce n'est pas négociable, c'est mécanique. Si tu traites beaucoup de texte en français, tu paies le double, point.
Étape 4 — Estime le coût d'un prompt
Une fois le nombre de tokens connu, le coût est une simple règle de trois. Les fournisseurs affichent un prix au million de tokens, séparé entre l'entrée (ton prompt) et la sortie (la réponse). Voici une fonction qui estime les deux.
import tiktoken
def cout_estime(prompt: str, reponse: str, prix_in: float, prix_out: float) -> float:
enc = tiktoken.get_encoding("cl100k_base")
tokens_in = len(enc.encode(prompt))
tokens_out = len(enc.encode(reponse))
return (tokens_in * prix_in + tokens_out * prix_out) / 1_000_000
prompt = "Explique-moi ce qu'est un token en une phrase."
reponse = "Un token est un morceau de texte, souvent plus petit qu'un mot, que le modèle lit puis facture."
cout = cout_estime(prompt, reponse, 2.5, 10.0)
print(f"Coût estimé : {cout:.6f} $")Les prix varient selon les modèles et les fournisseurs : 2,5 dollars le million de tokens en entrée et 10 dollars en sortie, c'est l'ordre de grandeur de GPT-4o au moment où j'écris. Vérifie la grille tarifaire du modèle que tu utilises et remplace les valeurs. L'important, c'est que tu peux désormais chiffrer un prompt avant de l'envoyer, et même comparer deux formulations : la moins verbeuse est souvent la moins chère.
Étape 5 — Coupe une conversation pour tenir dans le contexte
Deuxième usage indispensable : la fenêtre de contexte. Un modèle accepte un nombre maximal de tokens (128 000 pour GPT-4o). Si tu lui envoies un historique trop long, l'API renvoie une erreur. Plutôt que de la laisser exploser, coupe proprement en gardant les derniers messages, les plus récents.
import tiktoken
def tronquer(historique: list[str], limite: int = 100_000) -> list[str]:
enc = tiktoken.get_encoding("cl100k_base")
total, gardes = 0, []
for message in reversed(historique):
total += len(enc.encode(message))
if total > limite:
break
gardes.append(message)
return list(reversed(gardes))On parcourt l'historique à l'envers, on accumule les tokens et on s'arrête dès qu'on dépasse la limite. Les messages les plus anciens sautent, les plus récents restent. Tu gardes ainsi une marge sous le plafond pour laisser de la place à la réponse.
Étape 6 — Choisir le bon encodage
Pour être certain de compter exactement comme le modèle lui-même, ne devine pas l'encodage : demande-le. Chaque modèle est associé à son encodage, et tiktoken fait la correspondance pour toi.
tiktoken.encoding_for_model("gpt-4") # cl100k_base
tiktoken.encoding_for_model("gpt-4o") # o200k_basegpt-4 et gpt-3.5-turbo utilisent cl100k_base. Les modèles plus récents comme gpt-4o et o3 passent sur o200k_base. Si tu cibles un modèle précis, utilise encoding_for_model() plutôt que de taper le nom à la main : tu ne te tromperas jamais de dictionnaire.
Conclusion
Compter ses tokens, c'est la première ligne de défense contre les factures surprises et les erreurs de contexte. Avec tiktoken, le calcul se fait en local, sans un seul appel à l'API, et tu sais ce que tu envoies avant d'appuyer sur Entrée. Le français coûte plus cher en tokens que l'anglais, c'est un fait mécanique : maintenant, au moins, tu peux le mesurer, l'anticiper, et adapter tes prompts en conséquence.






