Guida

Cos'è la Generative UI? La guida completa

Tutto quello che devi sapere sui sistemi AI che generano componenti UI interattivi, non solo testo.

Alex20 min di lettura

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.

FrameworkLinguaggioCaratteristica chiaveLicenzaStar
Vercel AI SDKTypeScript / ReactstreamUI + React Server ComponentsApache 2.013k+
CopilotKitTypeScript / ReactHook headless, copilota in-appMIT17k+
ThesysTypeScript (qualsiasi framework)Protocollo componenti framework-agnosticApache 2.02k+
Custom SSEQualsiasiControllo totale, zero dipendenzeN/AN/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 zod

Definisci 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?
No, e questa distinzione è importante. L'HTML generato dall'AI lascia all'LLM la libertà di scrivere markup arbitrario, il che è un rischio di sicurezza (XSS) e produce risultati incoerenti. La Generative UI usa un registry controllato di componenti — l'LLM sceglie quale componente pre-costruito renderizzare e quali props passare. I componenti stessi sono scritti da ingegneri. Pensa alla differenza tra permettere a un ospite di spostare i mobili (sicuro) rispetto a permettergli di ristrutturare la casa (non sicuro).
Quali provider LLM funzionano meglio con la GenUI?
Qualsiasi provider con un robusto supporto function/tool calling funziona bene. GPT-4o e la serie o di OpenAI, Claude 3.5+ di Anthropic e Gemini 1.5 Pro di Google hanno tutti un forte tool calling adatto alla GenUI. Il criterio chiave è un output strutturato affidabile — il modello deve restituire costantemente JSON valido che corrisponda agli schemi dei parametri. I modelli open-source più piccoli possono funzionare ma richiedono più prompt engineering e producono tassi di errore più elevati nella selezione dei tool.
Come gestisco gli errori LLM in un'interfaccia GenUI?
La gestione degli errori GenUI ha due livelli. Primo, gestisci gli errori LLM API (rate limit, timeout, risposte non valide) con logica di retry standard e fallback a una risposta solo testuale. Secondo, gestisci i casi in cui il modello chiama un tool inesistente o passa props non valide — valida tutti gli output LLM rispetto agli schemi dei parametri prima di passarli ai componenti, e renderizza un componente di errore gestito quando la validazione fallisce. Non lasciare mai che l'output grezzo dell'LLM raggiunga un componente senza validazione.
Posso usare la Generative UI senza React?
Sì. La funzione streamUI del Vercel AI SDK è specifica per React, ma il pattern sottostante è framework-agnostic. Thesys supporta più framework. Per Vue, Svelte o JS vanilla, implementa il pattern con SSE streaming e un registry dei componenti mappato al sistema di componenti del tuo framework. La logica lato server (tool calling LLM, emissione JSON) è identica; cambia solo il layer di rendering.
Qual è la differenza di costo rispetto a un chatbot standard?
I costi in token sono simili — una risposta GenUI usa circa lo stesso numero di token di una risposta testuale equivalente, a volte meno perché il JSON strutturato è più conciso della prosa verbosa. Il costo aggiuntivo principale è la latenza: le chiamate ai tool aggiungono un round-trip alla pipeline LLM. Per workflow multi-step in cui il modello chiama diversi tool in sequenza, questo può aggiungere 2–5 secondi al tempo totale di risposta. Il tool calling parallelo (supportato da GPT-4o e Claude 3.5+) mitiga significativamente questo aspetto.
generative-uiaiframeworkstutorial

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 Alex

Iscriviti alla Newsletter

Articoli bi-settimanali su pattern Generative UI, aggiornamenti dei framework e insight implementativi. Unisciti a 500+ ingegneri.

Rispettiamo la tua privacy. Disiscrizione in qualsiasi momento.

Costruisci Generative UI per la produzione?

Revisione architetturale, implementazione full-stack o leadership tecnica frazionata — ottieni supporto esperto senza l'overhead.

Scopri come lavoriamo