16 KiB
Référence des étapes et des scripts
Ce document décrit le workflow détaillé, les commandes disponibles et les parcours alternatifs.
Étapes
Utiliser `python -m copienator gui` ou `python -m copienator gui Interro` pour lancer un GUI qui suit automatiquement les étapes décrites ci-dessous.
Prétraitement de l'énoncé
Dans le dossier de l'évaluation, mettre les fichiers suivants de l'évaluation :
`enonce.pdf`, `enonce.tex`, `correction.tex`.
-
`python -m copienator statement Interro` or `python -m copienator statement Interro –restart`
À partir des trois fichiers précédents, se charge de détecter les labels des questions et leur contenu.
Les questions vont également être regroupées. Par la suite, quand des requêtes de corrections seront effectuées sur une question, seulement les énoncés des questions du groupe seront envoyés (et le corrigé de la question). Il faut donc que chaque groupe contienne si possible le contexte nécessaire pour comprendre la question.
Une fenêtre s'ouvre pour permettre d'éditer le résultat. Ne pas hésiter à faire des groupes plus gros que les groupes par défaut.
Après relecture le script génère :
- un fichier `labels` avec les labels des questions
- Un dossier `Text` avec le contenu textuel des questions, regroupées.
- Un dossier `Sol` avec le contenu textuel du corrigé, question par question.
- Un dossier `Text2`, qui compile un fichier `.tex` pour chaque question (utilisé pour compiler un rendu pdf du corrigé pour chaque question)
- Un dossier `Sol2`, qui compile un fichier `.tex` pour chaque correction de chaque question.
- Un dossier `Persp` avec des instruction de barème pour chaque question.
Éventuellement : vérifier et modifier les barèmes dans `Persp`.
- Alternative personnelle : `python -m copienator statement-personal Interro`
Ces deux commandes suivent la convention des scripts standardisés.
Leur import ne lance aucun traitement et les erreurs partielles sont
distinguées des échecs. Les réponses d'extraction mises en cache par
copienator statementet le fichierlabelssont publiés atomiquement.
Prétraitement des copies
Mettre les copies scannées au format pdf dans Interro.
python -m copienator copies rotate Interro(facultatif) Retourne tous les pdf de 180°, si la photocopie a été faite à l'envers.python -m copienator copies rename Interrochange le nom des copies enCopie{id}.pdf-
python -m copienator page-split InterroDécoupe des copies A3 en pages A4, en retirant les pages vides.
Pour chaque page double il est possible
- de garder les deux pages
- de ne garder qu'une des deux pages.
- de jeter les deux pages
- de déplacer la délimitation à droite/gauche
Fix issues with
python -m copienator page-split Interro14/Copies/Copie01.pdfLe PDF transformé est construit dans un dossier temporaire. La copie produite et la sauvegarde dans
Copies Originalessont ensuite installées avec rollback : une erreur conserve les deux versions précédentes. Une relance ciblée lit directement la sauvegarde originale sans la déplacer au préalable. python -m copienator crop-labels InterroDécoupe la partie gauche des copies, là où il devrait y avoir les labels des exercices/questions.python -m copienator crop-labels Interro --fullpageto use the full page always. Rerun on a single file withpython -m copienator crop-labels Interro/Copies/Copie01.pdfLes images et le fichier_schema.jsond'une copie sont remplacés ensemble. Fermer l'outil juste après la dernière validation ne peut donc plus interrompre un thread de sauvegarde en arrière-plan.
Labelisation et regroupement
Optional : Set proxy with export HTTPS_PROXY="http://10.0.0.1:3128"
python -m copienator labels Interro, avec éventuellement--overwriteFait des requêtes à Gemini pour identifier les labels des questions dans images générées à partir des parties gauches des copies. Une copie PDF ou une image précise deCutleftpeut également être ciblée. Plusieurs cibles de la même évaluation sont acceptées. Les parties d'une copie restent traitées séquentiellement afin de conserver les labels précédents comme contexte, tandis que les copies différentes sont traitées en parallèle. Chaque réponse JSON validée est écrite atomiquement. Une cible sans image correspondante produit le code de sortie 4.-
python -m copienator review-labels InterroPermet de vérifier visuellement les labels trouvés.
- Sous linux, on peut faire
epour ouvrir le fichier .json et l'éditer a la main. - Quand un label est manquant, il est possible de cliquer sur l'image, ce qui copie les coordonnées dans le presse papier (sous linux…), puis on peut l'ajouter à la main.
-
Utilisation de `_`, `|…` et `…|` :
- `|…` n'est pas arrêté verticalement par son type opposé.
- `…|` est stoppé horizontalement par le `|…` le plus proche.
Pour modifier une seule copie :
python -m copienator review-labels Interro/Copies/Copie01.pdfLes coordonnées agrégées sont écrites atomiquement dans le JSON de la copie. Fermer la fenêtre avant la fin d'une copie ne remplace pas son JSON par un résultat incomplet.
It also generates les
Copie01.json, à partir desCopie01_01.jsonEn cas de soucis, (par exemple les pages ne sont pas dans le bon ordre)- Réordonner les pages du fichier pdf
- Rerun
python -m copienator crop-labels Interro/Copie{id} - Rerun
python -m copienator labels Interro/Copie{id}
- Sous linux, on peut faire
python -m copienator split-answers InterroDécoupe les copies suivant les exercices Peut-être appelé avec une seule copie. Les réponses d'une copie sont préparées dans un dossier temporaire, puis remplacent ensemble le dossier précédent. En cas d'erreur, l'ancienne version est conservée. Les réponses devenues obsolètes restent archivées dans le sous-dossierMissing.python -m copienator group-answers InterroRegroupe les mêmes questions de différentes copies en groupes de tailles raisonnables.- Facultatif :
python -m copienator verify-groups InterroVérifie que chaque réponse PDF apparaît bien dans les métadonnées des groupes. La commande renvoie un code non nul si une réponse est absente ou si la vérification est incomplète.
Correction et annotation
Optional : Set proxy with export HTTPS_PROXY="http://10.0.0.1:3128"
- Il faut créer des persp, pour indication de comment corriger, et
relancer
copienator statement-personal -
python -m copienator correct Interro --limit 240OUpython -m copienator correct Interro/Par\ label/Ex\ 2/Group_1.jpgOUpython -m copienator correct Interro --overwriteFais les requêtes de correction à Gemini.
copienator correctpeut être relancé sans supprimer son état. Les fichierscorrection.jsonetcorrection_progress.jsonsont mis à jour atomiquement. Avec--overwrite, leur version précédente reste en place jusqu'à la première écriture réussie de la nouvelle exécution.--resetest la seule option qui supprime explicitement cet état et restaure les fichiers*_old.pdf.L'argument
limitlimite le nombre de requêtes à Gemini Pro (chères), pour une version low cost, passer--limit 0, toutes les requêtes seront sur Gemini Flash.Pour diminuer le coût, il est possible de batch les requêtes, qui seront alors traitées sous au plus 24h.
python -m copienator correct Interro --batch- OU
python -m copienator correct Interro --batch-from 'Ex 4' python -m copienator batch-submit Interropython -m copienator batch-statuspython -m copienator batch-fetch Interropython -m copienator correct Interro --deal-with-batched
Les quatre commandes de ce flux suivent la convention des scripts standardisés. Les fichiers de requêtes et le résultat JSONL combiné sont publiés atomiquement : une interruption ne laisse pas de fichier final partiellement écrit.
copienator batch-submitconserve aussi les identifiants distants dansbatch_jobs.json; la récupération les utilise en priorité et garde la recherche par nom pour les anciens batchs.python -m copienator batch-status --download JOB --output resultat.jsonlpermet aussi de télécharger atomiquement le résultat d'un job particulier. -
python -m copienator post-correction Interro- Essaye de corriger des erreurs d'encodage/d'accents dans
correction.json. - aussi échappe les `_` en dehors du mode math, pour LaTeX.
- Essaye de corriger des erreurs d'encodage/d'accents dans
-
Résolution manuel de conflits, s'il y en a.
Edit `manual_resolutions.txt`. Use :
- `->` or `x>` : Here set a pipe `|` before or after the new_label name
- `-x` : replace the goal
- `ss` : do nothing
- `sx` : stay, and remove goal.
- `xx` : move to goal.
- `xs` : remove old, keep goal.
Then call `python -m copienator resolve-manual Interro`
- Call `python -m copienator correct Interro –refaire`.
Génération des copies annotées
python -m copienator annotate-simple Interro(facultatif) Ajoute les annotations Gemini aux copies, enregistrées dans le dossierAnot. On peut passer l'argument--overwrite.
OU
python -m copienator annotate-checks InterroAjoute les annotations Gemini, et des checkboxes à cocher. Enregistrées dans le dossierBnot,--overwriteUne seule copie peut être ciblée avec, par exemple,python -m copienator annotate-checks Interro/Copies/Copie01.pdf. Le mode--refaireexige un fichierrefaire.jsonet écrit dansBRnot.
OU
python -m copienator annotate-grouped InterrodansBGnotAjoute les annotations Gemini, et des checkboxes, et regroupe les réponses par question. Enregistrées dansBGnotNeeds : label_groups file (made automatically by this function), qui dit quelles questions regrouper.python -m copienator export Interro BGnot(gestion perso) Cela déplace les groupes dans le dossier configuré parEXPORT_DIR(par défautExport). Le second argument peut êtreBGnot,BnotouAnotet reste facultatif (BGnotpar défaut).AnotexporteConcat.jpg; les deux autres modes exportentConcat.pdf. Dans le GUI, seuls les dossiers présents sont proposés et le mode de la dernière génération d'annotations est présélectionné.
Il faut ensuite annoter les fichiers dans `EXPORT_DIR` avec une tablette graphique.
Lecture de la correction manuscrite
Before : vider le dossier configuré par IMPORT_DIR (par défaut
Import), puis y copier ou synchroniser les fichiers depuis la tablette.
python -m copienator import Interro BGnotUne fois les corrections manuelles appliquées aux fichiersConcat.pdf, il faut enregistrer le fichier annoté au même endroit, sous le nomConcat_annotated.pdf. Comme pour l'export, le second argument accepteBGnot,BnotouAnot. Le GUI présélectionne le dossier utilisé lors du dernier export. PourAnot, l'image est importée sous le nomConcat_annotated.jpg.python -m copienator read-annotations InterroLit lesConcat_annotateddansBnot, regénère les copies avec les modifications. Les fichiers générés (score.json,Concat.jpg, etc.) sont préparés séparément puis installés ensemble. Les entrées du dossierBnotrestent en place et une erreur de génération conserve les anciennes sorties.
OU
python -m copienator read-grouped InterroIdem, mais pourBGnot. Les tâches parallèles remontent leurs erreurs au processus principal au lieu de les ignorer.-
python -m copienator giving-names Interro BGnotCrée un dossier
A Rendreavec des liens symboliques vers- La copie à rendre
- un fichier
score.jsonqui contient les notes par question
Si un nom est
Unknown: renommer à la main le dossier et le fichier dedans. -
Éventuellement, faire des modifications manuelles aux
score.json.Puis
- `python -m copienator read-annotations –update-score Interro`
- `python -m copienator read-grouped –update-score Interro`
pour mettre à jour les scores dans les images.
-
(gestion perso)
gestion_classe nepour créer l'interro puisgestion_classe we(set barème here)python -m copienator update-ods Interrooupython -m copienator update-ods Interro --sum(en l'absence de barème)gestion_classe regestion_classe wsentpython -m copienator add-final-score Interro21(this makes files inServer/copies)
-
(gestion perso)
- Deploy
miqmacs-copies-assets, and - update the copies from
miqmacs.fr/admin.
- Deploy
- (gestion perso) Impression d'une copie. Via Evince » print to pdf.
Archivage et nettoyage
Une fois l'évaluation terminée, python -m copienator clean Interro
supprime les fichiers intermédiaires et régénérables. La commande ne
conserve que :
- les PDF
Copies/*.pdfproduits après le découpage des pages ; - les sources et sorties textuelles du prétraitement de l'énoncé :
enonce.tex,correction.tex,labels,label_groups,Text,Sol,Persp, les fichiers TeX deText2etSol2,CacheetTmp; - le résultat final
correction.json; - les journaux de
.copienator/logset les journaux placés à la racine, commecorrection_log; - les images et fichiers
score.jsonprésents dansA Rendre.
Les liens symboliques conservés dans A Rendre sont remplacés par de
véritables fichiers avant la suppression de leurs cibles. La commande
refuse de démarrer si les copies traitées, correction.json ou une
image/un score d'élève sont absents. Elle affiche d'abord un résumé et
demande de saisir le nom de l'évaluation pour confirmer.
Dans le GUI, cette commande apparaît comme dernière étape facultative
dans la section Archivage. Un avertissement rappelle que la
progression du GUI et les données binaires permettant de reprendre les
étapes seront définitivement perdues.
Utiliser python -m copienator clean Interro --dry-run pour afficher
le plan sans rien supprimer, et --yes pour omettre la confirmation
interactive.
Autres
Recorrection d'une seule copie (peu testé)
!! Attention, refaire ne marchera pas si tu fais une annotation non groupée into refaire !!
-
Redécoupage
python -m copienator review-labels InterroTest/Copie01.pdfpython -m copienator split-answers InterroTest/Copie20.pdf
-
Créer
refaire.json, avec un contenu comme[["Copie02", []], ["Copie01", ["Ex 1 : 1)"]]]
- Appeler
correctionavec –refaire. Il doit créer des groupes individuels, faire des requêtes, et remplacer les corrections précédentes (à sauver ailleurs). Ou non, si tu veux le faire à la main. - ?? Si je fais refaire, avant d'avoir créer les annotating with checks, que se passe-t-il ???
- Appeler
python -m copienator annotate-checks --refaire --overwrite python -m copienator export --refaire Interro24python -m copienator import --refaire Interro24python -m copienator read-grouped --refaire Interro24Avec--refaire,refaire.jsonet le dossierBRnotsont des prérequis obligatoires ; leur absence produit le code de sortie 3.
Exemple de replotting, refaire d'une copie
- replot it.
- `python -m copienator split-answers DS09VA/Copies/Copie25.pdf` this will get rid of old/new. !! Attention, et si ça dégage un new : bad bad bad.
- Make `refaire.json`, avec la copie, et les labels à refaire.
- `python -m copienator correct DS09VA –refaire`
- `python -m copienator annotate-checks DS09VA –refaire`
- `python -m copienator import Interro24 –refaire`