Chat Thread
コンポーザーを中心にした会話全体です。回答のストリーミング中も質問は上部に固定され、サイドのチェックポイントでメッセージ間を移動でき、すべての返信をコピー、編集、再試行、評価し、バージョン間で切り替えられます。返信はコードブロック、テーブル、引用を含むMarkdownとして描画され、思考、ツール呼び出し、Prompt Inputもそのまま組み込めます。
Chat Threadは、コンポーザーを中心とした会話です。自分のメッセージ、モデルの返信、それらに対してできることを扱います。最初は空の状態とコンポーザーが中央に表示され、メッセージができるとコンポーザーを再マウントせずに下部へドッキングするため、フォーカスと下書きのテキストはそのまま残ります。
送信したばかりのメッセージは、その回答が下にストリーミングされる間、上部に移動し、ビューはスクロールして離れるまで新しいテキストに追従します。右側のチェックポイントのレールでは、ホバー時のプレビューつきで自分のメッセージ間をジャンプできます。古い履歴は、ビューが動くことなく上から読み込まれます。
メッセージにホバーすると、コピー、編集、再試行ができます。編集と再試行はバージョンとなり、切り替えられるため、何も失われません。失敗した返信にはTry againが表示され、停止した返信はその旨が示され、サムズアップとサムズダウンはワンクリックです。各返信の内部には、他のブロックのReasoning、ToolCalls、Markdownがそのまま組み込めます。
Proレジストリをcomponents.jsonに追加する
components.json トークンを追加する
アカウントページでトークンを作成し、
.env.localにHEXTAUI_PRO_TOKENとして設定してください。ブロックを追加する
pnpm dlx shadcn@latest add @hextaui-pro/chat-thread
AI SDKと使う
useChatのメッセージをスレッドに対応付けます。ReasoningパーツはReasoningに、ツールパーツはToolCallsに、テキストはMarkdownに渡します。最新のユーザーメッセージをピン留めし、Try againにはregenerateを使い、編集はその時点から再送信します。
構造
外側から内側へ組み合わせるパーツ。
| パーツ | 説明 |
|---|---|
ChatThread | フレーム。スクローラー、チェックポイント、空の状態、コンポーザーのスロット。 |
ChatUserMessage | 自分のメッセージ。添付ファイル、バブル、時刻、バージョン、コピー、編集。 |
ChatAssistantMessage | 返信。内側にReasoning、ToolCalls、Markdownを置きます。アクション、エラー、停止の状態が追加されます。 |
ChatDivider | メッセージのグループの間にある、ラベル付きの線。 |
ChatAttachments, ChatAction, ChatCopy, ChatBranchSwitch, ChatEditor | メッセージが使う部品。カスタムレイアウト向けにエクスポートされています。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
childrenメッセージと区切り線を、順番に。 | ReactNode | – |
composer通常はPrompt Input。空のときは中央に、それ以外は下部にドッキングされます。 | ReactNode | – |
emptyメッセージがないとき、コンポーザーの上に表示されます。 | ReactNode | – |
busy返信のストリーミング中、支援技術に対して会話をビジー状態として示します。 | boolean | false |
hasOlder先頭に「Load earlier messages」を表示します。 | boolean | false |
loadingOlderそのボタンにスピナーを表示します。falseになるとスクロール位置が復元されます。 | boolean | false |
onLoadOlder古いメッセージはここに先頭追加します。 | () => void | – |
| プロパティ | 型 | デフォルト |
|---|---|---|
id安定したid。ビューが跳ねないよう、バージョンをまたいで同じ値にしてください。 | string | – |
textメッセージ。チェックポイントのプレビューにも使われます。 | string | – |
pinこのメッセージが表示されたとき、先頭までスクロールします。送信したばかりのメッセージに設定してください。 | boolean | false |
files{ id, name, size?, type?, url? }。urlを持つ画像はサムネイルとして表示されます。 | ChatFile[] | – |
timeホバー時に、閲覧者のロケールで表示されます。 | Date | – |
branchバージョンの矢印用の { index, count, onChange }。 | ChatBranch | – |
onEditEditを表示します。内容が変更されたとき、新しいテキストとともに呼ばれます。 | (text: string) => void | – |
attachmentsバブルの上のカスタムコンテンツ。 | ReactNode | – |
| プロパティ | 型 | デフォルト |
|---|---|---|
id安定したid。 | string | – |
childrenReasoning、ToolCalls、Markdown、またはその他の任意の内容。 | ReactNode | – |
textCopy用のプレーンテキスト。 | string | – |
streaming返信が完了するまでアクションを非表示にします。 | boolean | false |
lastアクションをホバー時ではなく、常に表示します。 | boolean | false |
metaアクション行の右側。モデルや推論量など。 | ReactNode | – |
branch再試行用のバージョンの矢印。 | ChatBranch | – |
feedback現在の評価。 | "up" | "down" | null | null |
onFeedbackサムズを表示します。評価が取り消されたときは、nullとともに呼ばれます。 | (feedback) => void | – |
onRetryTry againを表示します。 | () => void | – |
errorアクションの代わりに、Try again付きでメッセージを表示します。 | string | null | – |
stopped途中で停止された返信を示します。 | boolean | false |
| プロパティ | 型 | デフォルト |
|---|---|---|
childrenTodayや「Switched to Nova 3 Max」などのラベル。 | ReactNode | – |
| キー | アクション |
|---|---|
| Tab | メッセージのアクション間を移動します。ホバー時だけでなく、フォーカス時にも表示されます。 |
| Enter | 編集したメッセージを送信します。 |
| ShiftEnter | 編集中に行を追加します。 |
| Esc | 編集をキャンセルします。 |
| ↑↓PgUpPgDn | フォーカスがあるとき、会話をスクロールします。 |
- 会話は、logを保持するラベル付きのリージョンです。新しいメッセージは届くたびに読み上げられ、返信のストリーミング中はリージョンがビジー状態として示されます。
- すべてのアイコンアクションにはラベルとツールチップがあります。サムズアップとサムズダウンはaria-pressedを使い、Copyとフィードバックはpoliteなライブリージョンで確認され、エラーにはrole=alertが使われます。
- チェックポイントは「Message 2: …」という名前のボタンからなるナビゲーションのランドマークで、現在のものにはaria-currentが付きます。
- バージョンの矢印は「Version 1 of 2」という名前のグループです。
- エディターは自動でフォーカスし、カーソルは末尾に置かれ、Cancelでメッセージに戻ります。入力メソッドで変換中は、Enterが待機します。
- フォーカスリングがスクローラーで切り取られることはなく、タッチ画面ではアクションが常に表示されます。
使用技術
Chat Thread を構成する無料のHextaUIコンポーネントです。それぞれ単独でインストールできます。
コード
2 個のファイルを components/blocks/chat-thread に追加しました。