SSE vs WebSocket, Mana yang Kamu Butuhkan
Keduanya memungkinkan server mengirim data ke browser tanpa browser harus terus-menerus minta update. Bedanya:
- SSE (Server-Sent Events) itu satu arah, dari server ke browser saja, dan jalan di atas HTTP biasa. Setup-nya lebih sederhana dan pas banget untuk kebutuhan kita menampilkan teks AI yang mengalir.
- WebSocket itu dua arah dan butuh koneksi yang terus terbuka, setup-nya lebih ribet (seperti Laravel Reverb atau Pusher), dan lebih cocok untuk hal seperti chat room multi-user atau kolaborasi real-time.
Karena chatbot kita cuma perlu kirim teks hasil AI ke satu user dalam satu waktu, SSE adalah pilihan yang tepat di sini. Kita baru butuh WebSocket nanti kalau bikin fitur multi-user atau broadcast.
Cara Kerja Streaming, dengan Bahasa Sederhana
Daripada provider AI-nya kirim satu respons besar di akhir, dia kirim potongan-potongan teks kecil (chunk) terus-menerus seiring proses generate-nya jalan. Aplikasi Laravel-mu menerima tiap chunk dan langsung meneruskannya ke browser, bukannya nunggu kumpulin dulu seluruh respons.
Langkah 1: Streaming Pakai HTTP Client Laravel
Kalau kamu manggil API OpenAI langsung, kamu perlu bilang ke API-nya supaya stream responsnya, lalu baca chunk-chunk yang datang:
Detail penting di sini adalah
Langkah 2: Streaming Pakai Prism PHP
Kalau kamu pakai Prism dari Part 4, streaming-nya jauh lebih sederhana karena sudah built-in:
Prism juga punya
Ini versi paling sederhana dan sudah cukup untuk kebanyakan kasus. Pakai versi manual di atas kalau kamu butuh format custom atau logika tambahan di antara chunk-chunk-nya.
Langkah 3: Menerima Stream di Browser
Di frontend, pakai API
Setiap kali chunk datang, kita tambahkan ke elemen output, sehingga terbentuk efek kata-demi-kata.
Jebakan yang Sering Terjadi
1. Buffering di server memblokir streaming Meski kode PHP-nya sudah benar, beberapa setup server tetap buffer output secara default. Kalau streaming-nya kelihatan nggak jalan, cek config Nginx-mu untuk
2. Pakai
3. Laravel Telescope bisa mengganggu Kalau kamu pakai Telescope, dia bisa mencegat event dari HTTP client dan "makan" stream-nya sebelum kodemu sempat baca. Matikan HTTP watcher milik Telescope untuk route yang butuh streaming.
4. Menutup koneksi Selalu panggil
Selanjutnya
Streaming bikin pengalaman chat terasa lebih cepat, tapi masih ada masalah yang belum kita tangani: gimana kalau respons AI-nya butuh waktu lama buat mulai, atau kalau banyak user pakai fitur AI-mu bersamaan? Di artikel selanjutnya, kita akan pindahkan proses AI yang berat ke queue dan background job, supaya aplikasimu tetap responsif meski lagi ramai.
Ini adalah Part 6 dari series "Laravel + AI Integration".




