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.
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,
// 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.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. Konten Anda tidak digunakan untuk pelatihan model.
Paket gratis. Tanpa kartu.
Kami menggunakan alat analitik dan pengelolaan tag opsional untuk memahami penggunaan situs. Pilih apakah Anda ingin mengizinkan alat berikut: Ahrefs Web Analytics, PostHog, dan Google Tag Manager. Menonaktifkan analitik akan memuat ulang halaman ini agar perubahan diterapkan dengan baik. Fungsi penting situs dan pemantauan kesalahan tidak dikendalikan oleh pilihan ini. Baca kebijakan privasi kami.