File size: 5,871 Bytes
578da72
 
 
1719e8e
 
 
578da72
1719e8e
578da72
 
a85d17b
578da72
a85d17b
578da72
1719e8e
 
 
a85d17b
 
 
 
 
 
1719e8e
 
a85d17b
 
1719e8e
 
 
 
a85d17b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1719e8e
a85d17b
 
 
1719e8e
a85d17b
1719e8e
a85d17b
 
 
 
1719e8e
 
a85d17b
 
1719e8e
a85d17b
 
 
 
838be72
 
 
 
 
 
 
a85d17b
 
838be72
a85d17b
 
 
 
 
 
 
 
 
 
 
 
 
1719e8e
 
 
 
 
 
a85d17b
 
1719e8e
 
 
 
 
 
 
 
 
 
 
 
 
 
838be72
 
 
 
 
 
 
1719e8e
 
578da72
 
 
1719e8e
578da72
 
 
 
1719e8e
 
 
 
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
from typing import Optional
from fastapi import Request
from app.core.session_manager import get_session_manager
from app.core.database import get_database
from bson import ObjectId
import logging

logger = logging.getLogger(__name__)
session_manager = get_session_manager()

async def load_chat_session_into_context(chat_session_id: str, user_id: str) -> str:
    """
    Load a chat session from MongoDB into memory context - ENHANCED DEBUG VERSION
    """
    try:
        db = get_database()
        
        # Add enhanced debugging
        logger.info(f"=== LOADING CHAT SESSION DEBUG ===")
        logger.info(f"Attempting to load chat_session_id: {chat_session_id}")
        logger.info(f"For user_id: {user_id}")
        
        # Try to find the session with enhanced debugging
        chat_session = await db.chat_sessions.find_one({
            "_id": ObjectId(chat_session_id),
            "user_id": ObjectId(user_id),
            "deleted_at": {"$exists": False}
        })
        
        if not chat_session:
            logger.warning(f"Chat session {chat_session_id} not found for user {user_id}")
            
            # Debug: Check if session exists for any user
            try:
                session_exists = await db.chat_sessions.find_one({"_id": ObjectId(chat_session_id)})
                if session_exists:
                    logger.warning(f"Session exists but for different user: {session_exists.get('user_id')}")
                    logger.warning(f"Expected user: {user_id}")
                    logger.warning(f"Session user: {session_exists.get('user_id')}")
                    logger.warning(f"User ID types - Expected: {type(user_id)}, Found: {type(session_exists.get('user_id'))}")
                else:
                    logger.warning(f"Session {chat_session_id} does not exist in database at all")
            except Exception as debug_error:
                logger.error(f"Error during session debug: {debug_error}")
            
            # Debug: List recent sessions for this user
            try:
                recent_sessions = await db.chat_sessions.find(
                    {"user_id": ObjectId(user_id), "deleted_at": {"$exists": False}}
                ).limit(5).to_list(5)
                logger.info(f"Recent sessions for user {user_id}: {[str(s['_id']) for s in recent_sessions]}")
            except Exception as debug_error:
                logger.error(f"Error listing recent sessions: {debug_error}")
            
            return None

        logger.info(f"✅ Found chat session: {chat_session.get('title', 'Untitled')}")
        logger.info(f"✅ Message count: {len(chat_session.get('messages', []))}")
        
        # Create consistent memory session ID  
        memory_session_id = f"chat_{chat_session_id}"
        logger.info(f"✅ Creating memory session: {memory_session_id}")
        
        # Get session manager and create memory session
        session_manager = get_session_manager()
        memory_session = session_manager.get_session(memory_session_id)
        
        # Clear any existing data
        memory_session.clear_all_data()
        
        # Load messages into memory session
        messages = chat_session.get('messages', [])
        for msg_data in messages:
            try:
                msg_type = msg_data.get('type', '')
                if msg_type == 'user':
                    role = 'user'
                elif msg_type == 'advisor':
                    role = msg_data.get('persona_id') or 'assistant'
                else:
                    role = 'assistant'
                message = {
                    'id': msg_data.get('id', 'unknown'),
                    'role': role,
                    'content': msg_data.get('content', ''),
                    'timestamp': msg_data.get('timestamp', '')
                }
                memory_session.append_message(message['role'], message['content'])
                
                # Store original message for export
                if not hasattr(memory_session, 'original_messages'):
                    memory_session.original_messages = []
                
                memory_session.original_messages.append(message)
            except Exception as msg_error:
                logger.error(f"Error loading message: {msg_error}")
                continue
        
        logger.info(f"Loaded {len(messages)} messages into session {memory_session_id}")
        return memory_session_id
        
    except Exception as e:
        logger.error(f"Error loading chat session into context: {e}")
        import traceback
        logger.error(f"Full traceback: {traceback.format_exc()}")
        return None

async def get_or_create_session_for_request_async(
    request: Request, 
    session_id_override: Optional[str] = None,
    chat_session_id: Optional[str] = None,
    user_id: Optional[str] = None
) -> str:
    """
    Async version that properly handles chat session loading
    """
    
    # Case 1: Loading an existing chat session
    if chat_session_id and user_id:
        memory_session_id = f"chat_{chat_session_id}"
        loaded = await load_chat_session_into_context(chat_session_id, user_id)
        if loaded:
            return loaded
        # Keep a stable session id even when MongoDB load fails (e.g. race on first message)
        session_manager.get_session(memory_session_id)
        return memory_session_id
    
    # Case 2: Explicit session ID provided
    if session_id_override:
        return session_id_override

    # Case 3: Check for session header
    session_header = request.headers.get("X-Session-ID")
    if session_header:
        return session_header

    # Case 4: Create a truly new session
    new_session_id = session_manager.create_session()
    logger.info(f"Created new session: {new_session_id}")
    return new_session_id