Kontrola nad komponentami
Twórz wiadomości, karty cytowań, podpowiedzi, puste stany i elementy sterujące z własnych komponentów React.
Połącz komponenty React z ChattyBox przez @openstaticfish/chattybox. Twój zespół kontroluje renderowanie i stan, a zarządzana infrastruktura obsługuje odpowiedzi oparte na źródłach, cytowania i grupowanie rozmów.
ChattyBox indeksuje istniejącą witrynę, dokumentację, centrum pomocy, CMS lub bazę wiedzy, a następnie osadza chatbota, który odpowiada na podstawie własnych opublikowanych treści zamiast ogólnej pamięci modelu.
Zainstaluj SDK JavaScript w aplikacji React.
Utwórz jednego klienta Chattybox poza ścieżką renderowania komponentu.
Wysyłaj wiadomości z procedury obsługi zdarzenia i aktualizuj stan interfejsu odpowiedzią.
Wyświetlaj linki do źródeł i obsługuj ustrukturyzowane błędy ChattyboxError.
Uruchomienie w trzech krokach
Korzystaj z wzorców stanu, dostępności, stylów i systemu projektowego używanych już w aplikacji, zamiast dopasowywać się do sztywnej obudowy widżetu.
Skorzystaj z tych punktów kontrolnych, aby zdecydować, czy ChattyBox powinien siedzieć obok Twojej platformy dokumentów, zastąpić osobnego asystenta, czy też pozostać odizolowany na czas testów.
Twórz wiadomości, karty cytowań, podpowiedzi, puste stany i elementy sterujące z własnych komponentów React.
Używaj stanu lokalnego lub istniejącej warstwy stanu, zachowując rozdzielenie konwersacji poszczególnych odwiedzających.
Kontroluj fokus, aktywne regiony, obsługę klawiatury i komunikaty o błędach we własnej aplikacji.
Utrzymuj małą integrację przeglądarkową, podczas gdy ChattyBox obsługuje indeksowanie treści, wyszukiwanie i odpowiedzi z cytowaniami.
Utwórz klienta raz, wywołuj go z procedury obsługi zdarzenia i przechowuj identyfikator konwersacji każdego odwiedzającego w stanie komponentu lub aplikacji.
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.Tak. SDK JavaScript zwraca wiadomości, identyfikatory konwersacji i adresy URL źródeł, dzięki czemu aplikacja React może wyświetlać całkowicie własny interfejs.
Pakiet nie eksportuje komponentu React ani hooków. Użyj metod headless z własnymi komponentami lub wywołaj mountWidget() ze stałego układu przeglądarkowego, aby załadować utrzymywany pływający widżet.
Utwórz go raz poza ścieżką renderowania komponentu lub w stabilnym providerze aplikacji, zamiast konstruować nowego klienta przy każdym renderowaniu.
Tak. Skorzystaj z przewodnika instalacji hostowanego widżetu, jeśli wolisz utrzymywany interfejs zamiast własnego renderowania w React.
Karta kredytowa nie jest wymagana. Twoje treści nie są używane do trenowania modeli.
Plan Free. Bez karty.
Używamy opcjonalnych narzędzi analitycznych oraz narzędzi do zarządzania tagami, aby rozumieć sposób korzystania z witryny. Wybierz, czy zezwalasz na Ahrefs Web Analytics, PostHog i Google Tag Manager. Wyłączenie analityki spowoduje ponowne załadowanie tej strony, aby zmiana została prawidłowo zastosowana. Podstawowe funkcje witryny i monitorowanie błędów nie zależą od tego wyboru. Przeczytaj naszą politykę prywatności.