Tool Calls
Montrez ce que fait un agent, une ligne par étape. Les lectures et recherches se replient en un court résumé, tandis que les modifications, commandes, approbations et erreurs restent visibles. Chaque étape s’ouvre sur une vraie vue : le fichier, le diff, le terminal ou les résultats. Tous les états d’outil d’AI SDK sont couverts, y compris les approbations avec un motif à donner en échange.
Les agents peuvent faire des dizaines de petites étapes avant de répondre. Les montrer toutes noie la réponse, et les cacher fait de l’agent une boîte noire. Tool Calls donne à chaque étape une ligne discrète qui se lit comme une phrase, comme « Read components/search.tsx » ou « Searched for useResults, 3 results ».
Les lectures, recherches et consultations enchaînées se replient en un seul résumé comme « Explored 6 files ». Tout ce qui modifie quelque chose, exige une décision ou échoue reste sur sa propre ligne, avec un minuteur en direct pendant l’exécution. Ouvrez n’importe quelle étape pour voir le vrai travail : le fichier, le diff, le terminal ou les résultats.
Chaque état d’outil d’AI SDK a son propre aspect et sa formulation, approbations comprises. L’approbation propose Allow, Deny, Always allow et « Tell it what to do instead », qui renvoie vos mots comme motif, avec ⌘↵ et ⌘⌫ au clavier. getToolPartStatus associe les parts d’outil pour vous, et des vues prêtes à l’emploi couvrent les résultats de recherche, les listes de fichiers, les questions à choix multiples et le JSON brut.
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/tool-calls
Avec AI SDK
Transformez les parties d’outil en étapes avec getToolPartStatus et choisissez un kind et une vue pour chaque outil. Passez stopped dès que la conversation cesse de diffuser, afin qu’un appel interrompu en cours de route affiche Cancelled au lieu de tourner indéfiniment.
Approuver des commandes
Marquez un outil avec needsApproval côté serveur et répondez avec addToolApprovalResponse. Always allow mémorise le programme, et un refus peut porter ce qu’il faut faire à la place comme motif. ⌘↵ et ⌘⌫ fonctionnent tant que l’étape a le focus.
Interroger l’utilisateur
Un outil côté client sans fonction execute attend une réponse. Affichez les choix avec AskUser et renvoyez le choix avec addToolOutput.
Anatomie
Les parties à composer, de l’extérieur vers l’intérieur.
| Partie | Description |
|---|---|
ToolCalls | La liste. Regroupe les exécutions discrètes et partage le temps entre les étapes. |
ToolCall | Une étape : icône, phrase, méta, minuteur, et son contenu à l’ouverture. |
ToolGroup | Une série repliée d’étapes discrètes avec une ligne de résumé. |
ToolApproval | La carte d’approbation, de refus et de redirection, affichée dans une étape en attente d’approbation. |
SearchResults, FileList, AskUser, ToolJson | Vues à passer comme contenu d’une étape. |
ToolCalls
Accepte aussi toutes les props de ol sauf children.
| Prop | Type | Par défaut |
|---|---|---|
callsLes étapes dans l’ordre où elles se sont exécutées. | ToolCallProps[] | – |
groupReplie les séries d’étapes discrètes. Mettez false pour afficher chaque étape. | boolean | true |
| Prop | Type | Par défaut |
|---|---|---|
idId stable, généralement le toolCallId. Le chronométrage est conservé par id. | string | – |
statusstreaming, running, waiting, approval, done, error, denied ou cancelled. | ToolStatus | – |
kindread, search, list, edit, write, run, web, fetch, ask ou other. Détermine l’icône et le verbe. | ToolKind | "other" |
subjectCe sur quoi elle a agi : un chemin, une requête, une URL ou une commande. | string | – |
nameNom de l’outil, utilisé pour la phrase lorsque kind vaut other. | string | – |
titleRemplace entièrement la phrase générée. | string | – |
metaCourt résultat après la phrase, comme « 3 results » ou « +12 −3 ». | ReactNode | – |
contentAffiché quand l’étape est ouverte. | ReactNode | – |
exitCodePour les étapes d’exécution. Une valeur non nulle marque l’étape comme échouée et l’ouvre. | number | – |
errorMessage affiché pour le statut d’erreur. | string | – |
durationDurée enregistrée en secondes, pour l’historique. | number | – |
approvalMotif, résultat et libellé de Always allow pour les approbations. | ToolCallApproval | – |
defaultOpenRemplace le fait que l’étape démarre ouverte ou non. | boolean | – |
onApproveAppelé depuis Allow ou Always allow. | (options: { always: boolean }) => void | – |
onDenyAppelé depuis Deny, ou avec le texte de « Tell it what to do instead ». | (reason?: string) => void | – |
| Prop | Type | Par défaut |
|---|---|---|
reasonLa raison pour laquelle une approbation est requise, affichée au-dessus des boutons. | string | – |
approvedLa réponse, une fois donnée. | boolean | – |
automaticApprouvé par une règle, donc aucune carte n’est affichée. | boolean | – |
denialReasonCe que la personne a demandé à la place, affiché sur les étapes refusées. | string | – |
alwaysLabelAffiche « Always allow … » avec ce libellé, par exemple le nom du programme. | string | – |
getToolPartStatus(part, options)
Associe une part d’outil AI SDK à un ToolStatus.
| Prop | Type | Par défaut |
|---|---|---|
partLa partie issue de message.parts. | ToolUIPart | DynamicToolUIPart | – |
options.stoppedLa conversation s’est arrêtée : les appels inachevés affichent Cancelled au lieu de tourner indéfiniment. | boolean | false |
options.waitingUn outil côté client attend la personne, par exemple AskUser. | boolean | false |
| Prop | Type | Par défaut |
|---|---|---|
questionLa question. | string | – |
optionsLes choix. | { value, label, description? }[] | – |
answerLa valeur choisie, une fois la réponse donnée. | string | – |
onAnswerRenvoyez-le avec addToolOutput. | (value: string) => void | – |
| Prop | Type | Par défaut |
|---|---|---|
queryMis en évidence à l’intérieur de chaque correspondance. | string | – |
matchesLes correspondances. | { path, line, text }[] | – |
limitAffiché avant « Show all ». | number | 6 |
| Touche | Action |
|---|---|
| EnterSpace | Ouvre ou ferme une étape ou un groupe replié. |
| ⌘↵ | Autorise une étape en attente d’approbation tant que le focus est à l’intérieur. |
| ⌘⌫ | Refuse une étape en attente d’approbation tant que le focus est à l’intérieur. |
| Esc | Quitte « Tell it what to do instead » sans envoyer. |
- Les étapes forment une liste ordonnée : les lecteurs d’écran annoncent leur nombre et la position de chacune.
- Les étapes qui nécessitent une personne sont annoncées via une région live polie, par exemple « Approbation requise : Run pnpm test », de même que les questions et les erreurs. Les étapes courantes restent silencieuses pour ne pas submerger les lecteurs d’écran.
- Le statut ne repose jamais sur la couleur seule : chaque état a sa propre icône et sa formulation.
- Les raccourcis d’approbation sont ignorés pendant la saisie dans un champ, et le champ de redirection prend le focus à son ouverture et le rend à sa fermeture.
Construit avec
Les composants HextaUI gratuits dont Tool Calls est constitué. Chacun s’installe séparément.
Code
8 fichiers, ajoutés à components/blocks/tool-calls.