Eigene Komponenten
Erstellen Sie Nachrichten, Quellenkarten, Vorschläge, Leerzustände und Steuerelemente aus eigenen React-Komponenten.
Verbinden Sie React-Komponenten über @openstaticfish/chattybox mit ChattyBox. Ihr Team steuert Darstellung und Zustand; die verwaltete Infrastruktur übernimmt quellenbezogene Antworten, Quellenangaben und Gesprächsgruppierung.
ChattyBox crawlt Ihre bestehende Website, Dokumentation, Ihr Help Center, CMS oder Ihre Wissensdatenbank und bettet anschließend einen Chatbot ein, der aus Ihren eigenen veröffentlichten Inhalten statt aus dem allgemeinen Modellgedächtnis antwortet.
Installieren Sie das JavaScript-SDK in Ihrer React-Anwendung.
Erstellen Sie einen Chattybox-Client außerhalb des Komponenten-Renderpfads.
Senden Sie Nachrichten in einem Event-Handler und aktualisieren Sie den UI-Status mit der Antwort.
Zeigen Sie Quelllinks an und behandeln Sie strukturierte ChattyboxError-Fehler.
Dreistufiger Start
Nutzen Sie die vorhandenen Muster Ihrer Anwendung für Status, Barrierefreiheit, Styling und Designsystem, statt sich an eine feste Widget-Hülle anzupassen.
Verwenden Sie diese Prüfpunkte, um zu entscheiden, ob ChattyBox neben Ihrer Dokumentenplattform stehen, einen separaten Assistenten ersetzen oder zum Testen isoliert bleiben soll.
Erstellen Sie Nachrichten, Quellenkarten, Vorschläge, Leerzustände und Steuerelemente aus eigenen React-Komponenten.
Nutzen Sie lokalen Status oder Ihre vorhandene Statusschicht und halten Sie Konversationen zwischen Besuchern getrennt.
Steuern Sie Fokus, Live-Regionen, Tastaturverhalten und Fehlerankündigungen in Ihrer Anwendung.
Halten Sie die Browser-Integration klein, während ChattyBox Inhaltsindexierung, Suche und Antworten mit Quellenangaben übernimmt.
Erstellen Sie den Client einmal, rufen Sie ihn in einem Event-Handler auf und speichern Sie die Konversations-ID jedes Besuchers im Komponenten- oder Anwendungsstatus.
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. Das JavaScript-SDK gibt Nachrichten, Konversations-IDs und Quell-URLs zurück, sodass Ihre React-Anwendung eine vollständig eigene Oberfläche darstellen kann.
Es werden keine React-Komponenten oder Hooks exportiert. Nutzen Sie Headless-Methoden mit eigenen Komponenten oder rufen Sie mountWidget() aus einem persistenten Browser-Layout auf, um das gepflegte schwebende Widget zu laden.
Erstellen Sie ihn einmal außerhalb des Komponenten-Renderpfads oder in einem stabilen Anwendungs-Provider, nicht bei jedem Rendern neu.
Ja. Nutzen Sie die Installationsanleitung für das gehostete Widget, wenn Sie eine gepflegte Oberfläche statt eigener React-Darstellung wünschen.
Keine Kreditkarte erforderlich. Ihre Inhalte werden nicht für Modelltraining verwendet.
Kostenloser Tarif. Keine Karte nötig.
Wir verwenden optionale Analyse- und Tag-Management-Tools, um zu verstehen, wie die Website genutzt wird. Entscheiden Sie, ob Sie Ahrefs Web Analytics, PostHog und Google Tag Manager erlauben möchten. Wenn Sie die Analyse deaktivieren, wird diese Seite neu geladen, damit die Änderung sauber wirksam wird. Die grundlegenden Funktionen der Website und die Fehlerüberwachung werden von dieser Auswahl nicht gesteuert. Datenschutzerklärung lesen.