90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
"""Modèles de domaine pour le cas d'usage de génération de page LoreMind.
|
|
|
|
On utilise @dataclass (pas Pydantic) pour garder le domaine exempt de toute
|
|
dépendance framework. Pydantic apparaît uniquement aux frontières : DTOs HTTP
|
|
dans `main.py`, Settings dans `core/config.py`.
|
|
"""
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class PageGenerationContext:
|
|
"""Contexte métier à fournir au LLM pour générer une page LoreMind.
|
|
|
|
Les champs correspondent aux entités du Lore Context côté Core Java :
|
|
- lore_* : l'univers (Lore)
|
|
- folder_name : le dossier (LoreNode) qui catégorise la page
|
|
- template_* : le gabarit qui liste les champs à remplir
|
|
- page_title : le titre de la page à créer
|
|
"""
|
|
|
|
lore_name: str
|
|
folder_name: str
|
|
template_name: str
|
|
template_fields: list[str]
|
|
page_title: str
|
|
lore_description: str | None = None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class PageGenerationResult:
|
|
"""Résultat métier : une valeur textuelle générée par champ du template.
|
|
|
|
La clé du dict est le nom du champ (ex: "apparence"), la valeur est
|
|
le contenu généré par le LLM. Cohérent avec la structure
|
|
`Page.values: Map<String,String>` côté Core Java.
|
|
"""
|
|
|
|
values: dict[str, str]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ChatMessage:
|
|
"""Message d'une conversation — rôle + contenu textuel.
|
|
|
|
Rôles possibles (OpenAI/Ollama compatibles) :
|
|
- "system" : prompt système (contexte, instructions)
|
|
- "user" : message de l'utilisateur
|
|
- "assistant" : réponse précédente du LLM
|
|
"""
|
|
|
|
role: str
|
|
content: str
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class LoreStructuralContext:
|
|
"""Carte structurelle d'un Lore pour nourrir l'IA sans tout lui envoyer.
|
|
|
|
Pas de contenu des pages — uniquement noms, dossiers, templates, tags.
|
|
Suffit pour que l'IA propose des suggestions cohérentes avec l'existant.
|
|
|
|
Le dict `folders` est indexé par nom de dossier et mappe vers la liste
|
|
des pages qu'il contient, chaque page étant représentée par le tuple
|
|
(page_title, template_name).
|
|
"""
|
|
|
|
lore_name: str
|
|
lore_description: str | None
|
|
folders: dict[str, list[tuple[str, str]]]
|
|
tags: list[str]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class PageContext:
|
|
"""Contexte d'une page spécifique en cours d'édition.
|
|
|
|
Injecté dans le system prompt pour focaliser le chat sur CETTE page
|
|
précise : son template, ses champs, ses valeurs actuelles. Permet à
|
|
l'IA d'éviter de parler d'autres pages du Lore par mégarde.
|
|
|
|
Complémentaire de `LoreStructuralContext` : l'un donne la carte
|
|
générale (toutes les pages existantes), l'autre zoome sur la page
|
|
en cours de discussion.
|
|
"""
|
|
|
|
title: str
|
|
template_name: str
|
|
template_fields: list[str]
|
|
values: dict[str, str]
|