import sqlite3 from datetime import datetime from rag.config import settings DB_PATH = "chat_history.db" def _get_conn() -> sqlite3.Connection: conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row conn.execute("PRAGMA journal_mode=WAL") conn.execute("""CREATE TABLE IF NOT EXISTS sessions ( id TEXT PRIMARY KEY, title TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL)""") conn.execute("""CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, role TEXT NOT NULL, content TEXT NOT NULL, created_at TEXT NOT NULL, FOREIGN KEY (session_id) REFERENCES sessions(id))""") conn.commit() return conn def create_session(title: str = "New chat") -> str: import uuid sid = str(uuid.uuid4()) now = datetime.now().isoformat() conn = _get_conn() conn.execute( "INSERT INTO sessions (id, title, created_at, updated_at) VALUES (?, ?, ?, ?)", (sid, title, now, now), ) conn.commit() conn.close() return sid def save_message(session_id: str, role: str, content: str) -> None: now = datetime.now().isoformat() conn = _get_conn() conn.execute( "INSERT INTO messages (session_id, role, content, created_at) VALUES (?, ?, ?, ?)", (session_id, role, content, now), ) conn.execute( "UPDATE sessions SET updated_at=? WHERE id=?", (now, session_id), ) conn.commit() conn.close() def get_recent_history(session_id: str, max_turns: int = 4) -> list[dict]: conn = _get_conn() rows = conn.execute( """SELECT role, content FROM messages WHERE session_id=? ORDER BY id DESC LIMIT ?""", (session_id, max_turns * 2), ).fetchall() conn.close() messages = [{"role": r["role"], "content": r["content"]} for r in rows] messages.reverse() return messages def format_history_for_prompt(history: list[dict], max_tokens: int = 1000) -> str: lines = [] token_estimate = 0 for msg in reversed(history): label = "User" if msg["role"] == "user" else "Assistant" line = f"{label}: {msg['content']}" tokens = len(line) // 4 if token_estimate + tokens > max_tokens: break lines.insert(0, line) token_estimate += tokens return "\n".join(lines)