Propriedade do componente
Componha mensagens, cartões de citação, prompts, estados vazios e controles a partir de seus próprios componentes React.
Conecte componentes React ao ChattyBox com @openstaticfish/chattybox. Sua equipe controla renderização e estado, enquanto a infraestrutura gerenciada cuida de respostas baseadas em fontes, citações e agrupamento de conversas.
O ChattyBox rastreia seu site, documentação, central de ajuda, CMS ou base de conhecimento existentes e, em seguida, incorpora um chatbot que responde com base no seu próprio conteúdo publicado, em vez da memória genérica do modelo.
Instale o JavaScript SDK em seu aplicativo React.
Crie um cliente Chattybox fora do caminho de renderização do componente.
Envie mensagens de um manipulador de eventos e atualize o estado da UI com a resposta.
Renderize links de origem e lide com falhas estruturadas do ChattyboxError.
Lançamento em três etapas
Use os padrões de estado, acessibilidade, estilo e sistema de design que seu aplicativo já segue, em vez de se adaptar a um shell de widget fixo.
Use esses pontos de verificação para decidir se ChattyBox deve ficar ao lado de sua plataforma de documentos, substituir um assistente separado ou permanecer isolado para testes.
Componha mensagens, cartões de citação, prompts, estados vazios e controles a partir de seus próprios componentes React.
Use o estado local ou a camada de estado existente enquanto mantém as conversas isoladas entre os visitantes.
Controle o foco, as regiões ativas, o comportamento do teclado e os anúncios de erros em seu aplicativo.
Mantenha a integração do navegador pequena enquanto o ChattyBox cuida da indexação, recuperação e respostas citadas de conteúdo.
Crie o cliente uma vez, chame-o de um manipulador de eventos e mantenha cada ID de conversa do visitante no estado do componente ou do aplicativo.
import { useState, type FormEvent } from 'react';
import { Chattybox, ChattyboxError, type ChatResponse } from '@openstaticfish/chattybox';
// Vite browser example. Other frameworks use different public environment APIs.
const chattybox = new Chattybox({
apiKey: import.meta.env.VITE_CHATTYBOX_API_KEY,
baseUrl: import.meta.env.VITE_CHATTYBOX_API_URL,
});
export function Chat() {
const [question, setQuestion] = useState('');
const [answer, setAnswer] = useState<ChatResponse | null>(null);
const [pending, setPending] = useState(false);
const [error, setError] = useState('');
async function ask(event: FormEvent<HTMLFormElement>) {
event.preventDefault();
const message = question.trim();
if (pending || !message || message.length > 2000) return;
setPending(true);
setError('');
try {
setAnswer(await chattybox.sendMessage({
message,
// Groups stored messages; previous turns are not sent to the model.
conversationId: answer?.conversationId,
}));
setQuestion('');
} catch (failure) {
setError(failure instanceof ChattyboxError
? failure.status + ': ' + failure.message
: 'Chat could not be completed.');
} finally {
setPending(false);
}
}
const sources = answer?.sources.filter((source) => {
try { return ['https:', 'http:'].includes(new URL(source).protocol); }
catch { return false; }
}) ?? [];
return (
<section aria-label="Chat">
<form onSubmit={ask}>
<label>Question
<input value={question} maxLength={2000} disabled={pending}
onChange={(event) => setQuestion(event.target.value)} />
</label>
<button type="submit" disabled={pending || !question.trim()}>
{pending ? 'Sending...' : 'Send'}
</button>
</form>
{error && <p role="alert">{error}</p>}
<div aria-live="polite" aria-busy={pending}>
<p style={{ whiteSpace: 'pre-wrap' }}>{answer?.message}</p>
{sources.length > 0 && <ul aria-label="Sources">
{sources.map((source, index) => <li key={index}>
<a href={source} target="_blank" rel="noopener noreferrer">{source}</a>
</li>)}
</ul>}
</div>
</section>
);
}
// Render <Chat /> in your app. This shows the latest answer, not a saved transcript.
// No automatic retries: see the SDK retry-safety guide before adding retries.Sim. O JavaScript SDK retorna mensagens, IDs de conversa e URLs de origem para que seu aplicativo React possa renderizar uma interface totalmente personalizada.
Não são exportados componentes nem hooks React. Use os métodos headless com seus componentes ou chame mountWidget() em um layout persistente do navegador para carregar o widget flutuante mantido.
Crie-o fora do caminho de renderização do componente ou em um provedor de aplicativo estável, em vez de construir um novo cliente para cada renderização.
Sim. Use o guia de instalação do widget hospedado quando desejar uma interface mantida em vez da renderização React personalizada.
Não é necessário cartão de crédito. O seu conteúdo não é usado para treinar modelos.
Plano Free. Sem cartão.
Utilizamos ferramentas opcionais de análise e gestão de tags para compreender a utilização do site. Escolha se pretende permitir o Ahrefs Web Analytics, o PostHog e o Google Tag Manager. Ao desativar a análise, esta página será recarregada para que a alteração seja aplicada corretamente. A funcionalidade essencial do site e a monitorização de erros não são controladas por esta escolha. Leia a nossa política de privacidade.