ZCRiGHdZddlZddlmZddlmZmZmZmZGddZy)z: ChatMemory - Gestione memoria conversazionale con SQLite N)datetime)ListDictOptionalAnyc eZdZdZdefdZdZdededefdZdded ed e e eeffd Z defd Z ded efd Z dededededef dZdded ed e e eeffdZded e e eeffdZy) ChatMemoryz:Gestisce la memoria conversazionale persistente con SQLitedb_pathc2||_|jy)N)r _init_db)selfr s R/mnt/ssd/data/python-lab/Jarvis-Cognitive/services/cognitiveservice/chat_memory.py__init__zChatMemory.__init__ s  c*tj|j}|j}|j d|j d|j d|j d|j |j y)zInizializza il database SQLitea1 CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, role TEXT NOT NULL, content TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) zu CREATE INDEX IF NOT EXISTS idx_session_timestamp ON messages(session_id, timestamp) a CREATE TABLE IF NOT EXISTS conversation_summaries ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, summary_text TEXT NOT NULL, message_range_start INTEGER NOT NULL, message_range_end INTEGER NOT NULL, token_count INTEGER, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) z CREATE INDEX IF NOT EXISTS idx_summary_session ON conversation_summaries(session_id, created_at) Nsqlite3connectr cursorexecutecommitclose)r connrs rr zChatMemory._init_dbs}t||,           r session_idrolecontentctj|j}|j}|j d|||f|j |j y)z%Aggiunge un messaggio alla cronologiazAINSERT INTO messages (session_id, role, content) VALUES (?, ?, ?)Nr)r rrrrrs r add_messagezChatMemory.add_message8sLt||, O w '  rlimitreturnc tj|j}|j}|j d||f|j }|j t|Dcgc]}|d|d|dd}}|Scc}w)z/Recupera gli ultimi N messaggi per una sessionez SELECT role, content, timestamp FROM messages WHERE session_id = ? ORDER BY timestamp DESC LIMIT ? r)rr timestamprrr rrfetchallrreversed)r rrrrrowsrowmessagess rget_recent_messageszChatMemory.get_recent_messagesEst||, %  "   ~ VASV D    s1B ctj|j}|j}|j d|f|j |j y)z,Cancella tutta la cronologia di una sessionez)DELETE FROM messages WHERE session_id = ?Nr)r rrrs r clear_sessionzChatMemory.clear_session]sBt||,BZMR  rctj|j}|j}|j d|f|j d}|j |S)z Conta i messaggi in una sessionez2SELECT COUNT(*) FROM messages WHERE session_id = ?r)rrr rrfetchoner)r rrrcounts rget_session_countzChatMemory.get_session_countgsTt||, @ M !!$  r summary_text msg_startmsg_end token_countctj|j}|j}|j d|||||f|j |j y)z(Salva un summary di un range di messaggizINSERT INTO conversation_summaries (session_id, summary_text, message_range_start, message_range_end, token_count) VALUES (?, ?, ?, ?, ?)Nr)r rr2r3r4r5rrs r add_summaryzChatMemory.add_summaryxsTt||, )y'; G    rc 0tj|j}|j}|j d||f|j }|j t|Dcgc]}|d|d|d|d|dd}}|Scc}w)zRecupera gli ultimi N summariesz SELECT summary_text, message_range_start, message_range_end, token_count, created_at FROM conversation_summaries WHERE session_id = ? ORDER BY created_at DESC LIMIT ? rr"r#)r2r3r4r5 created_atr%)r rrrrr(r) summariess r get_summarieszChatMemory.get_summariesst||, %  "   ~   !$A Vq6"1v!!f       s1Bcntj|j}|j}|j d|f|j }|r|dnd}|j d||f|j }|j|Dcgc]}|d|d|d|dd}}|Scc}w)z)Recupera messaggi non ancora sintetizzatiz SELECT message_range_end FROM conversation_summaries WHERE session_id = ? ORDER BY created_at DESC LIMIT 1 rz SELECT id, role, content, timestamp FROM messages WHERE session_id = ? AND id > ? ORDER BY timestamp ASC r"r#r9)idrrr$)rrr rrr/r&r) r rrrresultlast_summarized_idr(r)r*s rget_messages_since_last_summaryz*ChatMemory.get_messages_since_last_summaryst||,  ]  "*0VAYa  , -  /   q63q6c!f3q6 R    sB2N) ))__name__ __module__ __qualname____doc__strrr rintrrr+r-r1r7rr=rBrrr r sD'R c  s c#tDQTVYQYNG[0 C C " c   WZ il CT#s(^@T:!#!$tCQTH~BV!rr ) rHrrtypingrrrrr rKrrrMs$,,}}r