Types de questions
12 types au total — 10 auto-corrigés, essay manuel/LLM, calculated comme type avancé à formule :
| Type | Auto-correction | Cas d'usage |
|---|---|---|
| multiple_choice | Oui | Connaissances factuelles, concepts |
| true_false | Oui | Vérification rapide |
| multiple_select | Oui | Plusieurs réponses correctes |
| fill_blank | Oui (normalisation) | Vocabulaire, formules |
| matching | Oui | Associations (mot-définition) |
| ordering | Oui | Séquence logique/chronologique |
| numeric | Oui (avec tolérance) | Calculs mathématiques/physiques |
| short_answer | Oui (normalisation + synonymes) | Réponses courtes |
| cloze | Oui | Plusieurs lacunes dans un même texte |
| hotspot | Oui | Cliquer sur une zone d'une image |
| essay | Manuel (ou LLM optionnel) | Rédaction, dissertation |
| calculated | Avancé (basé sur une formule) | Problèmes numériques paramétrés |
Configuration du quiz
QuizConfiguration en JSON de contenu :
{
"maxAttempts": 3,
"timeLimitMinutes": 30,
"shuffleQuestions": true,
"shuffleOptions": true,
"accessCode": "ENEM2026",
"scoringPolicy": "highest", // highest | latest | average
"reviewMode": "after_submit", // after_submit | after_due_date | never
"passingScore": 70,
"showResultsToStudent": true,
"allowGoBack": false // si false, l'étudiant ne peut pas revenir aux questions précédentes
}
Flux de soumission
POST /api/courses/[courseId]/lessons/[lessonId]/quiz/start
↓
- Valide l'inscription + disponibilité de la leçon (checkLessonAvailability)
- Valide que maxAttempts n'est pas dépassé
- Valide accessCode si configuré
- Crée QuizAttempt avec optionOrders (mélanges persistés)
- Retourne les questions SANS correctIndex (règle critique 66)
↓
L'étudiant répond (le client envoie les événements de changement d'onglet en arrière-plan)
↓
POST /api/courses/[courseId]/lessons/[lessonId]/quiz/submit
↓
- remapStudentAnswer (inverse le mélange via optionOrders)
- Auto-correction par type
- Calcule le score
- Crée/met à jour LessonCompletion (scoringPolicy décide)
- Déclenche QuizEvaluationService :
- Met à jour ConceptMastery par concepts[] de la question
- Détecte les misconceptions (Haiku, ~$0.001)
- Crée un Grade dans le gradebook (si GradeItem associée)
- Déclenche l'automatisation quiz_submitted
- Déclenche handleGamificationEvent (XP, badges, concours)
Intégrité académique
QuizAttempt persiste :
tabSwitchCount— nombre de fois que l'étudiant a quitté l'ongletcopyPasteCount— tentatives de copier-coller/couper détectéesblurCount— événements de perte de focus de la fenêtretimeSpentSec— temps total (le temps moyen par question est dérivé de cette valeur)ipAddress,userAgentflagged/flagReason— true lorsqu'un signal dépasse la limite configurée
Contrôles configurables dans QuizConfiguration : accessCode, ipWhitelist (correspondance exacte, validée côté serveur dans quiz/start), requireLockdownBrowser (Safe Exam Browser ou l'app StudeiaMobile), requireFullscreen, preventTabSwitch avec maxTabSwitches, et disableCopyPaste.
Le gradebook affiche une icône ShieldAlert + une info-bulle indiquant le motif du signalement. L'enseignant décide d'annuler ou d'ignorer.
Question pooling (banque de questions)
Un quiz peut tirer aléatoirement un sous-ensemble d'une ou plusieurs banques : useQuestionPool, questionPoolBankIds, questionPoolCount et questionPoolFilters (difficulté, tags, types). Chaque étudiant reçoit un ensemble différent, sélectionné côté serveur — les bonnes réponses ne sont jamais envoyées au client avant la soumission.
Analytics psychométriques
/api/institution/courses/[id]/lessons/[lid]/quiz-analytics retourne :
Difficulté des items (p-value)
difficulty = total_correctes / total_tentatives
- < 0.3 : trop difficile (revoir la question)
- 0.3-0.7 : idéal
-
0.85 : trop facile
Discrimination point-biserial
Corrélation entre la réussite d'un item et le score total. Identifie les questions qui ne discriminent PAS les bons des mauvais étudiants.
-
0.4 : excellent
- 0.2-0.4 : acceptable
- < 0.2 : médiocre (supprimer/reformuler)
Analyse des distracteurs (MC et TF)
% d'étudiants ayant choisi chaque option incorrecte. Indice de misconceptions communes :
Q : "Capitale de l'Australie ?"
A) Sydney (40% — misconception populaire) ← FLAG
B) Canberra (45% — correcte)
C) Melbourne (10%)
D) Brisbane (5%)
Alpha de Cronbach (cohérence interne)
Mesure si les questions du quiz évaluent le même construit.
-
0.7 : acceptable
- 0.6-0.7 : questionnable
- < 0.6 : repenser le quiz
Nécessite ≥ 30 tentatives pour une fiabilité statistique.
Distribution des scores
10 intervalles de 0 à 100 %. Aide à détecter les quiz avec effet plafond/plancher.
Banque de questions
QuestionBank réutilise les questions dans plusieurs quiz :
POST /api/institution/question-banks
POST /api/institution/question-banks/[id]/items
L'éditeur de quiz dispose d'un sélecteur qui filtre par banque, type, difficulté et tags. L'import sélectionne N questions aléatoires dans la banque.
Exporteurs :
- Format GIFT (compatible Moodle, Canvas, Blackboard)
- CSV (pour l'édition dans un tableur)
La banque de questions peut être intégrée dans le RAG pour que le tuteur IA y accède également :
POST /api/institution/question-banks/[id]/rag-ingest
Limites et quotas
- Maximum 200 questions par quiz (UX)
- Maximum 1 000 questions par banque de questions (performance)
- Durée limite minimale 1 minute, maximale 360 minutes (6h)
- Max attempts : 1-99 ou
null(illimité)
Honnêteté technique
Ce que Studeia fait bien :
- IA multi-fournisseurs pour la détection des misconceptions
- Analytics psychométriques dans l'interface (rares LMS les proposent)
- Banque de questions avec ingestion RAG
- Compteurs d'intégrité passifs (changement d'onglet, copier-coller, perte de focus, temps)
- Verrouillage via Safe Exam Browser / StudeiaMobile
- IP whitelist par quiz + accessCode
- Question pooling depuis la banque
Ce que Studeia NE fait PAS (encore) :
- Surveillance par webcam/microphone (utilisez Examity/ProctorU via LTI)
- Tests adaptatifs (CAT) — feuille de route
- L'auto-correction des essays assistée par LLM est optionnelle (pas un correcteur garanti)