# core/visualizations.py """ Visualisations pour Lucie – arbre de connaissances (vis.js) et cerveau 3D (Three.js). Utilise les données de ChromaDB (vector_memory). """ import json import logging from typing import Dict, List, Any logger = logging.getLogger("lucie.visualizations") def generate_knowledge_graph(vector_memory, limit: int = 50) -> Dict: """ Génère les données pour vis.js à partir des épisodes de ChromaDB. Retourne un dict avec 'nodes' et 'edges'. """ nodes = [] edges = [] try: # Récupérer les épisodes episodes = vector_memory.search("*", n=limit, min_score=0.0) for idx, ep in enumerate(episodes): node_id = f"node_{idx}" label = ep.get("metadata", {}).get("source", "unknown")[:20] nodes.append({ "id": node_id, "label": label, "title": ep["text"][:100], "score": ep.get("similarity", 0.0), "group": ep.get("metadata", {}).get("method", "other") }) # Lien avec le précédent (simple graphe linéaire pour l'exemple) if idx > 0: edges.append({ "from": f"node_{idx-1}", "to": node_id, "value": ep.get("similarity", 0.5) }) except Exception as e: logger.error(f"Erreur génération graphe: {e}") return {"nodes": nodes, "edges": edges} def generate_brain_state(vector_memory) -> Dict: """ Génère l'état du cerveau 3D (couleur, intensité, particules) basé sur la progression. Retourne un dict avec 'color', 'intensity', 'particles'. """ try: stats = vector_memory.stats() if vector_memory else {} count = stats.get("count", 0) # Progression simple (0-100) progress = min(100, count * 2) # 2% par épisode, max 100 # Couleur de 0 (bleu) à 1 (rouge) selon progression color = (progress / 100.0, 0.3, 1.0 - progress / 100.0) return { "color": color, "intensity": 0.5 + progress / 200.0, "particles": min(500, count * 10), "progress": progress } except Exception as e: logger.error(f"Erreur génération cerveau: {e}") return {"color": (0.2, 0.5, 0.8), "intensity": 0.5, "particles": 100, "progress": 0}