Quando uma chamada em streaming se comporta mal, o que você tem é um muro de linhas de evento e dados, e as três coisas que você quer saber estão espalhadas por ele: o que o modelo realmente disse, por que parou e o que consumiu. O texto chega em fragmentos, os argumentos de ferramenta chegam como JSON parcial que só analisa quando a última peça cai, e o uso fica dividido entre o primeiro evento e o último. Isto remonta tudo. Os dois formatos comuns de stream são tratados, porque na prática as pessoas colam ambos, e eventos que não analisam são relatados em vez de pulados em silêncio.
Recursos
Texto remontado a partir dos deltas, na ordem
Argumentos de ferramenta reconstruídos de JSON parcial e formatados
Motivo de parada, modelo e uso extraídos
Trata tanto o formato de blocos quanto o de choices/delta
Linhas data repetidas unidas como a especificação exige
Comentários de keep-alive ignorados em vez de contados como eventos
Eventos de erro mostrados em vez de pulados
Cada evento expansível, com contagem por nome
Como usar Visualizador de streams SSE
Cole o stream cru
Leia o texto remontado
Confira o motivo de parada e o uso
Expanda eventos específicos se algo ainda não se explicar
Exemplo
Entrada
delta: {"type":"text_delta","text":"Order 4471 "}
Saída
Order 4471 shipped on 30 August.
Fragmentos espalhados por seis eventos, remontados na ordem.
Erros comuns e solução de problemas
Nenhum texto sai. — O stream pode ter terminado antes de haver conteúdo: veja a lista de eventos e o motivo de parada. Uma recusa ou um evento de erro produzem um stream válido e vazio.
Argumentos de ferramenta saem truncados. — Eles chegam como JSON parcial em vários eventos. Se o stream foi cortado, o JSON nunca fecha, e o fragmento cru é mostrado em vez de uma análise.
Alguns eventos não analisam. — Costuma ser um stream cortado no meio de um evento na hora de copiar. Esses são relatados com o índice em vez de descartados.
Os números de uso parecem incompletos. — Eles ficam divididos pelo stream: tokens de entrada no começo, de saída no fim. Um stream sem os eventos finais está sem metade deles.
Perguntas frequentes
O que são server-sent events?
Um formato de streaming simples: linhas de campo e valor, com eventos separados por linhas em branco. É o que as respostas de API em streaming usam, e por isso uma chamada que falha deixa você com um muro deles.
Que formatos de stream são aceitos?
O de blocos, em que o texto chega como deltas tipados dentro de blocos de conteúdo, e o de choices/delta. Ambos são reconhecidos automaticamente, já que as pessoas colam o que o cliente delas registrou.
Por que os argumentos vêm em pedaços?
Eles são transmitidos como JSON parcial para o cliente poder começar a renderizar antes de a chamada estar completa. Isso significa que os fragmentos só analisam quando o último chega, e por isso um stream truncado deixa JSON inválido.
Consigo ver quanto custou?
O bloco de uso é extraído quando está presente, leituras de cache incluídas. Ele diz o que a chamada consumiu; daí em diante entram as ferramentas de custo.
O stream é enviado a algum lugar?
Não. Um stream contém a resposta inteira e muitas vezes o prompt que a produziu, e toda a análise acontece no navegador.