66import uuid
77from datetime import datetime , timedelta
88from threading import Lock
9- from langchain .memory import ConversationBufferMemory
9+ from typing import Optional
10+ from langchain .memory import ConversationBufferWindowMemory
1011from api .config .loader import CONFIG
11- from api .services .sessionmanager import (
12+ from api .services .sessionmanager import (
1213 delete_session_file ,
1314 load_session ,
1415 session_exists_in_json ,
@@ -31,13 +32,13 @@ def init_session() -> str:
3132 session_id = str (uuid .uuid4 ())
3233 with _lock :
3334 _sessions [session_id ] = {
34- "memory" : ConversationBufferMemory ( return_messages = True ),
35+ "memory" : ConversationBufferWindowMemory ( k = 10 , return_messages = True ),
3536 "last_accessed" : datetime .now ()
3637 }
3738 return session_id
3839
3940
40- def get_session (session_id : str ) -> ConversationBufferMemory | None :
41+ def get_session (session_id : str ) -> Optional [ ConversationBufferWindowMemory ] :
4142 """
4243 Retrieve the chat session memory for the given session ID.
4344 Lazily restores from disk if missing in memory.
@@ -46,24 +47,24 @@ def get_session(session_id: str) -> ConversationBufferMemory | None:
4647 session_id (str): The session identifier.
4748
4849 Returns:
49- ConversationBufferMemory | None : The memory object if found, else None.
50+ Optional[ConversationBufferWindowMemory] : The memory object if found, else None.
5051 """
5152
5253 with _lock :
5354
5455 session_data = _sessions .get (session_id )
5556
56- if session_data :
57+ if session_data :
5758 session_data ["last_accessed" ] = datetime .now ()
5859 return session_data ["memory" ]
5960
6061 history = load_session (session_id )
6162 if not history :
6263 return None
6364
64- memory = ConversationBufferMemory ( return_messages = True )
65+ memory = ConversationBufferWindowMemory ( k = 10 , return_messages = True )
6566 for msg in history :
66- memory .chat_memory .add_message (# pylint: disable=no-member
67+ memory .chat_memory .add_message ( # pylint: disable=no-member
6768 {
6869 "role" : msg ["role" ],
6970 "content" : msg ["content" ],
@@ -77,14 +78,15 @@ def get_session(session_id: str) -> ConversationBufferMemory | None:
7778
7879 return memory
7980
80- async def get_session_async (session_id : str ) -> ConversationBufferMemory | None :
81+
82+ async def get_session_async (session_id : str ) -> Optional [ConversationBufferWindowMemory ]:
8183 """
8284 Async wrapper for get_session to prevent event loop blocking.
8385 """
8486 return await asyncio .to_thread (get_session , session_id )
8587
8688
87- def persist_session (session_id : str )-> None :
89+ def persist_session (session_id : str ) -> None :
8890 """
8991 Persist the current session messages to disk.
9092
@@ -97,7 +99,6 @@ def persist_session(session_id: str)-> None:
9799 append_message (session_id , messages )
98100
99101
100-
101102def delete_session (session_id : str ) -> bool :
102103 """
103104 Delete a chat session and its persisted data.
@@ -138,7 +139,8 @@ def reset_sessions():
138139 with _lock :
139140 _sessions .clear ()
140141
141- def get_last_accessed (session_id : str ) -> datetime | None :
142+
143+ def get_last_accessed (session_id : str ) -> Optional [datetime ]:
142144 """
143145 Get the last accessed timestamp for a given session.
144146
@@ -157,9 +159,9 @@ def get_last_accessed(session_id: str) -> datetime | None:
157159 if not history :
158160 return None
159161
160-
161162 return history ["last_accessed" ]
162163
164+
163165def set_last_accessed (session_id : str , timestamp : datetime ) -> bool :
164166 """
165167 Set the last accessed timestamp for a given session (for testing purposes).
@@ -186,6 +188,7 @@ def set_last_accessed(session_id: str, timestamp: datetime) -> bool:
186188
187189 return False
188190
191+
189192def get_session_count () -> int :
190193 """
191194 Get the total number of active sessions (for testing purposes).
@@ -196,6 +199,7 @@ def get_session_count() -> int:
196199 with _lock :
197200 return len (_sessions )
198201
202+
199203def cleanup_expired_sessions () -> int :
200204 """
201205 Remove sessions that have not been accessed within the configured timeout period.
0 commit comments