Komponentägande
Skriv meddelanden, citatkort, uppmaningar, tomma tillstånd och kontroller från dina egna React-komponenter.
Anslut React-komponenter till ChattyBox med @openstaticfish/chattybox. Ditt team styr rendering och tillstånd medan hanterad infrastruktur sköter källbaserade svar, källhänvisningar och gruppering av konversationer.
ChattyBox genomsöker din befintliga webbplats, dokumentation, hjälpcenter, CMS eller kunskapsbas och bäddar sedan in en chatbot som svarar utifrån ditt eget publicerade innehåll i stället för modellens generiska minne.
Installera JavaScript SDK i din React-applikation.
Skapa en Chattybox-klient utanför komponentrenderingssökvägen.
Skicka meddelanden från en händelsehanterare och uppdatera UI-tillståndet med svaret.
Återge källlänkar och hantera strukturerade ChattyboxError-fel.
Lansering i tre steg
Använd tillstånd, tillgänglighet, stil och designsystem som din applikation redan följer istället för att anpassa till ett fast widgetskal.
Använd dessa kontrollpunkter för att bestämma om ChattyBox ska sitta bredvid din dokumentplattform, ersätta en separat assistent eller hålla sig isolerad för testning.
Skriv meddelanden, citatkort, uppmaningar, tomma tillstånd och kontroller från dina egna React-komponenter.
Använd lokala tillstånd eller ditt befintliga tillståndslager samtidigt som konversationer isoleras mellan besökare.
Kontrollera fokus, liveregioner, tangentbordsbeteende och felmeddelanden i din applikation.
Håll webbläsarintegrationen liten medan ChattyBox hanterar innehållsindexering, hämtning och citerade svar.
Skapa klienten en gång, anrop den från en händelsehanterare och håll varje besökskonversations-ID i komponent- eller applikationstillstånd.
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.Ja. JavaScript-SDK:n returnerar meddelanden, konversations-ID:n och källadresser så att din React-applikation kan återge ett helt anpassat gränssnitt.
Inga React-komponenter eller hooks exporteras. Använd headless-metoder med egna komponenter, eller anropa mountWidget() från en beständig webbläsarlayout för att ladda den underhållna flytande widgeten.
Skapa den en gång utanför komponentrenderingsvägen eller i en stabil applikationsleverantör istället för att bygga en ny klient för varje rendering.
Ja. Använd installationsguiden för den värdbaserade widgeten när du vill ha ett underhållet gränssnitt snarare än anpassad React-rendering.
Inget kreditkort krävs. Ditt innehåll används inte för modellträning.
Free-nivå. Inget kort behövs.
Vi använder valfria analys- och tagghanteringsverktyg för att förstå hur webbplatsen används. Välj om du vill tillåta Ahrefs Web Analytics, PostHog och Google Tag Manager. Om du stänger av analysen laddas sidan om så att ändringen genomförs korrekt. Grundläggande webbplatsfunktioner och felövervakning styrs inte av detta val. Läs vår integritetspolicy.