Claude Code, à quelle vitesse ? Les tokens par seconde, mesurés sur 20 000 tours

Claude Code n'affiche jamais sa vitesse de sortie, mais chaque transcription de session contient de quoi la calculer. On a passé un script de 40 lignes sur 319 de nos sessions, 20 408 tours et 12 millions de tokens de sortie : Opus 5 sort à 63 tokens par seconde en médiane, Opus 5.5 à 95, Sonnet 5 à 77, et une réponse courte est toujours plus lente qu'une longue. La méthode, le script, les chiffres, et ce que change le fast mode.

Claude Code te dit beaucoup de choses sur les tokens. /usage montre ce que tu as consommé de la session et de la semaine, le moniteur de session d'AgentsRoom compte les tokens d'entrée, de sortie, les lectures et les écritures de cache tour par tour, et la ligne de statut peut afficher la part de la fenêtre de contexte utilisée. Aucun d'eux n'imprime le chiffre que les gens cherchent : combien de tokens par seconde le modèle produit vraiment pendant que tu attends.

Le chiffre n'est pas caché, il n'est juste jamais calculé. Chaque message de chaque session atterrit dans une transcription JSONL sous ~/.claude/projects/, et chaque message de l'assistant porte un horodatage et sa consommation de tokens. Alors on l'a calculé, sur notre propre machine, sur les quatre dernières semaines. Voici la méthode, le script, et ce qui en est sorti.

D'où viennent les données

Claude Code écrit un fichier par session dans ~/.claude/projects/<project slug>/<session id>.jsonl. Une ligne par événement. Les lignes qui comptent ici sont les messages de l'assistant, et chacun ressemble à ceci une fois qu'on ne garde que les champs utiles :

{
  "type": "assistant",
  "uuid": "24d13076-…",
  "parentUuid": "d4447285-…",
  "requestId": "req_011CepWq…",
  "timestamp": "2026-09-07T18:00:08.412Z",
  "message": {
    "model": "claude-opus-5",
    "usage": {
      "input_tokens": 2,
      "cache_read_input_tokens": 0,
      "cache_creation_input_tokens": 51591,
      "output_tokens": 200,
      "output_tokens_details": { "thinking_tokens": 0 },
      "speed": "standard"
    }
  }
}

Quatre choses rendent la mesure possible :

  • timestamp est écrit au moment où le bloc de contenu est ajouté, donc le dernier bloc d'un tour est daté de la fin du flux.
  • parentUuid pointe sur la ligne juste avant, le message de l'utilisateur ou le résultat d'outil auquel le modèle répondait. Son horodatage est le moment où la requête est partie.
  • requestId regroupe les blocs d'un même appel d'API. Un tour qui écrit du texte puis appelle un outil produit deux lignes assistant avec le même requestId et le même usage : les tokens se comptent une fois par requête, pas une fois par ligne.
  • usage.output_tokens est la sortie totale de la requête, réflexion comprise ; output_tokens_details.thinking_tokens dit quelle part était de la réflexion.

Rien dans le fichier ne donne le temps jusqu'au premier token. Ce qu'on peut mesurer, c'est le tour entier : du départ de la requête à l'arrivée du dernier token. C'est aussi le seul chiffre que tu ressens en attendant, donc c'est celui qu'on a gardé.

La méthode

Pour chaque requestId : prendre la première et la dernière ligne assistant qui le portent, lire le usage sur la première, retrouver le parent de la première ligne, et diviser les tokens de sortie par les secondes entre l'horodatage du parent et celui de la dernière ligne. Puis regarder la distribution par modèle, jamais une moyenne unique, parce qu'un tour de 40 secondes et un tour de 2 secondes ne sont pas le même objet.

On a écarté les tours sans token de sortie, les tours à durée négative ou nulle (une session reprise peut avoir un parent daté après son enfant) et les tours de plus de quinze minutes, qui sont des sessions interrompues et non de longues réponses. Rien d'autre n'a été filtré.

Le script fait 40 lignes de Python sans dépendance. Lance-le de n'importe où : il lit tous les projets de la machine.

import json, glob, os, statistics as st
from datetime import datetime
from collections import defaultdict

def ts(s): return datetime.fromisoformat(s.replace("Z", "+00:00")).timestamp()

turns = []
for path in glob.glob(os.path.expanduser("~/.claude/projects/*/*.jsonl")):
    by_uuid, groups, order = {}, {}, []
    with open(path) as fh:
        for line in fh:
            try: o = json.loads(line)
            except ValueError: continue
            if "uuid" in o: by_uuid[o["uuid"]] = o
            msg = o.get("message") or {}
            if o.get("type") == "assistant" and msg.get("usage") and o.get("timestamp"):
                rid = o.get("requestId") or o["uuid"]
                if rid not in groups: groups[rid] = []; order.append(rid)
                groups[rid].append(o)
    for rid in order:
        first, last = groups[rid][0], groups[rid][-1]
        out = first["message"]["usage"].get("output_tokens", 0)
        parent = by_uuid.get(first.get("parentUuid"))
        if not parent or not parent.get("timestamp") or out <= 0: continue
        dur = ts(last["timestamp"]) - ts(parent["timestamp"])
        if 0 < dur <= 900:
            turns.append((first["message"].get("model"), out, dur))

by_model = defaultdict(list)
for model, out, dur in turns: by_model[model].append((out, dur))
for model, rows in sorted(by_model.items(), key=lambda kv: -len(kv[1])):
    rates = [o / d for o, d in rows]
    print(f"{model:18s} turns={len(rows):6d} median={st.median(rates):5.1f} tok/s "
          f"weighted={sum(o for o, _ in rows) / sum(d for _, d in rows):5.1f} tok/s")

La colonne weighted est le total des tokens divisé par le total des secondes. C'est ce que vit un long run autonome ; la médiane est ce que vit un tour interactif.

Les chiffres

Un Mac en France, 319 transcriptions, 20 408 tours entre le 27 août et le 25 septembre 2026, 12,0 millions de tokens de sortie produits en 45 heures de génération. Vitesse standard sur chaque tour (voir le fast mode plus bas). Cinq modèles apparaissent dans les transcriptions, sous les noms que Claude Code écrit.

ModèleToursMédiane tok/s25e au 75e centiletok/s pondérés
Opus 516 70862,751,5 à 71,869,8
Opus 5.51 10294,980,9 à 109,0109,3
Sonnet 542677,062,6 à 91,587,0
Fable 5.12 07075,166,1 à 82,980,0
Opus 4.810260,949,1 à 66,564,2

Deux lectures avant tout le reste. D'abord, Opus 5.5 n'est pas un peu plus rapide qu'Opus 5 : il fait moitié plus sur la médiane et 57 % de mieux sur le chiffre pondéré, avec une part bien plus grande de tours longs. Ensuite, l'écart à l'intérieur d'un modèle est plus large que l'écart entre modèles : un tour d'Opus 5 au 25e centile sort à 51 tokens par seconde, un tour au 75e à 72. La raison, c'est la taille du tour, et elle mérite sa propre section.

Une réponse courte est toujours plus lente

Revoici Opus 5, découpé par le nombre de tokens de sortie du tour :

Tokens de sortie du tourToursMédiane tok/sDurée médiane
1 à 991 85442,11,9 s
100 à 49910 74360,63,4 s
500 à 1 9993 51272,811,1 s
2 000 et plus59978,438,8 s

Même modèle, même mois, même machine, et le débit double entre une réponse d'une ligne et une longue. Le modèle ne sort pas plus vite sur les tours longs. Chaque tour paie un coût fixe avant que le premier token n'apparaisse : la requête part, le prompt est traité, le flux démarre. Sur un tour de 80 tokens, ce coût pèse un tiers du temps écoulé ; sur un tour de 3 000 tokens, il disparaît dans le bruit.

Une régression linéaire de la durée sur les tokens de sortie sépare les deux. La pente donne la vitesse de flux, l'ordonnée à l'origine donne le coût fixe :

ModèleCoût fixe par tourVitesse de flux
Opus 51,03 s81,6 tok/s
Opus 5.51,10 s148,9 tok/s
Sonnet 50,45 s94,9 tok/s
Fable 5.10,99 s84,8 tok/s
Opus 4.81,40 s69,9 tok/s

Donc quand une session pleine d'appels d'outils paraît lente, ce n'est presque jamais le débit du modèle. C'est le nombre de tours. Un agent qui lit douze fichiers un par un paie douze coûts fixes ; le même agent qui les lit en un seul appel groupé n'en paie qu'un. C'est la même leçon que pour réduire les coûts en tokens : moins de tours, plus gros, pas un modèle plus rapide.

Le plus long tour du corpus fait 21 332 tokens de sortie en 236 secondes sur Opus 5, soit 90 tokens par seconde de bout en bout : une fois le coût fixe amorti, c'est le plafond qu'on a observé sur ce modèle à la vitesse standard.

Les tokens de réflexion sont des tokens de sortie

output_tokens inclut la réflexion que fait le modèle avant de répondre, et output_tokens_details.thinking_tokens dit combien. Dans notre corpus, la réflexion représente 30 % de tout ce qu'Opus 5 a produit, 18 % pour Opus 5.5, 36 % pour Fable 5.1, et 54 % pour Sonnet 5, qu'on a surtout fait tourner avec un niveau de réflexion élevé sur des tâches de relecture.

Ça compte pour lire un tour lent. Un tour qui réfléchit huit secondes et imprime deux lignes n'est pas un modèle lent, c'est un tour qui a produit 600 tokens que tu n'as jamais vus. Les tours avec réflexion sont, par token, légèrement plus rapides que les tours sans : 67 contre 57 tokens par seconde sur Opus 5, parce qu'ils sont plus longs et amortissent mieux le coût fixe. Si une session paraît molle et que tu n'as pas besoin du raisonnement, le levier, c'est le niveau de réflexion, pas le modèle.

Les lectures de cache changent la facture, pas le débit

Presque chaque tour de Claude Code touche le cache de prompt : seuls 130 des 16 680 tours d'Opus 5 avaient cache_read_input_tokens à zéro, et ce sont les premiers tours d'une session. Sur les tours de 100 à 500 tokens de sortie, les tours en cache sortent à 60,6 tokens par seconde en médiane et prennent 3,4 secondes ; les tours hors cache sortent à 58,0 et prennent 3,7 secondes. La différence est réelle mais petite, et elle se loge dans le coût fixe, pas dans la vitesse de flux. Le cache, c'est le prix du contexte que tu transportes, et c'est pour ça que le compteur de tokens du terminal AgentsRoom affiche les lectures et les écritures de cache comme deux chiffres séparés.

Stable sur le mois

Un chiffre cumulé peut cacher une dérive, donc on a aussi regardé la médiane hebdomadaire d'Opus 5 sur les tours de 100 à 500 tokens, les plus fréquents : 63,6, 64,1, 60,9, 61,7, 56,9 tokens par seconde semaine après semaine, puis 68,7 sur la dernière semaine, incomplète. Entre 57 et 69, pas de tendance. Si tes sessions paraissent plus lentes un après-midi, ça vaut le coup de lancer le script sur cette seule journée avant d'accuser le modèle.

Ce que change le fast mode, et ce qu'on n'a pas pu mesurer

Chaque bloc usage porte un champ speed, et les 20 408 nôtres disent standard. Anthropic documente un fast mode pour Claude Opus, activé avec /fast dans le CLI ou "fastMode": true dans les réglages utilisateur, qui rend le modèle jusqu'à 2,5 fois plus rapide à un prix par token plus élevé : 8 dollars par million de tokens d'entrée et 40 par million de tokens de sortie sur Opus 5.5, 10 et 50 sur Opus 5 et Opus 4.8. Sur les forfaits Pro et Max, il est facturé sur les crédits d'usage, hors des fenêtres de l'abonnement ; Sonnet et Haiku ne le supportent pas, et l'activer te bascule sur Opus. Une icône éclair à côté du prompt dit qu'il est actif.

On ne l'a pas payé, donc on n'a pas de chiffre mesuré à mettre à côté des 2,5 fois documentés. Si tu le fais tourner, le même script te dit ce que tu as obtenu : filtre les tours sur usage["speed"] == "fast" et compare les médianes. Envoie-nous les chiffres.

Ce que ça change dans notre façon de faire tourner des agents

Trois choses, aucune ne consiste à choisir un modèle plus rapide.

La première concerne les attentes. Si un run de nuit de sept agents produit deux millions de tokens de sortie, ça fait huit heures de génération à 70 tokens par seconde, réparties entre des agents qui tournent en parallèle. Connaître le débit, c'est ce qui permet de dire si une tâche planifiée peut finir avant que la suivante ne démarre.

La deuxième concerne les tours. La seconde fixe par tour est la même sur une confirmation de 30 tokens et sur un diff de 3 000 tokens. Les agents qui demandent avant chaque petite étape, ou qui lisent les fichiers un par un, passent leur temps dans cette seconde. C'est pour ça qu'on écrit « groupe tes lectures indépendantes » dans les prompts des agents qui tournent sans surveillance.

La troisième concerne ce que le compteur devrait montrer. Le moniteur de session d'AgentsRoom affiche les tokens et le cache, et passe au rouge quand une session devient lourde ; il n'affiche pas de débit, et après cette mesure on n'est pas sûrs qu'il le devrait. Un débit est une propriété du modèle et de la taille du tour, pas de la session, et le chiffre dont un développeur a besoin est celui des tableaux ci-dessus. C'est pour ça que c'est un article et pas un widget.

Questions fréquentes

Combien de tokens par seconde Claude Code produit-il ?

Sur nos 20 408 tours enregistrés entre le 27 août et le 25 septembre 2026 : Opus 5 fait 63 tokens de sortie par seconde en médiane (69 si on divise tous les tokens par toutes les secondes), Opus 5.5 95 (109), Sonnet 5 77 (87), Fable 5.1 75 (80) et Opus 4.8 61 (64). Ces chiffres comptent le tour entier, du départ de la requête jusqu'au dernier token reçu : c'est ce que tu attends réellement.

Est-ce que /usage ou /cost affichent les tokens par seconde ?

Non. /usage montre le quota du forfait, les fenêtres de 5 heures et hebdomadaire et la part de la fenêtre de contexte utilisée ; /cost est un alias de /usage. Aucun des deux n'imprime un débit. Le seul endroit où la vitesse existe, c'est la transcription de session sous ~/.claude/projects/, où chaque message de l'assistant porte un horodatage et son nombre de tokens de sortie. C'est ce que lit le script de cet article.

Pourquoi une réponse courte paraît-elle plus lente qu'une longue ?

Parce que chaque tour paie un coût fixe avant l'arrivée du premier token : l'envoi de la requête, le traitement du prompt, le démarrage du flux. Dans nos données, ce coût est d'environ une seconde sur Opus 5 et Opus 5.5 et d'une demi-seconde sur Sonnet 5. Sur une réponse de 80 tokens, une seconde représente un tiers du tour, donc le débit mesuré tombe à 40 tokens par seconde ; sur une réponse de 3 000 tokens, la même seconde disparaît et le débit monte à 80 ou plus. La vitesse de flux elle-même ne bouge pas.

Les tokens de réflexion comptent-ils dans la vitesse ?

Oui. Le bloc usage de chaque message rapporte output_tokens avec un détail output_tokens_details.thinking_tokens, et les tokens de réflexion font partie d'output_tokens. Dans notre corpus, ils représentent 30 % de tout ce qu'Opus 5 a produit, 18 % pour Opus 5.5 et 54 % pour Sonnet 5, qui a surtout tourné avec un niveau de réflexion élevé. Un tour qui réfléchit longtemps n'est pas lent : il produit des tokens que tu ne vois pas.

Le cache de prompt rend-il Claude Code plus rapide ?

Pas le débit de sortie. Sur les tours de 100 à 500 tokens, Opus 5 sort à 60,6 tokens par seconde en médiane quand la requête touche le cache de prompt et à 58,0 quand elle ne le touche pas, et le tour entier prend 3,4 secondes contre 3,7. Le cache joue sur ce que tu paies pour le contexte, pas sur la vitesse à laquelle la réponse sort.

Qu'est-ce que le fast mode de Claude Code, et combien de fois plus vite va-t-il ?

Une configuration de Claude Opus qu'Anthropic documente comme jusqu'à 2,5 fois plus rapide, à un prix par token plus élevé : 8 dollars par million de tokens d'entrée et 40 par million de tokens de sortie sur Opus 5.5, 10 et 50 sur Opus 5 et Opus 4.8, facturés sur les crédits d'usage et non sur les fenêtres de l'abonnement. On l'active avec /fast, et une petite icône éclair apparaît à côté du prompt. Aucun des 20 408 tours mesurés n'a tourné en fast mode (toutes les transcriptions disent speed: standard), donc nous n'avons pas de chiffre mesuré pour lui ; les chiffres de cet article sont à la vitesse standard.

Télécharger AgentsRoom

Lancez tous vos agents IA, sur tous vos projets, depuis une seule fenêtre.

GratuitTélécharger AgentsRoom

App companion : suivez vos agents en déplacement

Utilisez Claude, Codex, Antigravity CLI ou un autre fournisseur IA.

Installer l'extension
Chrome Web Store

Remontez bugs et demandes directement dans votre backlog public.

Multi-projets
Multi-provider
Multi-agents
Statut en direct
Diff & commit
App mobile
Aperçu live
Équipes d'agents
Tests navigateur
Dev pilotée par backlog
Bibliothèque de prompts
Bibliothèque de skills
Voir toutes les fonctionnalités

Continuer la lecture