Eigendom van componenten
Stel berichten, citatiekaarten, aanwijzingen, lege statussen en bedieningselementen samen vanuit uw eigen React-componenten.
Verbind React-componenten met ChattyBox via @openstaticfish/chattybox. Uw team beheert weergave en status; de beheerde infrastructuur verzorgt brongebonden antwoorden, bronverwijzingen en gespreksgroepering.
ChattyBox crawlt uw bestaande website, documentatie, helpcentrum, CMS of kennisbank en sluit vervolgens een chatbot in die antwoord geeft op basis van uw eigen gepubliceerde inhoud in plaats van het generieke modelgeheugen.
Installeer JavaScript SDK in uw React-applicatie.
Maak één Chattybox-client buiten het renderpad van de component.
Verzend berichten vanaf een gebeurtenishandler en update de status UI met het antwoord.
Geef bronlinks weer en handel gestructureerde ChattyboxError-fouten af.
Lancering in drie stappen
Gebruik de status-, toegankelijkheids-, stijl- en ontwerpsysteempatronen die uw toepassing al volgt in plaats van zich aan te passen aan een vaste widgetshell.
Gebruik deze controlepunten om te beslissen of ChattyBox naast uw documentplatform moet worden geplaatst, een afzonderlijke assistent moet vervangen of geïsoleerd moet blijven om te testen.
Stel berichten, citatiekaarten, aanwijzingen, lege statussen en bedieningselementen samen vanuit uw eigen React-componenten.
Gebruik de lokale staat of uw bestaande staatslaag terwijl u gesprekken tussen bezoekers geïsoleerd houdt.
Beheer de focus, liveregio's, toetsenbordgedrag en foutaankondigingen binnen uw toepassing.
Houd de browserintegratie klein, terwijl ChattyBox de inhoudsindexering, het ophalen en geciteerde antwoorden afhandelt.
Maak de client één keer aan, roep deze aan vanuit een gebeurtenishandler en bewaar de gespreks-ID van elke bezoeker in de component- of applicatiestatus.
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.Ja. De JavaScript SDK retourneert berichten, gespreks-ID's en bron-URLs, zodat uw React-toepassing een volledig aangepaste interface kan weergeven.
Er worden geen React-componenten of hooks geëxporteerd. Gebruik de headless-methoden met uw eigen componenten, of roep mountWidget() aan vanuit een blijvende browserlay-out om de onderhouden zwevende widget te laden.
Maak het eenmalig buiten het renderpad van de component of in een stabiele applicatieprovider, in plaats van voor elke render een nieuwe client te bouwen.
Ja. Gebruik de gehoste widget-installatiegids als u een onderhouden interface wilt in plaats van aangepaste React-weergave.
Geen creditcard vereist. Je content wordt niet gebruikt voor modeltraining.
Gratis niveau. Geen kaart nodig.
We gebruiken optionele analysetools en tools voor tagbeheer om te begrijpen hoe de site wordt gebruikt. Kies of je Ahrefs Web Analytics, PostHog en Google Tag Manager wilt toestaan. Als je analytics uitschakelt, wordt deze pagina opnieuw geladen zodat de wijziging netjes van kracht wordt. Essentiële sitefunctionaliteit en foutmonitoring vallen niet onder deze keuze. Lees ons privacybeleid.