HextaAI
Une application de chat IA complète construite avec tous les blocks IA de HextaUI. Des conversations dans une barre latérale, la réflexion avec sources, des appels d’outils avec diffs et approbations, un plan à relire avant l’exécution de l’agent, du Markdown et du code en streaming, et un mode vocal silencieux, le tout piloté par les message parts d’AI SDK.
HextaAI est une application de chat IA complète faite de tous les blocks IA de HextaUI. Chat Sidebar contient l’historique, Chat Thread la conversation, Prompt Input est le champ de saisie, et chaque réponse est dessinée à partir de ses parts : Thinking pour le raisonnement, Tool Calls pour ce que l’agent a fait, Agent Todos pour son plan, Code Block pour les diffs et terminaux, et Streaming Markdown pour la réponse. Artifact ouvre les pages web, documents et fichiers produits par le modèle dans un panneau à côté du chat, avec des versions, et les petits changements sont tapés dans le fichier ouvert au lieu de le réécrire. Voice Mode s’ouvre depuis le champ de saisie et dépose la conversation dans le chat quand vous raccrochez.
Le cœur est HextaMessageParts. Il prend les mêmes message parts que renvoie useChat d’AI SDK, regroupe les raisonnements et appels d’outils voisins, garde un seul plan actif en haut de la réponse et affiche le texte avec des citations liées aux sources trouvées par le modèle. Lectures, modifications, écritures, recherches, requêtes web et commandes shell ont chacune une vue adaptée, et vous pouvez ajouter des moteurs de rendu pour vos propres outils.
La démo repose sur ScriptedChats, un petit moteur qui diffuse des parts réalistes hors ligne. Essayez une suggestion : créer une page de tarifs et la regarder s’ouvrir à côté du chat, rechercher une question et voir arriver les sources, demander une fonctionnalité et relire le plan avant son exécution, approuver un lancement de tests qui échoue puis est corrigé, ou demander une explication avec du code et des tableaux. Arrêtez, régénérez, modifiez et changez de chat pendant que les réponses continuent d’arriver en arrière-plan, puis ouvrez le mode vocal et parlez.
Ajouter le registre Pro à components.json
components.json Ajouter votre token
Créez un token sur votre page de compte et placez-le dans
.env.localsous le nomHEXTAUI_PRO_TOKEN.Ajouter le block
pnpm dlx shadcn@latest add @hextaui-pro/hexta-ai
Avec AI SDK
Passez directement les messages de useChat à HextaMessageParts. Les approbations d’outils et les relectures de plan répondent via addToolApprovalResponse, et un plan modifié retourne au modèle comme motif d’approbation.
Vos propres outils
Associez un nom d’outil à un moteur de rendu qui renvoie son kind, son subject et son content. Les outils non associés utilisent les vues intégrées ou une vue JSON.
Démos scriptées
ScriptedChats diffuse en streaming des parts au format AI SDK à partir d’un script, avec un vrai rythme, des approbations et l’arrêt. Utilisez-le pour des visites de produit, de l’onboarding et des démos hors ligne.
Anatomie
Les parties à composer, de l’extérieur vers l’intérieur.
| Partie | Description |
|---|---|
HextaMessageParts | Affiche un message de l’assistant à partir de ses parts, dans l’ordre : raisonnement, plan, appels d’outils et Markdown. |
defaultTools | Moteurs de rendu intégrés pour read_file, list_files, grep, web_search, fetch, edit_file, write_file et bash. |
ScriptedChats, useScriptedChat | Un moteur hors ligne qui diffuse en streaming des parts au format AI SDK à partir de scripts, avec arrêt, régénération, modification, approbations et relecture du plan. |
textOf, sourcesOf, toBlocks | Des helpers qui lisent le texte et les sources d’un message et regroupent ses parts comme le fait le moteur de rendu. |
HextaAIDemo | L’application complète : Chat Sidebar, Chat Thread, Prompt Input et Voice Mode reliés à ScriptedChats. |
| Prop | Type | Par défaut |
|---|---|---|
partsLes parts du message : texte, raisonnement, source-url, fichier et outil, telles que les renvoie useChat. | MessagePart[] | – |
streamingIndique si ce message est encore en cours d’arrivée. Le dernier bloc de raisonnement ou de texte s’anime, et les outils en cours restent actifs. | boolean | false |
stoppedMarque les outils en cours comme annulés et masque une relecture de plan en attente. | boolean | false |
toolsMoteurs de rendu par nom d’outil. Chacun renvoie kind, subject, title, meta, content, exitCode ou error, et remplace la vue intégrée. | Record<string, ToolRenderer> | {} |
onApprovalAppelé quand quelqu’un autorise ou refuse un appel d’outil en attente d’approbation. | (toolCallId, { approved, reason?, always? }) => void | – |
onPlanApproveAppelé avec le plan modifié quand quelqu’un l’exécute depuis la relecture. | (toolCallId, todos) => void | – |
onPlanCancelAppelé quand la relecture du plan est annulée. | (toolCallId) => void | – |
reasoningDurationsSecondes passées sur chaque bloc de raisonnement, pour que « Thought for » reste exact après un rechargement. | number[] | – |
| Prop | Type | Par défaut |
|---|---|---|
new ScriptedChats(respond)Choisit le script qui répond à chaque message. | (prompt, files) => Script | – |
send(chatId, text, files?, options?)Ajoute un message de l’utilisateur et diffuse la réponse en streaming. options : model, thinking et instant, qui supprime toute attente. | Promise<void> | – |
stop, regenerate, edit, append, removeArrêtez la réponse, refaites la dernière, renvoyez depuis un message modifié, ajoutez des messages terminés ou supprimez un chat. | methods | – |
decide(toolCallId, decision)Répond à une approbation ou une relecture de plan en attente. Passez todos pour exécuter un plan modifié. | void | – |
useScriptedChat(store, chatId)Abonne un composant à un chat. | { messages, status, pinned } | – |
| Prop | Type | Par défaut |
|---|---|---|
think(text)Diffuse une part de raisonnement en streaming. Ignoré quand thinking est désactivé. | Promise<void> | – |
say(markdown)Diffuse une part de texte en blocs irréguliers, comme un vrai modèle. | Promise<void> | – |
tool(name, input, { stream? })Ajoute un appel d’outil, avec éventuellement un champ d’entrée en streaming. Le handle peut l’approuver, le faire progresser, le terminer ou le faire échouer. | Promise<ToolHandle> | – |
plan(todos)Affiche un plan à relire et attend. Renvoie le plan modifié, ou null s’il est annulé. | Promise<Todo[] | null> | – |
todos(todos), source(page), pause(ms)Met à jour le plan, cite une source ou attend. | methods | – |
| Touche | Action |
|---|---|
| ⌘K | Recherche dans vos chats. |
| ⌘⇧O | Démarre un nouveau chat. |
| ⌘B | Réduit la barre latérale en icônes, ou l’ouvre en plein écran sur mobile. |
| Enter | Envoie le message. Shift+Enter ajoute une ligne. |
| ⌘↵ | Exécute le plan pendant sa relecture, ou autorise un appel d’outil en attente. |
| ⌘⌫ | Refuse l’appel d’outil en attente. |
| Esc | Arrête la réponse, ferme un menu ou termine le mode vocal. |
- Chaque part conserve l’accessibilité du block qui la dessine : le fil annonce poliment les nouvelles réponses, les appels d’outils et les plans exposent leur état en texte, les citations nomment leur source, et les approbations sont de vrais boutons avec raccourcis clavier.
- Rien d’important n’est montré uniquement par le mouvement ou la couleur. Les spinners ont des libellés comme « Replying », les chats terminés en arrière-plan reçoivent un libellé « Unread reply », et les diffs marquent les lignes ajoutées et supprimées par des signes en plus de la couleur.
- Les animations de streaming, de shader et de sheet respectent toutes la réduction des animations. Le mode vocal fonctionne sans lire les réponses à voix haute, affiche des sous-titres et joue une conversation d’exemple quand il n’y a pas de microphone.
Construit avec
Les composants HextaUI gratuits dont HextaAI est constitué. Chacun s’installe séparément.
Code
5 fichiers, ajoutés à components/blocks/hexta-ai.