Aide : Démarrage · Histoires · Personnages · Livres de lore · Multijoueur · Découvrir · Avancé · Templates · FAQ
Dream Scrolls utilise Mustache comme moteur de templating pour les prompts. Chaque champ texte transmis à l'IA — le prompt système, le prompt de résumé, les descriptions de personnages, le scénario, les entrées de lore — est rendu par ce moteur avant d'être envoyé au modèle. Vous pouvez utiliser des variables et des blocs logiques directement dans ces champs.
| Champ | Contexte disponible |
|---|---|
| Prompt système (histoire / preset) | Contexte complet — toutes les variables listées ci-dessous |
| Prompt de résumé (histoire / preset) | Contexte complet |
| Prompt système d'humeur (histoire / preset) | Contexte complet, le personnage POV est celui en cours d'évaluation |
| Prompt système d'état (histoire / preset) | Contexte complet, le personnage POV est celui en cours d'évaluation |
| Scénario (histoire) | Contexte de l'histoire (char, presentChars, nonPresentChars) |
| Note d'auteur (histoire) | Contexte de l'histoire (char, presentChars, nonPresentChars) |
| Description, personnalité, description courte, note d'auteur du personnage | Contexte du personnage (name uniquement) |
| Entrées de lore | Contexte de l'histoire (char, presentChars, nonPresentChars) |
| Variable | Description |
|---|---|
{{scenario}} | Le texte du scénario de l'histoire, après son propre rendu de template |
{{storyAuthorNote}} | La note d'auteur de l'histoire, après son propre rendu de template |
char)Ces variables ne sont renseignées que lorsque l'IA génère une réponse pour un personnage spécifique (le personnage POV). Elles sont vides lors de la construction du prompt de résumé.
| Variable | Description |
|---|---|
{{char.name}} | Le nom d'affichage du personnage |
{{char.id}} | L'UUID interne du personnage |
{{char.shortDescription}} | La description courte du personnage |
{{char.description}} | La description complète du personnage |
{{char.personality}} | Le champ personnalité du personnage |
{{char.authorNote}} | La note d'auteur spécifique à cette histoire pour ce personnage |
{{char.mood}} | L'humeur actuelle du personnage pour cette histoire, maintenue par l'IA (ou fixée manuellement) |
{{char.state}} | L'état actuel du personnage pour cette histoire, maintenu par l'IA (ou fixé manuellement) |
Dans l'invite système d'humeur/état spécifiquement, {{char.mood}}/{{char.state}} correspondent à la valeur avant cette réévaluation — incluez-la dans votre invite (ex. « Humeur actuelle : {{char.mood}}. Mettez-la à jour selon ce qui vient de se passer. ») pour obtenir une mise à jour incrémentale plutôt qu'une valeur redérivée de zéro à chaque fois.
presentChars contient tous les personnages actuellement présents dans l'histoire. nonPresentChars est la même liste sans le personnage POV — utile pour lister « les autres personnages présents dans la scène ».
Chaque élément de ces deux listes expose les mêmes champs que l'objet char : name, id, shortDescription, description, personality, authorNote, mood, state.
{{#presentChars}}
- {{name}} : {{shortDescription}}
{{/presentChars}}
{{#nonPresentChars}}
- {{name}}
{{/nonPresentChars}}
Le tableau lore contient uniquement les entrées qui ont passé la recherche vectorielle et tiennent dans le budget de contexte de lore. Utilisez {{hasLore}} pour envelopper conditionnellement le bloc afin qu'aucun titre n'apparaisse quand il n'y a rien à afficher.
| Variable | Description |
|---|---|
{{hasLore}} | true si au moins une entrée de lore a été injectée |
{{lore[*].label}} | Le titre de l'entrée de lore |
{{lore[*].content}} | Le texte de l'entrée de lore |
{{#hasLore}}
# Connaissances du monde
{{#lore}}
**{{label}}** : {{content}}
{{/lore}}
{{/hasLore}}
Le tableau summaries contient les résumés d'événements passés qui tiennent dans le budget de contexte. Comme les entrées de lore, seuls les résumés ne chevauchant pas l'historique de messages bruts sont inclus.
| Variable | Description |
|---|---|
{{hasSummaries}} | true si au moins un résumé a été injecté |
{{summaries[*].content}} | Le texte du résumé |
{{#hasSummaries}}
# Résumé des événements passés
{{#summaries}}
{{content}}
{{/summaries}}
{{/hasSummaries}}
Le tableau messages est l'historique de conversation filtré selon le budget de contexte, transmis au modèle.
| Variable | Description |
|---|---|
{{messages[*].role}} | user, assistant ou system |
{{messages[*].authorName}} | Le nom d'affichage de l'auteur |
{{messages[*].content}} | Le corps du message |
Le rendu des messages sous forme de tours avec balises de rôle (voir la section suivante) est le pattern recommandé :
{{#messages}}
<{{role}}{{#authorName}} name="{{authorName}}"{{/authorName}}>{{content}}</{{role}}>
{{/messages}}
Par défaut, l'intégralité du template rendu est envoyée au modèle comme un seul message système. Vous pouvez le découper en plusieurs tours — system, user, et assistant — à l'aide de balises de rôle.
<system>Vos instructions ici.</system>
<user name="Alice">Ce qu'elle a dit.</user>
<assistant name="Bob">Ce qu'il a répondu.</assistant>
name est optionnel sur toutes les balises.Une fois le template Mustache rendu, le moteur parcourt le résultat à la recherche de balises de rôle et produit une liste ordonnée de messages de prompt. Chaque message a un rôle (SYSTEM, USER, ASSISTANT) et, optionnellement, un nom. Cette liste est ensuite transmise au LLM sous forme de conversation multi-tours structurée.
Si le rendu ne contient aucune balise de rôle, l'intégralité du contenu est envoyée comme un seul message système — compatible avec les prompts simples.
<system>
Vous incarnez {{char.name}} dans une histoire collaborative.
{{char.name}} : {{char.description}}
</system>
{{#scenario}}
<system>
{{scenario}}
</system>
{{/scenario}}
{{#hasLore}}
<system>
# Connaissances du monde
{{#lore}}
{{label}} : {{content}}
{{/lore}}
</system>
{{/hasLore}}
{{#hasSummaries}}
<system>
# Résumé des événements passés
{{#summaries}}
{{content}}
{{/summaries}}
</system>
{{/hasSummaries}}
{{#messages}}
<{{role}}{{#authorName}} name="{{authorName}}"{{/authorName}}>{{content}}</{{role}}>
{{/messages}}
<system>
[Continuez l'histoire en tant que {{char.name}}. Deux paragraphes maximum.]
</system>
Les descriptions, personnalités, descriptions courtes et notes d'auteur des personnages sont également passées par Mustache avant d'être injectées dans le prompt. Cependant, seul le nom propre du personnage est disponible dans ces champs :
| Variable | Disponible dans les champs de personnage |
|---|---|
{{name}} | Le nom propre du personnage |
Dans le scénario et la note d'auteur de l'histoire, le contexte de l'histoire est disponible : {{char}}, {{presentChars}}, {{nonPresentChars}}.
Le texte des entrées de lore est rendu de la même façon avec le contexte de l'histoire avant injection.
| Syntaxe | Effet |
|---|---|
{{variable}} | Affiche la valeur d'une variable (sans encodage HTML) |
{{objet.propriété}} | Accède à une propriété imbriquée |
{{#bloc}}...{{/bloc}} | Affiche le bloc si la valeur est vraie ; itère si c'est une liste |
{{^bloc}}...{{/bloc}} | Affiche le bloc si la valeur est fausse (section inverse) |
{{! commentaire }} | Commentaire — non inclus dans la sortie |
Dream Scrolls désactive l'encodage des entités HTML par défaut de Mustache. Toutes les valeurs sont affichées telles quelles.
Erreur « Invalid system prompt template » dans le fil de l'histoire
Le template n'a pas pu être rendu, généralement à cause d'une erreur de syntaxe (balises {{# / {{/ mal fermées, ou {{ non fermé). Vérifiez votre prompt système à la recherche de fautes de frappe. Le message d'erreur contient une brève description du problème.
Une variable s'affiche vide
{{char.*}} sont vides quand aucun personnage POV n'est défini (ex. dans le prompt de résumé sans contexte de personnage). Utilisez {{#char}}...{{/char}} pour protéger le bloc.{{scenario}} et {{storyAuthorNote}} sont des chaînes vides si les champs correspondants de l'histoire sont vides.Le bloc lore / résumés apparaît même quand il est vide
Enveloppez-le dans {{#hasLore}}...{{/hasLore}} ou {{#hasSummaries}}...{{/hasSummaries}} pour le masquer conditionnellement.
Les balises de rôle ne sont pas découpées
Assurez-vous que les noms de balises sont en minuscules (<system>, <user>, <assistant>). Le parseur est insensible à la casse pour les noms de balises, mais la valeur de l'attribut name est utilisée telle quelle.