TutorLoom
The learning platform for companies, colleges and training institutes. Free and open source, with an Enterprise edition.
翻譯準備中
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Application web pour servir des exercices de mathématiques LaTeX avec recherche avancée.
# Installation des dépendances (Node 22 + pnpm via corepack)
pnpm install
# Générer incrémentalement le cache JSON et la base SQLite (sans TikZ)
pnpm build:content
# Si les sources modifiées contiennent du TikZ, compiler aussi les SVG
pnpm build:content:incremental:with-tikz
# Vérifier que les images des exercices sont bien présentes dans les artefacts servis
pnpm check:artifacts
# Démarrer le serveur Vite (http://localhost:5173)
pnpm dev
# Variante: rebuild du contenu puis démarrer le serveur
pnpm dev:full
# Tests unitaires (scripts de build, parsing LaTeX, export)
pnpm test
# Tests d'interface (Playwright) — nécessite le navigateur, une seule fois :
npx playwright install chromium
pnpm test:integration
# Un seul projet, ou un seul fichier
npx playwright test --project=mobile
npx playwright test tests/e2e/feuille.mobile.spec.js
Les tests d'interface démarrent le serveur de développement au besoin et
réutilisent celui déjà lancé. Ils sont séparés en deux projets, desktop et
mobile, parce que le comportement l'est : la prévisualisation est une colonne
sur ordinateur et une feuille tactile sur téléphone, et la destination
d'ouverture d'un exercice en dépend.
# Build complet (contenu + bundle Node adapter)
pnpm build
# Vérifier le build localement
pnpm preview
# Lancer le serveur Node en production (PORT=3000 par défaut)
NODE_ENV=production node build
# 1) Mettre à jour la version dans package.json (champ "version")
# Exemple: "2.3.2" -> "2.3.3"
# Préparer les artéfacts locaux avant de reconstruire l'image.
# Utiliser build:content:full après un clean ou sur une nouvelle machine.
pnpm build:content:incremental:with-tikz
# 2) Construire + pousser l'image GHCR taggée avec package.json:version
pnpm docker:release
# 3) Démarrer la stack (Caddy + app) en mode interactif
pnpm docker:dev
# 4) Lancer en détaché (prod)
pnpm docker:prod
# Arrêt
docker compose down
Notes:
pnpm docker:build et pnpm docker:push existent aussi si vous voulez séparer les étapes.package.json (version), sans variable VERSION=... à saisir manuellement.Créer un fichier .env à la racine (jamais commité) :
# Ollama — LLM local (prioritaire)
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_CHAT_MODEL=mistral-small3.2:24b
OLLAMA_EMBED_MODEL=bge-m3
# Albert API — fallback si Ollama indisponible
ALBERT_API_KEY=sk-...
ALBERT_BASE_URL=https://albert.api.etalab.gouv.fr/v1
Ollama est utilisé en priorité pour la génération de résumés et les embeddings. Albert prend le relais si Ollama n'est pas disponible ou si le modèle n'est pas installé. Pour l'indexation sémantique, Ollama seul suffit (gratuit, hors-ligne).
L’onglet « PDF LaTeX » de l’éditeur /create utilise le service public
TeXLive.net avec LuaLaTeX. Les sources
sont donc envoyées à ce service tiers ; ne l’utilisez pas pour un contenu
confidentiel. Les éventuelles ressources jointes doivent être textuelles (SVG,
EPS, .tex, .sty, .cls, .bib ou .csv) : les images binaires ne sont
pas supportées par ce protocole.
# Après build:content, générer résumés + embeddings pour les nouveaux exercices
pnpm index:exercises
# Options utiles
pnpm index:exercises:force # réindexe tout
node scripts/index-exercises.js --uuid UUID # un seul exercice
node scripts/index-exercises.js --limit 50 # limiter à 50 exercices
node scripts/index-exercises.js --dry-run # simuler sans écrire
Les résumés générés sont versionnés dans content/metadata/ et commités dans git.
Les embeddings restent en local dans cache/embeddings/ et dans la DB.
Trois artefacts cohabitent :
content/metadata/**/*.json : résumés, concepts, méthodes et objets générés par LLM. Ils sont versionnés dans Git et doivent être commités après pnpm index:exercises.data/exercises.sqlite : base locale non versionnée. Elle contient les exercices, les métadonnées chargées depuis Git et les embeddings.cache/embeddings/*.json : cache local non versionné. Il évite de rappeler Ollama/Albert et peut être reconstruit depuis la DB.Règle pratique : Git transporte les métadonnées textuelles, le snapshot transporte la DB et les embeddings. Le cache local est seulement une copie de travail.
# Machine qui a indexé
source ~/.nvm/nvm.sh
nvm use
pnpm install
pnpm build:content
pnpm index:exercises
git status --short
# commiter les content/metadata/**/*.json modifiés
pnpm db:snapshot:pack
pnpm db:snapshot:publish
# Autre machine
source ~/.nvm/nvm.sh
nvm use
pnpm install
git pull
pnpm db:snapshot:update
pnpm cache:embeddings:stats
pnpm dev
pnpm db:snapshot:update télécharge le snapshot puis le restaure.
pnpm db:snapshot:restore restaure data/exercises.sqlite puis reconstruit
cache/embeddings/ depuis la DB. Si un fichier de cache existait déjà mais avec
un content_hash différent, il est remplacé.
Prérequis : Node 22 (.nvmrc) et gh connecté (gh auth login). Par défaut,
les commandes utilisent le tag db-snapshot-dev et l'archive locale ignorée par
Git data/openyourmath-db-snapshot.tgz.
Voir aussi : docs/embeddings-sync.md.
content/ : Sources LaTeX des exercices + métadonnées LLM versionnées (content/metadata/)cache/ : Cache JSON des exercices parsés + embeddings locaux (cache/embeddings/)scripts/ : Pipeline de build (LaTeX → JSON → SQLite) et indexation IAsrc/ : Application SvelteKitstatic/ : Assets statiques et artifactsÀ commiter avec un nouvel exercice :
content/exercises/**/*.tex : la source de l'exercice ;content/images/** : les images sources éventuellement référencées ;content/metadata/**/*.json : les métadonnées produites par pnpm index:exercises ;content/authors.json uniquement si le référentiel d'auteurs a changé.Ne pas commiter : data/, cache/ et static/artifacts/. Ces répertoires sont
générés localement et embarqués dans l'image Docker au moment de la construction.
Voir /docs pour plus de détails.
content/referentials/cpge/, importés d'exobase).docs/debug-scripts.mdRaccourcis associés :
pnpm exercise:prepare -- X7pQ # valide, construit et indexe un exercice
pnpm exercises:prepare # prépare tous les nouveaux .tex non commités
pnpm release:content # teste, construit et pousse une release GHCR
content/referentials/amscc/referentiel.md, content/referentials/exo7/),
comme l'a été le référentiel CPGE (scripts/build-referentiel-cpge.js), pour
remplacer la taxonomie implicite de la base, aujourd'hui bruitée (doublons
de graphie type « Probabilités et Statistique(s) », chapitres promus
modules…). À brancher ensuite dans :
/create
(metadataTask() dans src/routes/api/create/assist/+server.js, la base
ne servant plus que de complément) ;scripts/quality/).