Chat Thread
Die ganze Unterhaltung rund um den Composer. Deine Frage bleibt oben angeheftet, während die Antwort streamt, Checkpoints an der Seite springen zwischen Nachrichten, und jede Antwort lässt sich kopieren, bearbeiten, wiederholen, bewerten und zwischen Versionen umschalten. Antworten rendern Markdown mit Codeblöcken, Tabellen und Zitaten, und Thinking, Tool-Aufrufe und Prompt Input lassen sich direkt einsetzen.
Chat Thread ist die Unterhaltung rund um den Composer: deine Nachrichten, die Antworten des Modells und was du damit tun kannst. Er beginnt mit deinem Leerzustand und dem zentrierten Composer und dockt den Composer unten an, sobald es Nachrichten gibt, ohne ihn neu zu mounten, sodass Fokus und Entwurfstext erhalten bleiben.
Die Nachricht, die du gerade gesendet hast, rückt nach oben, während die Antwort darunter streamt, und die Ansicht folgt neuem Text, bis du wegscrollst. Eine Leiste mit Checkpoints rechts lässt dich zwischen deinen Nachrichten springen, mit Vorschau beim Hover. Älterer Verlauf lädt von oben, ohne dass sich die Ansicht bewegt.
Fahre über eine Nachricht, um sie zu kopieren, zu bearbeiten oder erneut zu versuchen. Bearbeitungen und Wiederholungen werden zu Versionen, zwischen denen du wechseln kannst, und nichts geht verloren. Fehlgeschlagene Antworten bieten Try again, gestoppte Antworten sagen das, und Daumen hoch oder runter ist ein Klick. In jeder Antwort lassen sich Reasoning, ToolCalls und Markdown aus den anderen Blocks direkt einsetzen.
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/chat-thread
Mit dem AI SDK
Ordne useChat-Nachrichten dem Thread zu. Reasoning-Parts gehen an Reasoning, Tool-Parts an ToolCalls und Text an Markdown. Hefte die neueste Nutzernachricht an, nutze regenerate für Try again und sende eine Bearbeitung ab diesem Punkt erneut.
Aufbau
Die Teile, die du zusammensetzt, von außen nach innen.
| Part | Beschreibung |
|---|---|
ChatThread | Der Rahmen: Scroller, Checkpoints, Leerzustand und Composer-Slot. |
ChatUserMessage | Deine Nachricht: Anhänge, Bubble, Zeit, Versionen, Kopieren und Bearbeiten. |
ChatAssistantMessage | Eine Antwort. Setze Reasoning, ToolCalls und Markdown hinein; sie fügt die Aktionen sowie Fehler- und Stopp-Zustände hinzu. |
ChatDivider | Eine beschriftete Linie zwischen Nachrichtengruppen. |
ChatAttachments, ChatAction, ChatCopy, ChatBranchSwitch, ChatEditor | Die Bausteine, die die Nachrichten verwenden, für eigene Layouts exportiert. |
| Prop | Typ | Standard |
|---|---|---|
childrenNachrichten und Trenner, der Reihe nach. | ReactNode | – |
composerMeist Prompt Input. Zentriert, wenn leer, sonst unten angedockt. | ReactNode | – |
emptyWird über dem Composer angezeigt, wenn es keine Nachrichten gibt. | ReactNode | – |
busyMarkiert die Unterhaltung für assistive Technologien als beschäftigt, während eine Antwort streamt. | boolean | false |
hasOlderZeigt oben „Load earlier messages“. | boolean | false |
loadingOlderZeigt auf diesem Button einen Spinner. Die Scrollposition wird wiederhergestellt, sobald es false wird. | boolean | false |
onLoadOlderÄltere Nachrichten hier voranstellen. | () => void | – |
| Prop | Typ | Standard |
|---|---|---|
idStabile ID. Behalte sie über Versionen hinweg bei, damit die Ansicht nicht springt. | string | – |
textDie Nachricht. Wird auch für die Checkpoint-Vorschau verwendet. | string | – |
pinScrollt diese Nachricht nach oben, wenn sie erscheint. Setze es bei der gerade gesendeten Nachricht. | boolean | false |
files{ id, name, size?, type?, url? }. Bilder mit einer url werden als Thumbnails angezeigt. | ChatFile[] | – |
timeWird beim Hover angezeigt, in der Locale des Lesers. | Date | – |
branch{ index, count, onChange } für die Versionspfeile. | ChatBranch | – |
onEditZeigt Edit. Wird mit dem neuen Text aufgerufen, wenn er sich geändert hat. | (text: string) => void | – |
attachmentsEigener Inhalt über der Bubble. | ReactNode | – |
| Prop | Typ | Standard |
|---|---|---|
idStabile ID. | string | – |
childrenReasoning, ToolCalls, Markdown oder irgendetwas anderes. | ReactNode | – |
textReiner Text für Copy. | string | – |
streamingBlendet die Aktionen aus, bis die Antwort fertig ist. | boolean | false |
lastHält die Aktionen sichtbar, statt sie beim Hover zu zeigen. | boolean | false |
metaRechte Seite der Aktionszeile, etwa das Modell und der Effort. | ReactNode | – |
branchVersionspfeile für Wiederholungen. | ChatBranch | – |
feedbackDie aktuelle Bewertung. | "up" | "down" | null | null |
onFeedbackZeigt die Daumen. Wird mit null aufgerufen, wenn eine Bewertung zurückgenommen wird. | (feedback) => void | – |
onRetryZeigt Try again. | () => void | – |
errorZeigt die Nachricht mit Try again statt der Aktionen. | string | null | – |
stoppedMarkiert eine Antwort, die vorzeitig gestoppt wurde. | boolean | false |
| Prop | Typ | Standard |
|---|---|---|
childrenDas Label, etwa Heute oder „Zu Nova 3 Max gewechselt“. | ReactNode | – |
| Taste | Aktion |
|---|---|
| Tab | Wechselt durch die Aktionen der Nachrichten. Sie erscheinen bei Fokus, nicht nur beim Hover. |
| Enter | Sendet eine bearbeitete Nachricht. |
| ShiftEnter | Fügt beim Bearbeiten eine Zeile hinzu. |
| Esc | Bricht eine Bearbeitung ab. |
| ↑↓PgUpPgDn | Scrollt die Unterhaltung, wenn sie den Fokus hat. |
- Die Unterhaltung ist eine beschriftete Region mit einem Log, sodass neue Nachrichten beim Eintreffen angesagt werden und die Region als beschäftigt markiert ist, während eine Antwort streamt.
- Jede Icon-Aktion hat ein Label und einen Tooltip. Daumen nutzen aria-pressed, Copy und Feedback bestätigen über eine höfliche Live-Region, und Fehler nutzen role=alert.
- Checkpoints sind eine Navigationsmarke aus Buttons namens „Nachricht 2: …“, und der aktuelle hat aria-current.
- Versionspfeile sind eine Gruppe namens „Version 1 von 2“.
- Der Editor fokussiert sich selbst mit dem Cursor am Ende und kehrt bei Cancel zur Nachricht zurück. Enter wartet, solange eine Eingabemethode komponiert.
- Fokusringe werden vom Scroller nie abgeschnitten, und Aktionen bleiben auf Touchscreens sichtbar.
Gebaut mit
Die kostenlosen HextaUI-Komponenten, aus denen Chat Thread besteht. Jede lässt sich einzeln installieren.
Code
2 Dateien, hinzugefügt zu components/blocks/chat-thread.