Limite del cliente piccolo
Contrassegna solo il modulo di chat interattiva con use client invece di spostare un'intera pagina o layout nel browser.
Utilizza @openstaticfish/chattybox all'interno di un limite client mirato mentre il resto della tua applicazione App Router rimane sottoposto a rendering del server. ChattyBox gestisce il recupero, le citazioni, le conversazioni e il ridimensionamento.
Conversazione a scopo illustrativo — non è una chat dal vivo.
ChattyBox esegue la scansione del tuo sito web esistente, della documentazione, del centro assistenza, del CMS o della knowledge base, quindi incorpora un chatbot che risponde dai tuoi contenuti pubblicati invece che dalla memoria generica del modello.
Installa @openstaticfish/chattybox nell'applicazione Next.js.
Aggiungi la chiave API del widget pubblico e API URL come variabili di ambiente NEXT_PUBLIC.
Crea un componente client per lo stato della chat e l'interazione con il browser.
Importa il componente client da una pagina o un layout del componente server.
Lancio in tre fasi
Mantieni SDK sul lato client dove avviene l'interazione della chat e preserva i componenti server per il resto dell'applicazione.
Utilizza questi punti di controllo per decidere se ChattyBox deve essere affiancato alla tua piattaforma di documenti, sostituire un assistente separato o rimanere isolato per i test.
Contrassegna solo il modulo di chat interattiva con use client invece di spostare un'intera pagina o layout nel browser.
Utilizzare una chiave di progetto sicura per il browser con origini consentite; non esporre mai le credenziali di gestione tramite le variabili NEXT_PUBLIC.
Visualizza messaggi e citazioni nella tua navigazione, nell'area dell'account, nella shell dei documenti o nel flusso di lavoro di supporto.
Evita di aggiungere gestori di route esclusivamente per eseguire il proxy di un browser gestito API a meno che il tuo prodotto non abbia un requisito concreto lato server.
SDK utilizza fetch e le credenziali del progetto visibili dal browser, quindi inizializzalo in un modulo client. Mantieni i segreti e la gestione API fuori dalle variabili 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.SÌ. Usalo in un componente client per lo stato della chat interattiva ed esegui il rendering di quel componente da una pagina o un layout App Router.
Non per la normale integrazione del browser. Le chiavi widget pubbliche sono progettate per l'uso da parte dei client e possono essere limitate alle origini approvate.
La chiave widget pubblica identifica un progetto ma non è una credenziale di gestione. Limitalo alla tua produzione e alle origini in anteprima e non esporre mai segreti amministrativi.
SÌ. La guida all'installazione ospitata mostra il percorso successivo/script quando preferisci un'interfaccia UI mantenuta anziché un'interfaccia SDK personalizzata.
Nessuna carta di credito richiesta
Piano Free. Nessuna carta.