Ahora mismo el flujo es backend/API, sin frontend:

0.- El profesor se registra (POST /auth/register) o inicia sesión (POST /auth/login) y obtiene un token JWT.

1.- Crea una plantilla con POST /exam/templates (requiere Authorization: Bearer <token>).
   Define título, materia, nivel educativo, tipos de preguntas, puntuación, penalización y dificultad.
   La plantilla queda guardada en base de datos asociada a su usuario.

2.- Sube materiales de referencia con POST /exam/templates/{id}/materials (campo file).
   Acepta PDF, DOCX, TXT, MD, PNG, JPG, WEBP. La API extrae el texto para contexto de la IA.

2b.- Sube imágenes de examen con POST /exam/templates/{id}/images (campo file, opcional caption).
   PNG, JPG, WEBP, GIF. Se usan para mostrarlas en las preguntas (no para extraer texto).

3.- Genera un prompt con POST /exam/prompts/{template_id}.
   El prompt incluye el material subido + el tema indicado por el profesor.

4.- Hay dos caminos posibles:

    4.1.- Generación automática: POST /exam/generate.
          La API llama al LLM con el contexto de los ficheros y guarda las preguntas.

    4.2.- Carga manual: POST /exam/parse.
          El profesor pega una salida de IA en json o txt, y la API la valida y guarda.

5.- Consulta su historial con GET /exam/history.
   Ve todos los exámenes que ha creado, cuántas preguntas tienen y cuándo exportó por última vez.

6.- Exporta el examen:

    GET /exam/export/xml/{template_id} para Moodle XML.
    GET /exam/export/txt/{template_id} para texto plano.
    GET /exam/export/json/{template_id} para JSON.

(El XML generado se importa manualmente en Moodle.)

En resumen: registrarse → plantilla → subir materiales → prompt/generar con IA → historial → exportar Moodle XML.
