In the first post of this series we built a working AI chatbot in Laravel. It had one problem every user notices immediately: you send a message, then stare at a spinner for five seconds while the whole response generates.

LLMs produce text token by token. If you wait for the full completion before showing anything, you're throwing away the single biggest UX win available: streaming. The same answer that takes 5 seconds to finish starts appearing in ~300ms when streamed. Nothing about the model got faster — but to the user, it feels 10x faster.

In this post we'll upgrade the chatbot to stream responses with Server-Sent Events (SSE) — no WebSockets, no Pusher, no extra infrastructure. Just Laravel.

Why SSE and not WebSockets?

WebSockets are bidirectional and need a long-running server (Reverb, Soketi) or a paid service. For chat completions you only need one direction: server → browser, for the lifetime of one request. That's exactly what SSE is for, and since Laravel 11 it's built into the framework as response()->eventStream().