Límite de cliente pequeño
Marca solo el módulo de chat interactivo con use client, en lugar de trasladar una página o un layout completos al navegador.
Utilice @openstaticfish/chattybox dentro de un límite de cliente enfocado mientras el resto de su aplicación App Router permanece procesada en el servidor. ChattyBox maneja la recuperación, las citas, las conversaciones y el escalado.
Conversación ilustrativa: no es un chat en directo.
ChattyBox rastrea su sitio web, documentación, centro de ayuda, CMS o base de conocimientos existentes y luego inserta un chatbot que responde a partir de su propio contenido publicado, en lugar de la memoria genérica del modelo.
Instale @openstaticfish/chattybox en la aplicación Next.js.
Agregue la clave API del widget público y la URL de la API como variables de entorno NEXT_PUBLIC.
Cree un componente de cliente para el estado del chat y la interacción del navegador.
Importe ese componente de cliente desde una página o diseño de componente de servidor.
Lanzamiento en tres pasos
Mantenga el SDK en el borde del cliente donde ocurre la interacción de chat y conserve los componentes del servidor para el resto de la aplicación.
Utilice estos puntos de control para decidir si ChattyBox debe sentarse junto a su plataforma de documentos, reemplazar a un asistente independiente o permanecer aislado para realizar pruebas.
Marca solo el módulo de chat interactivo con use client, en lugar de trasladar una página o un layout completos al navegador.
Utilice una clave de proyecto segura para el navegador con orígenes permitidos; nunca exponga las credenciales de administración a través de variables NEXT_PUBLIC.
Representa mensajes y citas en tu propia navegación, área de cuenta, shell de documentos o flujo de trabajo de soporte.
Evite agregar controladores de ruta únicamente para representar una API de navegador administrada a menos que su producto tenga un requisito concreto del lado del servidor.
El SDK utiliza credenciales de proyecto visibles y de recuperación del navegador, así que inicialícelo en un módulo de cliente. Mantenga los secretos y las API de administración fuera de las variables 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í. Úselo en un componente del cliente para el estado del chat interactivo y represente ese componente desde una página o diseño de App Router.
No para la integración normal del navegador. Las claves de widget públicas están diseñadas para uso del cliente y pueden restringirse a orígenes aprobados.
La clave del widget público identifica un proyecto pero no es una credencial de administración. Restrinjalo a sus orígenes de producción y vista previa, y nunca exponga secretos administrativos.
Sí. La guía de instalación del widget alojado muestra cómo usar next/script si prefieres una interfaz mantenida en lugar de crear una propia con el SDK.
No se requiere tarjeta de crédito
Plan Free. Sin tarjeta.