ストリーミング
滑らかに読めるAIの応答をストリーミングします。モデルからまとまって届くチャンクは、追いつくために加速する一定のペースで表示され、新しい単語はやわらかくフェードし、書き込み中はキャレットが表示されます。
モデルは、数語、間、そして一文まるごと、というようにテキストをまとまって送ります。届いたチャンクをそのまま表示すると、返信がぎくしゃくします。Streamingは、受け取った内容と表示する内容を分けて保持し、毎秒90文字の一定のペースで表示します。
チャンクが溜まると、約0.3秒で差を埋めるようにペースが上がり、ストリームが終わると残りは約0.12秒で一気に表示されるため、テキストがモデルから大きく遅れることはありません。絵文字などの複数のパーツからなる文字は、表示の途中で分割されません。また、再生成の後のようにテキストが追記ではなく置き換えられた場合は、2つのバージョンが共有する部分から表示をやり直します。
ストリーミングされていないテキストは最初のフレームで全文が描画されるため、履歴やサーバーレンダリングがアニメーションすることはありません。StreamingTextは、最新の単語にやわらかなフェードを、書き込み中にキャレットを加えます。useSmoothTextは、ペース調整だけを提供するので、Markdownを含む任意のレンダラーの前に置けます。
Proレジストリをcomponents.jsonに追加する
components.json トークンを追加する
アカウントページでトークンを作成し、
.env.localにHEXTAUI_PRO_TOKENとして設定してください。ブロックを追加する
pnpm dlx shadcn@latest add @hextaui-pro/streaming
AI SDKと使う
useChatメッセージの各テキストパーツを描画します。パーツ自身のstateにより、StreamingTextはモデルがまだ書き込み中かどうかを判断するため、完了したメッセージや履歴は即座に表示されます。
Markdownと使う
フックを単独で使うと、どのレンダラーの前でもテキストを滑らかにできます。Streamdownはストリーミング中の未完了のMarkdownを処理し、react-markdownも同様に動作します。
任意のストリームと使う
各チャンクを文字列に追記して渡します。fetch、OpenAI、Anthropicの差分、サーバー送信イベントのいずれでも同じように動作します。
構造
外側から内側へ組み合わせるパーツ。
| パーツ | 説明 |
|---|---|
StreamingText | ペースを調整し、フェードさせ、キャレットを表示する、そのまま使えるテキスト要素。プレーンテキストの返信に使います。 |
useSmoothText | ペース調整だけの機能です。今すぐ表示するテキストと、まだ追いついている途中かどうかを返します。 |
StreamingText
childrenを除くすべてのdivプロップも受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
textここまでに受け取ったすべて。チャンクが届くたびに追記します。 | string | – |
streamingさらにテキストが届くかどうか。キャレットを表示し、追いつくための猶予を開いたままにします。 | boolean | false |
smoothペース調整をオフにすると、受け取ったとおりにテキストを描画します。 | boolean | true |
charsPerSecond追いつく処理の前の、基本の読み上げペース。 | number | 90 |
useSmoothText(text, options)
{ text, animating } を返します。animatingは、表示中のテキストが全文に追いつくまでtrueのままです。
| プロパティ | 型 | デフォルト |
|---|---|---|
textここまでに受け取った全文。 | string | – |
options.streamingソースがまだ送信中かどうか。 | boolean | false |
options.enabledfalseの場合、フックはテキストをそのまま返します。 | boolean | true |
options.charsPerSecond基本の読み上げペース。 | number | 90 |
- テキストのコンテナは、ストリーミング中はaria-busyを持つpoliteなライブリージョンになるため、スクリーンリーダーは1文字ずつではなく、返信が落ち着いた時点で読み上げます。
- キャレットは装飾であり、支援技術からは隠されます。
- モーション軽減時は、単語はフェードなしで表示され、キャレットの点滅は止まります。ペース調整は、モーションではなく読む速度の問題なので、そのまま維持されます。
使用技術
Streaming を構成する無料のHextaUIコンポーネントです。それぞれ単独でインストールできます。
コード
3 個のファイルを components/blocks/streaming に追加しました。