1313 MemoryMessagesAndContext ,
1414 MemoryResponse ,
1515)
16- from reducers import handle_compaction
16+ from summarization import handle_compaction
1717from utils import Keys , get_model_client , get_openai_client , get_redis_conn
1818
1919
2424
2525@router .get ("/sessions/" , response_model = list [str ])
2626async def get_sessions (
27- pagination : GetSessionsQuery = Depends (GetSessionsQuery ),
27+ pagination : GetSessionsQuery = Depends (),
2828):
2929 """
3030 Get a list of session IDs, with optional pagination
@@ -55,14 +55,11 @@ async def get_sessions(
5555 session_ids = await redis .zrange (sessions_key , start , end )
5656
5757 # Convert from bytes to strings if needed
58- session_ids = [
59- s .decode ("utf-8" ) if isinstance (s , bytes ) else s for s in session_ids
60- ]
58+ return [s .decode ("utf-8" ) if isinstance (s , bytes ) else s for s in session_ids ]
6159
62- return session_ids
6360 except Exception as e :
6461 logger .error (f"Error getting sessions: { e } " )
65- raise HTTPException (status_code = 500 , detail = "Internal server error" )
62+ raise HTTPException (status_code = 500 , detail = "Internal server error" ) from e
6663
6764
6865@router .get ("/sessions/{session_id}/memory" , response_model = MemoryResponse )
@@ -72,7 +69,6 @@ async def get_memory(session_id: str):
7269
7370 Args:
7471 session_id: The session ID
75- request: FastAPI request
7672
7773 Returns:
7874 Memory response with messages and context
@@ -103,8 +99,19 @@ async def get_memory(session_id: str):
10399 msg_raw = msg_raw .decode ("utf-8" )
104100
105101 # Parse JSON
106- msg = json .loads (msg_raw )
107- memory_messages .append (MemoryMessage (** msg ))
102+ msg_dict = json .loads (msg_raw )
103+
104+ # Convert comma-separated strings back to lists for topics and entities
105+ if "topics" in msg_dict :
106+ msg_dict ["topics" ] = (
107+ msg_dict ["topics" ].split ("," ) if msg_dict ["topics" ] else []
108+ )
109+ if "entities" in msg_dict :
110+ msg_dict ["entities" ] = (
111+ msg_dict ["entities" ].split ("," ) if msg_dict ["entities" ] else []
112+ )
113+
114+ memory_messages .append (MemoryMessage (** msg_dict ))
108115
109116 # Extract context and tokens
110117 context = None
@@ -128,14 +135,15 @@ async def get_memory(session_id: str):
128135 tokens = int (tokens_str )
129136
130137 # Build response
131- response = MemoryResponse (
132- messages = memory_messages , context = context , tokens = tokens
138+ return MemoryResponse (
139+ messages = memory_messages ,
140+ context = context ,
141+ tokens = tokens ,
133142 )
134143
135- return response
136144 except Exception as e :
137145 logger .error (f"Error getting memory for session { session_id } : { e } " )
138- raise HTTPException (status_code = 500 , detail = "Internal server error" )
146+ raise HTTPException (status_code = 500 , detail = "Internal server error" ) from e
139147
140148
141149@router .post ("/sessions/{session_id}/memory" , response_model = AckResponse )
@@ -172,22 +180,22 @@ async def post_memory(
172180 current_time = int (time .time ())
173181 await redis .zadd (sessions_key , {session_id : current_time })
174182
175- # Add messages to session list
176- # TODO: Don't need a pipeline here, lpush takes multiple values.
177- pipe = redis .pipeline ()
183+ # Convert messages to JSON, handling topics and entities
184+ messages_json = []
178185 for msg in memory_messages .messages :
179- # Convert to dict and serialize
180- msg_json = json .dumps (msg .model_dump ())
181- pipe .lpush (messages_key , msg_json )
186+ msg_dict = msg .model_dump ()
187+ # Convert lists to comma-separated strings for TAG fields
188+ msg_dict ["topics" ] = "," .join (msg .topics ) if msg .topics else ""
189+ msg_dict ["entities" ] = "," .join (msg .entities ) if msg .entities else ""
190+ messages_json .append (json .dumps (msg_dict ))
182191
183- # Execute pipeline
184- await pipe . execute ()
192+ # Add messages to list
193+ await redis . lpush ( messages_key , * messages_json ) # type: ignore
185194
186195 # Check if window size is exceeded
187196 current_size = await redis .llen (messages_key )
188197 if current_size > settings .window_size :
189198 # Handle compaction in background
190- # Get the appropriate client for the generation model
191199 model_client = await get_model_client (settings .generation_model )
192200 background_tasks .add_task (
193201 handle_compaction ,
@@ -198,26 +206,21 @@ async def post_memory(
198206 redis ,
199207 )
200208
201- # If long-term memory is enabled, index messages.
202- #
203- # TODO: Add support for custom policies around when to index and/or
204- # avoid re-indexing duplicate content.
209+ # If long-term memory is enabled, index messages
205210 if settings .long_term_memory :
206- # For embeddings, we always use OpenAI models since Anthropic doesn't support embeddings
207211 embedding_client = await get_openai_client ()
208-
209212 background_tasks .add_task (
210213 index_messages ,
211214 memory_messages .messages ,
212215 session_id ,
213- embedding_client , # Explicitly use OpenAI client for embeddings
216+ embedding_client ,
214217 redis ,
215218 )
216219
217220 return AckResponse (status = "ok" )
218221 except Exception as e :
219222 logger .error (f"Error adding messages for session { session_id } : { e } " )
220- raise HTTPException (status_code = 500 , detail = "Internal server error" )
223+ raise HTTPException (status_code = 500 , detail = "Internal server error" ) from e
221224
222225
223226@router .delete ("/sessions/{session_id}/memory" , response_model = AckResponse )
@@ -252,5 +255,4 @@ async def delete_memory(
252255 return AckResponse (status = "ok" )
253256 except Exception as e :
254257 logger .error (f"Error deleting memory for session { session_id } : { e } " )
255- raise
256- raise HTTPException (status_code = 500 , detail = "Internal server error" )
258+ raise HTTPException (status_code = 500 , detail = "Internal server error" ) from e
0 commit comments