@@ -78,7 +78,7 @@ def __init__(
7878 if not self .is_remote :
7979 default_memory_config = {
8080 "provider" : "rag" ,
81- "use_embedding" : True ,
81+ "use_embedding" : False , # Disable embeddings to avoid OpenAI API key requirement
8282 "rag_db_path" : f".praison/sessions/{ self .session_id } /chroma_db"
8383 }
8484 if memory_config :
@@ -96,13 +96,15 @@ def __init__(
9696 self ._memory = None
9797 self ._knowledge = None
9898 self ._agents_instance = None
99+ self ._agents = {} # Track agents and their chat histories
99100 else :
100101 # For remote sessions, disable local memory/knowledge
101102 self .memory_config = {}
102103 self .knowledge_config = {}
103104 self ._memory = None
104105 self ._knowledge = None
105106 self ._agents_instance = None
107+ self ._agents = {} # Track agents and their chat histories
106108
107109 @property
108110 def memory (self ) -> Memory :
@@ -170,7 +172,23 @@ def Agent(
170172 agent_kwargs ["knowledge" ] = knowledge
171173 agent_kwargs ["knowledge_config" ] = self .knowledge_config
172174
173- return Agent (** agent_kwargs )
175+ agent = Agent (** agent_kwargs )
176+
177+ # Create a unique key for this agent (using name and role)
178+ agent_key = f"{ name } :{ role } "
179+
180+ # Restore chat history if it exists from previous sessions
181+ if agent_key in self ._agents :
182+ agent .chat_history = self ._agents [agent_key ].get ("chat_history" , [])
183+ else :
184+ # Try to restore from memory for backward compatibility
185+ restored_history = self ._restore_agent_chat_history (agent_key )
186+ agent .chat_history = restored_history
187+
188+ # Track the agent
189+ self ._agents [agent_key ] = {"agent" : agent , "chat_history" : agent .chat_history }
190+
191+ return agent
174192
175193 # Keep create_agent for backward compatibility
176194 def create_agent (self , * args , ** kwargs ) -> Agent :
@@ -189,6 +207,11 @@ def save_state(self, state_data: Dict[str, Any]) -> None:
189207 """
190208 if self .is_remote :
191209 raise ValueError ("State operations are not available for remote agent sessions" )
210+
211+ # Save agent chat histories first
212+ self ._save_agent_chat_histories ()
213+
214+ # Save session state
192215 state_text = f"Session state: { state_data } "
193216 self .memory .store_short_term (
194217 text = state_text ,
@@ -212,12 +235,15 @@ def restore_state(self) -> Dict[str, Any]:
212235 """
213236 if self .is_remote :
214237 raise ValueError ("State operations are not available for remote agent sessions" )
215- # Use metadata -based search for better SQLite compatibility
238+ # Use content -based search for better SQLite compatibility
216239 results = self .memory .search_short_term (
217- query = f"type:session_state " ,
240+ query = "Session state: " ,
218241 limit = 10 # Get more results to filter by session_id
219242 )
220243
244+ # Restore agent chat histories first
245+ self ._restore_agent_chat_histories ()
246+
221247 # Filter results by session_id in metadata
222248 for result in results :
223249 metadata = result .get ("metadata" , {})
@@ -230,6 +256,97 @@ def restore_state(self) -> Dict[str, Any]:
230256
231257 return {}
232258
259+ def _restore_agent_chat_history (self , agent_key : str ) -> List [Dict [str , Any ]]:
260+ """
261+ Restore agent chat history from memory.
262+
263+ Args:
264+ agent_key: Unique identifier for the agent
265+
266+ Returns:
267+ List of chat history messages or empty list if not found
268+ """
269+ if self .is_remote :
270+ return []
271+
272+ # Search for agent chat history in memory
273+ results = self .memory .search_short_term (
274+ query = "Agent chat history for" ,
275+ limit = 10
276+ )
277+
278+ # Filter results by session_id and agent_key
279+ for result in results :
280+ metadata = result .get ("metadata" , {})
281+ if (metadata .get ("type" ) == "agent_chat_history" and
282+ metadata .get ("session_id" ) == self .session_id and
283+ metadata .get ("agent_key" ) == agent_key ):
284+ # Extract chat history from metadata
285+ chat_history = metadata .get ("chat_history" , [])
286+ return chat_history
287+
288+ return []
289+
290+ def _restore_agent_chat_histories (self ) -> None :
291+ """
292+ Restore all agent chat histories from memory.
293+ """
294+ if self .is_remote :
295+ return
296+
297+ # Search for all agent chat histories in memory
298+ results = self .memory .search_short_term (
299+ query = "Agent chat history for" ,
300+ limit = 50 # Get many results to find all agents
301+ )
302+
303+ # Filter and restore chat histories for this session
304+ for result in results :
305+ metadata = result .get ("metadata" , {})
306+ if (metadata .get ("type" ) == "agent_chat_history" and
307+ metadata .get ("session_id" ) == self .session_id ):
308+ agent_key = metadata .get ("agent_key" )
309+ chat_history = metadata .get ("chat_history" , [])
310+
311+ if agent_key and chat_history :
312+ # Store in _agents dict for later retrieval
313+ self ._agents [agent_key ] = {
314+ "agent" : None , # Will be populated when Agent is created
315+ "chat_history" : chat_history
316+ }
317+
318+ def _save_agent_chat_histories (self ) -> None :
319+ """
320+ Save all agent chat histories to memory.
321+ """
322+ if self .is_remote :
323+ return
324+
325+ for agent_key , agent_data in self ._agents .items ():
326+ agent = agent_data .get ("agent" )
327+ chat_history = None
328+
329+ # Prioritize history from the live agent object, but fall back to restored history
330+ if agent and hasattr (agent , 'chat_history' ):
331+ chat_history = agent .chat_history
332+ agent_data ["chat_history" ] = chat_history # Ensure tracked history is up-to-date
333+ else :
334+ chat_history = agent_data .get ("chat_history" )
335+
336+ if chat_history is not None :
337+ # Save to memory
338+ history_text = f"Agent chat history for { agent_key } "
339+ self .memory .store_short_term (
340+ text = history_text ,
341+ metadata = {
342+ "type" : "agent_chat_history" ,
343+ "session_id" : self .session_id ,
344+ "user_id" : self .user_id ,
345+ "agent_key" : agent_key ,
346+ "chat_history" : chat_history
347+ }
348+ )
349+
233350 def get_state (self , key : str , default : Any = None ) -> Any :
234351 """Get a specific state value"""
235352 state = self .restore_state ()
@@ -241,6 +358,11 @@ def set_state(self, key: str, value: Any) -> None:
241358 current_state [key ] = value
242359 self .save_state (current_state )
243360
361+ def increment_state (self , key : str , increment : int = 1 , default : int = 0 ) -> None :
362+ """Increment a numeric state value"""
363+ current_value = self .get_state (key , default )
364+ self .set_state (key , current_value + increment )
365+
244366 def add_memory (self , text : str , memory_type : str = "long" , ** metadata ) -> None :
245367 """
246368 Add information to session memory.
0 commit comments