
Capacidades
- IA en streaming
- Voz y transcripción
- Generación de imágenes
- Modelos en local
Frontend
Backend
ChatGPT Clone
CompletadoAplicación fullstack que agrupa varios casos de uso de IA sobre un mismo backend: corrección ortográfica, traducción, discusión de pros y contras con respuesta en streaming, texto a voz, transcripción de audio, generación y variación de imágenes, y un asistente conversacional con hilos persistentes. Frontend Angular 19, backend NestJS con PostgreSQL.
El reto
Meter una API key de OpenAI en un frontend no es una opción, y cada capacidad del modelo tiene su propia forma de responder: JSON, texto, streaming, audio o imagen. El objetivo era una arquitectura donde añadir un caso de uso nuevo fuese añadir un archivo, no tocar media aplicación.
Implementación
El backend es el único que ve la API key
NestJS actúa de proxy: el navegador nunca toca OpenAI directamente. Cada capacidad vive aislada en su propio caso de uso, así que añadir uno nuevo no obliga a tocar el resto.
Streaming token a token
Las respuestas largas se reenvían al cliente conforme llegan mediante un pipe propio sobre el stream de OpenAI, que además corta limpiamente si el cliente aborta la petición en mitad de la generación.
Multimodal, no solo texto
Ortografía, traducción y pros/contras en texto; texto a voz y transcripción de audio con subida de fichero validada por tipo y tamaño; y generación y variación de imágenes.
Asistente con hilos persistentes
Además del chat por completions, un módulo aparte usa la Assistants API creando hilos que mantienen el contexto de la conversación entre peticiones.
Proveedor intercambiable con Ollama
Los mismos casos de uso tienen una implementación alternativa contra Ollama para correr modelos en local, y un endpoint público informa de qué proveedores están disponibles en cada despliegue.
Historial persistido en PostgreSQL
Conversaciones y mensajes se guardan con TypeORM, con autenticación JWT, recuperación de contraseña por email y usuarios propios de la aplicación.
API endurecida
Rate limiting con Throttler, cabeceras de seguridad con Helmet, compresión, validación de variables de entorno con Joi al arrancar y DTOs validados con class-validator.