volver al blog
proyectos1 de mayo de 2025· 8 min de lectura

Building chat-IA: arquitectura, decisiones y lo que aprendí

Un breakdown técnico de cómo construí un chat con IA desde cero: streaming, autenticación, documentos, diseño del sistema, y los obstáculos que me encontré en el camino.

D

Daniel

jarvis_404

chat-IA nació de una idea simple: quería un chat con IA que pudiera analizar mis documentos. Terminar construyendo un sistema completo con autenticación, historial de conversaciones, streaming, y soporte de PDFs fue todo un viaje.

##El stack elegido

Para este proyecto usé Next.js 15 con App Router, React 19, TypeScript strict, Tailwind CSS v4, Prisma con PostgreSQL, y NextAuth v5. Todo en un solo repositorio. La elección de Next.js fue natural: maneja el frontend y el backend en el mismo repo, tiene soporte nativo para streaming, y el App Router facilita mucho la arquitectura de layouts y rutas.

##El mayor desafío: streaming

Implementar el streaming de respuestas de la IA fue lo más complejo. No podía hacer un simple fetch y esperar la respuesta completa, porque con respuestas largas el usuario esperaría mucho tiempo sin feedback. La solución fue usar Server-Sent Events (SSE) desde el API route y leerlos con ReadableStream en el cliente.

typescript
// app/api/chat/route.ts
const stream = new ReadableStream({
  async start(controller) {
    for await (const chunk of completion) {
      const text = chunk.choices[0]?.delta?.content ?? '';
      controller.enqueue(encoder.encode(text));
    }
    controller.close();
  },
});

return new Response(stream, {
  headers: { 'Content-Type': 'text/event-stream' },
});

##Autenticación con NextAuth v5

NextAuth v5 cambió bastante respecto a v4. La configuración es más explícita y el sistema de adapters es más limpio. Integrar el Prisma Adapter para persistir sesiones y usuarios fue directo, aunque la documentación de la beta tiene algunos huecos que tuve que resolver leyendo issues en GitHub.

##Lo que haría diferente

  • Extraería el sistema de design tokens a un archivo separado desde el día uno
  • Agregaría tests end-to-end con Playwright desde el inicio
  • Usaría un job queue para el procesamiento de documentos pesados
  • Implementaría rate limiting en los API routes desde el principio
"El diseño del sistema importa más que la implementación. Es más fácil reescribir código que cambiar la arquitectura."
ver todos los posts