Chatbot AI
Reglas
- Usa el SDK de Vercel AI (paquete
ai) para streaming — hook useChat() en el cliente, streamText() en el servidor
- Transmite respuestas con
text/event-stream — nunca almacenes respuestas completas en buffer antes de enviarlas
- Formato de mensaje:
{ role: "user" | "assistant" | "system", content: string }
- Gestión de ventana de contexto: recorta los mensajes más antiguos al acercarse al límite de tokens, mantén siempre el prompt del sistema
- Patrón RAG: incrusta la consulta del usuario → búsqueda vectorial → inyecta los k resultados principales como contexto antes del mensaje del usuario
- Interfaz de chat: desplazamiento automático al final, indicador de carga con puntos animados, renderiza Markdown en los mensajes del asistente
- Persiste el historial de conversaciones en el servidor — usa una tabla
messages con chatId, role, content, createdAt
- El prompt del sistema va primero en el array de mensajes — nunca permitas que los mensajes del usuario lo sobrescriban
- Endpoint de chat YepAPI:
POST /v1/ai/chat con { messages, model?, stream? }
- Botón de detener generación — usa
AbortController para cancelar transmisiones en curso
Patrones
const { messages, input, handleInputChange, handleSubmit, isLoading, stop } = useChat({
api: "/api/chat",
});
import { streamText } from "ai";
export async function POST(req: Request) {
const { messages } = await req.json();
const result = streamText({ model, messages });
return result.toDataStreamResponse();
}
Evitar
- Enviar todo el historial de conversación sin recortar — excederá la ventana de contexto
- Bloquear la interfaz de usuario mientras se espera la respuesta completa — siempre usa streaming
- Almacenar mensajes solo en el estado del cliente — persiste en el servidor para el historial
- Codificar nombres de modelos directamente — usa variables de entorno o configuración