Métriques de latence AI API : TTFT, première réponse et vitesse
Guide par timeline pour distinguer headers upstream, premier SSE event, première réponse effective, texte visible, latence totale et vitesse.
La latence d’une AI API n’est pas un chiffre unique. Pour une requête streaming, il faut distinguer l’arrivée des headers upstream, le premier SSE event non vide, le premier contenu ou Action utile, le premier texte visible et la fin de la réponse. Ces étapes répondent à des questions différentes et ne doivent pas toutes s’appeler « TTFT ».
Dans un chat textuel, Time to First Visible Text représente généralement l’expérience utilisateur. Dans un workflow de reasoning ou de Tools, des Function Arguments peuvent constituer une sortie effective plus tôt. La vitesse de génération se mesure après le début de la sortie.
Construire une timeline avant de nommer la métrique
Utilisez une horloge monotone et un seul point d’origine :
t0 le gateway reçoit la requête
t1 il démarre la requête upstream
t2 les headers upstream arrivent
t3 premier SSE event non vide
t4 premier contenu ou Action effectif
t5 premier Text Delta visible
t6 le body upstream se termine ou se ferme
t7 le handler gateway se termine
Tous les jalons n’existent pas pour chaque requête. Une valeur absente doit rester absente, pas devenir zéro.
| Champ | Mesure | Limite importante |
|---|---|---|
auth_ms |
Authentification | Phase locale |
distribution_ms |
Sélection de route | Phase locale |
body_read_ms |
Lecture du request body | Révèle un upload lent |
upstream_headers_ms |
Début upstream à headers | Origine différente du receipt gateway |
first_sse_event_ms |
Receipt à premier event | Peut ne contenir que metadata |
first_response_ms |
Receipt à contenu ou Action utile | Texte, reasoning, Function Arguments |
first_text_delta_ms |
Receipt à texte visible | Peut être absent |
upstream_done_ms |
Receipt à fermeture upstream | Une fermeture n’est pas toujours un succès |
total_handler_ms |
Receipt à fin du relay | Approximation E2E gateway |
visible_output_tps |
Tokens / fenêtre visible | Diagnostic utilisateur, pas TPS système |
Ne soustrayez pas des durées qui n’ont pas la même origine.
TTFT possède plusieurs sens pratiques
Le guide NVIDIA NIM inclut généralement réseau, queue et prompt prefill dans TTFT et exclut les réponses initiales vides. Un stream moderne peut émettre avant le texte : metadata, reasoning, Function Arguments, Tool Input ou heartbeat.
| Nom | Définition recommandée | Usage |
|---|---|---|
| Time to Headers | Début à headers upstream | Réseau et admission |
| Time to First Event | Début à premier SSE non vide | Transport uniquement |
| Time to First Effective Response | Début à contenu ou Action utile | Agents et reasoning |
| Time to First Visible Text | Début à texte affichable | Expérience chat |
Un graphique « TTFT » doit documenter la définition choisie.
Séparer réactivité et vitesse de génération
end_to_end_latency = final_response_time - request_start_time
visible_generation_window = final_response_time - first_visible_text_time
visible_output_tps = output_tokens / visible_generation_window_seconds
Inter-token Latency exclut TTFT et divise généralement le temps restant par output_tokens - 1. Ne comptez pas les SSE events comme des tokens : un event peut en contenir zéro ou plusieurs.
Un texte rapide avec peu de TPS démarre bien puis ralentit ; un texte tardif avec beaucoup de TPS semble bloqué puis finit vite. TPS par utilisateur et throughput agrégé sont également différents.
Reasoning et Tools peuvent précéder le texte
En texte pur, first_response_ms et first_text_delta_ms sont proches. Des Function Arguments à 1,8 s et du texte à 6,4 s indiquent une Action utile précoce mais aucune prose visible avant 6,4 s.
- un terminal agent peut mesurer First Effective Action ;
- une UI textuelle doit mesurer First Visible Text ;
- une Tool API peut ne jamais produire de texte ;
- un SSE envelope précoce prouve la connexion, pas un progrès utile.
Le guide AI API Streaming couvre parsing, Cancellation et Idle Timeout. Les métriques doivent suivre les limites du parser.
Diagnostiquer les étapes dans un ordre fixe
| Symptôme | Métrique | Vérifier |
|---|---|---|
| Lent avant headers | upstream_headers_ms |
Réseau, admission, queue, route, région |
| Headers rapides, sortie tardive | first_response_ms |
Queue modèle, prefill, reasoning, inflight |
| Event rapide, sortie tardive | Gap SSE→Response | Metadata, heartbeat, démarrage reasoning |
| Action rapide, texte tardif | Gap Response→Text | Tool/reasoning, composition |
| Texte rapide, génération lente | visible_output_tps |
Decode, contention, long contexte |
| Upstream normal | Champs locaux | Auth, policy, upload client |
Aucune métrique ne prouve seule la cause. Route, région, fournisseur et charge doivent être combinés.
Lire trois traces synthétiques
Trace A : attente des headers
| Métrique | Valeur |
|---|---|
upstream_headers_ms |
6 100 ms |
first_response_ms |
6 350 ms |
first_text_delta_ms |
6 400 ms |
total_handler_ms |
9 200 ms |
visible_output_tps |
42 |
La majorité de l’attente précède les headers. Examinez route, admission, réseau, région et charge avant l’interface.
Trace B : Action avant texte visible
| Métrique | Valeur |
|---|---|
upstream_headers_ms |
240 ms |
first_response_ms |
2 900 ms |
first_text_delta_ms |
8 700 ms |
total_handler_ms |
10 200 ms |
visible_output_tps |
55 |
Une Action existe à 2,9 s mais le texte attend encore 5,8 s. Inspectez reasoning ou Tools ; allonger le header timeout ne corrige rien.
Trace C : début rapide, génération lente
| Métrique | Valeur |
|---|---|
upstream_headers_ms |
260 ms |
first_response_ms |
420 ms |
first_text_delta_ms |
430 ms |
total_handler_ms |
20 430 ms |
visible_output_tps |
9,8 |
Le texte arrive vite mais la génération dure près de 20 s. Comparez longueur, contexte, channel, inflight et fournisseur. Un first-output timeout ne détecte pas ce cas.
Comparer uniquement dans des conditions contrôlées
Enregistrez modèle et route, distributions de tokens, streaming, reasoning effort, Tools, région, Network Path, concurrency, sampling, Max Output, warmup, retry policy, échantillon et méthode de percentile.
Comparez p50, p95 et p99, pas une moyenne isolée. Gardez timeouts et erreurs visibles. Des prompts, longueurs ou concurrences différentes ne forment pas un classement de vitesse de modèles.
Conserver la metadata, pas le contenu
Request ID, timestamp, model, group, channel reference, status, token counts, timing fields, event counts, inflight, région approximative et classificateur comme upstream_headers_slow suffisent souvent.
Prompts, réponses, API Keys et identités en clair ne sont pas nécessaires. Appliquez rétention et Access Control à la metadata.
Commencez par la timeline, utilisez Reliable AI API Routing pour comparer les Attempts et AI API Error Troubleshooting pour relier le statut final. On sépare ainsi admission, model startup, reasoning/Tools, génération visible et overhead local.