Kuldeep-AI / memory /sqlite_memory.py
Kuldeepmishra3's picture
feat: Kuldeep AI v1.0
f2eba97
Raw
History Blame Contribute Delete
3.23 kB
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()