The frontend side of this doesn't get enough attention. Building UI for AI-native products is a different problem than CRUD. You're dealing with response times you can't predict, outputs that arrive mid-stream, and failures that don't look the same twice. A loading spinner and a try/catch don't cut it.
Most teams are still reaching for the same patterns they'd use for a form submission. It works until users start feeling the difference and they do feel it.
React Suspense + streaming in the Next.js App Router is the first thing I've reached for that actually matches how AI responses behave. You stop thinking about how long to wait and start describing what to show while waiting. The stream decides when things appear. Small shift in how you write the component, noticeable shift in how it feels to use. The teams getting this right aren't the ones with the nicest chat UI. They're the ones who questioned where their component boundaries sit before they wrote a single line.