Files
Copies/Readme.org
T
2026-09-17 22:19:05 +02:00

268 lines
11 KiB
Org Mode
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#+title: Copienator
#+author: Sébastien Miquel
#+date: 14-03-2026
# Time-stamp: <22-08-26 12:22>
#+OPTIONS:
* Présentation
** Quézaco
Ce dépôt contient un certain nombre de script Python que j'utilise
pour faire corriger des copies par Gemini.
1. Les copies sont découpées suivant les labels des questions.
2. Des requêtes de correction sont faites à Gemini, qui met une note
entre 0 et 4 à la question, ajoute des commentaires, et encadre
certaines parties de la réponse.
3. Une version pdf annotée de la copie est générée, faite pour être
éditée sur tablette tactile. Le correcteur humain peut modifier la
note, supprimer des commentaires de l'IA, ou ajouter des remarques
manuscrites.
4. Ces annotations manuscrites sont lues et recompilées en une
version de la copie pour l'élève.
** Limitations
Pour l'instant, la correction est faite question par question : le LLM
n'a accès qu'à la partie de la copie correspondant à une question
fixée. Ça ne gère donc pas les cas où un argument a été donné dans une
question précédente ou autre.
*** Noms de labels sous Windows
Les labels de questions sont utilisés comme noms de fichiers. Les
labels contenant notamment =:= ne sont pas acceptés par Windows.
** Prérequis et installation
*** Python 3.11 ou plus récent
Sous macOS avec Homebrew, installer Python et la version correspondante
de Tkinter avant de créer l'environnement virtuel. Par exemple :
#+BEGIN_SRC bash
brew install python@3.13 python-tk@3.13
#+END_SRC
Utiliser alors =python3.13= à la place de =python= dans les commandes
de création de l'environnement si la commande non versionnée n'est pas
disponible.
Créer et activer un environnement virtuel est recommandé :
#+BEGIN_SRC bash
python -m venv .venv
#+END_SRC
Sous Linux et macOS :
#+BEGIN_SRC bash
source .venv/bin/activate
#+END_SRC
Sous Windows (PowerShell) :
#+BEGIN_SRC powershell
.venv\Scripts\Activate.ps1
#+END_SRC
Installer ensuite Copienator et ses dépendances Python depuis la
racine du dépôt :
#+BEGIN_SRC bash
python -m pip install --upgrade pip
python -m pip install -e .
#+END_SRC
Cette commande installe les modules contrôlés par le diagnostic du GUI
(NumPy, pandas, Matplotlib, Pillow, pydantic, pypdf, pdf2image,
ReportLab, img2pdf, PyMuPDF, ftfy, ezodf et Google Gen AI), ainsi que
les exécutables =copienator= et =copienator-gui=. Le paquet fournissant
=google.genai= est =google-genai=, et non =google=.
Les commandes restent également accessibles avec
=python -m copienator= depuis la racine du dépôt.
*** Programmes externes obligatoires
Le diagnostic vérifie que Poppler et LaTeX sont accessibles depuis
=PATH=.
**** Linux (Debian et Ubuntu)
#+BEGIN_SRC bash
sudo apt install poppler-utils python3-tk texlive-latex-extra texlive-fonts-extra lmodern python3-pygments
#+END_SRC
Cette sélection couvre les modèles LaTeX de la configuration par
défaut, notamment =standalone=, =lmodern=, =mathabx= et =minted=. Selon
les commandes LaTeX utilisées dans vos propres énoncés, d'autres
paquets TeX peuvent être nécessaires. =python3-tk= fournit Tkinter sur
les installations Python qui ne l'incluent pas d'origine.
**** Windows
1. Télécharger [[https://github.com/oschwartz10612/poppler-windows][Poppler pour Windows]] et ajouter son dossier =bin= à
=PATH=.
2. Installer une distribution LaTeX, par exemple MiKTeX ou TeX Live,
et vérifier que =pdflatex= est accessible depuis =PATH=.
Fermer puis rouvrir le terminal et le GUI après une modification de
=PATH=.
**** macOS
Avec Homebrew, installer Poppler et MacTeX :
#+BEGIN_SRC bash
brew install poppler
brew install --cask mactex
#+END_SRC
MacTeX fournit la distribution TeX Live complète utilisée par les
modèles de Copienator. Après son installation, rouvrir le terminal ou
exécuter :
#+BEGIN_SRC bash
eval "$(/usr/libexec/path_helper)"
#+END_SRC
Copienator recherche aussi les exécutables dans =/opt/homebrew/bin=,
=/usr/local/bin= et =/Library/TeX/texbin=, notamment lorsque le GUI ne
récupère pas le =PATH= du terminal. Ces instructions conviennent aux
Mac Intel et Apple Silicon sous macOS 11 ou plus récent.
*** Programme externe facultatif
PDF Arranger permet d'ouvrir et de réorganiser plus facilement les
PDF. Son absence est signalée comme facultative dans le diagnostic. Il
doit fournir la commande =pdf-arranger= ou =pdfarranger= dans =PATH=.
Sous macOS, Copienator utilise automatiquement Aperçu comme solution de
repli.
*** Accès à Gemini
Il faut créer une clef API pour Gemini (pas facile).
Puis ajouter =GEMINI_API_KEY= à l'environnement avec :
#+BEGIN_SRC bash
export GEMINI_API_KEY=
#+END_SRC
ou éventuellement, la renseigner directement dans le fichier
`config.py`.
** Configuration
Copier `default_config.py` en `config.py`. Éventuellement le modifier.
** Correction d'un paquet de copies
1. Créer un fichier =names= dans le dossier courant, avec les
noms/prénoms des élèves, un par ligne
2. Créer un dossier correspondant à l'évaluation (=Interro= dans la
suite)
3. Suivre les instructions suivantes
** Interface graphique
Lancer l'assistant avec :
#+BEGIN_SRC bash
python -m copienator gui
#+END_SRC
Sous Linux ou macOS, le lanceur exécutable =./start-gui.sh= démarre aussi
linterface, depuis nimporte quel répertoire. Il utilise le Python de
=.venv= sil existe, sinon =python3= du PATH. On peut lui passer le dossier
d’évaluation : =./start-gui.sh Interro=. Sans argument, il ouvre le
sous-dossier immédiat non masqué le plus récemment modifié du répertoire
courant, en excluant =copienator=, =copienator_gui=, =tests=, =OLD=,
=__pycache__=, =build=, =dist=, =*.egg-info=, =venv=, =env= et
=node_modules=. Sil ny a aucun dossier admissible, linterface démarre
sans évaluation. Un chemin explicite reste utilisable même sil est exclu
de la sélection automatique.
=Recharger — vérifier à nouveau= relit les fichiers dentrée du dossier.
Pour reprendre le découpage dune copie, sélectionnez-la dans =Copies
détectées=, cliquez sur =Refaire la copie sélectionnée=, puis sur
=Exécuter=. Le découpage repart de loriginal conservé.
Dans la fenêtre de découpage, =i= inverse lordre de toutes les pages
(dernière vers première) et reprend à la nouvelle première page. Les choix
de découpage déjà saisis sont effacés ; les rotations globales sont conservées.
Ce raccourci est configurable via =PAGE_SPLITTER_KB["reverse_pages"]=.
=Copier la commande= copie les commandes complètes (à lancer depuis la
racine du projet). Dans la console, les boutons de copie et le clic droit
permettent de copier la sélection ou toute la sortie ; =Ctrl+C= et
=Ctrl+A= sont également disponibles (=Cmd= sous macOS).
Pendant =Découper une partie à gauche pour détection des labels=, =n= décale
la zone de 50 px vers la droite, =N= de 100 px, =t= de 50 px vers la
gauche et =l= l’élargit de 50 px. =1= utilise les pages entières. =s=
signale la copie en erreur et passe à la suivante ; =Entrée= valide et
enregistre la découpe affichée.
Une copie ignorée conserve ses anciennes découpes. Les signalements sont
conservés dans =.copienator/copy_errors.json=, même après fermeture.
Dans =Séparer et réordonner les pages=, =Traiter les copies signalées=
reprend ces copies à partir des originaux conservés. Le même bouton dans
=Découper une partie à gauche pour détection des labels= reprend leur
découpage ; chaque signalement
est effacé seulement après validation et enregistrement avec =Entrée=.
Fermer la fenêtre, appuyer à nouveau sur =s= ou rencontrer une erreur
conserve le signalement. Les commandes =page-split= et =crop-labels=
acceptent aussi =--marked= pour traiter les copies signalées de l’évaluation.
Avec =SHOW_PERSONAL_STEPS = True=, =Analyser l’énoncé= propose le choix
entre Gemini et =Énoncés et solutions personnels (SHEETINFO)=. Ce dernier
lance =python -m copienator statement-personal Interro= : il lit
=enonce.tex=, utilise le service dexercices sur =localhost:8080= pour
générer =Text=, =Sol=, =Text2=, =Sol2= et les barèmes personnels =Persp=,
et écrit un groupe par exercice dans =label_groups=.
Deux boutons ouvrent ensuite des actions facultatives avec aperçu de
commande et bouton =Exécuter= : =Regrouper avec Gemini…= remplace seulement
=label_groups= (=statement Interro --groups-only=) ; =Remplacer Persp avec
Gemini…= régénère seulement les barèmes des groupes actuels
(=statement Interro --persp-only=), avec le même prompt que le parcours
Gemini complet. Une réponse incomplète ou un échec laisse les anciens
barèmes en place. On peut ignorer ces étapes et conserver les résultats
personnels.
On peut aussi ouvrir directement une évaluation avec =python -m copienator gui
Interro=. L'interface conserve l'état et l'historique des étapes dans
=Interro/.copienator-gui.json=, et les sorties complètes dans
=Interro/.copienator/logs/=. Une relance d'une étape antérieure ne
supprime aucun résultat ; les étapes suivantes sont seulement marquées
comme étant à revalider.
Après la réussite d'un script, l'interface sélectionne automatiquement
l'étape suivante. =Découper les réponses par question= et =Regrouper
les réponses= démarrent automatiquement lors de leur première visite.
Avec le mode =Correction immédiate=, les trois étapes batch sont alors
marquées =Ignorée= à leur première visite. L'étape de résolution
manuelle est traitée de la même façon si =manual_resolutions.txt= est
absent, vide ou ne contient que des commentaires. Ces automatismes ne
se répètent pas lors d'un retour en arrière.
Le bouton =Diagnostic…= vérifie les modules Python, Poppler, LaTeX,
PDF Arranger (ou Aperçu sous macOS) et la configuration Gemini. Sous
Windows, les exécutables externes doivent être accessibles depuis
=PATH=. Sous macOS, les emplacements standards de Homebrew et MacTeX
sont également inspectés. Quand la création de liens symboliques ou
physiques n'est pas autorisée, l'export et la préparation de =A Rendre=
utilisent automatiquement une copie normale.
Les chemins des étapes personnelles peuvent être adaptés avec
=CURRENT_SCORE_ODS_PATH=, =FINAL_SCORE_ODS_PATH=,
=FINAL_SCORE_OUTPUT_DIR= et =FINAL_SCORE_FONT_PATH= dans =config.py=.
* Documentation complémentaire
- [[file:docs/final_output.md][Fichiers finaux dans A Rendre]] : contenu du JPEG, sélection et
pagination du PDF, JPEG par réponse, =score.json=, =info.json= et diffusion.
- [[file:Script.org][Référence des étapes et des scripts]] : commandes, arguments,
prérequis, fichiers produits et parcours alternatifs.
- [[file:Architecture.org][Architecture et conventions de développement]] : API commune,
état partagé, écritures sûres et règles de maintenance.