Maîtrise des composants
Composez les messages, cartes de citation, suggestions, états vides et commandes avec vos propres composants React.
Connectez vos composants React à ChattyBox avec @openstaticfish/chattybox. Votre équipe gère le rendu et l’état, tandis que l’infrastructure gérée prend en charge les réponses fondées sur les sources, les citations et le regroupement des conversations.
ChattyBox explore votre site existant, votre documentation, votre centre d'aide, votre CMS ou votre base de connaissances, puis intègre un chatbot qui répond à partir de votre propre contenu publié plutôt qu'à partir de la mémoire générique d'un modèle.
Installez le SDK JavaScript dans votre application React.
Créez un seul client Chattybox en dehors du chemin de rendu du composant.
Envoyez les messages depuis un gestionnaire d'événement et mettez à jour l'état de l'interface avec la réponse.
Affichez les liens vers les sources et gérez les erreurs structurées ChattyboxError.
Un lancement en trois étapes
Utilisez les conventions d'état, d'accessibilité, de style et de design system déjà suivies par votre application au lieu de vous adapter à l'enveloppe d'un widget figé.
Utilisez ces points de contrôle pour décider si ChattyBox doit s'asseoir à côté de votre plate-forme de documents, remplacer un assistant distinct ou rester isolé pour les tests.
Composez les messages, cartes de citation, suggestions, états vides et commandes avec vos propres composants React.
Utilisez un état local ou votre couche d'état existante tout en isolant les conversations entre les visiteurs.
Gérez le focus, les régions live, le clavier et l'annonce des erreurs au sein de votre application.
Gardez une intégration légère dans le navigateur pendant que ChattyBox gère l'indexation du contenu, la recherche et les réponses avec citations.
Créez le client une seule fois, appelez-le depuis un gestionnaire d'événement et conservez l'identifiant de conversation de chaque visiteur dans l'état du composant ou de l'application.
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.Oui. Le SDK JavaScript renvoie des messages, des identifiants de conversation et des URL de sources afin que votre application React puisse afficher une interface entièrement personnalisée.
Aucun composant React ni hook n’est exporté. Utilisez les méthodes sans interface avec vos composants, ou appelez mountWidget() depuis une mise en page persistante côté navigateur pour charger le widget flottant maintenu.
Créez-le une fois en dehors du chemin de rendu du composant ou dans un provider applicatif stable, plutôt que de construire un nouveau client à chaque rendu.
Oui. Suivez le guide d'installation du widget hébergé si vous préférez une interface maintenue à un affichage React personnalisé.
Aucune carte de crédit requise. Votre contenu n’est pas utilisé pour l’entraînement de modèles.
Niveau Free. Aucune carte requise.
Nous utilisons des outils facultatifs d’analyse et de gestion des balises pour comprendre l’utilisation du site. Choisissez d’autoriser ou non Ahrefs Web Analytics, PostHog et Google Tag Manager. La désactivation des outils d’analyse recharge cette page afin que la modification soit appliquée proprement. Les fonctionnalités essentielles du site et la surveillance des erreurs ne sont pas régies par ce choix. Lire notre politique de confidentialité.