Olá,Chat com IA em produção: streaming da OpenAI chega no frontend em bloco único, não token a token. UX quebrada.StackFrontend:
Next.js 14 App Router, Client Component lendo stream via ReadableStream + TextDecoderAuth: Supabase Auth (@supabase/ssr, cookie-based)Proxy: app/api/chat/
route.ts valida sessão e repassa para o ExpressBackend: Express (Node 20) com
openai.chat.completions.create({ stream: true })DB: Supabase Postgres, messages com RLS por user_id. Persistência pelo Express ao fim do
stream.Infra: Docker em VPS. Sem Vercel/nginx/Cloudflare na frente.Já verificadoChunks da OpenAI aparecem nos logs do Express em tempo real. O buffering ocorre depois
entre Express
route handler
client.Hipóteses (responda qual e por quê em 1~2 frases)compression() middleware bufferizando chunked no ExpressRoute handler consumindo o stream (await
res.json()) em vez de new Response(
upstream.body)Headers errados: Content-Length presente ou Transfer-Encoding: chunked ausenteEscopoLocalizar o buffering com curl -N hop a hopCorrigir streaming token-a-token no clientManter persistência no Supabase respeitando RLS (user_id injetado mesmo com service role)Bonus: AbortController para cancelar OpenAI quando client desconectaPR com descrição do que estava bufferizandoFora de escopo: Vercel ai sdk/langchain, refatoração de schema, frontend visual.RequisitosStreaming OpenAI em produçãoApp Router: por que Content-Length mata streaming;
Response.json() vs new Response(stream)Supabase: anon key vs service role, RLS na práticaExpress: por que compression antes de streaming é um problemaOrçamento: USD 50~70. Prazo: 1 dias. Repo + staging SSH após Escrow.
Prazo de Entrega: Não estabelecido