Métricas de latência de AI API: TTFT, primeira resposta e velocidade

Guia por timeline para separar Headers upstream, primeiro SSE Event, primeira resposta efetiva, texto visível, latência total e velocidade.

A latência de uma AI API não é um único número. Em streaming, registre a chegada dos Headers upstream, o primeiro SSE Event não vazio, o primeiro conteúdo ou Action efetiva, o primeiro texto visível e a conclusão. Esses marcos respondem a perguntas diferentes e não devem ser chamados todos de “TTFT”.

Em chat de texto, Time to First Visible Text costuma representar a experiência do usuário. Em workflow de reasoning ou Tools, Function Arguments podem ser o primeiro resultado efetivo. Generation Speed é uma medida separada após a saída começar.

Construa uma timeline antes de nomear métricas

Use Clock monotônico e uma única origem:

t0  gateway recebe request
t1  inicia request upstream
t2  chegam Headers upstream
t3  primeiro SSE Event não vazio
t4  primeiro conteúdo ou Action efetiva
t5  primeiro Text Delta visível
t6  upstream Body termina ou fecha
t7  handler do gateway termina

Nem todo request possui todos os marcos. Valor ausente deve permanecer ausente, não virar zero.

Campo Medição Limite importante
auth_ms Autenticação Fase local
distribution_ms Seleção de canal e routing Fase local
body_read_ms Leitura do request body Detecta upload lento
upstream_headers_ms Upstream Start até Headers Origem diferente do gateway receipt
first_sse_event_ms Receipt até primeiro Event Pode conter só metadata
first_response_ms Receipt até conteúdo ou Action Texto, reasoning, Function Arguments
first_text_delta_ms Receipt até texto visível Pode não existir
upstream_done_ms Receipt até fechamento upstream Fechamento não é sempre sucesso
total_handler_ms Receipt até fim do relay E2E do gateway
visible_output_tps Tokens / janela visível Diagnóstico por usuário, não TPS global

Não subtraia durações com origens diferentes.

TTFT tem mais de um significado

O guia de benchmark NVIDIA NIM inclui geralmente rede, queue e prompt prefill no TTFT e exclui respostas iniciais vazias. Streams modernos podem emitir antes do texto: metadata, reasoning, Function Arguments, Tool Input ou heartbeat.

Nome Definição recomendada Uso
Time to Headers Início até Headers upstream Rede e admission
Time to First Event Início até SSE não vazio Liveness do transporte
Time to First Effective Response Início até conteúdo ou Action útil Agents e reasoning
Time to First Visible Text Início até texto renderizável Experiência de chat

Um dashboard com “TTFT” deve dizer qual definição usa.

Separe responsividade e velocidade de geração

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 exclui TTFT e normalmente divide o restante por output_tokens - 1. Não conte SSE Events como Tokens; um Event pode conter zero ou vários.

Texto inicial rápido com TPS baixo começa bem e fica lento; texto tardio com TPS alto parece travado e termina rápido. TPS por usuário e Throughput agregado também diferem.

Reasoning e Tools podem vir antes do texto

Em texto puro, first_response_ms e first_text_delta_ms ficam próximos. Function Arguments em 1,8 s e texto em 6,4 s significam que existe uma Action útil antes da prosa visível.

  • terminal agent pode medir First Effective Action;
  • UI só de texto deve medir First Visible Text;
  • Tool API pode não produzir texto;
  • SSE Envelope precoce prova conexão, não progresso útil.

O guia AI API Streaming cobre parsing, Cancellation e Idle Timeout. As métricas devem seguir o limite do parser.

Diagnostique fases em ordem fixa

Sintoma Métrica Verificar
Lento antes dos Headers upstream_headers_ms Rede, admission, queue, rota, região
Headers rápidos, saída tardia first_response_ms Model Queue, prefill, reasoning, inflight
Event rápido, saída tardia Gap SSE→Response Metadata, heartbeat, início de reasoning
Action rápida, texto tardio Gap Response→Text Tool/reasoning, composição
Texto rápido, geração lenta visible_output_tps Decode, contenção, contexto longo
Upstream normal Campos locais Auth, policy, upload

Uma métrica não prova a causa. Combine rota, região, provedor e carga concorrente.

Leia três traces sintéticos

Trace A: espera por Headers

Métrica Valor
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

A espera ocorre antes dos Headers. Verifique rota, admission, rede, região e carga antes da interface.

Trace B: Action antes do texto

Métrica Valor
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

Action efetiva surge em 2,9 s e o texto 5,8 s depois. Investigue reasoning ou Tools; aumentar Header Timeout não ajuda.

Trace C: início rápido, geração lenta

Métrica Valor
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

Texto começa rápido, mas a geração leva quase 20 s. Compare comprimento, contexto, channel, inflight e provedor. First-output Timeout não detecta esse padrão.

Compare apenas em condições controladas

Registre model e route, distribuições de Tokens, streaming, reasoning effort, Tools, região, Network Path, concurrency, sampling, Max Output, warmup, retry policy, amostra e método de percentil.

Compare p50, p95 e p99, não uma média isolada. Mantenha timeouts e erros. Prompts, comprimentos ou concurrency diferentes não formam ranking de velocidade de modelos.

Retenha metadata, não conteúdo

Request ID, timestamp, model, group, channel reference, status, Token Counts, timing fields, event counts, inflight, região aproximada e classificadores como upstream_headers_slow costumam bastar.

Não é necessário guardar prompts, respostas, API Keys ou identidades em texto. Aplique retention e Access Control à metadata.

Comece pela timeline, use Reliable AI API Routing para comparar Attempts e AI API Error Troubleshooting para ligar timing ao status final. Assim é possível separar admission, model startup, reasoning/Tools, geração visível e overhead local.