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 le cache JSON et la base SQLite (à relancer quand le LaTeX change)
pnpm build:content
# Démarrer le serveur Vite (http://localhost:5173)
pnpm dev
# Variante: rebuild du contenu puis démarrer le serveur
pnpm dev:full
# 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 si vous reconstruisez l'image
pnpm build:content:full
# 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).
# 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.
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 artifactsVoir /docs pour plus de détails.
docs/debug-scripts.md