· 8 min · Open source

Ui : une analyse approfondie du projet d’IA en vogue pour les développeurs (2026)

Ui : une analyse approfondie du projet d’IA en vogue pour les développeurs (2026)

À 2:17 du matin, le modèle fonctionnait bien. Le produit, non.

Nous avions un assistant à génération augmentée par récupération qui fournissait des réponses étayées en environ 1.8 secondes au p95, diffusait les tokens proprement en streaming et obtenait des scores d’évaluation corrects. Mais l’interface qui l’entourait ralentissait l’équipe : les bulles de chat manquaient de cohérence, les citations étaient difficiles à parcourir, les indicateurs de chargement se déplaçaient sans cesse, le panneau latéral des paramètres perturbait la navigation au clavier, et chaque « correction rapide de l’interface » se transformait en un nouveau débat sur le système de design.

C’est le problème d’ingénierie que shadcn-ui/ui résout bien : il ne s’agit pas de « rendre l’IA plus intelligente », mais de faciliter la création, la maîtrise et la modification de l’interface produit qui entoure les systèmes d’IA.

Le dépôt GitHub shadcn-ui/ui est devenu l’un des projets d’interface utilisateur open source les plus importants pour les équipes qui développent des applications web modernes, y compris des produits d’IA. Il se décrit comme « un ensemble de composants au design soigné et accessibles, ainsi qu’une plateforme de distribution de code », avec une prise en charge des frameworks favoris et des sujets liés à base-ui, components, laravel, nextjs, radix-ui, ainsi que react.

L’idée centrale est d’une simplicité trompeuse : au lieu d’installer une bibliothèque de composants fermée comme dépendance et de lutter contre ses abstractions, vous copiez le code source des composants dans votre projet. Vous en avez la maîtrise. Vous pouvez le modifier. Vous pouvez supprimer ce dont vous n’avez pas besoin.

Ce modèle compte beaucoup pour les applications d’IA, où l’interface n’est pas un simple décor. Elle constitue le plan de contrôle des prompts, des outils, des traces, des téléversements, des citations, des approbations, des sorties en streaming, de la reprise après erreur et des retours humains.

Le problème d’ingénierie : les applications d’IA ont rapidement besoin d’une interface prête pour la production

La plupart des équipes qui développent des applications d’IA sous-estiment l’étendue de l’interface utilisateur.

Une « simple application de chat » devient généralement :

  • Un fil de messages en streaming
  • Des commandes pour les prompts et les instructions système
  • Une sélection de modèles parmi GPT, Claude, Gemini, Llama, Qwen, DeepSeek, Kimi ou des points de terminaison internes
  • Le téléversement de fichiers et l’état de leur analyse
  • L’affichage des sources de récupération
  • L’inspection des appels d’outils
  • Des panneaux d’évaluation et de débogage
  • Des états d’authentification et de facturation
  • Des workflows d’approbation humaine
  • La gestion des erreurs liées aux limites de débit, aux délais d’attente dépassés, au dépassement de la fenêtre de contexte et aux filtres de sécurité

Le backend peut être plus difficile sur le plan intellectuel, mais le frontend absorbe les complications que les utilisateurs ressentent réellement.

Les bibliothèques de composants traditionnelles sont utiles, mais elles introduisent souvent un autre coût :

  • Vous dépendez d’abstractions au niveau du package que vous ne pouvez pas facilement modifier.
  • Les surcharges de styles deviennent fragiles.
  • L’accessibilité n’est que partiellement prise en charge si vous ne comprenez pas les primitives.
  • Vous livrez plus de code que nécessaire.
  • Votre application commence à ressembler à toutes les autres applications qui utilisent la même bibliothèque.

shadcn-ui/ui adopte une autre approche : les composants ne sont pas un produit que vous utilisez à l’exécution ; ce sont du code source que vous intégrez à votre projet.

En pratique, cela change le modèle de maintenance. Si l’espacement des boutons est incorrect dans votre workflow de révision par IA, vous modifiez components/ui/button.tsx. Si votre menu de commandes a besoin de badges indiquant la latence des modèles, vous le modifiez directement. Si votre carte de citation doit afficher les scores de récupération ou les fragments de documents, vous maîtrisez le balisage.

Cela paraît banal jusqu’au moment où vous devez livrer une interface d’IA personnalisée chaque semaine.

Ce que shadcn-ui/ui est réellement

Le projet se comprend mieux comme deux éléments liés :

  1. Une collection de composants
  2. Une plateforme de distribution de code

La collection de composants fournit des éléments d’interface réutilisables : boutons, boîtes de dialogue, cartes, champs de saisie, tableaux, menus, panneaux, formulaires, palettes de commandes et autres primitives similaires présentes dans les applications web modernes.

C’est son modèle de distribution qui la distingue. Au lieu de procéder ainsi :

npm install some-ui-library

et d’importer des composants opaques depuis node_modules, un workflow typique avec shadcn/ui ajoute les fichiers sources des composants à votre application :

npx shadcn@latest init
npx shadcn@latest add button card dialog input textarea

Vous les importez ensuite depuis votre projet local :

import { Button } from "@/components/ui/button"
import {
  Card,
  CardContent,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"

La différence est architecturale, pas cosmétique. Le composant fait partie de votre base de code. Vous pouvez l’inspecter, le refactoriser, l’adapter à vos tokens de design ou l’intégrer aux conventions de votre framework.

L’écosystème du projet croise fréquemment React, Next.js, Radix UI, les classes utilitaires de type Tailwind CSS et les intégrations aux frameworks. Les sujets du dépôt incluent également Laravel, ce qui reflète une ambition plus large : il ne s’agit pas simplement d’un ensemble de composants React, mais d’une approche de distribution de code pour des interfaces réutilisables sur différentes stacks applicatives.

Architecture : des composants dont vous possédez le code source plutôt qu’une abstraction à l’exécution

La façon la plus claire d’expliquer l’architecture consiste à comparer les périmètres de propriété du code.

ApprocheEmplacement des composantsModèle de personnalisationModèle de mise à niveauUsage idéal
Package d’interface traditionnelnode_modulesProps, thèmes, substitutionsMise à niveau du packageApplications standardisées avec une personnalisation limitée
Primitives sans interface prédéfinienode_modules avec le balisage de l’applicationComposez vous-même le comportementMise à niveau du packageÉquipes disposant d’une solide expertise frontend
shadcn/ui styleVotre arborescence de code sourceModifiez directement le code des composantsAjoutez à nouveau, comparez les différences ou mettez à jour manuellementÉquipes produit ayant besoin de rapidité et de contrôle
Système de design entièrement personnaliséVotre arborescence de code source et vos packagesMaîtrise complèteProcessus interneGrandes organisations dotées d’équipes dédiées au système de design

shadcn-ui/ui se situe entre une bibliothèque de composants et un kit de démarrage pour un système de design. Il vous fournit des composants fonctionnels, sans pour autant prétendre qu’ils doivent rester intacts.

Une stack courante ressemble à ceci :

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

La frontière importante est components/ui. Il s’agit de primitives génériques. Vos interfaces propres à l’IA se situent au-dessus, dans components/ai.

Une règle saine en pratique :

  • components/ui: génériques, réutilisables, sans sophistication superflue
  • components/ai: schémas d’interaction avec l’IA propres au produit
  • lib/ai: routage des modèles, streaming, recherche d’informations, exécution d’outils
  • app/: routage du framework, actions serveur, composition des pages

Cela évite de transformer les primitives d’interface en fourre-tout pour les comportements propres aux modèles.

Un workflow réaliste : créer une console de validation des réponses de l’IA

Supposons que vous développiez une console interne de validation des réponses de l’IA pour des tickets d’assistance. Le backend recherche des informations dans les tickets précédents et rédige des suggestions de réponse à l’aide d’un modèle tel que GPT-5.5, Claude Sonnet 4.6, Gemini 3 ou d’un point de terminaison de modèle ouvert. Le frontend doit afficher :

  • Le ticket du client
  • Le brouillon généré
  • Les éléments justificatifs retrouvés
  • Un indicateur de confiance
  • Une action d’approbation humaine
  • Un sélecteur de modèle pour le débogage

Commencez par ajouter les composants d’interface essentiels :

npx shadcn@latest init
npx shadcn@latest add button card badge textarea select separator skeleton

Définissez ensuite explicitement la configuration de vos modèles. Ne la dissimulez pas dans les libellés de l’interface.

// 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",
  },
]

Composez maintenant le panneau de validation à l’aide des composants d’interface locaux :

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>
  )
}

C’est ici que l’approche fondée sur la maîtrise du code source porte ses fruits. Si votre bouton d’approbation nécessite une boîte de dialogue de confirmation spécifique pour le journal d’audit, vous n’avez pas à attendre qu’une bibliothèque expose la bonne prop. Si votre bloc de justificatifs nécessite des raccourcis clavier, une gestion personnalisée du focus ou une présentation dense adaptée aux entreprises, vous pouvez le construire directement à partir des primitives locales.

Sa place dans une stack IA moderne

shadcn-ui/ui n’est ni un framework d’inférence, ni une base de données vectorielle, ni un routeur de modèles, ni un environnement d’exécution d’agents. Il se situe dans la couche produit.

Une stack IA typique en 2026 ressemble à ceci :

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

C’est dans la couche d’interface que les utilisateurs décident s’ils font confiance au système. Pour les produits d’IA, la confiance repose souvent sur des détails d’interface ordinaires :

  • Le streaming rend-il la progression visible ?
  • Les sources retrouvées sont-elles lisibles ?
  • Les utilisateurs peuvent-ils inspecter les appels d’outils ?
  • L’incertitude du modèle est-elle clairement signalée ?
  • Un humain peut-il remplacer le résultat ?
  • Les actions destructrices nécessitent-elles une confirmation ?
  • La navigation au clavier fonctionne-t-elle dans les parcours de validation denses ?

Les primitives de composants aident à répondre à ces questions, mais elles ne les résolvent pas automatiquement. Vous devez toujours exercer votre jugement en matière de conception produit.

Un piège courant : les équipes créent une belle fenêtre de chat et négligent le parcours de débogage. Puis survient le premier incident en production — recherche d’informations défaillante, mauvais routage du modèle, JSON mal formé, délai d’attente d’un outil dépassé — et aucune interface ne permet d’inspecter ce qui s’est passé. Avec des composants dont vous possédez le code source, il est facile de créer des panneaux internes pour les traces, les contenus des prompts, les mesures de latence et les décisions des modèles sans importer un framework d’interface d’administration distinct.

Par exemple, présentez clairement les données de durée :

{
  "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
}

Affichez-les ensuite dans une petite carte de diagnostic destinée aux utilisateurs internes. Tous les utilisateurs n’en ont pas besoin, mais chaque équipe d’ingénierie IA finit par en avoir besoin.

À qui s’adresse cette approche

shadcn-ui/ui convient particulièrement aux équipes qui souhaitent garder le contrôle sans partir de zéro.

Utilisez-le si :

  • Vous développez un produit reposant largement sur React ou Next.js.
  • Vous avez besoin de primitives d’interface modernes et accessibles.
  • Vous prévoyez de personnaliser les composants en profondeur.
  • Vous souhaitez posséder le code source plutôt que dépendre du comportement opaque d’une bibliothèque.
  • Votre application comprend des workflows d’IA nécessitant des panneaux, des chronologies, des éditeurs ou des états de validation personnalisés.
  • Votre équipe est à l’aise avec la maintenance du code frontend.

Cette approche est particulièrement utile pour les produits d’IA dont l’interface ne se limite pas à un tableau de bord statique. Les éditeurs de prompts, les vues d’évaluation, les chronologies de chat, les traces d’agents et les files d’approbation nécessitent tous une conception d’interaction personnalisée.

Faites preuve de davantage de prudence si :

  • Votre équipe souhaite un système de design d’entreprise entièrement prêt à l’emploi.
  • Vous ne souhaitez pas avoir le code des composants dans votre dépôt.
  • Vous ne disposez pas de l’expertise frontend nécessaire pour maintenir les composants copiés.
  • Vous exigez une gouvernance du design strictement centralisée sur de nombreuses applications.
  • Vous attendez des mises à niveau de packages qu’elles résolvent automatiquement la maintenance de l’interface.

Autrement dit, shadcn-ui/ui vous donne la maîtrise du code. Cette maîtrise est un atout puissant, mais elle a un coût.

Avantages, inconvénients et limites

Ce qui fonctionne bien

Le principal avantage est le contrôle local. Vous pouvez inspecter chaque composant, comprendre ce qui est livré et l’adapter à votre application. Pour les interfaces d’IA, c’est extrêmement pratique, car les exigences produit évoluent rapidement.

Autres points forts :

  • Une base accessible : L’écosystème s’appuie généralement sur des primitives conçues avec l’accessibilité à l’esprit, telles que Radix UI.
  • Une esthétique soignée par défaut : Les composants sont suffisamment aboutis pour être utilisés immédiatement.
  • Une structure composable : Les composants constituent de bons éléments de base pour les interfaces propres au produit.
  • Peu de contraintes d’abstraction : Vous n’êtes pas obligé d’adopter une API de composants gigantesque.
  • Une orientation adaptée aux frameworks : Le positionnement du projet autour de la distribution du code lui permet de s’adapter à des applications de formes variées, au-delà d’un seul cas précis.

Les points faibles

Le principal inconvénient est la maintenance. Une fois le code intégré à votre dépôt, il vous appartient.

Cela signifie que :

  • Vous devez suivre manuellement les changements lorsque les pratiques en amont s’améliorent.
  • Les composants peuvent diverger d’une application à l’autre.
  • Les ingénieurs peuvent personnaliser excessivement les primitives au lieu de composer des composants à partir de celles-ci.
  • La cohérence du design exige de la discipline.
  • L’accessibilité peut régresser si des modifications locales perturbent la gestion du focus ou la sémantique.

Un exemple concret : un composant de boîte de dialogue peut être accessible au départ, mais un ingénieur pressé peut tout de même supprimer les libellés appropriés, perturber le retour du focus ou masquer un état important aux lecteurs d’écran. La maîtrise du code source ne supprime pas le travail d’accessibilité ; elle rend l’implémentation visible.

Autre limite : shadcn-ui/ui ne définit pas votre modèle d’interaction avec l’IA. Il ne vous dira pas comment représenter l’incertitude, comparer les résultats des modèles ou concevoir un parcours d’approbation sûr. Il vous fournit des briques de qualité, pas un produit d’IA fini.

Conseils pratiques d’architecture

En pratique, je recommande de considérer les shadcn/ui composants comme une couche de plateforme locale.

Gardez vos composants d’interface génériques bien structurés :

components/ui/button.tsx
components/ui/dialog.tsx
components/ui/table.tsx
components/ui/tabs.tsx

Créez les composants propres à l’IA séparément :

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

Évitez cette mauvaise pratique :

components/ui/ai-button.tsx
components/ui/prompt-dialog.tsx
components/ui/rag-card.tsx

Dès que des concepts propres à l’IA s’introduisent dans components/ui, les primitives deviennent plus difficiles à réutiliser.

Pour les applications d’IA sensibles à la latence, évitez également de lier directement l’état visuel à un unique objet de réponse volumineux. Les interfaces en streaming sont plus faciles à maintenir lorsque l’état est réparti :

type AssistantRunState = {
  status: "idle" | "retrieving" | "generating" | "complete" | "error"
  draftText: string
  evidence: Evidence[]
  timings: {
    retrievalMs?: number
    firstTokenMs?: number
    totalMs?: number
  }
}

Cela se traduit naturellement en composants d’interface : des squelettes de chargement pendant la recherche, du texte en streaming pendant la génération, des cartes de preuves lorsque la recherche est terminée et des badges de diagnostic lorsque les mesures de durée arrivent.

L’avenir de ce projet

L’intérêt de shadcn-ui/ui ne tient pas seulement à son ensemble de composants. Il réside aussi dans l’idée de distribuer le code.

Les équipes modernes recherchent de plus en plus des logiciels réutilisables qu’elles peuvent copier, examiner et modifier, surtout à mesure que les outils de développement assisté par IA s’intègrent au travail quotidien. Un modèle de composants dont l’équipe maîtrise le code source s’inscrit dans cette réalité. Un ingénieur peut demander à un assistant de programmation IA d’adapter un composant local parce que le code est présent dans le dépôt. Il n’est pas nécessaire de rétroconcevoir l’abstraction d’un paquet ni de lutter contre des mécanismes internes non documentés.

Cela n’a rien de magique. Ce modèle de composants correspond simplement à la manière dont de nombreuses équipes travaillent réellement : copier une bonne implémentation, l’adapter et continuer à livrer.

Pour les équipes qui développent des produits d’IA, c’est souvent le bon compromis.

Conseils pratiques

  • shadcn-ui/ui résout un véritable problème d’ingénierie produit : créer des interfaces soignées, accessibles et personnalisables sans renoncer à la maîtrise des composants.
  • Son architecture privilégie le code source : les composants sont ajoutés à votre dépôt et maintenus comme du code local, au lieu d’être utilisés uniquement au travers d’API de paquets opaques.
  • Il trouve surtout sa place dans la couche d’interface des systèmes d’IA : conversations, files de révision, tableaux de bord d’évaluation, sélecteurs de modèles, traces d’outils et affichage des sources de recherche.
  • Le principal compromis concerne la maintenance : une fois les composants copiés, votre équipe est responsable de leur cohérence, de leur accessibilité et de leurs mises à niveau.
  • Conservez components/ui générique et placez les comportements propres à l’IA dans components/ai pour éviter de contaminer les primitives.
  • Utilisez-le si vous avez besoin à la fois de rapidité et de contrôle ; évitez-le si vous recherchez un système de design entièrement géré, avec des mises à niveau centralisées et une responsabilité minimale sur le frontend.
A

Ce blog est publié par AI Prime Tech. Les articles sont rédigés avec l’aide de l’IA ; vérifiez les détails propres à chaque version, tels que les identifiants de modèles, les prix et les limites, dans la documentation officielle avant de vous y fier.

Accédez à l’API Claude à moindre coût

Une seule clé API pour Claude Opus 5.5, Sonnet 5, Haiku 4.5 et Fable 5.1, ainsi que GPT-6 modèles. Paiement à l’usage, sans abonnement.

Obtenir votre clé API →
AI Prime Tech est une passerelle API tierce indépendante. Claude™ et Anthropic® sont des marques d’Anthropic, PBC. Aucune affiliation ni approbation n’est sous-entendue.