Mặc định chọn SSE (server-sent events). Luồng chat LLM là một chiều server → client: client gửi đúng một request, server phát dần các mảnh chữ. Đó chính xác là mô hình SSE.
Vì sao SSE hợp hơn:
- Chạy trên HTTP thường, đi qua CDN/proxy/load balancer sẵn có, không cần nâng cấp giao thức.
- Tự động kết nối lại và có Last-Event-ID trong chuẩn EventSource.
- Chỉ cần trả một ReadableStream từ route handler, không cần server giữ trạng thái kết nối.
// server: stream text chunks as SSE
return new Response(stream, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache, no-transform',
Connection: 'keep-alive',
},
})Khi nào cần WebSocket: hai chiều liên tục — voice/audio thời gian thực, người dùng ngắt lời model, nhiều người xem chung một phiên, hoặc server cần chủ động đẩy sự kiện ngoài phạm vi một câu trả lời.
Lưu ý triển khai: đặt Cache-Control: no-transform và tắt buffer ở proxy (nginx X-Accel-Buffering: no), nếu không proxy gom hết chunk rồi mới trả một lần và mất hiệu ứng chảy chữ.