"""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` 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]