cinematch-ai / memory /session_store.py
dbadeev's picture
Upload 24 files
da524e0 verified
Raw
History Blame Contribute Delete
3.61 kB
# 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