Types de questions
12 types au total — 10 auto-corrigés, essay manuel/LLM, calculated comme type avancé de 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 tolerance) | 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 la 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'apprenant 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 l'accessCode si configuré
- Crée QuizAttempt avec optionOrders (mélanges persistés)
- Retourne les questions SANS correctIndex (règle critique 66)
↓
L'apprenant 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 (annule 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 une 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'apprenant a quitté l'ongletcopyPasteCount— tentatives de copy/paste/cut 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 le seuil configuré
Contrôles configurables dans QuizConfiguration : accessCode, ipWhitelist (correspondance exacte, validée côté serveur dans quiz/start), requireLockdownBrowser (Safe Exam Browser ou l'application StudeiaMobile), requireFullscreen, preventTabSwitch avec maxTabSwitches, et disableCopyPaste.
Le gradebook affiche l'icône ShieldAlert avec une infobulle 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 apprenant reçoit un ensemble différent, sélectionné côté serveur — les réponses correctes 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 : très difficile (revoir la question)
- 0.3-0.7 : idéal
-
0.85 : très 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 apprenants.
-
0.4 : excellent
- 0.2-0.4 : acceptable
- < 0.2 : mauvais (supprimer/reformuler)
Analyse des distracteurs (MC et TF)
% d'apprenants ayant choisi chaque option incorrecte. Indice de misconceptions courantes :
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 : discutable
- < 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 permettant de filtrer par banque, type, difficulté, tags. L'import sélectionne N questions aléatoires de la banque.
Exportateurs :
- Format GIFT (compatible Moodle, Canvas, Blackboard)
- CSV (pour é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 1000 questions par banque de questions (performance)
- Durée minimale 1 minute, maximale 360 minutes (6h)
- Max attempts : 1-99 ou
null(illimité)
Honnêteté technique
Ce que Studeia fait bien :
- IA multi-fournisseur pour la détection de misconceptions
- Analytics psychométriques dans l'interface (rares dans les LMS)
- Banque de questions avec ingestion RAG
- Compteurs d'intégrité passifs (changement d'onglet, copy/paste, blur, temps)
- Verrouillage via Safe Exam Browser / StudeiaMobile
- IP whitelist par quiz + accessCode
- Question pooling à partir de la banque
Ce que Studeia ne fait PAS (encore) :
- Surveillance par webcam/microphone (utilisez Examity/ProctorU via LTI)
- Tests adaptatifs (CAT) — feuille de route
- La correction automatique des essays via LLM est optionnelle (pas un correcteur garanti)