LineChatbot / core /session_paths.py
raystermomo's picture
Deploy romance chat to Hugging Face Spaces
6cd1906
Raw
History Blame Contribute Delete
2.35 kB
"""セッションごとのデータ保存先を管理する。
複数のユーザーが同じURLを開いても会話やメモリが混ざらないよう、
各ブラウザセッションに専用の data ディレクトリを割り当てる。
Streamlit は各セッションを別スレッドで実行するため、保存先は
contextvar で持つ。app.py が各実行の冒頭で set_data_dir() を呼ぶ。
学習済みモデル(data/Models 以下)は全セッション共有の読み取り専用なので
ここでは扱わない。
"""
from __future__ import annotations
import contextvars
import shutil
import time
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
DEFAULT_DATA_DIR = ROOT / "data"
SESSIONS_DIR = DEFAULT_DATA_DIR / "sessions"
_data_dir: contextvars.ContextVar[Path] = contextvars.ContextVar(
"rc_data_dir", default=DEFAULT_DATA_DIR
)
def set_data_dir(path: Path | str) -> Path:
"""このセッション(スレッド)のデータ保存先を設定する。"""
p = Path(path)
p.mkdir(parents=True, exist_ok=True)
_data_dir.set(p)
return p
def use_session(session_id: str) -> Path:
"""session_id 専用のデータディレクトリを作成して有効化する。"""
return set_data_dir(SESSIONS_DIR / session_id)
def data_dir() -> Path:
return _data_dir.get()
# --- 個別ファイル/ディレクトリ -------------------------------------------
def conversation_path() -> Path:
return data_dir() / "conversation_history.json"
def summary_path() -> Path:
return data_dir() / "history_summary.json"
def user_memory_path() -> Path:
return data_dir() / "user_memory.json"
def persona_style_path() -> Path:
return data_dir() / "persona_style.json"
def text_save_dir() -> Path:
return data_dir() / "text_save"
def cleanup_old_sessions(max_age_hours: float = 24.0) -> None:
"""古いセッションディレクトリを削除してディスクの肥大化を防ぐ。"""
if not SESSIONS_DIR.exists():
return
cutoff = time.time() - max_age_hours * 3600
for child in SESSIONS_DIR.iterdir():
if not child.is_dir():
continue
try:
if child.stat().st_mtime < cutoff:
shutil.rmtree(child, ignore_errors=True)
except OSError:
continue