import { openai } from '@ai-sdk/openai';
import { streamText } from 'ai';
export const maxDuration = 30;
export async function POST(req: Request) {
const { messages } = await req.json();
const result = streamText({
model: openai('gpt-4o-mini'),
messages,
system: 'Ești un asistent tehnic util și la obiect.',
});
return result.toDataStreamResponse();
}Am trecut recent un proiect de SaaS de la un request clasic await openai.chat.completions.create() la streaming direct prin Vercel AI SDK. Rezultatul? Userii nu mai dau refresh de disperare, iar timpul până la primul token afișat pe ecran a scăzut de la 4.2 secunde la doar ~280ms.
Când construiești interfețe cu LLM-uri, latența e cel mai mare inamic al UX-ului. Până nu pui streaming, aplicația pare pur și simplu blocată.
De ce te ajută SSE și de ce nu facem REST normal
Până acum, fluxul clasic era așa: frontend-ul trimite un POST, Next.js se roagă de API-ul OpenAI, OpenAI procesează tot prompt-ul, returnează JSON-ul uriaș, iar serverul tău îl trimite înapoi la client. Dacă promptul cerea un răspuns lung de 1000 de tokeni, userul se uita la un spinner obosit timp de 5-8 secunde.
Cu Server-Sent Events (SSE), conexiunea HTTP rămâne deschisă. Serverul trimite chunk-uri mici de text imediat ce le primește de la furnizorul de LLM. E ca un robinet picurător, doar că picăturile sunt cuvinte care apar instant pe ecran.
Unde intervine Vercel AI SDK și useChat
Dacă vrei să scrii tu manual parserul de SSE pe frontend cu EventSource sau ReadableStream, te prinde miezul nopții depanând edge case-uri: ce faci când pică conexiunea, cum păstrezi istoricul mesajelor, cum gestionezi starea de loading sau erorile de rate limit?
Aici te salvează pachetul ai. Cu hook-ul useChat, tot stadiul chat-ului se reduce la câteva linii de cod pe client. El gestionează automat trimiterea mesajului curent, append-ul în UI în timp real și optimizările de re-render.
Trade-off-uri reale: Când devine complicat
Sună totul roz, dar am dat de câteva ziduri când am scalat aplicația pe la 10k conversații pe zi:
- Edge vs Node Runtime: Vercel recomandă Edge pentru streaming rapid fără cold starts. Însă pe Edge nu ai acces la orice librărie de Node.js (de exemplu, unele ORM-uri vechi sau SDK-uri de bază de date or să crăpe instant).
- Costuri ascunse pe Vercel: Un stream lung ține conexiunea deschisă. Dacă ai tona de useri și funcții serverless care stau agățate în streaming câte 20 de secunde, durata totală de execuție crește, deci crește și factura tăcută de cloud.
- Rerender-uri agresive: Pentru că
useChatupdatează starea la FIECARE token primit, componentele React grele din pagină se pot re-randa de 30-50 de ori pe secundă dacă nu ești atent cu memoizarea (useMemo,React.memo).
Voi folosiți AI SDK în producție sau vă preferați o soluție custom cu WebSockets/SSE direct în backend-ul de Go sau Node?