UI chat streaming dengan Next.js.
Streaming token demi token melalui SSE, pembatalan, penanganan error di tengah stream, dan API key tetap di sisi server. ~150 baris TypeScript.
Arsitektur — Tiga bagian
- Route handler Next.js di server — memproksikan permintaan browser ke Anoman agar API key Anda tidak pernah sampai ke klien.
- Hook useChat — mengelola state pesan, mem-parsing SSE, mengekspos
send()+cancel(). - Komponen ChatBox — merender pesan + input. Menonaktifkan input saat streaming. Menampilkan tombol Stop.
1. Proksi sisi server — Alirkan stream Anoman langsung ke browser
Route handler memanggil Anoman, lalu memancarkan ulang setiap chunk sebagai SSE untuk browser. Kami tidak memodifikasi chunk — teruskan apa adanya agar frame metadata _anoman sampai ke klien tanpa perubahan.
app/api/chat/route.ts — Proksi streaming Next.js
2. Hook parser SSE — Tambahkan delta ke pesan terakhir
Buffer persisten untuk toleransi batas chunk. Frame error di tengah stream dilempar agar blok catch memunculkannya. AbortController untuk pembatalan.
hooks/useChat.ts — State React + parser SSE
3. Komponen UI — Tombol Stop saat streaming, Send saat idle
ChatBox.tsx — Komponen React minimal
Tips produksi
- Kompatibilitas proksi Cloudflare — edge Anoman meneruskan frame SSE begitu tiba. Setiap chunk mereset timeout proksi, sehingga respons streaming bertahan untuk penyelesaian yang panjang sekalipun.
- Tampilkan status guardrail inline — frame
_anomanterakhir memuat rincian guardrail lengkap. Render lencana kecil "Terverifikasi bersih ✓" di bawah setiap pesan asisten. - Penanganan rate limit — saat route handler Anda menerima 429 dari Anoman, tampilkan pesan ramah "Pelan-pelan" ke pengguna. Header
retry-aftermemberi tahu lama tunggunya. - Konteks multi-giliran — kirim seluruh array
messagespada setiap permintaan. Anoman + upstream menangani sisanya. - Sesi persisten — tambahkan header
anoman-session-iduntuk mengelompokkan semua giliran di bawah satu trace di tampilan Sessions dashboard.
Lihat playground untuk UI referensi lengkap.
Perbandingan streaming 3-panel dengan pemilih model + kontrol parameter.