Propiedad de los componentes
Redacte mensajes, tarjetas de citas, mensajes, estados vacíos y controles desde sus propios componentes de React.
Conecta componentes React a ChattyBox con @openstaticfish/chattybox. Tu equipo controla el renderizado y el estado, mientras la infraestructura gestionada se ocupa de respuestas basadas en fuentes, citas y agrupación de conversaciones.
ChattyBox rastrea su sitio web, documentación, centro de ayuda, CMS o base de conocimientos existentes y luego inserta un chatbot que responde a partir de su propio contenido publicado, en lugar de la memoria genérica del modelo.
Instale el SDK de JavaScript en su aplicación React.
Cree un cliente Chattybox fuera de la ruta de procesamiento del componente.
Envíe mensajes desde un controlador de eventos y actualice el estado de la interfaz de usuario con la respuesta.
Represente enlaces de origen y maneje fallas estructuradas de ChattyboxError.
Lanzamiento en tres pasos
Utilice los patrones de estado, accesibilidad, estilo y sistema de diseño que su aplicación ya sigue en lugar de adaptarse a un shell de widget fijo.
Utilice estos puntos de control para decidir si ChattyBox debe sentarse junto a su plataforma de documentos, reemplazar a un asistente independiente o permanecer aislado para realizar pruebas.
Redacte mensajes, tarjetas de citas, mensajes, estados vacíos y controles desde sus propios componentes de React.
Utilice el estado local o su capa de estado existente mientras mantiene las conversaciones aisladas entre los visitantes.
Controle el foco, las regiones activas, el comportamiento del teclado y los anuncios de errores dentro de su aplicación.
Mantenga pequeña la integración del navegador mientras ChattyBox maneja la indexación de contenido, la recuperación y las respuestas citadas.
Cree el cliente una vez, llámelo desde un controlador de eventos y mantenga el ID de conversación de cada visitante en el estado de componente o aplicación.
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.Sí. El SDK de JavaScript devuelve mensajes, ID de conversación y URL de origen para que su aplicación React pueda representar una interfaz completamente personalizada.
No se exportan componentes ni hooks de React. Usa los métodos sin interfaz con tus componentes, o llama a mountWidget() desde un diseño persistente del navegador para cargar el widget flotante mantenido.
Créelo una vez fuera de la ruta de renderizado del componente o en un proveedor de aplicaciones estable en lugar de construir un nuevo cliente para cada renderizado.
Sí. Utilice la guía de instalación del widget alojado cuando desee una interfaz mantenida en lugar de una representación personalizada de React.
No se requiere tarjeta de crédito. Tu contenido no se usa para entrenar modelos.
Plan Free. Sin tarjeta.
Utilizamos herramientas opcionales de analítica y gestión de etiquetas para comprender el uso del sitio. Elige si quieres permitir Ahrefs Web Analytics, PostHog y Google Tag Manager. Al desactivar la analítica, esta página se recargará para que el cambio se aplique correctamente. Las funciones esenciales del sitio y la monitorización de errores no dependen de esta opción. Lee nuestra política de privacidad.