File size: 2,400 Bytes
a97ced3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 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}