Saltar al contenido principal
NachUI

Reasoning

El razonamiento del modelo, abierto mientras llega y plegado cuando empieza la respuesta.

The user wants a copy-paste component, so an npm package is off the table. I will read the registry first, then write the primitive with no runtime dependencies beyond the ones the library already ships.
1'use client';
2
3import { Reasoning } from '@/components/ui/reasoning';
4
5export function Default() {
6 return (
7 <div className="w-full max-w-md">
8 <Reasoning duration={4}>
9 <Reasoning.Trigger />
10 <Reasoning.Content>
11 The user wants a copy-paste component, so an npm package is off the table. I will read the
12 registry first, then write the primitive with no runtime dependencies beyond the ones the
13 library already ships.
14 </Reasoning.Content>
15 </Reasoning>
16 </div>
17 );
18}

Instalación

pnpm dlx nachui add reasoning

Anatomía

1import { Reasoning } from '@/components/ui/reasoning';
1<Reasoning isStreaming={estaRazonando}>
2 <Reasoning.Trigger />
3 <Reasoning.Content>{textoDeRazonamiento}</Reasoning.Content>
4</Reasoning>
El trigger escribe su propia etiqueta. Mientras isStreaming es true late en "Thinking", y cuando el stream termina se asienta en "Thought for 4 seconds" usando el duration que le pases o el tiempo que midió solo.

Composición

Usa la siguiente composición para construir un Reasoning:
Reasoning
├── Reasoning.Trigger
└── Reasoning.Content

Streaming

Encender isStreaming abre el panel, y apagarlo lo cierra y guarda la duración. Es el comportamiento que la gente espera de un modelo que piensa: ves llegar el razonamiento, después se corre del camino, y vuelve a estar a un clic.
1'use client';
2
3import { useState } from 'react';
4import { Reasoning } from '@/components/ui/reasoning';
5
6export function Streaming() {
7 const [streaming, setStreaming] = useState(false);
8
9 return (
10 <div className="flex w-full max-w-md flex-col gap-4">
11 <button
12 type="button"
13 onClick={() => setStreaming((previous) => !previous)}
14 className="border-border hover:bg-muted w-fit rounded-full border px-3 py-1.5 text-xs transition-colors"
15 >
16 {streaming ? 'Stop streaming' : 'Start streaming'}
17 </button>
18 <Reasoning isStreaming={streaming} defaultOpen={false}>
19 <Reasoning.Trigger />
20 <Reasoning.Content>
21 The panel opens on its own while the model is thinking and closes once the answer starts,
22 keeping the reasoning one click away instead of in the way.
23 </Reasoning.Content>
24 </Reasoning>
25 </div>
26 );
27}

useReasoning

useReasoning() lee el estado desde adentro del panel, y así se construye un trigger propio o un pie que reacciona al stream.
1const { isStreaming, isOpen, setIsOpen, duration } = useReasoning();

Referencia de API

Reasoning

PropTypeDefaultDescription
isStreamingbooleanfalseAbre el panel, late la etiqueta y mide la corrida
defaultOpenbooleantrueEstado abierto cuando no se controla
openboolean-Estado abierto controlado
onOpenChange(open: boolean) => void-Se llama al cambiar el estado
durationnumber-Segundos a mostrar en vez del tiempo medido
classNamestring-Clases CSS adicionales

Reasoning.Trigger

PropTypeDefaultDescription
getLabel(isStreaming: boolean, duration?: number) => ReactNode-Reemplaza el texto incluido
childrenReactNode-Etiqueta fija, tiene prioridad sobre getLabel
classNamestring-Clases CSS adicionales

Reasoning.Content

PropTypeDefaultDescription
classNamestring-Clases CSS adicionales
¿Encontraste algo que mejorar?

¿Notaste un error, tipografía o detalle faltante en esta página? Ayúdanos a mejorar la documentación abriendo un issue en GitHub.

Crear un Issue