Ui: un approfondimento per sviluppatori sul progetto IA del momento (2026)
Ui: un approfondimento per sviluppatori sul progetto IA del momento (2026)
Alle 2:17 del mattino, il modello funzionava bene. Il prodotto no.
Avevamo un assistente con generazione aumentata dal recupero che restituiva risposte fondate sulle fonti in circa 1.8 secondi al p95, trasmetteva i token in streaming senza problemi e otteneva discreti punteggi di valutazione. Ma l'interfaccia che lo circondava rallentava il team: i fumetti della chat erano incoerenti, le citazioni erano difficili da consultare rapidamente, gli stati di caricamento si spostavano continuamente, il pannello laterale delle impostazioni comprometteva la navigazione da tastiera e ogni “rapida correzione della UI” si trasformava in un'altra discussione sul sistema di design.
Questo è il problema ingegneristico che shadcn-ui/ui risolve bene: non “rendere l'AI più intelligente”, ma rendere l'interfaccia del prodotto che circonda i sistemi AI più facile da costruire, gestire e modificare.
Il repository GitHub shadcn-ui/ui è diventato uno dei progetti UI open source più importanti per i team che costruiscono applicazioni web moderne, inclusi i prodotti AI. Si descrive come “un insieme di componenti dal design curato e accessibili e una piattaforma di distribuzione del codice”, con supporto per i framework preferiti e argomenti relativi a base-ui, components, laravel, nextjs, radix-uie react.
L'idea centrale è apparentemente semplice: invece di installare una libreria di componenti chiusa come dipendenza e lottare con le sue astrazioni, copi il codice sorgente dei componenti nel tuo progetto. Ne hai il controllo. Puoi modificarlo. Puoi eliminare ciò che non ti serve.
Questo modello è molto importante per le applicazioni AI, dove la UI non è solo decorazione. È il piano di controllo per prompt, strumenti, tracce, caricamenti, citazioni, approvazioni, output in streaming, ripristino dopo gli errori e feedback umano.
Il problema ingegneristico: le applicazioni AI hanno bisogno rapidamente di una UI pronta per un prodotto
La maggior parte dei team che sviluppano applicazioni AI sottovaluta l'ampiezza dell'interfaccia.
Una “semplice app di chat” di solito diventa:
- Una sequenza cronologica di messaggi in streaming
- Controlli per prompt e istruzioni di sistema
- Selezione del modello tra GPT, Claude, Gemini, Llama, Qwen, DeepSeek, Kimi o endpoint interni
- Stato di caricamento e analisi dei file
- Visualizzazione delle fonti del recupero
- Ispezione delle chiamate agli strumenti
- Pannelli di valutazione e debug
- Stati di autenticazione e fatturazione
- Flussi di approvazione umana
- Gestione degli errori per limiti di frequenza, timeout, superamento della capacità del contesto e filtri di sicurezza
Il backend può essere più difficile sul piano intellettuale, ma il frontend assorbe la complessità disordinata che gli utenti percepiscono davvero.
Le librerie di componenti tradizionali aiutano, ma spesso introducono un costo diverso:
- Dipendi da astrazioni a livello di pacchetto che non puoi modificare facilmente.
- Le personalizzazioni degli stili diventano fragili.
- L'accessibilità è gestita solo in parte, a meno che tu non comprenda le primitive.
- Distribuisci più codice del necessario.
- La tua app inizia ad assomigliare a tutte le altre che usano la stessa libreria.
shadcn-ui/ui adotta un approccio diverso: i componenti non sono un prodotto da usare a runtime, ma codice sorgente che integri nel tuo progetto.
In pratica, questo cambia il modello di manutenzione. Se la spaziatura dei pulsanti è sbagliata nel tuo flusso di revisione AI, modifichi components/ui/button.tsx. Se il menu dei comandi ha bisogno di indicatori della latenza dei modelli, lo modifichi direttamente. Se la scheda delle citazioni deve mostrare i punteggi di recupero o i segmenti dei documenti, hai il controllo del markup.
Sembra una cosa ordinaria, finché non devi rilasciare un'interfaccia AI personalizzata ogni settimana.
Cosa shadcn-ui/ui Che cos'è realmente
Il modo migliore per comprendere il progetto è considerarlo come due elementi correlati:
- Una raccolta di componenti
- Una piattaforma di distribuzione del codice
La raccolta di componenti offre elementi UI riutilizzabili: pulsanti, finestre di dialogo, schede, campi di input, tabelle, menu, pannelli, moduli, palette dei comandi e primitive simili presenti nelle moderne applicazioni web.
È il modello di distribuzione a renderla insolita. Invece di fare questo:
npm install some-ui-library
e importare componenti opachi da node_modules, un tipico shadcn/ui flusso di lavoro aggiunge i file sorgente dei componenti alla tua applicazione:
npx shadcn@latest init
npx shadcn@latest add button card dialog input textarea
Poi li importi dal tuo progetto locale:
import { Button } from "@/components/ui/button"
import {
Card,
CardContent,
CardHeader,
CardTitle,
} from "@/components/ui/card"
La differenza è architetturale, non estetica. Il componente diventa parte della tua base di codice. Puoi esaminarlo, rifattorizzarlo, adattarlo ai tuoi token di design o integrarlo nelle convenzioni del tuo framework.
L'ecosistema del progetto si intreccia spesso con React, Next.js, Radix UI, classi di utilità in stile Tailwind CSS e integrazioni con i framework. Gli argomenti del repository includono anche Laravel, a testimonianza di un'ambizione più ampia: non si tratta soltanto di una raccolta di componenti React, ma di un approccio alla distribuzione del codice per UI riutilizzabili in diversi stack applicativi.
Architettura: componenti con sorgenti sotto il tuo controllo anziché astrazioni a runtime
Il modo più chiaro per spiegare l'architettura è confrontare i confini di responsabilità.
| Approccio | Dove risiedono i componenti | Modello di personalizzazione | Modello di aggiornamento | Ideale per |
|---|---|---|---|---|
| Pacchetto UI tradizionale | node_modules | Prop, temi, override | Aggiornamento del pacchetto | Applicazioni standardizzate con personalizzazione limitata |
| Primitive headless | node_modules più il markup dell'applicazione | Componi tu il comportamento | Aggiornamento del pacchetto | Team con solide competenze frontend |
shadcn/ui stile | Il tuo albero dei sorgenti | Modifica direttamente il codice dei componenti | Aggiungi di nuovo, confronta le differenze o aggiorna manualmente | Team di prodotto che cercano velocità e controllo |
| Sistema di design completamente personalizzato | Il tuo albero dei sorgenti o i tuoi pacchetti | Pieno controllo | Processo interno | Grandi organizzazioni con team dedicati al sistema di design |
shadcn-ui/ui si colloca tra una libreria di componenti e un kit di partenza per un sistema di design. Ti offre componenti funzionanti, senza presumere che debbano rimanere intatti.
Uno stack comune si presenta così:
app/
chat/
page.tsx
components/
ai/
model-picker.tsx
message-list.tsx
citation-card.tsx
tool-call-panel.tsx
ui/
button.tsx
card.tsx
dialog.tsx
input.tsx
sheet.tsx
textarea.tsx
lib/
ai/
stream.ts
models.ts
retrieval.ts
Il confine importante è components/ui. Si tratta di primitive generiche. Le tue interfacce specifiche per l'AI si collocano al di sopra di esse, in components/ai.
Una buona regola pratica:
components/ui: generico, riutilizzabile, ordinariocomponents/ai: schemi di interazione con l'AI specifici del prodottolib/ai: instradamento dei modelli, streaming, recupero delle informazioni, esecuzione degli strumentiapp/: instradamento del framework, azioni server, composizione delle pagine
Questo evita che le primitive UI diventino un contenitore indiscriminato per comportamenti specifici dei modelli.
Un flusso di lavoro realistico: creare una console di revisione AI
Supponiamo che tu stia creando una console interna di revisione AI per i ticket di assistenza. Il backend recupera informazioni dai ticket precedenti e prepara bozze di risposta usando un modello come GPT-5.5, Claude Sonnet 4.6, Gemini 3 o un endpoint di un modello aperto. Il frontend deve mostrare:
- Il ticket del cliente
- La bozza generata
- Le evidenze recuperate
- Un indicatore del livello di confidenza
- Un'azione di approvazione umana
- Un selettore del modello per il debug
Inizia aggiungendo i componenti UI di base:
npx shadcn@latest init
npx shadcn@latest add button card badge textarea select separator skeleton
Poi definisci esplicitamente la configurazione del modello. Non nasconderla nelle etichette dell'interfaccia.
// lib/ai/models.ts
export type ModelId =
| "gpt-5.5"
| "claude-sonnet-4.6"
| "gemini-3"
| "qwen"
| "deepseek"
export const models: Array<{
id: ModelId
label: string
contextHint: string
}> = [
{
id: "gpt-5.5",
label: "GPT-5.5",
contextHint: "General reasoning and agentic workflows",
},
{
id: "claude-sonnet-4.6",
label: "Claude Sonnet 4.6",
contextHint: "Long-form drafting and coding workflows",
},
{
id: "gemini-3",
label: "Gemini 3",
contextHint: "Multimodal and general assistant tasks",
},
{
id: "qwen",
label: "Qwen",
contextHint: "Open-model route",
},
{
id: "deepseek",
label: "DeepSeek",
contextHint: "Open-model route",
},
]
Ora componi il pannello di revisione usando componenti UI locali:
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import {
Card,
CardContent,
CardHeader,
CardTitle,
} from "@/components/ui/card"
import { Textarea } from "@/components/ui/textarea"
type Evidence = {
title: string
snippet: string
score?: number
}
export function TicketReviewCard({
ticket,
draft,
evidence,
isStreaming,
}: {
ticket: string
draft: string
evidence: Evidence[]
isStreaming: boolean
}) {
return (
<Card>
<CardHeader>
<CardTitle>AI Draft Review</CardTitle>
</CardHeader>
<CardContent className="space-y-6">
<section className="space-y-2">
<Badge variant="secondary">Customer ticket</Badge>
<p className="text-sm leading-6 text-muted-foreground">{ticket}</p>
</section>
<section className="space-y-2">
<Badge>{isStreaming ? "Generating" : "Draft ready"}</Badge>
<Textarea value={draft} className="min-h-40" readOnly />
</section>
<section className="space-y-3">
<h3 className="text-sm font-medium">Retrieved evidence</h3>
{evidence.map((item) => (
<div key={item.title} className="rounded-md border p-3">
<div className="flex items-center justify-between">
<p className="text-sm font-medium">{item.title}</p>
{item.score !== undefined && (
<span className="text-xs text-muted-foreground">
score {item.score.toFixed(2)}
</span>
)}
</div>
<p className="mt-2 text-sm text-muted-foreground">
{item.snippet}
</p>
</div>
))}
</section>
<div className="flex gap-2">
<Button>Approve reply</Button>
<Button variant="outline">Request revision</Button>
</div>
</CardContent>
</Card>
)
}
È qui che l'approccio con sorgenti sotto il tuo controllo dà i suoi frutti. Se il pulsante di approvazione richiede una finestra di conferma specifica per il registro di audit, non devi aspettare che una libreria esponga la prop giusta. Se il blocco delle evidenze richiede scorciatoie da tastiera, una gestione personalizzata del focus o uno stile compatto per uso aziendale, puoi realizzarlo direttamente sulle primitive locali.
Come si inserisce in uno stack AI moderno
shadcn-ui/ui non è un framework di inferenza, un database vettoriale, un router di modelli o un runtime per agenti. Appartiene al livello di prodotto.
Un tipico stack AI nel 2026 si presenta così:
User Interface
Next.js / React / Laravel frontend
shadcn-style components
streaming state and interaction design
Application Layer
auth, billing, projects, teams
prompt templates
eval dashboards
human approval workflows
AI Orchestration
model routing
tool execution
retry and timeout policies
structured outputs
Model Providers
Claude Opus 4.8 / Sonnet 4.6 / Haiku 4.5
GPT-5.5
Gemini 3
Fable 5 with large-context workflows
Llama / Qwen / DeepSeek / MiniMax / Kimi
Data Layer
vector search
document stores
event logs
traces and feedback
Il livello UI è dove gli utenti decidono se fidarsi del sistema. Nei prodotti AI, la fiducia deriva spesso da dettagli ordinari dell'interfaccia:
- Lo streaming rende visibili i progressi?
- Le fonti recuperate sono leggibili?
- Gli utenti possono esaminare le chiamate agli strumenti?
- È evidente quando il modello è incerto?
- Una persona può intervenire sul risultato?
- Le azioni distruttive richiedono una conferma?
- La navigazione da tastiera funziona nei flussi di revisione densi di informazioni?
Le primitive dei componenti aiutano ad affrontare queste domande, ma non le risolvono automaticamente. Serve comunque capacità di giudizio sul prodotto.
Un errore comune: i team creano una splendida finestra di chat e trascurano il percorso di debug. Poi si verifica il primo problema in produzione — recupero delle informazioni scadente, instradamento errato del modello, JSON malformato, timeout di uno strumento — e non c'è alcuna UI per esaminare l'accaduto. Con componenti i cui sorgenti sono sotto il tuo controllo, è semplice creare pannelli interni per tracce, payload dei prompt, misurazioni della latenza e decisioni dei modelli senza importare un framework UI di amministrazione separato.
Per esempio, esponi chiaramente i dati temporali:
{
"request_id": "req_92f1",
"model": "claude-sonnet-4.6",
"retrieval_ms": 142,
"first_token_ms": 610,
"total_ms": 1840,
"input_tokens": 3912,
"output_tokens": 428
}
Poi visualizzali in una piccola scheda diagnostica per gli utenti interni. Non serve a tutti gli utenti, ma prima o poi serve a ogni team di ingegneria AI.
A chi è adatto
shadcn-ui/ui è particolarmente adatto ai team che desiderano controllo senza partire da zero.
Usalo se:
- Stai creando un prodotto basato principalmente su React o Next.js.
- Hai bisogno di primitive UI moderne e accessibili.
- Prevedi di personalizzare profondamente i componenti.
- Vuoi il controllo sui sorgenti anziché il comportamento di una libreria a scatola chiusa.
- La tua applicazione include flussi di lavoro AI che richiedono pannelli, cronologie, editor o stati di revisione personalizzati.
- Il tuo team è a proprio agio con la manutenzione del codice frontend.
È particolarmente utile per i prodotti AI in cui la UI non è una dashboard statica. Editor di prompt, viste di valutazione, cronologie delle chat, tracce degli agenti e code di approvazione richiedono tutti una progettazione personalizzata delle interazioni.
Procedi con maggiore cautela se:
- Il tuo team desidera un sistema di design aziendale completo e pronto all'uso.
- Non vuoi codice dei componenti nel tuo repository.
- Non hai le competenze frontend necessarie per mantenere i componenti copiati.
- Hai bisogno di una governance del design rigorosa e centralizzata su molte applicazioni.
- Ti aspetti che gli aggiornamenti dei pacchetti risolvano automaticamente la manutenzione della UI.
In altre parole, shadcn-ui/ui ti dà il controllo. Avere il controllo è potente, ma ha un costo.
Vantaggi, svantaggi e limitazioni
Cosa funziona bene
Il vantaggio principale è il controllo locale. Puoi esaminare ogni componente, capire cosa viene distribuito e adattarlo alla tua applicazione. Per le interfacce AI, questo è estremamente pratico perché i requisiti di prodotto cambiano rapidamente.
Altri punti di forza:
- Base accessibile: L'ecosistema si basa comunemente su primitive progettate pensando all'accessibilità, come Radix UI.
- Buona estetica predefinita: I componenti sono abbastanza curati da poter essere usati subito.
- Struttura componibile: I componenti funzionano bene come elementi di base per interfacce specifiche del prodotto.
- Pochi vincoli di astrazione: Non sei costretto a usare un'API di componenti enorme.
- Orientamento favorevole ai framework: Il posizionamento del progetto incentrato sulla distribuzione del codice lo rende adattabile a più di un unico tipo specifico di applicazione.
Possibili svantaggi
Lo svantaggio principale è la manutenzione. Una volta che il codice entra nel tuo repository, è tuo.
Questo significa che:
- Devi tenere traccia manualmente delle modifiche quando i pattern del progetto originale migliorano.
- I componenti possono divergere tra più applicazioni.
- Gli ingegneri possono personalizzare eccessivamente le primitive invece di usarle per comporre componenti di livello superiore.
- La coerenza del design richiede disciplina.
- L'accessibilità può peggiorare se le modifiche locali compromettono la gestione del focus o la semantica.
Un esempio concreto: un componente di dialogo può essere inizialmente accessibile, ma un ingegnere che lavora di fretta può comunque rimuovere le etichette corrette, compromettere il ripristino del focus o nascondere informazioni importanti sullo stato agli screen reader. La proprietà del codice sorgente non elimina il lavoro sull'accessibilità; rende visibile l'implementazione.
Un altro limite: shadcn-ui/ui non definisce il tuo modello di interazione con l'AI. Non ti dirà come rappresentare l'incertezza, come confrontare gli output dei modelli o come progettare un flusso di approvazione sicuro. Ti offre elementi di base di alta qualità, non un prodotto AI finito.
Consigli pratici sull'architettura
In pratica, consiglio di trattare shadcn/ui i componenti come un livello di piattaforma locale.
Mantieni puliti i componenti UI generici:
components/ui/button.tsx
components/ui/dialog.tsx
components/ui/table.tsx
components/ui/tabs.tsx
Crea separatamente i componenti specifici per l'AI:
components/ai/model-selector.tsx
components/ai/streaming-message.tsx
components/ai/retrieval-sources.tsx
components/ai/tool-call-log.tsx
components/ai/eval-result-card.tsx
Evita questo antipattern:
components/ui/ai-button.tsx
components/ui/prompt-dialog.tsx
components/ui/rag-card.tsx
Quando i concetti specifici dell'AI si infiltrano in components/ui, le primitive diventano più difficili da riutilizzare.
Per le applicazioni AI sensibili alla latenza, evita anche di collegare lo stato visivo direttamente a un unico enorme oggetto di risposta. Le interfacce in streaming sono più facili da mantenere quando lo stato è suddiviso:
type AssistantRunState = {
status: "idle" | "retrieving" | "generating" | "complete" | "error"
draftText: string
evidence: Evidence[]
timings: {
retrievalMs?: number
firstTokenMs?: number
totalMs?: number
}
}
Questo si traduce naturalmente in componenti UI: scheletri di caricamento durante il recupero, testo in streaming durante la generazione, schede con le evidenze al termine del recupero e badge diagnostici quando arrivano i dati sui tempi.
La direzione del progetto
L'aspetto interessante di shadcn-ui/ui non è soltanto l'insieme dei componenti. È l'idea della distribuzione del codice.
I team moderni desiderano sempre più software riutilizzabile che possa essere copiato, esaminato e modificato, soprattutto ora che gli strumenti AI per la programmazione entrano nello sviluppo quotidiano. Un modello di componenti di cui si possiede il codice sorgente si adatta a questo contesto. Un ingegnere può chiedere a un assistente AI di programmazione di adattare un componente locale perché il codice è presente nel repository. Non è necessario ricostruire il funzionamento dell'astrazione di un pacchetto o combattere con meccanismi interni non documentati.
Questo non lo rende magico. Semplicemente, allinea il modello dei componenti al modo in cui molti team lavorano davvero: copiare una buona implementazione, adattarla e continuare a rilasciare.
Per i team che sviluppano prodotti AI, spesso è il compromesso giusto.
Indicazioni pratiche
shadcn-ui/uirisolve un problema reale di ingegneria del prodotto: creare interfacce curate, accessibili e personalizzabili senza rinunciare alla proprietà dei componenti.- La sua architettura mette al centro il codice sorgente: i componenti vengono aggiunti al tuo repository e mantenuti come codice locale, anziché essere utilizzati soltanto tramite API opache di pacchetti.
- Si adatta soprattutto al livello UI dei sistemi AI: chat, code di revisione, dashboard di valutazione, selettori di modelli, tracce degli strumenti e visualizzazioni delle fonti recuperate.
- Il compromesso principale è la manutenzione: una volta copiati i componenti, il tuo team è responsabile della coerenza, dell'accessibilità e degli aggiornamenti.
- Mantieni
components/uigenerico e inserisci il comportamento specifico dell'AI incomponents/aiper evitare di contaminare le primitive. - Usalo quando ti servono velocità e controllo; evitalo se desideri un sistema di design completamente gestito, con aggiornamenti centralizzati e una responsabilità minima sul frontend.
Un'unica chiave API per Claude Opus 5.5, Sonnet 5, Haiku 4.5 e Fable 5.1, oltre a GPT-6 modelli. Pagamento a consumo, senza abbonamento.
Ottieni la tua chiave API →