Inkfate : quand l'IA devient maître de jeu

Inkfate est un jeu de rôle solo où une IA tient le rôle du maître de jeu. Les règles du Year Zero Engine, et le pipeline LangGraph et Mistral derrière le MJ.

Publié le Mis à jour le , mis à jour le 7 min de lecture

Réunir un groupe pour jouer à D&D, c'est un sport en soi. Et quand le groupe existe, le MJ annule la session. J'ai créé Inkfate un peu par frustration, pour pouvoir jouer sans dépendre de l'agenda de cinq personnes.

Cet article présente le jeu, puis ouvre le capot : comment on fait tenir un rôle de maître de jeu à un LLM sans qu'il triche aux dés ni qu'il oublie l'histoire. La seconde partie t'intéressera si tu construis toi-même une application autour d'un LLM.

Un jeu de rôle solo, en français

Inkfate est une plateforme de jeu de rôle en ligne où l'IA joue le maître de jeu (MJ). Tu choisis un scénario, tu crées ton personnage, et le MJ ouvre la première scène. Tu lances une partie quand tu veux, sans préparation.

Un tour se déroule toujours de la même façon :

  1. Le MJ décrit la situation.
  2. Tu écris ce que tente ton personnage, ou tu prends l'une des trois actions proposées.
  3. Si l'issue est incertaine, le MJ demande un jet de dés. Les dés s'affichent face par face.
  4. Le MJ raconte la suite, et la scène se termine sur une accroche.

Le jeu se joue seul face au MJ. Il n'y a pas de mode à plusieurs pour le moment.

Des règles de vrai jeu de rôle

Inkfate applique le Year Zero Engine, un système de règles utilisé par plusieurs jeux de rôle sur table. Il se joue avec de simples dés à six faces.

Ton personnage a quatre attributs (Force, Agilité, Esprit, Empathie) et quatorze compétences. Pour un jet, tu additionnes l'attribut et la compétence concernés : le total donne le nombre de dés à lancer. Chaque 6 est un succès, et un seul suffit pour réussir.

Si tu rates, tu peux pousser le jet une fois. Tu gardes les 6 et tu relances le reste, mais chaque 1 obtenu à la relance te coûte une condition physique.

Il n'y a pas de points de vie. Les coups et les chocs se traduisent par des conditions, comme Épuisé, Meurtri ou Effrayé. Chacune retire un dé à tous tes jets, et trois conditions du même type mettent ton personnage hors d'état d'agir. Une scène de repos en efface une.

Il n'y a pas de points d'expérience non plus. Une compétence utilisée est marquée, et elle peut progresser à la prochaine scène de repos.

Tu n'as rien à calculer : le MJ décide quand un jet s'impose et applique les règles. Si tu veux comprendre ce qui s'affiche, la page Règles du jeu détaille le système.

Deux scénarios officiels et ton propre univers

Le catalogue propose deux scénarios officiels au moment où j'écris :

  • Les Brumes de Vaelhorn (fantasy) : d'anciennes puissances sommeillent sous les brumes.
  • L'Archipel des Souffles (steampunk) : le gaz s'épuise, la Guilde creuse plus profond, et personne ne pose de questions.

Chaque scénario fournit au MJ son univers, ses personnages non-joueurs (PNJ) de départ et ses quêtes. Tu peux aussi décrire ton propre monde en quelques lignes, avec son ambiance et ses règles particulières. Le MJ s'en sert comme référence pour mener la partie.

Un tour de jeu passe par quatorze étapes

On pourrait écrire un long prompt « tu es un maître de jeu » et laisser un seul modèle tout faire. Le risque est connu : sur une longue partie, il oublie un PNJ, invente un objet dans ton sac, ou décide que ton jet réussit parce que ça arrange l'histoire.

Dans Inkfate, un tour de jeu passe par un pipeline de quatorze étapes, orchestré avec LangGraph, une bibliothèque qui décrit un traitement comme un graphe de nœuds. Chaque nœud a un rôle étroit. Les étapes sont définies dans le code, ce qui distingue ce pipeline d'un agent autonomeIA pour les développeurs · partie 224 minAgents IA : boucle agentique et pattern ReActConstruis un agent IA autonome en TypeScript avec Mistral : boucle agentique, pattern ReAct, planification, mémoire et garde-fous. Code complet inclus.Lire l'articleNouvel ongletUn bandeau t'y proposera de reprendre ici, section 4., qui choisit lui-même ses outils en boucle.

flowchart TD
    A["Action du joueur"] --> B["Planificateur<br/>prépare la scène, décide s'il faut un jet"]
    B --> C["Serveur<br/>tire les dés"]
    C --> D["Narrateur<br/>écrit la scène avec le résultat imposé"]
    D --> E["Mémoire"]
    D --> F["PNJ"]
    D --> G["Inventaire"]
    E --> H[("État de la partie<br/>PostgreSQL")]
    F --> H
    G --> H
    H -. "relu au tour suivant" .-> B

Le schéma regroupe les étapes par grande fonction.

Le planificateur décide, le narrateur écrit

Un premier modèle lit l'action du joueur et l'état de la partie. Il prépare la scène et décide si un jet est nécessaire, et sur quelle compétence. Un second modèle écrit le texte que tu lis.

Séparer les deux évite de demander à un même appel d'être à la fois arbitre et conteur. Ça permet aussi de choisir le modèle selon la tâche. Tous viennent de Mistral AI, et ce ne sont pas les mêmes pour planifier la scène, pour l'écrire et pour les mises à jour techniques.

Les dés ne passent jamais par le LLM

C'est le serveur qui tire les dés, avec un générateur aléatoire, avant que le narrateur n'écrive la scène. Le modèle reçoit le résultat et doit le raconter tel quel. Un jet de Discrétion raté fait grincer une planche au mauvais moment, et l'histoire continue.

Note

Un LLM à qui on demande de lancer un dé ne tire rien au hasard : il produit le résultat le plus plausible dans le contexte. Dès qu'une règle doit être appliquée exactement, il vaut mieux l'écrire en code et ne laisser au modèle que le récit.

L'état du monde est enregistré en base

Les PNJ rencontrés, les lieux découverts et les chemins qui les relient, l'inventaire, l'heure du jour et la météo sont enregistrés dans une base PostgreSQL. Le MJ relit cet état à chaque tour.

Chaque PNJ a une personnalité, une humeur et une relation avec ton personnage, qui évolue d'une scène à l'autre. Le contrebandier à qui tu dois trois pièces d'argent s'en souviendra la prochaine fois.

Quand l'historique s'allonge, il est résumé plutôt que coupé. Tu peux revenir après une semaine et reprendre la partie où tu l'avais laissée.

Les mises à jour suivent la narration

Une fois la scène écrite, d'autres passes mettent à jour la mémoire, les PNJ et l'inventaire à partir de ce qui vient de se passer. Les quatre dernières étapes du graphe s'exécutent en parallèle. Le pipeline note aussi les conséquences de tes actes, un garde humilié ou une promesse non tenue, pour les faire resurgir quelques scènes plus tard.

Le reste de la stack est classique : une API Express en TypeScript, un front Next.js, Prisma pour la base. Chaque appel à un modèle est tracé avec Langfuse, ce qui permet de voir, étape par étape, ce que chaque modèle a reçu et produit.

Pourquoi j'ai créé ça

J'aime le JDR, mais un groupe régulier, c'est galère à tenir. Les emplois du temps, les déménagements, la vie qui passe. Les sessions s'espacent, puis s'arrêtent.

Inkfate me permet de jouer quand j'ai 30 minutes devant moi. Seul et sans pression, avec une IA qui ne lève pas les yeux au ciel quand je fais un choix stupide. Et j'en fais.

Une alpha ouverte

La plateforme est en ligne sur inkfate.app, en alpha. Quand les inscriptions sont ouvertes, tu crées un compte et tu joues dans la minute. Quand elles sont fermées, tu laisses ton adresse et tu es prévenu à l'ouverture.

Le MJ se trompe encore parfois sur un détail. C'est une alpha, et ce sont les retours des joueurs qui servent à corriger ces cas.

Voir en Markdown

À lire ensuite

IA pour les développeurs · 2

Agents IA : boucle agentique et pattern ReAct

Construis un agent IA autonome en TypeScript avec Mistral : boucle agentique, pattern ReAct, planification, mémoire et garde-fous. Code complet inclus.

Cité dans cet article, à propos de un agent autonome

IA pour les développeurs · 1

LLM pour les devs : du token au function calling

Comment fonctionne un LLM : tokens, température, types de messages et function calling. On construit ensuite un jeu de dés en TypeScript avec Mistral Small.

Alexandre Simonet, développeur fullstack.
J'écris ici sur les serveurs MCP, les agents et l'infra pour les faire tourner.