Malá klientská hranice
Označte pomocí use client pouze interaktivní modul chatu, místo abyste do prohlížeče přesouvali celou stránku nebo layout.
Použijte @openstaticfish/chattybox uvnitř přesně vymezené klientské hranice, zatímco zbytek aplikace s App Routerem zůstane vykreslovaný na serveru. ChattyBox zajišťuje vyhledávání, citace, konverzace a škálování.
Ilustrační konverzace — nejde o živý chat.
ChattyBox prochází váš stávající web, dokumentaci, centrum nápovědy, CMS nebo znalostní bázi a poté vloží chatbota, který odpovídá na základě vašeho publikovaného obsahu, nikoli obecné paměti modelu.
Nainstalujte @openstaticfish/chattybox do aplikace Next.js.
Přidejte veřejný klíč API widgetu a URL API jako proměnné prostředí NEXT_PUBLIC.
Vytvořte klientskou komponentu pro stav chatu a interakci v prohlížeči.
Importujte tuto klientskou komponentu ze stránky nebo layoutu typu Server Component.
Spuštění ve třech krocích
Ponechte SDK na klientském okraji, kde probíhá interakce s chatem, a pro zbytek aplikace zachovejte Server Components.
Pomocí těchto kontrolních bodů se můžete rozhodnout, zda má ChattyBox sedět vedle vaší platformy dokumentů, nahradit samostatného asistenta nebo zůstat izolovaný pro testování.
Označte pomocí use client pouze interaktivní modul chatu, místo abyste do prohlížeče přesouvali celou stránku nebo layout.
Použijte projektový klíč bezpečný pro prohlížeč s povolenými zdroji; přihlašovací údaje pro správu nikdy nezpřístupňujte prostřednictvím proměnných NEXT_PUBLIC.
Vykreslujte zprávy a citace ve vlastní navigaci, zákaznické sekci, shellu dokumentace nebo pracovním postupu podpory.
Nepřidávejte route handlery pouze kvůli proxy pro spravované API pro prohlížeč, pokud váš produkt nemá konkrétní požadavek na straně serveru.
SDK používá fetch a přihlašovací údaje projektu viditelné v prohlížeči, proto ho inicializujte v klientském modulu. Tajné údaje a API pro správu nepatří do proměnných NEXT_PUBLIC.
'use client';
import { useState, type FormEvent } from 'react';
import { Chattybox, ChattyboxError, type ChatResponse } from '@openstaticfish/chattybox';
const chattybox = new Chattybox({
apiKey: process.env.NEXT_PUBLIC_CHATTYBOX_API_KEY!,
baseUrl: process.env.NEXT_PUBLIC_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>
);
}
// Import and render <Chat /> from your page or layout. This shows the latest answer, not a saved transcript.
// No automatic retries: see the SDK retry-safety guide before adding retries.Ano. Použijte ho v klientské komponentě pro interaktivní stav chatu a tuto komponentu vykreslete ze stránky nebo layoutu App Routeru.
Pro běžnou integraci v prohlížeči ne. Veřejné klíče widgetu jsou určené pro použití na klientovi a lze je omezit na schválené zdroje.
Veřejný klíč widgetu identifikuje projekt, ale nejde o přihlašovací údaj pro správu. Omezte ho na produkční a preview zdroje a nikdy nezveřejňujte administrativní tajné údaje.
Ano. Pokud dáváte přednost udržovanému UI před vlastním rozhraním SDK, průvodce hostovanou instalací ukazuje postup s next/script.
Není vyžadována kreditní karta
Tarif Free. Bez karty.