import sqlite3 from datetime import datetime from pathlib import Path from typing import List, Dict import config from utils.logger import get_logger logger = get_logger(__name__) Path(config.SQLITE_DB_PATH).parent.mkdir(parents=True, exist_ok=True) def _get_connection() -> sqlite3.Connection: conn = sqlite3.connect(config.SQLITE_DB_PATH, check_same_thread=False) conn.row_factory = sqlite3.Row return conn def initialise_db() -> None: conn = _get_connection() try: conn.execute(""" CREATE TABLE IF NOT EXISTS conversation_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, role TEXT NOT NULL CHECK(role IN ('user', 'assistant')), content TEXT NOT NULL, timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) """) conn.execute(""" CREATE INDEX IF NOT EXISTS idx_session_timestamp ON conversation_history (session_id, timestamp) """) conn.commit() logger.info("SQLite DB initialised (conversation_history table ready).") finally: conn.close() def save_turn(session_id: str, role: str, content: str) -> None: conn = _get_connection() try: conn.execute( "INSERT INTO conversation_history (session_id, role, content, timestamp) " "VALUES (?, ?, ?, ?)", (session_id, role, content, datetime.utcnow().isoformat()), ) conn.commit() logger.debug(f"Saved [{role}] turn for session '{session_id}'.") finally: conn.close() def load_history(session_id: str, limit: int = 10) -> List[Dict[str, str]]: conn = _get_connection() try: cursor = conn.execute( """ SELECT role, content FROM conversation_history WHERE session_id = ? ORDER BY timestamp DESC LIMIT ? """, (session_id, limit), ) rows = cursor.fetchall() history = [{"role": row["role"], "content": row["content"]} for row in reversed(rows)] logger.info(f"Loaded {len(history)} turns for session '{session_id}'.") return history finally: conn.close() def get_session_summary(session_id: str) -> str: turns = load_history(session_id, limit=10) if not turns: return "No previous conversation history." lines = [f"{t['role'].capitalize()}: {t['content']}" for t in turns] return "\n".join(lines) def count_turns(session_id: str) -> int: conn = _get_connection() try: cursor = conn.execute( "SELECT COUNT(*) FROM conversation_history WHERE session_id = ?", (session_id,), ) return cursor.fetchone()[0] finally: conn.close() def clear_session(session_id: str) -> None: conn = _get_connection() try: conn.execute( "DELETE FROM conversation_history WHERE session_id = ?", (session_id,), ) conn.commit() logger.info(f"Cleared history for session '{session_id}'.") finally: conn.close() initialise_db()