Docmind-RAG / rag /memory.py
Harhit07's picture
fix: README YAML, Dockerfile model order, server.py PORT env
cf9ef10
Raw
History Blame Contribute Delete
2.42 kB
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)