Sistema de gestión de actividades educativas con evaluación automatizada mediante IA generativa, integrado con Moodle mediante LTI.
- 🎓 Gestión de actividades: Crea y administra actividades individuales o grupales
- 🤖 Evaluación automatizada: Integración con modelos LAMB para evaluación mediante IA
- 📝 Entregas de estudiantes: Sistema de entregas individuales o grupales con códigos compartidos
- 📊 Calificaciones: Envío automático de calificaciones a Moodle mediante LTI
- 🌐 Multiidioma: Soporte para Catalán, Español e Inglés
- 🔒 Integración LTI: Autenticación y autorización mediante LTI 1.1
- Python 3.8+
- Node.js 18+
- Moodle con soporte LTI 1.1
cd backend
pip install -r requirements.txtCrea un archivo .env basado en env.example:
# LTI Configuration (REQUIRED)
OAUTH_CONSUMER_KEY=tu_consumer_key
LTI_SECRET=tu_secret
# Database Configuration (OPTIONAL)
DATABASE_URL=sqlite:///./lamba.db
# HTTPS Configuration for production (OPTIONAL)
HTTPS_ENABLED=false
ALLOWED_ORIGINS=*
# LAMB API Configuration (OPTIONAL)
LAMB_API_URL=http://lamb.lamb-project.org:9099
LAMB_BEARER_TOKEN=tu_token
LAMB_TIMEOUT=30
# Administrator Credentials (OPTIONAL)
ADMIN_USERNAME=admin
ADMIN_PASSWORD=adminNota: Si usas https_server.py, las variables HTTPS_ENABLED y ALLOWED_ORIGINS se configuran automáticamente para HTTPS. Para producción, cambia ALLOWED_ORIGINS a los dominios específicos permitidos.
cd frontend/svelte-app
npm install
npm run build- Genera los certificados SSL (solo la primera vez):
cd backend
python generate_ssl_cert.pyEsto creará los certificados autofirmados en la carpeta backend/ssl/:
cert.pem- Certificado SSLkey.pem- Clave privada
- Inicia el servidor HTTPS:
python https_server.pyLa aplicación estará disponible en:
https://localhost:9099(Local)https://TU_IP:9099(Red local/Tailscale)
Nota importante: Al usar certificados autofirmados, tu navegador mostrará una advertencia de seguridad. Haz clic en "Avanzado" y "Proceder al sitio" para continuar. Esto es normal en entornos de desarrollo.
cd backend
python -m uvicorn main:app --reload --port 9099La aplicación estará disponible en http://localhost:9099
-
Ve a
Administración del sitio>Plugins>Actividades>Herramienta externa>Gestionar herramientas -
Haz clic en
Configurar una herramienta manualmente -
Configura:
- Nombre de la herramienta: LAMBA
- URL de la herramienta:
https://tu-servidor:9099/lti(ohttps://localhost:9099/ltipara desarrollo local) - Versión LTI: LTI 1.0/1.1
- Clave de consumidor: El valor de
OAUTH_CONSUMER_KEYde tu.env - Secreto compartido: El valor de
LTI_SECRETde tu.env - Contenedor de lanzamiento predeterminado: Nueva ventana
⚠️ Importante: Usahttps://en la URL
-
En Privacidad:
- ✅ Compartir el nombre del lanzador con la herramienta: Siempre
- ✅ Compartir el correo del lanzador con la herramienta: Siempre
- ✅ Aceptar calificaciones de la herramienta: Siempre
-
En Servicios:
- ✅ IMS LTI Assignment and Grade Services
- ✅ IMS LTI Names and Role Provisioning
- ✅ Tool Settings
- En tu curso, añade una nueva actividad de tipo Herramienta externa
- Selecciona LAMBA como herramienta preconfigurada
- Importante: El nombre de la actividad en Moodle debe coincidir con el título de la actividad en LAMBA
- Configura las calificaciones:
- ✅ Permitir que LAMBA añada calificaciones al libro de calificaciones
- Tipo de calificación: Puntuación
- Calificación máxima: 10
- Calificación para aprobar: 5.00
.
├── backend/
│ ├── main.py # Punto de entrada de la aplicación
│ ├── https_server.py # Servidor HTTPS para producción
│ ├── generate_ssl_cert.py # Script para generar certificados SSL
│ ├── config.py # Configuración y variables de entorno
│ ├── database.py # Configuración de base de datos
│ ├── db_models.py # Modelos de base de datos (SQLAlchemy)
│ ├── models.py # Modelos Pydantic para API
│ ├── activities_router.py # Endpoints de actividades
│ ├── activities_service.py # Lógica de negocio de actividades
│ ├── admin_router.py # Endpoints de administración
│ ├── admin_service.py # Servicio de administración
│ ├── submissions_router.py # Endpoints de entregas
│ ├── grades_router.py # Endpoints de calificaciones
│ ├── grade_service.py # Servicio de calificaciones
│ ├── lti_service.py # Servicio LTI para envío de notas
│ ├── lamb_api_service.py # Integración con API LAMB
│ ├── storage_service.py # Gestión de archivos subidos
│ ├── user_service.py # Lógica de negocio de usuarios
│ ├── course_service.py # Lógica de negocio de cursos
│ ├── moodle_service.py # Lógica de negocio de Moodle
│ ├── document_extractor.py # Extracción de texto de documentos
│ ├── requirements.txt # Dependencias Python
│ ├── API_DOCUMENTATION.md # Documentación completa de la API
│ └── ssl/ # Certificados SSL (generados)
│
└── frontend/svelte-app/
├── src/
│ ├── routes/
│ │ ├── +page.svelte # Página principal
│ │ ├── +layout.svelte # Layout raíz
│ │ ├── +layout.js # Configuración de rutas
│ │ ├── actividad/
│ │ │ └── [activityId]/
│ │ │ └── +page.svelte # Vista de actividad específica
│ │ └── admin/
│ │ ├── +page.svelte # Página de login admin
│ │ ├── +layout.svelte # Layout admin
│ │ └── dashboard/
│ │ ├── +page.svelte # Dashboard principal admin
│ │ ├── activities/ # Gestión de actividades
│ │ ├── users/ # Gestión de usuarios
│ │ ├── submissions/ # Gestión de entregas
│ │ ├── grades/ # Gestión de calificaciones
│ │ ├── courses/ # Gestión de cursos
│ │ ├── files/ # Gestión de archivos
│ │ └── moodle/ # Configuración Moodle
│ ├── lib/
│ │ ├── auth.js # Autenticación LTI
│ │ ├── admin.js # Lógica de administración
│ │ ├── components/
│ │ │ ├── Nav.svelte # Navegación principal
│ │ │ ├── AdminNav.svelte # Navegación admin
│ │ │ ├── ActivityForm.svelte # Formulario de actividades
│ │ │ ├── DataTable.svelte # Tabla de datos reutilizable
│ │ │ └── LanguageSelector.svelte # Selector de idioma
│ │ └── i18n/
│ │ ├── index.js # Configuración i18n
│ │ ├── formatters.js # Formateadores de datos
│ │ └── locales/
│ │ ├── ca.json # Catalán
│ │ ├── es.json # Español
│ │ └── en.json # Inglés
│ ├── app.html # HTML raíz
│ ├── app.css # Estilos globales
│ ├── app.d.ts # Tipos TypeScript
│ └── tests/ # Tests
├── package.json
├── svelte.config.js # Configuración Svelte
├── vite.config.js # Configuración Vite
├── vitest.config.js # Configuración Vitest
├── eslint.config.js # Configuración ESLint
├── jsconfig.json # Configuración JavaScript
└── static/
├── config.js # Configuración frontend
└── img/ # Imágenes estáticas
- Accede a LAMBA como administrador en
https://localhost:9099/admin - Inicia sesión con las credenciales configuradas en
.env:- Usuario:
ADMIN_USERNAME - Contraseña:
ADMIN_PASSWORD
- Usuario:
- En el panel de administración puedes:
- Gestionar actividades: Ver, crear, editar y eliminar actividades
- Gestionar usuarios: Ver información de usuarios registrados
- Ver entregas: Monitorizar todas las entregas de estudiantes
- Gestionar calificaciones: Revisar y enviar calificaciones a Moodle
- Configurar evaluadores LAMB: Asociar evaluadores de IA a actividades
- Accede a LAMBA desde Moodle
- Crea una nueva actividad especificando:
- Título
- Descripción
- Tipo (individual o grupal)
- Fecha límite (opcional)
- ID del evaluador LAMB (opcional, para evaluación automática)
- Los estudiantes podrán ver y entregar la actividad
- Revisa las entregas, evalúa (manual o automáticamente) y envía las calificaciones a Moodle
- Accede a la actividad desde Moodle
- Lee la descripción de la actividad
- Sube tu documento (individual) o únete a un grupo con un código compartido
- Espera la evaluación del profesor
- Tu calificación se enviará automáticamente a Moodle
- FastAPI: Framework web moderno y rápido
- SQLAlchemy: ORM para gestión de base de datos
- SQLite: Base de datos (fácilmente reemplazable por PostgreSQL/MySQL)
- Requests: Cliente HTTP para comunicación con API LAMB
- PyLTI: Implementación de LTI 1.1
- Cryptography: Generación de certificados SSL
- SvelteKit: Framework de aplicaciones web
- Svelte 5: Biblioteca UI reactiva
- Tailwind CSS: Framework CSS utility-first
- svelte-i18n: Internacionalización
Problema: El navegador no confía en el certificado autofirmado
Solución:
- Haz clic en "Avanzado" o "Advanced" en la advertencia del navegador
- Selecciona "Proceder a localhost (no seguro)" o similar
- Para Chrome/Edge: escribe
thisisunsafecuando veas la advertencia (sin ningún campo de texto visible)
Alternativa: Genera nuevos certificados si los actuales han expirado:
cd backend
python generate_ssl_cert.pyProblema: Moodle no puede conectarse a LAMBA
Solución:
- Verifica que la URL en Moodle use
https://y el puerto correcto (9099) - Asegúrate de que el firewall permita conexiones al puerto 9099
- Si usas Tailscale u otra VPN, usa la IP de la red virtual
- Verifica que
OAUTH_CONSUMER_KEYyLTI_SECRETcoincidan entre Moodle y.env
Problema: Error al evaluar con LAMB
Solución:
- Verifica que
LAMB_API_URLyLAMB_BEARER_TOKENsean correctos en.env - Asegúrate de que el
evaluator_idconfigurado en la actividad exista en LAMB - Verifica que los documentos subidos sean PDF, DOCX o TXT (formatos soportados)
Problema: Error al sincronizar calificaciones
Solución:
- Verifica que la actividad en Moodle tenga activada la opción "Aceptar calificaciones de la herramienta"
- Asegúrate de que la calificación máxima en Moodle sea 10
- Comprueba que los estudiantes accedieron a la actividad desde Moodle (necesario para obtener
lis_result_sourcedid)
- API Documentation: Ver
backend/API_DOCUMENTATION.mdpara documentación completa de todos los endpoints - Swagger UI: Disponible en
https://localhost:9099/docscuando el servidor está corriendo - ReDoc: Disponible en
https://localhost:9099/redocpara una vista alternativa de la API
Este proyecto es un Trabajo de Fin de Grado desarrollado por Arnau Tajahuerce Brulles.