Spaces:
Sleeping
Sleeping
| # memory/session_store.py | |
| import uuid | |
| import datetime | |
| import logging | |
| from typing import Dict, Any, Optional | |
| logger = logging.getLogger(__name__) | |
| class SessionStore: | |
| """ | |
| Хранилище состояния сессии. | |
| Полностью поддерживает логику: 1/0/2 меню, Custom Plot Mode и счетчики попыток. | |
| """ | |
| def __init__(self): | |
| self._sessions: Dict[str, Dict[str, Any]] = {} | |
| def create_session(self) -> str: | |
| """Создает новую сессию с полным набором полей""" | |
| session_id = str(uuid.uuid4()) | |
| self._sessions[session_id] = { | |
| "session_id": session_id, | |
| "created_at": datetime.datetime.utcnow().isoformat(), | |
| # --- Логика машины состояний --- | |
| "step": "initial", | |
| "attempts": 0, | |
| "suggested_plot": None, # Хранит текст предложенной истории | |
| "custom_plot_mode": False, # ✅ Флаг строгого режима (критично для вашей логики) | |
| # --- Данные диалога --- | |
| "history": [], | |
| "user_inputs": [], | |
| # --- Результаты текущего поиска --- | |
| "original_plot": "", | |
| "improved_plot": "", | |
| "movie_overview": "", | |
| "search_results": [], | |
| "final_recommendations": [] | |
| } | |
| return session_id | |
| def get_session(self, session_id: str) -> Optional[Dict[str, Any]]: | |
| """Возвращает копию состояния сессии""" | |
| return self._sessions.get(session_id) | |
| # --- Методы управления состоянием --- | |
| def add_user_input(self, session_id: str, text: str): | |
| if session_id in self._sessions: | |
| self._sessions[session_id]["user_inputs"].append(text) | |
| def add_history(self, session_id: str, user_msg: str, assistant_msg: str): | |
| if session_id in self._sessions: | |
| self._sessions[session_id]["history"].append({"role": "user", "content": user_msg}) | |
| self._sessions[session_id]["history"].append({"role": "assistant", "content": assistant_msg}) | |
| def update_state(self, session_id: str, key: str, value: Any): | |
| """Универсальное обновление поля""" | |
| if session_id in self._sessions: | |
| self._sessions[session_id][key] = value | |
| def increment_attempts(self, session_id: str): | |
| if session_id in self._sessions: | |
| self._sessions[session_id]["attempts"] += 1 | |
| def reset_attempts(self, session_id: str): | |
| if session_id in self._sessions: | |
| self._sessions[session_id]["attempts"] = 0 | |
| def set_custom_mode(self, session_id: str, is_active: bool): | |
| """Управление флагом строгого режима""" | |
| if session_id in self._sessions: | |
| self._sessions[session_id]["custom_plot_mode"] = is_active | |
| def clear_session_data(self, session_id: str): | |
| """Мягкий сброс (для кнопки Reset)""" | |
| if session_id in self._sessions: | |
| base = self._sessions[session_id] | |
| # Сбрасываем динамические данные | |
| base["history"] = [] | |
| base["user_inputs"] = [] | |
| base["original_plot"] = "" | |
| base["final_recommendations"] = [] | |
| base["attempts"] = 0 | |
| base["suggested_plot"] = None | |
| base["custom_plot_mode"] = False |