Introduzione
Quando fai una domanda a ChatGPT, ricevi testo — a volte formattato, a volte no, ma fondamentalmente una stringa di caratteri visualizzata in una bolla di chat. Questo modello di interazione uomo-AI sta già iniziando a sembrare datato.
La Generative UI è il paradigma in cui un sistema AI non restituisce solo testo — restituisce componenti di interfaccia già renderizzati. Chiedi di mostrarti un'analisi delle vendite e genera un grafico interattivo. Chiedi aiuto per prenotare un volo e ti mostra un form di prenotazione inline. Chiedi di riassumere un contratto e produce una card strutturata con clausole espandibili.
Il cambiamento è significativo perché il testo è il minimo comune denominatore. Un muro di testo che descrive un dataset è sempre inferiore a una buona visualizzazione di quei dati. La GenUI colma il divario tra ciò che un'AI sa e quanto efficacemente riesce a comunicarlo — dando all'AI accesso al vocabolario completo di un moderno toolkit UI.
Questa guida spiega come funziona tecnicamente la Generative UI, i principali framework che la rendono possibile oggi, casi d'uso reali, trade-off onesti e un punto di partenza pratico per la prima implementazione.
Come funziona la Generative UI
Il meccanismo alla base della Generative UI è una pipeline in quattro fasi. Capire ogni fase è essenziale per il debug e l'estensione dei sistemi GenUI in produzione.
1. L'LLM produce output strutturato
Invece di chiedere a un LLM di produrre testo libero, lo si istruisce a produrre dati strutturati — tramite function calling / tool use, o istruendo il modello a emettere JSON. Questo output descrive cosa renderizzare, non il contenuto grezzo in sé.
Ad esempio, invece di restituire "I ricavi di questo trimestre sono stati 1,2M€", il modello restituisce qualcosa come:
{
"component": "RevenueChart",
"props": {
"period": "Q1 2026",
"value": 1200000,
"change": 0.14,
"chartType": "bar"
}
}2. Un registry dei componenti mappa l'output alla UI
Un registry dei componenti sul client o sul server mappa i nomi dei componenti ai componenti React, Vue o Svelte effettivi. Quando il modello emette "component": "RevenueChart", il registry lo risolve nel componente RevenueChart reale, passa le props e lo renderizza.
Il registry è il confine chiave di sicurezza e qualità. Sei tu a decidere quali componenti sono disponibili per il modello — può renderizzare solo ciò che hai esplicitamente registrato. Questo è fondamentalmente diverso dal lasciar generare HTML arbitrario a un LLM, che sarebbe pericoloso e imprevedibile.
3. Lo streaming consegna i componenti progressivamente
Le migliori implementazioni GenUI trasmettono in streaming i dati dei componenti man mano che vengono generati. Invece di aspettare che l'LLM finisca l'intera risposta, i componenti vengono inviati al client non appena i loro dati sono completi. Questo offre agli utenti un'esperienza di rivelazione progressiva che sembra veloce anche per risposte multi-componente complesse.
Il modello di streaming di React (tramite Server Components e Suspense) è particolarmente adatto a questo pattern. La primitiva streamUI del Vercel AI SDK è costruita sopra di esso. SSE (Server-Sent Events) è un'alternativa più semplice che funziona in qualsiasi framework.
4. La UI si renderizza e l'utente interagisce
Una volta renderizzati, i componenti si comportano esattamente come qualsiasi altro componente UI — possono avere stato interno, chiamare API, inviare eventi e attivare ulteriori chiamate LLM. Questo consente UI "agentiche" multi-turno in cui l'AI e l'utente collaborano in modo iterativo attraverso una sequenza di interfacce renderizzate.
Framework principali
L'ecosistema GenUI si è consolidato attorno a una manciata di framework maturi. Ecco un confronto onesto delle principali opzioni a inizio 2026.
| Framework | Linguaggio | Caratteristica chiave | Licenza | Star |
|---|---|---|---|---|
| Vercel AI SDK | TypeScript / React | streamUI + React Server Components | Apache 2.0 | 13k+ |
| CopilotKit | TypeScript / React | Hook headless, copilota in-app | MIT | 17k+ |
| Thesys | TypeScript (qualsiasi framework) | Protocollo componenti framework-agnostic | Apache 2.0 | 2k+ |
| Custom SSE | Qualsiasi | Controllo totale, zero dipendenze | N/A | N/A |
Vercel AI SDK
Il Vercel AI SDK è il framework GenUI più adottato per i team React/Next.js. La sua funzione streamUI ti permette di definire una mappa di tool in cui ogni tool specifica uno scheletro di caricamento, un componente finale e la definizione del tool LLM — tutto in un unico posto. Il framework gestisce automaticamente lo streaming, l'idratazione e i confini Suspense.
L'SDK è orientato verso i React Server Components, il che lo rende estremamente potente per le app Next.js ma meno ergonomico al di fuori di quel contesto. Supporta tutti i principali provider LLM attraverso un'interfaccia unificata.
CopilotKit
CopilotKit adotta un approccio diverso, concentrandosi sull'incorporare un "copilota" in un'applicazione esistente piuttosto che costruire un'interfaccia chat-first da zero. Fornisce hook React headless (useCopilotAction, useCopilotReadable) che permettono all'AI di leggere lo stato della tua app e attivare azioni in essa — incluso il rendering di componenti UI come parte della risposta all'azione.
CopilotKit è particolarmente adatto per strumenti interni e dashboard in cui vuoi aggiungere assistenza AI a un'interfaccia esistente senza ricostruirla.
Thesys (ex LivebenchAI)
Thesys è un nuovo arrivato che offre un approccio framework-agnostic alla GenUI. Invece di essere legato alle primitive di streaming di React, usa il proprio protocollo di componenti che funziona su diversi framework. Questo lo rende la scelta pratica per ambienti Vue, Svelte o framework-agnostic. Il compromesso è un ecosistema e una comunità più piccoli rispetto all'SDK Vercel.
Implementazioni SSE personalizzate
Per i team con requisiti specifici — framework particolari, infrastruttura di streaming esistente o budget di latenza ristretti — un'implementazione personalizzata con Server-Sent Events e un registry dei componenti fatto in casa è una scelta valida. Il pattern di base è semplice: il server emette token JSON tramite SSE, il client li analizza in descrittori di componenti e un registry li risolve in componenti reali.
Le implementazioni personalizzate offrono il massimo controllo ma richiedono di costruire e mantenere l'infrastruttura di streaming, il recupero dagli errori e la type safety che i framework forniscono già.
Casi d'uso
La Generative UI aggiunge più valore nei contesti in cui la presentazione UI ottimale varia significativamente in base all'input o all'intenzione dell'utente. Ecco i casi d'uso produttivi più chiari.
Visualizzazione dei dati e analytics
Un utente chiede "mostrami com'è cambiato il nostro funnel di conversione questo mese". Un chatbot tradizionale restituisce una tabella markdown. Un sistema GenUI restituisce un grafico a funnel interattivo con capacità di drill-down — perché il modello può decidere che questi dati si rappresentano al meglio come funnel e renderizzare il componente giusto.
Questo caso d'uso è dove la GenUI ha il ROI più alto. Il divario tra testo e una buona visualizzazione è enorme per i dati analitici.
Interfacce conversazionali con risposte ricche
Il supporto clienti, i flussi di onboarding e la scoperta dei prodotti vengono trasformati quando l'AI può rispondere con form di prenotazione, schede prodotto, dialoghi di conferma e questionari interattivi invece di muri di testo istruzioni. I tassi di completamento delle risposte migliorano perché l'azione richiesta viene presentata direttamente anziché descritta.
Generazione di form e workflow multi-step
Invece di pre-costruire ogni possibile permutazione di form, un sistema GenUI può generare il form appropriato in base alle necessità espresse dall'utente. Un modulo assicurativo che genera campi diversi per diversi tipi di polizza. Una nota spese che adatta il suo schema al ruolo dell'impiegato e alla categoria di spesa. Form che richiederebbe settimane per essere progettati in anticipo possono essere generati su richiesta.
Strumenti di creazione di contenuti
Gli assistenti alla scrittura, i tool di generazione di codice e i sistemi di design beneficiano della GenUI quando l'output dell'AI deve essere mostrato nel contesto piuttosto che in un'interfaccia chat separata. Un editor di documenti in cui l'AI inserisce un blocco citazione formattato. Un assistente al codice che mostra una diff view inline. Un design tool che genera un'anteprima del componente insieme al codice.
Strumenti interni e pannelli di amministrazione
Il tooling interno è forse il caso d'uso più sottovalutato. Ingegneri e team operativi spesso hanno bisogno di interfacce ad-hoc per interrogare dati, eseguire operazioni o revisionare record. Invece di costruire queste interfacce manualmente, un sistema GenUI può generare la UI appropriata al momento della query — una tabella quando il risultato è tabulare, un form quando è necessaria un'azione, una scheda di stato quando il risultato è un singolo elemento.
Vantaggi
Riduzione del tempo di sviluppo per UI ricche di dati
Ogni visualizzazione di dati o form personalizzato che un sistema GenUI genera è uno che un ingegnere non deve costruire manualmente. Per prodotti con alta variabilità dell'UI — dashboard che richiedono decine di tipi di grafici, form che variano per segmento utente — questo rappresenta una riduzione significativa del lavoro frontend.
Interfacce personalizzate per contesto utente
Le UI tradizionali sono progettate per l'utente medio. La GenUI permette all'interfaccia stessa di adattarsi a ciò che ogni utente sta facendo e a quello che già sa. Un utente esperto riceve una tabella dati densa; un nuovo utente riceve una card guidata con callout esplicativi. L'AI deduce il livello appropriato di dettaglio dal contesto.
Risposte AI ricche oltre al testo semplice
Il testo è lossy. Descrivere un grafico a parole è sempre meno efficace che mostrare il grafico stesso. La GenUI colma il divario semantico tra ciò che l'AI comprende e ciò che riesce a comunicare. Quando l'AI conosce la struttura dei dati, può scegliere la codifica visiva più appropriata.
Divulgazione progressiva della complessità
I sistemi complessi possono essere resi accessibili facendo emergere all'AI il livello giusto di dettaglio al momento giusto. Un componente potrebbe iniziare compresso con un riassunto ed espandersi su richiesta. La navigazione drill-down può essere generata dinamicamente in base a ciò su cui l'utente si concentra. Questo è difficile da ottenere con UI statiche senza costruire macchine a stati esplicite; la GenUI lo rende emergente.
Sfide
La GenUI è genuinamente potente, ma comporta veri trade-off ingegneristici che vale la pena capire prima di impegnarsi nel pattern.
Complessità dei test
Testare le UI tradizionali è ben consolidato: si renderizza un componente con determinate props e si verifica l'output. Testare la GenUI è più difficile perché l'output renderizzato dipende dagli output dell'LLM, che sono non deterministici. Hai bisogno di una strategia di test che copra il registry dei componenti (unit test per ogni componente registrato), l'integrazione LLM (snapshot test con risposte mock) e il flusso end-to-end (test di integrazione che trattano l'LLM come una black box con input ben controllati).
Overhead di performance dello streaming
Lo streaming dei componenti introduce latenza al primo paint significativo: l'utente non vede nulla finché l'LLM non inizia a emettere il primo descrittore di componente. Spesso è meglio che aspettare il caricamento completo della pagina, ma richiede una gestione attenta degli stati di caricamento e degli skeleton screen per evitare un'esperienza brusca di spazio vuoto seguito da un pop. Il time-to-first-token varia significativamente tra provider LLM e dimensioni dei modelli.
Problemi di accessibilità
Le UI generate dinamicamente presentano vere sfide di accessibilità. La gestione del focus durante gli aggiornamenti in streaming, etichette ARIA significative sui componenti generati e la navigazione da tastiera tra elementi inseriti dinamicamente richiedono tutti una progettazione deliberata. I componenti auto-generati non avranno un'accessibilità ben considerata a meno che tu non progetti il registry dei componenti tenendola a mente.
Determinismo e riproducibilità
Gli LLM sono probabilistici. La stessa query utente può produrre selezioni di componenti diverse tra le richieste. Di solito è auspicabile — significa che l'AI si adatta a sottili differenze nella formulazione — ma rende il debug più difficile e può portare a confusione dell'utente quando un flusso "funzionante" improvvisamente si renderizza diversamente. Impostare la temperatura a 0 e usare definizioni precise dei tool riduce ma non elimina questa varianza.
Come iniziare
Il percorso più veloce verso un prototipo GenUI funzionante utilizza il Vercel AI SDK con Next.js. Ecco un esempio minimale che dimostra il pattern di base.
Installa le dipendenze
npm install ai @ai-sdk/openai zodDefinisci una server action con streamUI
// app/actions.tsx
'use server'
import { streamUI } from 'ai/rsc'
import { openai } from '@ai-sdk/openai'
import { z } from 'zod'
import { WeatherCard } from '@/components/WeatherCard'
import { StockChart } from '@/components/StockChart'
export async function chat(userMessage: string) {
const result = await streamUI({
model: openai('gpt-4o'),
messages: [{ role: 'user', content: userMessage }],
text: ({ content }) => <p>{content}</p>,
tools: {
showWeather: {
description: 'Show current weather for a location',
parameters: z.object({
location: z.string(),
unit: z.enum(['celsius', 'fahrenheit']).default('celsius'),
}),
generate: async ({ location, unit }) => {
// Fetch real data here
const data = await fetchWeather(location, unit)
return <WeatherCard {...data} />
},
},
showStockChart: {
description: 'Show a stock price chart',
parameters: z.object({
ticker: z.string(),
period: z.enum(['1d', '1w', '1m', '3m', '1y']),
}),
generate: async ({ ticker, period }) => {
const data = await fetchStockData(ticker, period)
return <StockChart ticker={ticker} data={data} />
},
},
},
})
return result.value
}Trasmetti la risposta in un componente React
// app/chat/page.tsx
'use client'
import { useState } from 'react'
import { readStreamableValue } from 'ai/rsc'
import { chat } from '../actions'
export default function ChatPage() {
const [messages, setMessages] = useState<React.ReactNode[]>([])
const [input, setInput] = useState('')
async function handleSubmit(e: React.FormEvent) {
e.preventDefault()
const userMessage = input
setInput('')
const response = await chat(userMessage)
setMessages(prev => [...prev, response])
}
return (
<div>
<div className="messages">
{messages.map((msg, i) => (
<div key={i}>{msg}</div>
))}
</div>
<form onSubmit={handleSubmit}>
<input
value={input}
onChange={e => setInput(e.target.value)}
placeholder="Ask anything..."
/>
<button type="submit">Send</button>
</form>
</div>
)
}L'intuizione chiave in questo pattern è l'oggetto tools. Ogni voce definisce il tool LLM (nome, descrizione, schema dei parametri) insieme al componente React da renderizzare quando quel tool viene chiamato. Il modello decide quale tool chiamare in base all'input dell'utente; il tuo codice decide cosa renderizzare.
Per ambienti Vue/Nuxt, lo stesso pattern è realizzabile con SSE streaming e un registry dei componenti manuale. Il framework Thesys fornisce un'astrazione di livello superiore per questo se preferisci non costruirlo da zero.
FAQ
La Generative UI è la stessa cosa dell'HTML generato dall'AI?
Quali provider LLM funzionano meglio con la GenUI?
Come gestisco gli errori LLM in un'interfaccia GenUI?
Posso usare la Generative UI senza React?
Qual è la differenza di costo rispetto a un chatbot standard?
Alex
Ingegnere indipendente e fondatore di GenerativeUI. Costruisco e scrivo di Generative UI in produzione — interfacce in streaming, integrazioni AI e i framework che le rendono possibili.
Su AlexArticoli correlati
Generative UI vs UI tradizionale: differenze chiave
Come le interfacce generative differiscono dalle UI convenzionali e quando ogni approccio ha senso.
Costruisci la tua prima Generative UI con Vercel AI SDK
Guida passo dopo passo per creare la tua prima interfaccia AI con streaming components.