Tool Calls
Zeige, was ein Agent tut, eine Zeile pro Schritt. Lesen und Suchen werden zu einer kurzen Zusammenfassung gefaltet, während Änderungen, Befehle, Freigaben und Fehler sichtbar bleiben. Jeder Schritt öffnet sich zu einer echten Ansicht: der Datei, dem Diff, dem Terminal oder den Ergebnissen. Jeder Tool-Zustand des AI SDK ist abgedeckt, einschließlich Freigaben mit der Möglichkeit, stattdessen eine Begründung anzugeben.
Agenten können Dutzende kleiner Schritte machen, bevor sie antworten. Jeden zu zeigen, begräbt die Antwort, und sie zu verbergen, lässt den Agenten wie eine Blackbox wirken. Tool Calls gibt jedem Schritt eine ruhige Zeile, die sich wie ein Satz liest, etwa „Read components/search.tsx“ oder „Searched for useResults, 3 results“.
Lesen, Suchen und Nachschlagen, die direkt hintereinander laufen, falten sich zu einer einzigen Zusammenfassung wie „Explored 6 files“. Alles, was etwas ändert, eine Entscheidung braucht oder fehlschlägt, bleibt in einer eigenen Zeile, mit einem Live-Timer, solange es läuft. Öffne einen beliebigen Schritt, um die echte Arbeit zu sehen: die Datei, den Diff, das Terminal oder die Ergebnisse.
Jeder Tool-Zustand des AI SDK hat sein eigenes Aussehen und seine eigene Formulierung, auch Freigaben. Die Freigabe bietet Allow, Deny, Always allow und „Tell it what to do instead“, das deine Worte als Grund zurückschickt, mit ⌘↵ und ⌘⌫ per Tastatur. getToolPartStatus ordnet Tool-Parts für dich zu, und fertige Ansichten decken Suchergebnisse, Dateilisten, Multiple-Choice-Fragen und rohes JSON ab.
Die Pro-Registry zu components.json hinzufügen
components.json Token hinzufügen
Erstelle auf deiner Kontoseite einen Token und trage ihn in
.env.localalsHEXTAUI_PRO_TOKENein.Den Block hinzufügen
pnpm dlx shadcn@latest add @hextaui-pro/tool-calls
Mit dem AI SDK
Wandle Tool-Parts mit getToolPartStatus in Schritte um und wähle pro Tool eine kind und eine View. Übergib stopped, sobald der Chat nicht mehr streamt, damit ein mittendrin abgebrochener Aufruf „Cancelled“ anzeigt, statt endlos zu drehen.
Befehle freigeben
Markiere ein Tool auf dem Server mit needsApproval und antworte mit addToolApprovalResponse. Always allow merkt sich das Programm, und eine Ablehnung kann als Grund mitgeben, was stattdessen zu tun ist. ⌘↵ und ⌘⌫ funktionieren, solange der Schritt den Fokus hat.
Den Nutzer fragen
Ein Client-Tool ohne execute-Funktion wartet auf eine Antwort. Zeige die Auswahl mit AskUser und sende die Wahl mit addToolOutput zurück.
Aufbau
Die Teile, die du zusammensetzt, von außen nach innen.
| Part | Beschreibung |
|---|---|
ToolCalls | Die Liste. Gruppiert ruhige Durchläufe und teilt die Zeitmessung zwischen den Schritten. |
ToolCall | Ein Schritt: Icon, Satz, Meta, Timer und sein Inhalt, wenn geöffnet. |
ToolGroup | Ein eingeklappter Lauf ruhiger Schritte mit einer Zusammenfassungszeile. |
ToolApproval | Die Karte zum Genehmigen, Ablehnen und Umleiten, die in einem Schritt angezeigt wird, der auf Freigabe wartet. |
SearchResults, FileList, AskUser, ToolJson | Views, die als Inhalt eines Schritts übergeben werden. |
ToolCalls
Akzeptiert auch alle ol-Props außer children.
| Prop | Typ | Standard |
|---|---|---|
callsDie Schritte in der Reihenfolge, in der sie ausgeführt wurden. | ToolCallProps[] | – |
groupFaltet Läufe ruhiger Schritte. Setze false, um jeden Schritt zu zeigen. | boolean | true |
| Prop | Typ | Standard |
|---|---|---|
idStabile ID, meist die toolCallId. Das Timing wird pro ID geführt. | string | – |
statusstreaming, running, waiting, approval, done, error, denied oder cancelled. | ToolStatus | – |
kindread, search, list, edit, write, run, web, fetch, ask oder other. Bestimmt Icon und Verb. | ToolKind | "other" |
subjectWorauf sich der Schritt bezog: ein Pfad, eine Suchanfrage, eine URL oder ein Befehl. | string | – |
nameTool-Name, der für den Satz verwendet wird, wenn kind other ist. | string | – |
titleErsetzt den generierten Satz vollständig. | string | – |
metaKurzes Ergebnis nach dem Satz, etwa „3 results“ oder „+12 −3“. | ReactNode | – |
contentWird angezeigt, wenn der Schritt geöffnet ist. | ReactNode | – |
exitCodeFür Run-Schritte. Ein Wert ungleich null markiert den Schritt als fehlgeschlagen und öffnet ihn. | number | – |
errorMeldung, die für den Fehlerstatus angezeigt wird. | string | – |
durationGespeicherte Dauer in Sekunden, für den Verlauf. | number | – |
approvalGrund, Ergebnis und Always-allow-Label für Freigaben. | ToolCallApproval | – |
defaultOpenÜberschreibt, ob der Schritt geöffnet startet. | boolean | – |
onApproveWird von Allow oder Always allow aufgerufen. | (options: { always: boolean }) => void | – |
onDenyWird von Deny oder mit Text aus „Tell it what to do instead“ aufgerufen. | (reason?: string) => void | – |
| Prop | Typ | Standard |
|---|---|---|
reasonWarum eine Freigabe nötig ist, angezeigt über den Buttons. | string | – |
approvedDie Antwort, sobald sie gegeben wurde. | boolean | – |
automaticDurch eine Regel freigegeben, daher wird keine Card angezeigt. | boolean | – |
denialReasonWas die Person stattdessen verlangt hat, angezeigt bei abgelehnten Schritten. | string | – |
alwaysLabelZeigt „Always allow …“ mit diesem Label, zum Beispiel dem Programmnamen. | string | – |
getToolPartStatus(part, options)
Ordnet einen Tool-Part des AI SDK einem ToolStatus zu.
| Prop | Typ | Standard |
|---|---|---|
partDer Part aus message.parts. | ToolUIPart | DynamicToolUIPart | – |
options.stoppedDer Chat wurde gestoppt, daher zeigen unfertige Aufrufe „Cancelled“ an, statt weiter zu drehen. | boolean | false |
options.waitingEin Client-Tool wartet auf die Person, zum Beispiel AskUser. | boolean | false |
| Prop | Typ | Standard |
|---|---|---|
questionDie Frage. | string | – |
optionsDie Auswahlmöglichkeiten. | { value, label, description? }[] | – |
answerDer gewählte Wert, sobald geantwortet wurde. | string | – |
onAnswerSchicke es mit addToolOutput zurück. | (value: string) => void | – |
| Prop | Typ | Standard |
|---|---|---|
queryInnerhalb jedes Treffers hervorgehoben. | string | – |
matchesDie Treffer. | { path, line, text }[] | – |
limitWird vor „Show all“ angezeigt. | number | 6 |
| Taste | Aktion |
|---|---|
| EnterSpace | Öffnet oder schließt einen Schritt oder eine gefaltete Gruppe. |
| ⌘↵ | Erlaubt einen Schritt, der auf Freigabe wartet, solange der Fokus in ihm liegt. |
| ⌘⌫ | Verweigert einen Schritt, der auf Freigabe wartet, solange der Fokus in ihm liegt. |
| Esc | Verlässt „Tell it what to do instead“, ohne zu senden. |
- Schritte sind eine geordnete Liste, sodass Screenreader ansagen, wie viele Schritte es gibt und an welcher Stelle sich jeder befindet.
- Schritte, die eine Person brauchen, werden über eine Live-Region mit polite-Priorität angesagt, etwa „Freigabe erforderlich: Run pnpm test“, ebenso Fragen und Fehler. Routineschritte bleiben still, damit Screenreader nicht überflutet werden.
- Der Status ist nie nur Farbe: Jeder Zustand hat sein eigenes Icon und seine eigene Formulierung.
- Freigabe-Kürzel werden ignoriert, solange in einem Feld getippt wird, und das Umleitungsfeld fokussiert sich beim Öffnen selbst und gibt den Fokus beim Schließen zurück.
Gebaut mit
Die kostenlosen HextaUI-Komponenten, aus denen Tool Calls besteht. Jede lässt sich einzeln installieren.
Code
8 Dateien, hinzugefügt zu components/blocks/tool-calls.