Streaming
Streame KI-Antworten, die sich flüssig lesen. Schubweise Chunks vom Modell werden in gleichmäßigem Tempo enthüllt, das zum Aufholen schneller wird, mit sanftem Einblenden neuer Wörter und einem Cursor, während geschrieben wird.
Modelle senden Text in Schüben: ein paar Wörter, eine Pause, dann ein ganzer Satz auf einmal. Jeden Chunk beim Eintreffen auszugeben, lässt eine Antwort stottern. Streaming hält das Empfangene getrennt vom Angezeigten und enthüllt es mit gleichmäßigen 90 Zeichen pro Sekunde.
Wenn sich Chunks stauen, steigt das Tempo, um die Lücke in etwa 0,3 Sekunden zu schließen, und sobald der Stream endet, wird der Rest in etwa 0,12 Sekunden ausgegeben, sodass der Text nie weit hinter dem Modell zurückbleibt. Emojis und andere mehrteilige Zeichen werden mitten in der Enthüllung nie getrennt, und wird der Text ersetzt statt angehängt, etwa nach einem Regenerieren, startet die Enthüllung ab dem, was beide Versionen gemeinsam haben.
Text, der nicht streamt, wird im ersten Frame vollständig gerendert, sodass Verlauf und Server-Renders nie animieren. StreamingText fügt ein sanftes Einblenden der neuesten Wörter und einen Cursor hinzu, während geschrieben wird. useSmoothText liefert nur das Timing, um es vor jeden Renderer zu setzen, auch Markdown.
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/streaming
Mit dem AI SDK
Rendere jeden Text-Part einer useChat-Nachricht. Der eigene Zustand des Parts sagt StreamingText, wann das Modell noch schreibt, sodass fertige Nachrichten und der Verlauf sofort erscheinen.
Mit Markdown
Nutze den Hook allein, um den Text vor jedem Renderer zu glätten. Streamdown behandelt unfertiges Markdown beim Streamen; react-markdown funktioniert genauso.
Mit jedem Stream
Hänge jeden Chunk an einen String an und übergib ihn. Das funktioniert gleich für fetch, OpenAI- oder Anthropic-Deltas oder Server-Sent Events.
Aufbau
Die Teile, die du zusammensetzt, von außen nach innen.
| Part | Beschreibung |
|---|---|
StreamingText | Ein Drop-in-Textelement, das taktet, einblendet und den Cursor zeigt. Nutze es für reine Textantworten. |
useSmoothText | Nur das Timing. Gibt den Text zurück, der gerade angezeigt werden soll, und ob es noch aufholt. |
StreamingText
Akzeptiert auch alle div-Props außer children.
| Prop | Typ | Standard |
|---|---|---|
textAlles, was bisher eingetroffen ist. Hänge daran an, wenn Chunks eintreffen. | string | – |
streamingOb weiterer Text kommt. Zeigt den Cursor und hält das Aufholfenster offen. | boolean | false |
smoothSchalte das Taktgeben ab, um Text genau so zu rendern, wie er eintrifft. | boolean | true |
charsPerSecondGrundlesetempo vor jedem Aufholen. | number | 90 |
useSmoothText(text, options)
Gibt { text, animating } zurück. animating bleibt true, bis der angezeigte Text den vollen Text erreicht.
| Prop | Typ | Standard |
|---|---|---|
textDer bisher empfangene vollständige Text. | string | – |
options.streamingOb die Quelle noch sendet. | boolean | false |
options.enabledBei false gibt der Hook den Text unverändert zurück. | boolean | true |
options.charsPerSecondGrundlesetempo. | number | 90 |
- Der Textcontainer ist eine höfliche Live-Region mit aria-busy, solange gestreamt wird, sodass Screenreader die Antwort ansagen, sobald sie sich setzt, statt jedes Zeichen.
- Der Cursor ist dekorativ und vor assistiven Technologien verborgen.
- Bei reduzierter Bewegung erscheinen Wörter ohne Einblenden, und der Cursor hört auf zu pulsieren. Das Timing bleibt, weil es um die Lesegeschwindigkeit geht, nicht um Bewegung.
Gebaut mit
Die kostenlosen HextaUI-Komponenten, aus denen Streaming besteht. Jede lässt sich einzeln installieren.
Code
3 Dateien, hinzugefügt zu components/blocks/streaming.