Streaming
Transmita respostas de IA que se leem com fluidez. Pedaços em rajadas vindos do modelo são revelados num ritmo constante que acelera para alcançar, com um fade suave nas palavras novas e um cursor enquanto escreve.
Os modelos enviam texto em rajadas: algumas palavras, uma pausa e depois uma frase inteira de uma vez. Imprimir cada pedaço assim que chega faz a resposta engasgar. O Streaming mantém o que você recebeu separado do que você mostra e o revela num ritmo constante de 90 caracteres por segundo.
Quando os pedaços se acumulam, o ritmo sobe para fechar a diferença em cerca de 0,3 segundo, e quando o stream termina o restante é despejado em cerca de 0,12 segundo, então o texto nunca fica muito atrás do modelo. Emojis e outros caracteres de várias partes nunca são divididos no meio da revelação, e se o texto é substituído em vez de acrescentado, como após uma regeneração, a revelação recomeça do que as duas versões têm em comum.
O texto que não está em streaming é renderizado por inteiro no primeiro quadro, então o histórico e as renderizações no servidor nunca são animados. O StreamingText adiciona um fade suave nas palavras mais novas e um cursor enquanto escreve. O useSmoothText oferece apenas o ritmo, para colocar na frente de qualquer renderizador, inclusive o Markdown.
Adicione o registro Pro ao components.json
components.json Adicione seu token
Crie um token na sua página de conta e coloque-o em
.env.localcomoHEXTAUI_PRO_TOKEN.Adicione o bloco
pnpm dlx shadcn@latest add @hextaui-pro/streaming
Com o AI SDK
Renderize cada parte de texto de uma mensagem do useChat. O state da própria parte informa ao StreamingText quando o modelo ainda está escrevendo, então mensagens concluídas e o histórico aparecem instantaneamente.
Com Markdown
Use o hook isoladamente para suavizar o texto antes de qualquer renderizador. O Streamdown trata o Markdown inacabado enquanto chega; o react-markdown funciona do mesmo jeito.
Com qualquer stream
Acrescente cada pedaço a uma string e passe-a. Funciona igual para fetch, deltas da OpenAI ou da Anthropic, ou server-sent events.
Anatomia
As partes que você compõe, de fora para dentro.
| Parte | Descrição |
|---|---|
StreamingText | Um elemento de texto pronto para uso que dá ritmo, faz fade e mostra o cursor. Use para respostas em texto simples. |
useSmoothText | Apenas o ritmo. Retorna o texto a mostrar agora e se ainda está alcançando. |
StreamingText
Também aceita todas as props de div, exceto children.
| Prop | Tipo | Padrão |
|---|---|---|
textTudo o que foi recebido até agora. Acrescente a isso conforme os pedaços chegam. | string | – |
streamingSe mais texto está a caminho. Mostra o cursor e mantém a janela de recuperação aberta. | boolean | false |
smoothDesative o ritmo para renderizar o texto exatamente como recebido. | boolean | true |
charsPerSecondRitmo de leitura base antes de qualquer recuperação. | number | 90 |
useSmoothText(text, options)
Retorna { text, animating }. animating permanece true até o texto exibido alcançar o texto completo.
| Prop | Tipo | Padrão |
|---|---|---|
textO texto completo recebido até agora. | string | – |
options.streamingSe a origem ainda está enviando. | boolean | false |
options.enabledQuando false, o hook retorna o texto sem alterações. | boolean | true |
options.charsPerSecondRitmo de leitura base. | number | 90 |
- O contêiner de texto é uma região live polite com aria-busy enquanto chega em streaming, para que os leitores de tela anunciem a resposta quando ela se estabiliza, e não cada caractere.
- O cursor é decorativo e fica oculto para tecnologias assistivas.
- Com movimento reduzido, as palavras aparecem sem o fade e o cursor para de pulsar. O ritmo permanece, porque diz respeito à velocidade de leitura, não ao movimento.
Construído com
Os componentes gratuitos do HextaUI de que Streaming é feito. Cada um é instalado separadamente.
Código
3 arquivos, adicionados a components/blocks/streaming.