File size: 3,407 Bytes
5177e12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from datetime import datetime
from pathlib import Path
import json
import uuid

class ChatSession:
    def __init__(self, user_name, session_id=None):
        self.session_id = session_id or str(uuid.uuid4())
        self.user_name = user_name
        self.start_time = datetime.now()
        self.messages = []
        self.session_data = {
            "emotion": None,
            "mental_health_status": None,
            "topics_discussed": set(),
            "agents_used": set(),
            "sentiment_scores": []
        }
    
    def add_message(self, role, content, agent=None, metadata=None):
        message = {
            "timestamp": datetime.now().isoformat(),
            "role": role,
            "content": content,
            "agent": agent,
            "metadata": metadata or {}
        }
        self.messages.append(message)
        
        if agent and hasattr(self.session_data["agents_used"], 'add'):
            self.session_data["agents_used"].add(agent)
    
    def add_topic(self, topic):
        """Safely add a topic"""
        if hasattr(self.session_data["topics_discussed"], 'add'):
            self.session_data["topics_discussed"].add(topic)
        else:
            # If it's a list, convert to set first
            topics = set(self.session_data.get("topics_discussed", []))
            topics.add(topic)
            self.session_data["topics_discussed"] = topics
    
    def to_dict(self):
        return {
            "session_id": self.session_id,
            "user_name": self.user_name,
            "start_time": self.start_time.isoformat(),
            "end_time": datetime.now().isoformat(),
            "duration_minutes": (datetime.now() - self.start_time).seconds // 60,
            "messages": self.messages,
            "total_messages": len(self.messages),
            "session_data": {
                **self.session_data,
                "topics_discussed": list(self.session_data["topics_discussed"]) if isinstance(self.session_data["topics_discussed"], set) else self.session_data["topics_discussed"],
                "agents_used": list(self.session_data["agents_used"]) if isinstance(self.session_data["agents_used"], set) else self.session_data["agents_used"]
            }
        }
    
    @classmethod
    def from_dict(cls, data, user_name=None):
        """Create a ChatSession from dictionary data"""
        session = cls(user_name or data.get('user_name', 'Guest'), data.get('session_id'))
        session.messages = data.get('messages', [])
        
        # Reconstruct session_data with proper types
        stored_data = data.get('session_data', {})
        session.session_data = {
            "emotion": stored_data.get('emotion'),
            "mental_health_status": stored_data.get('mental_health_status'),
            "topics_discussed": set(stored_data.get('topics_discussed', [])),
            "agents_used": set(stored_data.get('agents_used', [])),
            "sentiment_scores": stored_data.get('sentiment_scores', [])
        }
        
        return session
    
    def save(self, directory="chat_sessions"):
        Path(directory).mkdir(exist_ok=True)
        filename = f"{directory}/chat_{self.user_name}_{self.start_time.strftime('%Y%m%d_%H%M%S')}_{self.session_id[:8]}.json"
        
        with open(filename, 'w') as f:
            json.dump(self.to_dict(), f, indent=2)
        
        return filename