Pieni asiakasrajapinta
Merkitse use client -direktiivillä vain interaktiivinen chat-moduuli koko sivun tai asettelun siirtämisen sijaan selaimeen.
Käytä @openstaticfish/chattybox-pakettia rajatussa asiakasrajapinnassa, kun muu App Router -sovellus säilyy palvelinrenderöitynä. ChattyBox hoitaa tiedonhaun, lähdeviitteet, keskustelut ja skaalauksen.
Havainnollistava keskustelu — ei live-chat.
ChattyBox indeksoi nykyisen verkkosivustosi, dokumentaatiosi, ohjekeskuksesi, CMS:si tai tietämyskantasi ja upottaa sitten chatbotin, joka vastaa omasta julkaistusta sisällöstäsi eikä mallin yleisen muistin perusteella.
Asenna @openstaticfish/chattybox Next.js-sovellukseen.
Lisää julkinen widgetin API-avain ja API-URL-osoite NEXT_PUBLIC-ympäristömuuttujina.
Luo asiakaskomponentti chatin tilalle ja selainvuorovaikutukselle.
Tuo asiakaskomponentti palvelinkomponenttina toimivalle sivulle tai asetteluun.
Kolmivaiheinen käynnistys
Pidä SDK asiakasrajalla, jossa chat-vuorovaikutus tapahtuu, ja säilytä palvelinkomponentit muualla sovelluksessa.
Käytä näitä tarkistuspisteitä päättääksesi, pitäisikö ChattyBox istua dokumenttialustan viereen, vaihtaa erillinen avustaja vai pysyä erillään testausta varten.
Merkitse use client -direktiivillä vain interaktiivinen chat-moduuli koko sivun tai asettelun siirtämisen sijaan selaimeen.
Käytä selaimessa turvallista projektiavainta sallituilla origineilla; älä koskaan paljasta hallintatunnuksia NEXT_PUBLIC-muuttujissa.
Esitä viestit ja lähdeviitteet omassa navigaatiossasi, käyttäjäalueellasi, dokumentaatiokuoressasi tai tukityönkulussasi.
Älä lisää route handlereita vain hallitun selain-API:n välityspalvelimeksi, ellei tuotteellasi ole konkreettista palvelinpuolen tarvetta.
SDK käyttää fetchiä ja selaimessa näkyviä projektitunnuksia, joten alusta se asiakasmoduulissa. Älä sijoita salaisuuksia tai hallinta-API:en tunnuksia NEXT_PUBLIC-muuttujiin.
'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.Kyllä. Käytä sitä asiakaskomponentissa interaktiiviseen chat-tilaan ja esitä komponentti App Router -sivulta tai -asettelusta.
Et tavalliseen selainintegraatioon. Julkiset widget-avaimet on suunniteltu asiakaskäyttöön, ja ne voidaan rajata hyväksyttyihin origineihin.
Julkinen widget-avain tunnistaa projektin, mutta se ei ole hallintatunnus. Rajaa se tuotanto- ja esikatseluorigineihisi äläkä koskaan paljasta hallinnollisia salaisuuksia.
Kyllä. Hostatun widgetin asennusopas näyttää next/script-ratkaisun, kun haluat ylläpidetyn käyttöliittymän mukautetun SDK-käyttöliittymän sijaan.
Luottokorttia ei vaadita
Ilmainen taso. Ei korttia.