Spaces:
Sleeping
Sleeping
IDAgents Developer
Implement per-user session isolation system - Each authenticated user now has isolated workspace with separate chat histories and agent data
d952de8
| """ | |
| Session Helper Functions for Per-User Isolation | |
| ================================================ | |
| Helper functions that wrap the original app functions to provide | |
| per-user session isolation using the UserSessionManager. | |
| These wrappers intercept gr.Request to identify the user and | |
| manage their isolated session data. | |
| """ | |
| import gradio as gr | |
| from typing import Any, Dict, List, Tuple | |
| from user_session_manager import session_manager, get_username_from_request, SessionKeys | |
| import logging | |
| logger = logging.getLogger(__name__) | |
| def get_user_simple_chat_history(request: gr.Request) -> List: | |
| """Get simple chat history for current user.""" | |
| username = get_username_from_request(request) | |
| return session_manager.get_user_data(username, SessionKeys.SIMPLE_CHAT_HISTORY, default=[]) | |
| def set_user_simple_chat_history(request: gr.Request, history: List) -> None: | |
| """Set simple chat history for current user.""" | |
| username = get_username_from_request(request) | |
| session_manager.set_user_data(username, SessionKeys.SIMPLE_CHAT_HISTORY, history) | |
| def get_user_builder_chat_histories(request: gr.Request) -> Dict: | |
| """Get builder chat histories for current user.""" | |
| username = get_username_from_request(request) | |
| return session_manager.get_user_data(username, SessionKeys.BUILDER_CHAT_HISTORIES, default={}) | |
| def set_user_builder_chat_histories(request: gr.Request, histories: Dict) -> None: | |
| """Set builder chat histories for current user.""" | |
| username = get_username_from_request(request) | |
| session_manager.set_user_data(username, SessionKeys.BUILDER_CHAT_HISTORIES, histories) | |
| def get_user_deployed_chat_histories(request: gr.Request) -> Dict: | |
| """Get deployed chat histories for current user.""" | |
| username = get_username_from_request(request) | |
| return session_manager.get_user_data(username, SessionKeys.DEPLOYED_CHAT_HISTORIES, default={}) | |
| def set_user_deployed_chat_histories(request: gr.Request, histories: Dict) -> None: | |
| """Set deployed chat histories for current user.""" | |
| username = get_username_from_request(request) | |
| session_manager.set_user_data(username, SessionKeys.DEPLOYED_CHAT_HISTORIES, histories) | |
| def get_user_active_children(request: gr.Request) -> List: | |
| """Get active children for current user.""" | |
| username = get_username_from_request(request) | |
| return session_manager.get_user_data(username, SessionKeys.ACTIVE_CHILDREN, default=[]) | |
| def set_user_active_children(request: gr.Request, children: List) -> None: | |
| """Set active children for current user.""" | |
| username = get_username_from_request(request) | |
| session_manager.set_user_data(username, SessionKeys.ACTIVE_CHILDREN, children) | |
| def get_user_patient_data(request: gr.Request) -> Dict: | |
| """Get patient data for current user.""" | |
| username = get_username_from_request(request) | |
| return session_manager.get_user_data(username, SessionKeys.PATIENT_DATA, default={}) | |
| def set_user_patient_data(request: gr.Request, data: Dict) -> None: | |
| """Set patient data for current user.""" | |
| username = get_username_from_request(request) | |
| session_manager.set_user_data(username, SessionKeys.PATIENT_DATA, data) | |
| def get_user_prefill_flag(request: gr.Request) -> bool: | |
| """Get prefill flag for current user.""" | |
| username = get_username_from_request(request) | |
| return session_manager.get_user_data(username, SessionKeys.PREFILL_FLAG, default=False) | |
| def set_user_prefill_flag(request: gr.Request, flag: bool) -> None: | |
| """Set prefill flag for current user.""" | |
| username = get_username_from_request(request) | |
| session_manager.set_user_data(username, SessionKeys.PREFILL_FLAG, flag) | |
| def clear_user_session(request: gr.Request) -> None: | |
| """Clear all session data for current user.""" | |
| username = get_username_from_request(request) | |
| session_manager.clear_user_data(username) | |
| logger.info(f"Cleared session for user: {username}") | |
| def get_current_username(request: gr.Request) -> str: | |
| """Get the current authenticated username.""" | |
| username = get_username_from_request(request) | |
| logger.debug(f"Current user: {username}") | |
| return username | |
| # Wrapper functions that maintain compatibility with existing code | |
| # while adding per-user session management | |
| def wrap_simple_chat_response(original_func): | |
| """Wrap simple_chat_response to use per-user history.""" | |
| def wrapper(user_message: str, request: gr.Request): | |
| # Get user-specific history | |
| history = get_user_simple_chat_history(request) | |
| # Call original function | |
| updated_history, empty_input = original_func(user_message, history) | |
| # Save updated history | |
| set_user_simple_chat_history(request, updated_history) | |
| return updated_history, empty_input | |
| return wrapper | |
| def wrap_clear_simple_chat(original_func): | |
| """Wrap clear_simple_chat to use per-user history.""" | |
| def wrapper(request: gr.Request): | |
| # Call original function with empty history | |
| empty_history, empty_input = original_func() | |
| # Save to user session | |
| set_user_simple_chat_history(request, empty_history) | |
| return empty_history, empty_input | |
| return wrapper | |
| def wrap_chatpanel_handle(original_func): | |
| """Wrap chatpanel_handle to use per-user histories.""" | |
| def wrapper(agent_name: str, user_text: str, request: gr.Request): | |
| # Get user-specific histories | |
| histories = get_user_builder_chat_histories(request) | |
| # Call original function | |
| updated_history, log, empty_input, updated_histories = original_func( | |
| agent_name, user_text, histories | |
| ) | |
| # Save updated histories | |
| set_user_builder_chat_histories(request, updated_histories) | |
| return updated_history, log, empty_input, updated_histories | |
| return wrapper | |
| def wrap_load_history(original_func): | |
| """Wrap load_history to use per-user histories.""" | |
| def wrapper(agent_name: str, request: gr.Request): | |
| # Get user-specific histories | |
| histories = get_user_builder_chat_histories(request) | |
| # Call original function | |
| return original_func(agent_name, histories) | |
| return wrapper | |
| def log_user_access(request: gr.Request, action: str): | |
| """Log user access for debugging/auditing.""" | |
| username = get_username_from_request(request) | |
| logger.info(f"User '{username}' performed action: {action}") | |
| if __name__ == "__main__": | |
| print("Session helpers module loaded successfully") | |
| print(f"Available session keys: {[k for k in dir(SessionKeys) if not k.startswith('_')]}") | |