Kendali komponen
Susun pesan, kartu sitasi, prompt, empty state, dan kontrol dari komponen React Anda sendiri.
Hubungkan komponen React ke ChattyBox dengan @openstaticfish/chattybox. Tim Anda mengontrol rendering dan state, sementara infrastruktur terkelola menangani jawaban berbasis sumber, kutipan, dan pengelompokan percakapan.
Percakapan ilustratif — bukan chat langsung.
ChattyBox merayapi situs web, dokumentasi, pusat bantuan, CMS, atau basis pengetahuan yang sudah ada, lalu menyematkan chatbot yang menjawab berdasarkan konten terbitan Anda sendiri, bukan memori model generik.
Instal SDK JavaScript di aplikasi React Anda.
Buat satu klien Chattybox di luar jalur render komponen.
Kirim pesan dari event handler dan perbarui state UI dengan responsnya.
Tampilkan tautan sumber dan tangani kegagalan ChattyboxError terstruktur.
Peluncuran tiga langkah
Gunakan pola state, aksesibilitas, styling, dan design system yang sudah dipakai aplikasi Anda, alih-alih menyesuaikan diri dengan kerangka widget tetap.
Gunakan pos pemeriksaan ini untuk memutuskan apakah ChattyBox harus ditempatkan di samping platform dokumen Anda, menggantikan asisten terpisah, atau tetap terisolasi untuk pengujian.
Susun pesan, kartu sitasi, prompt, empty state, dan kontrol dari komponen React Anda sendiri.
Gunakan state lokal atau lapisan state yang sudah ada sambil menjaga percakapan tetap terpisah antar-pengunjung.
Kendalikan fokus, live region, perilaku keyboard, dan pengumuman error dalam aplikasi Anda.
Jaga integrasi browser tetap ringkas sementara ChattyBox menangani pengindeksan konten, retrieval, dan jawaban bersitasi.
Buat klien sekali, panggil dari event handler, dan simpan ID percakapan setiap pengunjung dalam state komponen atau aplikasi.
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,
// Same ID includes up to 12 recent saved messages, not the full transcript.
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.Ya. SDK JavaScript mengembalikan pesan, ID percakapan, dan URL sumber sehingga aplikasi React Anda dapat menampilkan antarmuka yang sepenuhnya kustom.
Tidak ada komponen atau hook React yang diekspor. Gunakan metode headless dengan komponen Anda sendiri, atau panggil mountWidget() dari tata letak browser persisten untuk memuat widget mengambang terkelola.
Buat sekali di luar jalur render komponen atau dalam provider aplikasi yang stabil, bukan membuat klien baru pada setiap render.
Ya. Gunakan panduan instalasi widget yang dihosting jika Anda menginginkan antarmuka yang dikelola alih-alih rendering React kustom.
Tidak perlu kartu kredit
Paket gratis. Tanpa kartu.