Kleine cliëntgrens
Markeer alleen de interactieve chatmodule met use client in plaats van een hele pagina of lay-out naar de browser te verplaatsen.
Gebruik @openstaticfish/chattybox binnen een gerichte clientgrens, terwijl de rest van uw App Router-applicatie door de server wordt weergegeven. ChattyBox zorgt voor het ophalen, citaten, gesprekken en schalen.
Illustratief gesprek — geen livechat.
ChattyBox crawlt uw bestaande website, documentatie, helpcentrum, CMS of kennisbank en sluit vervolgens een chatbot in die antwoord geeft op basis van uw eigen gepubliceerde inhoud in plaats van het generieke modelgeheugen.
Installeer @openstaticfish/chattybox in de Next.js-applicatie.
Voeg de openbare widget API sleutel en API URL toe als NEXT_PUBLIC omgevingsvariabelen.
Maak een clientcomponent voor chatstatus en browserinteractie.
Importeer die clientcomponent van een servercomponentpagina of lay-out.
Lancering in drie stappen
Bewaar de SDK aan de rand van de client waar chatinteractie plaatsvindt en bewaar servercomponenten voor de rest van de applicatie.
Gebruik deze controlepunten om te beslissen of ChattyBox naast uw documentplatform moet worden geplaatst, een afzonderlijke assistent moet vervangen of geïsoleerd moet blijven om te testen.
Markeer alleen de interactieve chatmodule met use client in plaats van een hele pagina of lay-out naar de browser te verplaatsen.
Gebruik een browserveilige projectsleutel met toegestane oorsprong; Stel nooit beheerreferenties bloot via NEXT_PUBLIC-variabelen.
Geef berichten en citaten weer in uw eigen navigatie, accountgebied, documentenshell of ondersteun de workflow.
Vermijd het toevoegen van route-handlers uitsluitend om een beheerde browser API te proxyen, tenzij uw product een concrete server-side vereiste heeft.
De SDK gebruikt fetch en in de browser zichtbare projectreferenties, dus initialiseer deze in een clientmodule. Houd geheimen en beheer APIs uit NEXT_PUBLIC variabelen.
'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.Ja. Gebruik het in een clientcomponent voor een interactieve chatstatus en geef die component weer vanaf een App Router pagina of lay-out.
Niet voor de normale browserintegratie. Openbare widgetsleutels zijn ontworpen voor gebruik door klanten en kunnen worden beperkt tot goedgekeurde oorsprongen.
De openbare widgetsleutel identificeert een project, maar is geen managementreferentie. Beperk het tot uw productie- en preview-oorsprong en geef nooit administratieve geheimen prijs.
Ja. De gehoste installatiehandleiding toont het next/script-pad als u de voorkeur geeft aan een onderhouden UI in plaats van een aangepaste SDK-interface.
Geen creditcard vereist
Gratis niveau. Geen kaart nodig.