# Ani Assistant - Asistente Médico Virtual Una plataforma web completa para asistente virtual médico construida con Next.js, TypeScript, TailwindCSS y shadcn/ui. ## 🚀 Características - **Autenticación completa** con NextAuth.js y roles de usuario (Doctor/Paciente) - **Chat médico inteligente** con integración de assistant-ui - **Generación automática de reportes médicos** después de 3 mensajes - **Base de datos PostgreSQL** con Prisma ORM - **Interfaz moderna y responsiva** con TailwindCSS y shadcn/ui - **Protección de rutas** según el rol del usuario - **Historial de reportes médicos** para pacientes y doctores - **Sistema de usernames únicos** generados automáticamente - **Almacenamiento de imágenes de perfil** en archivos ## 🛠️ Tecnologías Utilizadas - **Frontend**: Next.js 15, TypeScript, TailwindCSS - **UI Components**: shadcn/ui, assistant-ui - **Autenticación**: NextAuth.js - **Base de Datos**: PostgreSQL con Prisma ORM - **Encriptación**: bcryptjs - **Iconos**: Lucide React ## 📋 Requisitos Previos - Node.js 18+ - npm o yarn - PostgreSQL 12+ (instalado y ejecutándose) ## 🚀 Instalación > **💡 Para una instalación rápida, consulta [guides/QUICK_START.md](guides/QUICK_START.md)** 1. **Clonar el repositorio** ```bash git clone https://github.com/GeoShaPoH/ani-assistant cd ani-assistant ``` 2. **Instalar dependencias** ```bash npm install ``` 3. **Instalar y configurar PostgreSQL** Si no tienes PostgreSQL instalado: **Windows:** - Descarga desde [https://www.postgresql.org/download/windows/](https://www.postgresql.org/download/windows/) - O usa Chocolatey: `choco install postgresql` **Crear la base de datos:** ```bash psql -U postgres CREATE DATABASE ani_assistant; \q ``` 4. **Configurar variables de entorno** Copia el archivo `env.sample.txt` a `.env`: ```bash cp env.sample.txt .env ``` Edita el archivo `.env` con tus valores: ```env # NextAuth NEXTAUTH_URL="http://localhost:3000" NEXTAUTH_SECRET="your-secret-key-here" # Database (PostgreSQL) DATABASE_URL="postgresql://postgres:tu-password@localhost:5432/ani_assistant" # OpenRouter (para el chat médico) OPENROUTER_API_KEY="tu-api-key-de-openrouter" OPENROUTER_URL="https://openrouter.ai/api/v1" OPENROUTER_MODEL="deepseek/deepseek-chat-v3-0324:free" ``` **Nota**: - Reemplaza `tu-password` con la contraseña de tu usuario PostgreSQL - Si no configuras `OPENROUTER_API_KEY`, el chat funcionará con respuestas de fallback - Ejecuta `npm run check-env` para verificar la configuración 5. **Configurar la base de datos** ```bash # Verificar configuración npm run check-env # Generar el cliente de Prisma npm run db:generate # Crear las tablas en PostgreSQL npm run db:push # Configurar usuarios de prueba npm run db:setup ``` 6. **Ejecutar el servidor de desarrollo** ```bash npm run dev ``` 7. **Abrir en el navegador** ``` http://localhost:3000 ``` ## 🗄️ Estructura de la Base de Datos ### Tabla User - `id`: String (CUID) - `name`: String - `lastname`: String - `username`: String (único, generado automáticamente) - `email`: String (único) - `password`: String (hash) - `role`: Enum (DOCTOR/PATIENT) - `profileImage`: String? (URL de la imagen) - `createdAt`: DateTime - `updatedAt`: DateTime ### Tabla Record - `id`: String (CUID) - `userId`: String (referencia a User) - `content`: String (reporte médico) - `messages`: Json (opcional, mensajes del chat) - `createdAt`: DateTime ## 🔐 Roles de Usuario ### Paciente (PATIENT) - Acceso al chat médico (máximo 3 mensajes por sesión) - Visualización de sus propios reportes médicos - Generación automática de reportes ### Doctor (DOCTOR) - Acceso a panel de administración - Visualización de todos los reportes médicos - Gestión de pacientes - Estadísticas del sistema ## 📱 Páginas Principales - **/** - Página de inicio - **/auth/login** - Inicio de sesión - **/auth/register** - Registro de usuarios - **/dashboard** - Panel principal (según rol) - **/chat** - Chat médico (solo pacientes) - **/records** - Historial de reportes - **/admin** - Panel de administración (solo doctores) ## 🔧 Configuración para Producción ### Variables de Entorno de Producción ```env NEXTAUTH_URL="https://your-domain.com" NEXTAUTH_SECRET="your-production-secret-key" DATABASE_URL="postgresql://user:password@host:5432/ani_assistant" OPENROUTER_API_KEY="tu-api-key-de-openrouter" ``` ### Despliegue en VPS (Digital Ocean) 1. **Configurar el servidor** ```bash # Instalar Node.js sudo apt update sudo apt install nodejs npm # Instalar PostgreSQL sudo apt install postgresql postgresql-contrib ``` 2. **Configurar PostgreSQL** ```bash # Crear usuario y base de datos sudo -u postgres psql CREATE USER ani_user WITH PASSWORD 'your_password'; CREATE DATABASE ani_assistant OWNER ani_user; GRANT ALL PRIVILEGES ON DATABASE ani_assistant TO ani_user; \q ``` 3. **Desplegar la aplicación** ```bash # Clonar el repositorio git clone cd ani-assistant # Instalar dependencias npm install # Configurar variables de entorno cp env.sample.txt .env # Editar .env con las configuraciones de producción # Verificar configuración npm run check-env # Generar build de producción npm run build # Configurar base de datos npm run db:push npm run db:setup # Iniciar la aplicación npm start ``` 4. **Configurar PM2 (opcional)** ```bash npm install -g pm2 pm2 start npm --name "ani-assistant" -- start pm2 startup pm2 save ``` ## 🔑 Configuración de OpenRouter Para que el chat médico funcione con IA, necesitas configurar OpenRouter: 1. **Registrarse en OpenRouter** - Ve a [https://openrouter.ai](https://openrouter.ai) - Crea una cuenta gratuita - Obtén tu API key desde el dashboard 2. **Configurar la API key** - Agrega `OPENROUTER_API_KEY="tu-api-key"` en tu archivo `.env` - La aplicación usará el modelo Claude 3.5 Sonnet por defecto 3. **Funcionamiento sin API key** - Si no configuras la API key, el chat funcionará con respuestas de fallback - Las respuestas serán básicas pero funcionales ## 🧪 Datos de Prueba Para probar la aplicación, puedes usar los usuarios creados automáticamente: ### Usuario Administrador (Doctor) - Email: `admin@ani-assistant.com` - Password: `admin123` - Username: Generado automáticamente (ej: `asistema`) - Role: `DOCTOR` ### Usuario Paciente - Email: `patient@ani-assistant.com` - Password: `patient123` - Username: Generado automáticamente (ej: `pprueba`) - Role: `PATIENT` **Nota**: Los usernames se generan automáticamente usando la primera letra del nombre + apellido. Si ya existe, se agrega un número (ej: `pprueba1`, `pprueba2`). ## 📝 Scripts Disponibles ```bash npm run dev # Servidor de desarrollo npm run build # Build de producción npm run start # Servidor de producción npm run lint # Linting npm run check-env # Verificar variables de entorno npm run db:studio # Interfaz de Prisma npm run db:push # Crear/actualizar tablas npm run db:setup # Configurar usuarios de prueba npm run db:seed # Cargar datos de ejemplo ``` ## 🔒 Seguridad - Contraseñas encriptadas con bcryptjs - Sesiones JWT seguras - Protección de rutas por rol - Validación de datos en el servidor - Sanitización de inputs - Usernames únicos generados automáticamente - Almacenamiento seguro de imágenes de perfil ## 🤝 Contribución 1. Fork el proyecto 2. Crea una rama para tu feature (`git checkout -b feature/AmazingFeature`) 3. Commit tus cambios (`git commit -m 'Add some AmazingFeature'`) 4. Push a la rama (`git push origin feature/AmazingFeature`) 5. Abre un Pull Request ## 📄 Licencia Este proyecto está bajo la **Licencia Apache 2.0**. Esta licencia proporciona: - **Protección de propiedad intelectual** más robusta que MIT - **Permite uso comercial** y distribución - **Requiere atribución** y preservación de copyright - **Protección de patentes** explícita - **Contribuciones claramente definidas** para evitar conflictos Ver el archivo [LICENSE](LICENSE) para los términos completos. ### ¿Por qué Apache 2.0? La Licencia Apache 2.0 es ideal para proyectos que quieren: - Mantener el código abierto y colaborativo - Proteger mejor la propiedad intelectual del autor original - Permitir uso comercial sin restricciones - Definir claramente qué constituye una contribución - Proporcionar protección de patentes explícita ## ⚠️ Disclaimer Esta aplicación es para fines educativos y de demostración. No debe usarse para diagnóstico médico real sin la supervisión de profesionales médicos calificados. ## 🆘 Soporte Si tienes problemas o preguntas: 1. Revisa la documentación 2. Busca en los issues existentes 3. Crea un nuevo issue con detalles del problema --- **Desarrollado con ❤️ para la comunidad médica**