Files
open-school/MEMORY.md
2026-05-01 20:37:15 +02:00

12 KiB

Memoire Projet

Contexte

Ce projet est un POC de professeur virtuel pour enfants, avec:

  • frontend React + Vite
  • backend FastAPI
  • PostgreSQL pour les donnees eleve
  • Redis present dans la stack
  • integration OpenAI pour reponses texte et transcription audio

Points Importants

  • Le frontend appelle l'API via le prefixe /api.
  • Le backend expose une route POST /transcribe pour la transcription audio.
  • La route /transcribe utilise UploadFile, donc python-multipart est requis dans le backend.
  • Le backend a un socle d'authentification avec comptes users, roles student, teacher, maintenance.
  • Le compte admin/prof initial est seede depuis .env via ADMIN_USERNAME et ADMIN_PASSWORD.
  • Le login pose un cookie HTTP-only professeur_top_session et renvoie aussi un token bearer.
  • Le frontend affiche maintenant une page de connexion avant l'application et verifie la session via /auth/me.
  • Apres connexion admin/prof, l'interface actuelle reste accessible avec un bouton de deconnexion.
  • Les routes eleves principales verifient maintenant les roles:
    • teacher et maintenance peuvent acceder aux eleves
    • student ne peut acceder qu'a son propre student_id
  • Le backend expose POST /admin/student-accounts pour creer une fiche eleve et son compte login en une seule operation.
  • Le frontend masque le choix/creation d'eleve pour un compte student et ouvre directement sa propre seance.
  • Le backend expose GET /students/{student_id}/messages pour relire l'historique de conversation stocke en base.
  • Les reponses aux mini-tests sont maintenant aussi enregistrees dans messages avec le role user.
  • Le frontend recharge l'historique quand un eleve est selectionne, mais ne met plus automatiquement la derniere ancienne phrase au centre.
  • Au demarrage d'une nouvelle seance, Professeur TOP doit faire une courte reprise de l'historique puis annoncer le cours du jour.
  • L'interface de seance est maintenant en hauteur fixe 100vh: pas de scroll global, cours central au milieu, pas de conversation visible.
  • La conversation reste stockee en base pour analyse, mais l'ecran de cours remplace la consigne/reponse courante au lieu d'empiler des bulles.
  • Les reponses de mini-test utilisent la meme zone de reponse eleve en bas; le texte du prof reste au-dessus et pourra accueillir une image sous le texte.
  • Cote eleve, le bouton principal bascule entre Demarrer la seance et Fin de la seance.
  • Cote eleve, la colonne gauche affiche les themes du jour: une card lecon avec pourcentage local, une card exercice avec statut.
  • Le bilan complet de progression reste reserve aux vues prof/admin.
  • Les options TTS visibles doivent etre libellees Voix Douce, Voix Rigolote, etc.; la mention "Voix IA non humaine..." est portee par un tooltip.
  • Le declenchement manuel de mini-test/exercice doit disparaitre de l'interface eleve; le programme doit etre determine par Professeur TOP.
  • A prevoir cote admin: tableau par eleve et prompts/instructions personnalises pour guider Professeur TOP par eleve.
  • L'ecran eleve affiche une petite card "Transmis au prof" au-dessus de la zone de saisie pour montrer le texte capte/envoye.
  • Le backend ajoute une consigne de tours de parole courts pour que Professeur TOP laisse le temps a l'enfant de repondre.
  • Gestion interruption a prevoir: detection de parole pendant TTS, pause audio, transcription, classification pertinent/accidentel, puis reprise courte.
  • La transcription audio force maintenant language="fr" avec un prompt francais pour eviter les erreurs de detection de langue sur phrases tres courtes.
  • Le vrai docker-compose.yml de production n'est pas dans ce repo. Il est situe un niveau au-dessus sur le serveur.
  • La conf nginx reelle route:
    • /api/ vers tutor-backend:8000
    • / vers tutor-frontend:3000

Dictée Vocale

  • L'ancien bouton de dictee marchait en mode manuel avec MediaRecorder.start() puis stop().
  • Le mode actuel est un mode mains libres:
    • activation via un clic utilisateur
    • enregistrement automatique
    • detection du silence
    • transcription automatique
    • envoi automatique du message
  • Firefox s'est montre capricieux avec la mesure temps reel via AnalyserNode.
  • La solution retenue s'appuie sur un traitement plus direct du flux audio pour determiner le niveau sonore.
  • L'ecoute se rearme automatiquement apres:
    • la transcription/envoi du message eleve
    • la fin de lecture vocale du professeur

Voix du Professeur

  • L'ancien systeme de voix navigateur a ete remplace par une vraie TTS OpenAI.
  • Le backend expose maintenant:
    • GET /tts/profiles pour lister les profils de voix
    • POST /tts pour generer un MP3 a partir d'un texte et d'un profile_id
  • Les profils actuels sont:
    • rigolote
    • petillante
    • douce
    • sobre
  • Chaque profil TTS definit:
    • une voix OpenAI
    • une vitesse
    • des instructions de style vocal
  • Le frontend ne depend plus de speechSynthesis pour la voix sortante.
  • Le choix de voix est memorise dans localStorage avec la cle professeur-top-tts-profile.
  • La lecture audio se fait via un blob MP3 retourne par le backend.
  • Le mode micro auto doit continuer a se re-armer apres la fin de lecture du MP3.

Identite Produit

  • Le personnage et le nom visibles dans le frontend ont ete renommes de ProfAmi vers Professeur TOP.
  • Le nouvel avatar image est stocke dans:
    • frontend/src/assets/professeur-top.png
  • Le composant avatar React utilise maintenant l'image raster au lieu du visage CSS/SVG precedent.
  • Le backend a aussi ete aligne dans le prompt systeme et le message de debut de session avec le nom Professeur TOP.

Notes de Session 2026-04-24 21:58:39 +02:00

  • Repo clone dans c:\DataS\OpenSquared\OpenSchool\ProfTop.
  • safe.directory Git ajoute globalement pour ce dossier a cause d'un mismatch d'ownership Windows.
  • Image utilisateur face.png integree dans le frontend sous frontend/src/assets/professeur-top.png.
  • Libelles assistant remplaces par Professeur TOP dans l'UI.
  • README mis a jour pour refleter la TTS OpenAI au lieu de la voix navigateur.
  • Le frontend n'a pas encore ete verifie par build local car frontend/node_modules est absent.
  • Lors d'un prochain demarrage, penser a installer les dependances frontend avant validation finale.
  • La TTS OpenAI suppose une OPENAI_API_KEY valide cote backend.

Notes de Session 2026-04-25 - Auth, UI Eleve, Audio

  • Authentification ajoutee:
    • table users
    • roles student, teacher, maintenance
    • login via /auth/login
    • session via cookie HTTP-only professeur_top_session
    • compte admin/prof seede depuis .env
  • Acces eleve/admin:
    • un compte eleve est rattache a un student_id
    • un eleve ne peut acceder qu'a sa propre fiche/seance
    • prof/maintenance gardent l'acces global
    • creation d'un compte eleve via POST /admin/student-accounts
  • UI eleve:
    • page login active
    • l'eleve ne voit plus la creation ni le choix d'eleves
    • l'ecran de cours ne montre plus la conversation complete
    • le cours courant remplace la consigne precedente au centre
    • la zone de reponse eleve reste en bas
    • card "Transmis au prof" ajoutee pour afficher le dernier texte envoye/capte
    • bouton principal Demarrer la seance / Fin de la seance
    • colonne gauche eleve limitee aux themes du jour, pas au bilan global
  • Conversation et analyse:
    • les messages restent stockes en base
    • GET /students/{student_id}/messages permet de relire l'historique
    • le chat complet sera surtout utile aux rapports admin
  • Voix/TTS:
    • les voix visibles sont libellees Voix Douce, Voix Rigolote, etc.
    • la mention "Voix IA non humaine..." est deplacee en tooltip
    • Professeur TOP a maintenant une consigne backend de tours de parole courts
  • Transcription:
    • language="fr" force dans la transcription OpenAI
    • prompt de transcription ajoute pour phrases scolaires courtes
    • correction faite apres erreur type langue asiatique sur une phrase simple comme "nous chantons"
  • Deploiement serveur:
    • .env du compose doit etre dans /root/.env ou passe via --env-file
    • rebuild backend necessaire pour changements backend
    • rebuild frontend necessaire pour changements UI

Idee Technique - Interruptions Trop Frequentes

Objectif: permettre a l'enfant de couper Professeur TOP sans perdre le fil, tout en evitant les faux positifs.

Approche progressive recommandee:

  1. Barge-in simple avec TTS MP3 actuel:

    • garder l'analyse micro active pendant la lecture audio
    • si volume/parole detectee pendant que speaking=true, mettre l'audio en pause ou l'arreter
    • enregistrer un court segment jusqu'au silence
    • transcrire en francais
    • envoyer au backend avec un marqueur du type interruption=true
    • demander au LLM de classer implicitement: pertinent, question, correction, bruit/accident
    • si pertinent: repondre a l'enfant puis reprendre la lecon
    • si accidentel: repondre tres court puis continuer la consigne
  2. Anti-faux positifs:

    • imposer un seuil plus haut pendant la lecture TTS
    • ignorer les segments tres courts, par exemple moins de 600 ms
    • ignorer les transcriptions vides ou tres faibles
    • utiliser une courte fenetre de cooldown apres chaque interruption
    • afficher dans "Transmis au prof" uniquement ce qui est vraiment envoye
  3. Meilleure solution moyen terme:

    • passer sur OpenAI Realtime/WebRTC
    • gerer interruption, VAD, tour-taking et streaming audio nativement
    • envoyer des evenements de session avec contexte pedagogique
    • conserver en base les transcriptions et messages comme aujourd'hui
  4. Donnees a stocker plus tard:

    • session_id
    • message_type: text, image, audio, interruption
    • source: keyboard, microphone, system
    • interruption_of_message_id
    • timestamp debut/fin de parole
    • confiance transcription

Points de Vigilance

  • Les erreurs WebSocket Vite/HMR sur wss://prof.open-squared.tech/... sont du bruit de dev tant que le frontend tourne via Vite derriere nginx.
  • Ces erreurs ne sont pas la cause principale si /api/* renvoie des 502 ou si le micro se comporte mal.
  • En cas de 502 sur /api/*, verifier d'abord docker logs tutor-backend.
  • Pour tester l'auth locale actuelle: .env contient ADMIN_USERNAME=admin et ADMIN_PASSWORD=admin; a changer avant tout usage partage.

Note Programme Pedagogique par Eleve

  • Le mode admin doit devenir une gestion du programme par eleve.
  • Pour chaque eleve configure, le professeur/admin doit pouvoir choisir une lecon dans le contenu disponible localement.
  • La source prioritaire du contenu est:
    • C:\DataS\OpenSquared\OpenSchool\Programme\contenus_pedagogiques
  • Le contenu est classe par cycle, niveau et matiere:
    • cycle 3: CM1, CM2, 6e
    • cycle 4: 5e, 4e, 3e
  • Pour un eleve de CM1, l'admin doit pouvoir choisir par exemple:
    • mathematiques > nombres entiers
  • Les fiches .svg associees a la lecon choisie doivent s'afficher dans la zone centrale de Professeur TOP cote eleve.
  • Premier essai implemente: une affectation active par eleve, selectionnee en admin, puis visible dans l'ecran eleve.
  • A prevoir ensuite:
    • plusieurs cours possibles par eleve
    • progression equilibree entre lecons et matieres
    • instructions personnalisees par eleve
    • suivi fin des fiches vues / exercices faits
  • Vigilance langue française: les libellés visibles doivent utiliser les accents et formulations françaises correctes, par exemple Démarrer la leçon.

Plan de Dev Acces Eleve / Admin

  1. Socle comptes et roles: table users, hash password, seed admin depuis .env, login, session courante.
  2. Separation UI: LoginPage, StudentApp, AdminApp, composants partages.
  3. Conversation persistante: endpoints de lecture messages, puis sessions et rattachement des messages/tentatives.
  4. UI eleve sans scroll: Professeur TOP en haut, log de seance a gauche, derniere instruction au centre, saisie/micro en bas.
  5. Dashboard prof/admin: creation eleves/comptes, rapports, historique seances, conversation complete, stats de reussite.

Fichiers Touchés Pendant Cette Session

  • frontend/src/App.jsx
  • frontend/src/styles.css
  • frontend/src/assets/professeur-top.png
  • frontend/vite.config.js
  • backend/app/main.py
  • backend/app/schemas.py
  • backend/app/services.py
  • backend/requirements.txt
  • README.md
  • MEMORY.md