| """ |
| Memory module for XENO Bot |
| Handles LangGraph memory operations using SQLite |
| """ |
|
|
| import sqlite3 |
| import uuid |
| from datetime import datetime |
| from typing import Any, Dict, List |
|
|
| from langgraph.checkpoint.sqlite import SqliteSaver |
|
|
| from src.config import SQLITE_DB_PATH |
|
|
| |
| conn = sqlite3.connect(SQLITE_DB_PATH, check_same_thread=False) |
| memory = SqliteSaver(conn=conn) |
|
|
|
|
| def update_memory( |
| config: Dict[str, Any], user_message: str, assistant_message: str, timer=None |
| ): |
| """ |
| Update memory with new messages |
| |
| Args: |
| config: Configuration dictionary with thread_id |
| user_message: User's message |
| assistant_message: Assistant's response |
| timer: Optional timer object for tracking |
| """ |
| if timer: |
| with timer.time_step("memory_update"): |
| _update_memory_impl(config, user_message, assistant_message) |
| else: |
| _update_memory_impl(config, user_message, assistant_message) |
|
|
|
|
| def _update_memory_impl(config, user_message: str, assistant_message: str): |
| """Internal implementation of memory update""" |
| full_checkpoint = memory.get(config) or {} |
| messages = full_checkpoint.get("channel_values", {}).get("messages", []) |
|
|
| messages.append({"role": "user", "content": user_message}) |
| messages.append({"role": "assistant", "content": assistant_message}) |
|
|
| checkpoint_to_save = { |
| "v": 1, |
| "id": str(uuid.uuid4()), |
| "ts": datetime.now().isoformat(), |
| "channel_values": {"messages": messages}, |
| "channel_versions": {}, |
| "versions_seen": {}, |
| } |
|
|
| memory.put(config, checkpoint_to_save, {}, {}) |
|
|
|
|
| def retrieve_memory(config: Dict[str, Any], timer=None) -> List[Dict[str, str]]: |
| """ |
| Retrieve memory messages for a session |
| |
| Args: |
| config: Configuration dictionary with thread_id |
| timer: Optional timer object for tracking |
| |
| Returns: |
| List of message dictionaries |
| """ |
| if timer: |
| with timer.time_step("memory_retrieval"): |
| return _retrieve_memory_impl(config) |
| else: |
| return _retrieve_memory_impl(config) |
|
|
|
|
| def _retrieve_memory_impl(config) -> List[Dict[str, str]]: |
| """Internal implementation of memory retrieval""" |
| full_checkpoint = memory.get(config) or {} |
| return full_checkpoint.get("channel_values", {}).get("messages", []) |
|
|
|
|
| def create_session_config(session_id: str = "default") -> Dict[str, Any]: |
| """ |
| Create a configuration dictionary for a session |
| |
| Args: |
| session_id: Unique session identifier |
| |
| Returns: |
| Configuration dictionary |
| """ |
| return {"configurable": {"thread_id": str(session_id), "checkpoint_ns": ""}} |
|
|