Le projet consiste à créer une petite application web locale où une intelligence artificielle joue le rôle de Maître du Jeu (MJ) pour des parties de jeu de rôle. L’interface web, construite avec Nuxt 3, permettra aux joueurs d’échanger avec l’IA via un chat en direct et d’afficher des panneaux contenant les personnages, lieux, objets et notes du monde.
Le backend Express gérera :
- les échanges avec le LLM local exécuté par Ollama,
- les jets de dés,
- et la base de données SQLite (gérée via Prisma) pour conserver l’état de la partie.
À la fin du projet, tu disposeras d’un MJ-IA fonctionnel, jouable depuis ton navigateur, capable de générer des scènes cohérentes, de demander des jets de dés, et de maintenir un monde persistant entre les sessions.
| Étape | Temps estimé |
|---|---|
| Installation & configuration de base | 2 – 3 h |
| Backend (API, dés, JSON strict, LLM) | 5 – 7 h |
| Frontend (chat, panneaux, streaming) | 4 – 6 h |
| Tests, ajustements & polissage | 2 – 3 h |
| Total estimé | 12 – 18 heures |
Nuxt 3 : framework Vue pour créer rapidement un front SSR/SPA, parfait pour un chat avec streaming et une UI modulaire.
1.1 Créer le projet (npx nuxi init mj-front) et installer les dépendances.
1.2 Mettre en place une page unique : zone Chat (gauche) + Panneaux (droite).
1.3 Ajouter un composant ChatInput et un store léger (Pinia ou composables).
1.4 Gérer les variables d’environnement (.env) pour l’URL du backend.
Express : micro-framework HTTP Node.js, simple pour exposer des routes REST et SSE.
2.1 Initialiser mj-back (npm init -y) et installer express, cors, dotenv.
2.2 Créer les routes /health, /chat (SSE), /roll, /state/* (CRUD minimal).
2.3 Activer CORS et logs basiques.
2.4 Structurer le projet (src/server.ts|js, src/routes/*).
SQLite : base fichier, zéro config, idéale pour un proto. Prisma : ORM type-safe, migrations et seed rapides.
3.1 Installer prisma et @prisma/client ; npx prisma init (provider = sqlite).
3.2 Définir un schéma minimal :
Campaign, Session, Character{data Json}, Location, Item{data Json}, Note, EventLog, Quest{log Json}, PartyInventory{data Json}.
3.3 npx prisma migrate dev + script de seed (jeu “Valmora”).
3.4 Créer des services de lecture/écriture d’état.
Ollama : exécute des modèles LLM en local et expose une API compatible OpenAI.
4.1 Installer Ollama (Windows OK).
4.2 Télécharger un modèle :
ollama pull qwen2.5:7b-instruct-q4_K_M (ou llama3.1:8b-instruct-q4_K_M).
4.3 Tester en ligne de commande : ollama run qwen2.5:7b-instruct-q4_K_M.
4.4 Configurer un client OpenAI-like dans le backend (http://localhost:11434/v1).
Zod : validation de schémas runtime pour s’assurer que les réponses du LLM respectent le contrat JSON.
5.1 Définir le schéma : { narration, dm_actions[], roll_requests[], choices[], next_state_hint }.
5.2 Valider chaque réponse ; en cas d’échec : reprompt “JSON strict uniquement”.
5.3 Journaliser les erreurs et tronquer les sorties trop longues.
(Pas de nouvel outil.)
6.1 Implémenter le prompt système finalisé (MJ concis, JSON-only, PEGI 12).
6.2 Composer state côté backend (résumé + extraits persos/lieux/notes).
6.3 Appeler le LLM, parser/valider, puis streamer la réponse via SSE au front.
(Pas de nouvel outil.)
7.1 Parser XdY±Z et retourner { result, detail } avec seed/log.
7.2 Exécuter roll_requests renvoyés par le LLM et insérer un EventLog.
7.3 Exposer /roll et raccourcis UI (/roll d20+5).
(Pas de nouvel outil.)
8.1 Appliquer dm_actions validées : add_note, update_character, add_item_to_inventory, add_location, advance_quest.
8.2 Mettre à jour la BDD, puis rafraîchir les panneaux front.
8.3 Garder un EventLog propre (qui, quoi, quand).
SSE (Server-Sent Events) : flux texte unidirectionnel simple pour afficher la narration au fil de l’eau.
9.1 Ouvrir un EventSource sur /chat.
9.2 Construire le texte incrémentalement (buffer + affichage).
9.3 Les boutons choices renvoient des messages structurés au backend.
(Pas de nouvel outil.)
10.1 Importer le JSON “Valmora” (campagne, persos, lieux, notes, quêtes).
10.2 Ajouter une commande npm run seed.
10.3 Vérifier l’affichage initial (panneaux peuplés).
express-rate-limit : limite les requêtes, utile même en local pour éviter les boucles.
11.1 Installer et configurer express-rate-limit basique.
11.2 Définir maxTokens/stop pour couper les réponses trop longues.
11.3 Filtrer le contenu sensible côté serveur (contrôles simples).
Postgres + pgvector : même base pour relationnel + recherche sémantique top-k.
12.1 Migrer vers Postgres ; installer pgvector.
12.2 Créer facts(text, tags, embedding vector).
12.3 Pipeline : embed requête →
SELECT ... ORDER BY embedding <-> $vec LIMIT k → injecter ces faits dans le prompt.
(Pas de nouvel outil.)
13.1 Scripts npm run dev (front/back).
13.2 Fichier .env propre (URL backend, modèle).
13.3 README court avec commandes clés (init, seed, run).
📘 Résultat final attendu : Une application locale complète, composée d’un front Nuxt 3, d’un backend Express, d’une BDD SQLite/Prisma, et d’un LLM local via Ollama, permettant de jouer à un jeu de rôle interactif dirigé par une IA, avec persistance de l’univers et jets de dés automatisés.