Chat Thread
Toda la conversación alrededor del compositor. Tu pregunta se fija arriba mientras la respuesta llega en streaming, los puntos de control del lateral saltan entre mensajes, y cada respuesta se puede copiar, editar, reintentar, valorar y cambiar entre versiones. Las respuestas renderizan Markdown con bloques de código, tablas y citas, y el razonamiento, las llamadas a herramientas y Prompt Input encajan directamente.
Chat Thread es la conversación alrededor del compositor: tus mensajes, las respuestas del modelo y lo que puedes hacer con ellos. Empieza con tu estado vacío y el compositor centrado, y luego ancla el compositor abajo cuando hay mensajes, sin volver a montarlo, de modo que el foco y el texto del borrador se mantienen.
El mensaje que acabas de enviar sube arriba mientras su respuesta llega por debajo, y la vista sigue el texto nuevo hasta que te desplazas. Un riel de puntos de control a la derecha te permite saltar entre tus mensajes, con una vista previa al pasar el cursor. El historial anterior se carga desde arriba sin que la vista se mueva.
Pasa el cursor sobre un mensaje para copiar, editar o reintentar. Las ediciones y los reintentos se convierten en versiones entre las que puedes alternar, y no se pierde nada. Las respuestas fallidas ofrecen Try again, las detenidas lo indican, y el pulgar arriba o abajo es un clic. Dentro de cada respuesta, Reasoning, ToolCalls y Markdown de los otros bloques encajan directamente.
Añade el registro Pro a components.json
components.json Añade tu token
Crea un token en tu página de cuenta y colócalo en
.env.localcomoHEXTAUI_PRO_TOKEN.Añade el bloque
pnpm dlx shadcn@latest add @hextaui-pro/chat-thread
Con AI SDK
Asigna los mensajes de useChat al hilo. Las partes de razonamiento van a Reasoning, las de herramientas a ToolCalls y el texto a Markdown. Fija el último mensaje del usuario, usa regenerate para Try again y vuelve a enviar una edición desde ese punto.
Anatomía
Las partes que compones, de fuera hacia dentro.
| Parte | Descripción |
|---|---|
ChatThread | El marco: scroller, puntos de control, estado vacío y hueco del compositor. |
ChatUserMessage | Tu mensaje: adjuntos, burbuja, hora, versiones, copiar y editar. |
ChatAssistantMessage | Una respuesta. Coloca Reasoning, ToolCalls y Markdown dentro; añade las acciones y los estados de error y detenido. |
ChatDivider | Una línea etiquetada entre grupos de mensajes. |
ChatAttachments, ChatAction, ChatCopy, ChatBranchSwitch, ChatEditor | Las piezas que usan los mensajes, exportadas para diseños personalizados. |
| Prop | Tipo | Predeterminado |
|---|---|---|
childrenMensajes y divisores, en orden. | ReactNode | – |
composerNormalmente Prompt Input. Centrado cuando está vacío, anclado abajo en caso contrario. | ReactNode | – |
emptySe muestra sobre el compositor cuando no hay mensajes. | ReactNode | – |
busyMarca la conversación como ocupada para las tecnologías de asistencia mientras llega una respuesta. | boolean | false |
hasOlderMuestra «Load earlier messages» arriba. | boolean | false |
loadingOlderMuestra un spinner en ese botón. La posición de scroll se restaura cuando pasa a false. | boolean | false |
onLoadOlderAntepón aquí los mensajes más antiguos. | () => void | – |
| Prop | Tipo | Predeterminado |
|---|---|---|
idId estable. Mantenlo igual entre versiones para que la vista no salte. | string | – |
textEl mensaje. También se usa para la vista previa del punto de control. | string | – |
pinDesplaza este mensaje hasta arriba cuando aparece. Actívalo en el mensaje recién enviado. | boolean | false |
files{ id, name, size?, type?, url? }. Las imágenes con url se muestran como miniaturas. | ChatFile[] | – |
timeSe muestra al pasar el cursor, en la configuración regional del lector. | Date | – |
branch{ index, count, onChange } para las flechas de versión. | ChatBranch | – |
onEditMuestra Edit. Se llama con el texto nuevo cuando cambió. | (text: string) => void | – |
attachmentsContenido personalizado sobre la burbuja. | ReactNode | – |
| Prop | Tipo | Predeterminado |
|---|---|---|
idId estable. | string | – |
childrenReasoning, ToolCalls, Markdown o cualquier otra cosa. | ReactNode | – |
textTexto plano para Copy. | string | – |
streamingOculta las acciones hasta que la respuesta termine. | boolean | false |
lastMantiene las acciones visibles en lugar de mostrarlas al pasar el cursor. | boolean | false |
metaLado derecho de la fila de acciones, como el modelo y el esfuerzo. | ReactNode | – |
branchFlechas de versión para los reintentos. | ChatBranch | – |
feedbackLa valoración actual. | "up" | "down" | null | null |
onFeedbackMuestra los pulgares. Se llama con null cuando se deshace una valoración. | (feedback) => void | – |
onRetryMuestra Try again. | () => void | – |
errorMuestra el mensaje con Try again en lugar de las acciones. | string | null | – |
stoppedMarca una respuesta que se detuvo antes de tiempo. | boolean | false |
| Prop | Tipo | Predeterminado |
|---|---|---|
childrenLa etiqueta, como Today o «Switched to Nova 3 Max». | ReactNode | – |
| Key | Acción |
|---|---|
| Tab | Recorre las acciones de los mensajes. Aparecen con el foco, no solo al pasar el cursor. |
| Enter | Envía un mensaje editado. |
| ShiftEnter | Añade una línea durante la edición. |
| Esc | Cancela una edición. |
| ↑↓PgUpPgDn | Desplaza la conversación cuando tiene el foco. |
- La conversación es una región etiquetada que contiene un log, así que los mensajes nuevos se anuncian al llegar y la región se marca como ocupada mientras llega una respuesta.
- Cada acción con icono tiene una etiqueta y un tooltip. Los pulgares usan aria-pressed, Copy y el feedback se confirman mediante una región live polite, y los errores usan role=alert.
- Los puntos de control son un hito de navegación de botones llamados «Message 2: …», y el actual tiene aria-current.
- Las flechas de versión son un grupo llamado «Version 1 of 2».
- El editor se enfoca solo con el cursor al final y vuelve al mensaje con Cancel. Enter espera mientras un método de entrada está componiendo.
- Los anillos de foco nunca los recorta el scroller, y las acciones permanecen visibles en pantallas táctiles.
Construido con
Los componentes gratuitos de HextaUI con los que está hecho Chat Thread. Cada uno se instala por separado.
Código
2 archivos, añadidos a components/blocks/chat-thread.