Streaming ou resposta completa no GPT-6 Astra: qual escolher na sua aplicação?

Streaming no GPT-6 Astra serve pra quem tem gente olhando a tela: o texto aparece em pedaços conforme sai, então a espera pelo primeiro token pesa menos. Resposta completa serve pra script, pipeline e qualquer coisa sem humano esperando, e o front fica bem mais simples. Tem ainda o modo background, que roda assíncrono com polling e aceita ser combinado com streaming. O custo por token é o mesmo nos três, US$ 10,00 por 1M de entrada e US$ 50,00 por 1M de saída, então a escolha é de arquitetura, não de fatura.
Tem decisão que parece detalhe de API e vira experiência do usuário na cara dura
Fala aí, beleza? A OpenAI anunciou o rollout do GPT-6 Astra em 03/09/2026, o novo modelo de topo da linha da casa, e na API ele atende pelo id gpt-6-astra
Aí bate a dúvida na hora de plugar ele no teu produto: tu entrega o texto em pedaços conforme o modelo escreve, ou espera a resposta inteira chegar e mostra de uma vez?
Parece escolha de front, mas mexe em percepção de velocidade, em como tu trata erro no meio da geração e em quanta complexidade tu vai carregar pelo resto da vida do projeto
Bora comparar
O que o GPT-6 Astra suporta hoje:
Antes de escolher, o básico do que está na mesa
O gpt-6-astra suporta streaming, e está disponível tanto na Chat Completions quanto na Responses API
Batch também é suportado, fine-tuning não
Segundo a ficha do modelo no llm-stats, a janela é de 1.050.000 tokens de contexto, com 128.000 tokens de saída máxima
O preço no tier padrão e contexto curto fica assim: US$ 10,00 por 1 milhão de tokens de entrada, US$ 50,00 por 1 milhão de tokens de saída e US$ 1,00 por 1 milhão de tokens de entrada em cache
Repara numa coisa importante: o preço NÃO muda se tu liga ou desliga o streaming
O que muda é onde o tempo aparece pro usuário, e é aí que a comparação começa 🙂
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 114 aulas
- 4 projetos
- 9h 18min
Streaming x resposta completa: comparação lado a lado
Os tempos e as velocidades que aparecem na tabela abaixo não são medição minha, são os números publicados pelo Artificial Analysis pra esse modelo
| Critério | Streaming | Resposta completa | Background |
|---|---|---|---|
| Percepção de velocidade | usuário vê o texto nascendo já no primeiro token | usuário só vê algo quando tudo terminou | ninguém está vendo, então nem entra na conta |
| Espera até a primeira letra | depende do esforço de raciocínio: 2,60s no low, 5,59s no medium, 45,16s no high e 155,16s no xhigh, pelos dados do Artificial Analysis | a mesma espera, só que somada ao tempo de gerar o texto todo | irrelevante, a conexão nem fica aberta |
| Velocidade de geração | mesma coisa nos dois: a casa das dezenas de tokens por segundo, de 53,3 no low a 60,8 no high pelo Artificial Analysis | idem | idem |
| Erro no meio | chega como evento error com type, code, message e sequence_number |
tu descobre no fim, na resposta que não veio | tu descobre no polling do objeto response |
| Complexidade do front | alta: precisa consumir SSE, acumular deltas e montar o texto | baixa: uma requisição, uma resposta | média: precisa de fila de polling e estado |
| Moderação de conteúdo | mais difícil: os scores só chegam depois da saída completa e não vêm nos deltas parciais | mais simples, o texto inteiro já está na mão | texto inteiro na mão no estado terminal |
| Retomada após queda | dá pra retomar com starting_after, dentro do limite de 5 minutos |
não existe retomada, tu refaz a chamada | a geração continua rodando do lado de lá |
| Conexão aberta | sim, o tempo todo | sim, até o fim | não |
Olha os números de espera até o primeiro token de novo, ainda na medição do Artificial Analysis
2,60s no low e 155,16s no xhigh: isso não é a mesma aplicação, é outro universo de UX
Se a tua dor é justamente essa espera antes de qualquer coisa aparecer na tela, dá uma olhada em por que o Astra demora para responder, porque streaming ameniza o sintoma mas não resolve a causa
Qual modo escolher por tipo de interface
Chat com humano esperando na frente da tela:
Streaming, sem pensar muito
Com esforço low ou medium, a primeira palavra sai em poucos segundos e o resto vai desenrolando na casa das dezenas de tokens por segundo
O usuário lê enquanto o modelo escreve, e a espera vira leitura em vez de spinner girando
Script de terminal, cron ou pipeline de dados:
Resposta completa
Não tem ninguém olhando, então mostrar o texto nascendo não entrega valor nenhum, só te obriga a escrever código de acumular delta à toa
E se o volume for grande e o resultado não for pra agora, o gpt-6-astra também suporta Batch
Job em segundo plano dentro do produto:
Modo background, que eu explico logo abaixo
Geração que o usuário dispara e vai fazer outra coisa não combina com conexão aberta esperando
Geração longa, perto do teto de 128.000 tokens de saída:
Aqui mora a pegadinha
Respostas com mais de 5 minutos não podem mais ser transmitidas por streaming, e texto muito longo com esforço alto passa desse tempo com facilidade
Só lembra que subir o esforço de raciocínio não infla só o relógio: infla também os reasoning tokens que tu paga na saída
Pra esse cenário, background é a escolha mais tranquila que ficar rezando pra conexão sobreviver
Como ligar o streaming na Responses API:
Passo a passo curto, só com o que está documentado
- Mande
streamcomotrueno corpo da requisição da Responses API, junto do model id
{
"model": "gpt-6-astra",
"stream": true
}
- Trate a entrega como server-sent events (SSE), e não como um JSON único no fim
O erro comum deste passo é exatamente esse: o time consome a resposta como texto puro, faz um JSON.parse no corpo inteiro e quebra tudo
- Consuma os eventos tipados, que é o jeito da Responses API entregar as coisas
Os mais comuns pra texto são:
response.created
response.output_text.delta
response.completed
error
O response.output_text.delta é o pedaço novo de texto, o response.completed fecha o ciclo
- Acumule os deltas no teu lado e renderize o texto crescendo
Erro comum aqui: tratar cada delta como uma mensagem separada, o que faz o front piscar ou duplicar trecho
- Guarde o
sequence_numberque vem em cada evento
Ele é o cursor da tua posição no stream, e sem ele tu não tem como pedir a continuação depois de uma queda
Quando o stream cai no meio: erro, retomada e limites
Sintoma: a conexão morre no meio da geração e o usuário fica com meio parágrafo na tela
Causa: stream é conexão aberta, e conexão aberta cai (wi-fi ruim, proxy, timeout de load balancer, o que tu imaginar)
Sintoma 2: chega um evento de erro em vez de texto
O evento de erro do streaming tem type sempre igual a error e carrega code, message e sequence_number
Ou seja: dá pra logar o motivo E o ponto exato onde parou, o que é ótimo
Solução: retomar de onde parou, usando starting_after no GET da resposta
GET https://api.openai.com/v1/responses/{response_id}?stream=true&starting_after=N
O N é o último sequence_number que tu recebeu com sucesso
Limite duro, e esse dói: respostas com mais de 5 minutos não podem mais ser transmitida por streaming, então a janela de retomada fecha junto
Se a tua geração é longa, não conta com a retomada como plano A
Bônus do Chat Completions: se tu usa stream_options com include_usage em true, o último chunk pode vir com o array choices vazio
{
"stream_options": { "include_usage": true }
}
Parece bug, não é
O erro comum é o front fazer choices[0] sem checar tamanho e estourar bem no finalzinho, quando tudo já tinha dado certo, haha
Prevenção: guarda sempre o response id e o último sequence_number recebido
São as duas únicas coisas que te salvam depois
Background: a terceira opção que muita gente esquece
O modo background executa a geração de forma assíncrona, sem manter a conexão aberta
Tu dispara, recebe o id da response e vai consultando por polling até chegar num estado terminal
Se você conhece fila de jobs (Sidekiq, Celery, Bull, esses da vida), é a mesma ideia: enfileira e checa depois
E dá pra combinar os dois mundos, background e stream na mesma requisição
{
"model": "gpt-6-astra",
"background": true,
"stream": true,
"store": true
}
Tome cuidado com o store! Em requisições background, a resposta só é retida além do período de polling quando store vem como true explicitamente
Sem isso ela é apagada em cerca de 10 minutos, e aí o teu job assíncrono vira um belo de um 404
Outra coisa que reforça o cinto de segurança: a OpenAI já registrou um incidente em que parte das requisições em modo background da Responses API ficou presa no estado queued, ou seja, o job era aceito mas não avançava pro estado terminal
O registro indica que os serviços impactados se recuperaram totalmente, beleza
Mas serve de lembrete: teu polling precisa de timeout, de retry e de um plano pra quando o estado não muda
Assumir que a resposta sempre chega é a receita pra job pendurado pra sempre
Veredito: quando cada modo compensa
Tem humano olhando a tela? Streaming, e ponto
Não porque fica mais rápido, mas porque a espera vira leitura, e isso é percepção de velocidade de graça
Ninguém olhando? Resposta completa
Menos código, menos estado, menos coisa pra quebrar no front
Coisa longa, ou que o usuário dispara e sai andando? Background com polling bem feito
Agora o trade-off menos óbvio, que quase ninguém coloca na conta na hora de decidir
Streaming dificulta moderar conteúdo em produção
Resposta parcial é mais difícil de avaliar, e os scores de moderação só chegam depois da saída completa, eles não vêm junto dos deltas parciais
Traduzindo: se o teu produto precisa barrar conteúdo ANTES de aparecer pro usuário, o streaming trabalha contra você
E o que não muda entre os três modos: o custo por token
São os mesmos US$ 10,00 por 1M de entrada e US$ 50,00 por 1M de saída em qualquer um deles
Então isso aqui é decisão de arquitetura e de experiência, não de economia
Conclusão
A regra de bolso é boba de tão simples: se tem alguém olhando a tela, streaming; se não tem, resposta completa ou background
O resto é consequência disso, incluindo o tanto de complexidade que tu aceita colocar no front e como tu vai lidar com queda no meio da geração
Antes de fixar a arquitetura, faz o teste: roda a MESMA tarefa nos dois modos e mede duas coisas, tempo até o primeiro token e tempo total até o texto completo
Com esses dois números na frente, a escolha entre streaming e resposta completa deixa de ser opinião e vira decisão
Só não esquece de guardar o response id e o último sequence_number, que é o que te salva quando a conexão resolve morrer 😀
até o próximo post!
Perguntas frequentes
Dá para usar streaming e background ao mesmo tempo no GPT-6 Astra?
Dá sim, a Responses API aceita definir background=true e stream=true juntos na mesma requisição. Isso permite acompanhar os eventos conforme eles saem, sem manter a lógica de espera bloqueante do lado do teu servidor. Mesmo assim, se a conexão cair, valem as mesmas regras de retomada e limite de tempo do streaming comum.
O streaming muda o preço da API do gpt-6-astra?
Não, o preço é o mesmo com streaming ligado ou desligado. No tier padrão e contexto curto fica em US$ 10,00 por 1 milhão de tokens de entrada, US$ 50,00 por 1 milhão de tokens de saída e US$ 1,00 por 1 milhão de tokens de entrada em cache. O que o streaming muda é só onde o tempo de espera aparece pro usuário, não quanto tu paga.
Por quanto tempo dá para retomar um stream que caiu no meio?
O limite é 5 minutos: respostas que passam desse tempo não podem mais ser transmitidas por streaming. Dentro dessa janela, tu retoma com um GET em /v1/responses/{response_id} usando stream=true e starting_after=N, sendo N o sequence_number do último evento recebido. Passou dos 5 minutos, não tem retomada, o jeito é tratar como falha e decidir se refaz a chamada.
Para que serve o stream_options com include_usage no Chat Completions do GPT-6 Astra?
Esse parâmetro faz o Chat Completions mandar as métricas de uso de tokens junto do streaming. Quando ele está ativo, o último chunk da resposta pode vir com o array choices vazio, porque aquele chunk existe só para carregar o usage. É um detalhe que quebra front que assume que todo chunk sempre tem conteúdo em choices.
O streaming do GPT-6 Astra funciona igual na Chat Completions e na Responses API?
As duas suportam streaming, mas a forma de consumir é diferente. Na Responses API a entrega é por eventos tipados via SSE, como response.created, response.output_text.delta, response.completed e error, cada um com sequence_number. O Chat Completions segue seu próprio formato de chunks, e é lá que entra o cuidado com stream_options e o choices vazio no fim.
O que acontece com a resposta em background do GPT-6 Astra se eu não usar store=true?
Sem store=true na requisição, a resposta gerada em modo background é apagada depois de cerca de 10 minutos. Isso significa que se o teu polling demorar mais que isso pra buscar o resultado, ele já não estará mais lá. Pra qualquer job que não vai ser consultado na hora, vale a pena mandar store=true explicitamente.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
GPT-6 Astra ou Gemini: qual modelo usar para código no dia a dia?
GPT-6 Astra ou Gemini: qual escolher para código no dia a dia? Compare preço, limite de saída e casos de uso e veja o veredito sem enrolação.
Como usar o GPT-6 Astra para entender um repositório legado que ninguém documentou
O GPT-6 Astra promete entender repositórios legados sem documentação. Veja o passo a passo com 1 milhão de tokens de contexto e como validar cada resposta.
Por que o GPT-6 Astra demora para responder e o que fazer na sua aplicação
GPT-6 Astra lento? Entenda por que modelos de raciocínio pensam antes de responder e veja como ajustar reasoning.effort, contexto e cache na aplicação.
