Files
LoreMind/brain/app/application/prompts/tables.py
IETM_FIXE\ietm6 1fb4563557 Redécoupage des fichiers et sortie des prompts dans leurs propre fichiers pour ne pas tout mélanger ensemble.
On garde malgrès tout les promps à coté des parseurs car ils évoluent généralement ensemble.
2026-06-15 10:16:01 +02:00

61 lines
3.4 KiB
Python

"""Prompts des outils de table (tables aléatoires, improvisation, catalogues).
Ces prompts étaient auparavant construits en ligne dans le router `tables.py` ;
isolés ici pour garder la frontière HTTP fine. Le router calcule les plages de
dés et passe les champs bruts ; ces fonctions façonnent le texte.
"""
from app.core.language import language_name
def random_table_prompt(description: str, dice_formula: str, lo: int, hi: int,
context: str, language: str) -> str:
"""Prompt de génération d'une table aléatoire couvrant lo..hi."""
context_block = f"\nContexte de la campagne :\n{context.strip()}\n" if context.strip() else ""
return (
"Tu es un assistant de jeu de rôle. Génère une TABLE ALÉATOIRE évocatrice.\n"
f"Dé : {dice_formula} (résultats possibles de {lo} à {hi}).\n"
f"Sujet : {description.strip()}\n"
f"{context_block}\n"
"Règles IMPÉRATIVES :\n"
"- Réponds UNIQUEMENT par un objet JSON valide, sans texte autour.\n"
'- Format : {"name": "...", "description": "...", "entries": '
'[{"min_roll": N, "max_roll": M, "label": "résultat court", "detail": "1-2 phrases"}]}\n'
f"- Les plages (min_roll..max_roll) doivent COUVRIR EXACTEMENT {lo}..{hi}, "
"sans trou ni chevauchement, dans l'ordre croissant.\n"
"- Des résultats variés, cohérents avec le sujet (et le contexte s'il est fourni).\n"
f"- En {language_name(language)}. 'label' = résultat bref ; 'detail' = description/effet concret.\n"
"Renvoie maintenant le JSON."
)
def improvise_roll_prompt(table_name: str, result_label: str, result_detail: str,
context: str, language: str) -> str:
"""Prompt de narration brodée sur un résultat tiré."""
detail = f" ({result_detail.strip()})" if result_detail.strip() else ""
context_block = f"\nContexte : {context.strip()}" if context.strip() else ""
return (
"Tu es le Maître du Jeu. Les joueurs viennent de tirer sur la table "
f"« {table_name.strip()} » et ont obtenu : « {result_label.strip()} »{detail}."
f"{context_block}\n\n"
"Décris en 2-3 phrases vivantes et immédiates ce qui se passe, pour lancer la scène. "
f"Pas de méta, pas d'options : juste la narration, en {language_name(language)}."
)
def item_catalog_prompt(description: str, context: str, language: str) -> str:
"""Prompt de génération d'un catalogue d'objets (boutique, butin…)."""
context_block = f"\nContexte de la campagne :\n{context.strip()}\n" if context.strip() else ""
return (
"Tu es un assistant de jeu de rôle. Génère un CATALOGUE D'OBJETS (boutique, butin, trésor…).\n"
f"Sujet : {description.strip()}\n"
f"{context_block}\n"
"Règles IMPÉRATIVES :\n"
"- Réponds UNIQUEMENT par un objet JSON valide, sans texte autour.\n"
'- Format : {"name": "...", "description": "...", "items": '
'[{"name": "Objet", "price": "ex. 50 po", "category": "ex. Armes", "description": "effet/détails"}]}\n'
"- Des objets variés et cohérents avec le sujet (et le contexte s'il est fourni).\n"
"- 'price' = prix court dans la monnaie du jeu ; 'category' = regroupement (Armes, Potions…) ; "
f"'description' = effet/détails en une phrase. En {language_name(language)}.\n"
"Renvoie maintenant le JSON."
)