[docs]defcondense_zep_memory_into_human_message(zep_memory:Memory)->BaseMessage:"""Condense Zep memory into a human message. Args: zep_memory: The Zep memory object. Returns: BaseMessage: The human message. """prompt=""ifzep_memory.facts:prompt="\n".join(zep_memory.facts)ifzep_memory.summaryandzep_memory.summary.content:prompt+="\n"+zep_memory.summary.contentformsginzep_memory.messagesor[]:prompt+=f"\n{msg.roleormsg.role_type}: {msg.content}"returnHumanMessage(content=prompt)
[docs]defget_zep_message_role_type(role:str)->RoleType:"""Get the Zep role type from the role string. Args: role: The role string. One of "human", "ai", "system", "function", "tool". Returns: RoleType: The Zep role type. One of "user", "assistant", "system", "function", "tool". """ifrole=="human":return"user"elifrole=="ai":return"assistant"elifrole=="system":return"system"elifrole=="function":return"function"elifrole=="tool":return"tool"else:return"system"
[docs]classZepCloudChatMessageHistory(BaseChatMessageHistory):"""Chat message history that uses Zep Cloud as a backend. Recommended usage:: # Set up Zep Chat History zep_chat_history = ZepChatMessageHistory( session_id=session_id, api_key=<your_api_key>, ) # Use a standard ConversationBufferMemory to encapsulate the Zep chat history memory = ConversationBufferMemory( memory_key="chat_history", chat_memory=zep_chat_history ) Zep - Recall, understand, and extract data from chat histories. Power personalized AI experiences. Zep is a long-term memory service for AI Assistant apps. With Zep, you can provide AI assistants with the ability to recall past conversations, no matter how distant, while also reducing hallucinations, latency, and cost. see Zep Cloud Docs: https://help.getzep.com This class is a thin wrapper around the zep-python package. Additional Zep functionality is exposed via the `zep_summary`, `zep_messages` and `zep_facts` properties. For more information on the zep-python package, see: https://github.com/getzep/zep-python """
[docs]def__init__(self,session_id:str,api_key:str,*,memory_type:Optional[MemoryGetRequestMemoryType]=None,lastn:Optional[int]=None,ai_prefix:Optional[str]=None,human_prefix:Optional[str]=None,summary_instruction:Optional[str]=None,)->None:try:fromzep_cloud.clientimportAsyncZep,ZepexceptImportError:raiseImportError("Could not import zep-cloud package. ""Please install it with `pip install zep-cloud`.")self.zep_client=Zep(api_key=api_key)self.zep_client_async=AsyncZep(api_key=api_key)self.session_id=session_idself.memory_type=memory_typeor"perpetual"self.lastn=lastnself.ai_prefix=ai_prefixor"ai"self.human_prefix=human_prefixor"human"self.summary_instruction=summary_instruction
@propertydefmessages(self)->List[BaseMessage]:# type: ignore"""Retrieve messages from Zep memory"""zep_memory:Optional[Memory]=self._get_memory()ifnotzep_memory:return[]return[condense_zep_memory_into_human_message(zep_memory)]@propertydefzep_messages(self)->List[Message]:"""Retrieve summary from Zep memory"""zep_memory:Optional[Memory]=self._get_memory()ifnotzep_memory:return[]returnzep_memory.messagesor[]@propertydefzep_summary(self)->Optional[str]:"""Retrieve summary from Zep memory"""zep_memory:Optional[Memory]=self._get_memory()ifnotzep_memoryornotzep_memory.summary:returnNonereturnzep_memory.summary.content@propertydefzep_facts(self)->Optional[List[str]]:"""Retrieve conversation facts from Zep memory"""ifself.memory_type!="perpetual":returnNonezep_memory:Optional[Memory]=self._get_memory()ifnotzep_memoryornotzep_memory.facts:returnNonereturnzep_memory.factsdef_get_memory(self)->Optional[Memory]:"""Retrieve memory from Zep"""fromzep_cloudimportNotFoundErrortry:zep_memory:Memory=self.zep_client.memory.get(self.session_id,memory_type=self.memory_type,lastn=self.lastn)exceptNotFoundError:logger.warning(f"Session {self.session_id} not found in Zep. Returning None")returnNonereturnzep_memory
[docs]defadd_user_message(# type: ignore[override]self,message:str,metadata:Optional[Dict[str,Any]]=None)->None:"""Convenience method for adding a human message string to the store. Args: message: The string contents of a human message. metadata: Optional metadata to attach to the message. """self.add_message(HumanMessage(content=message),metadata=metadata)
[docs]defadd_ai_message(# type: ignore[override]self,message:str,metadata:Optional[Dict[str,Any]]=None)->None:"""Convenience method for adding an AI message string to the store. Args: message: The string contents of an AI message. metadata: Optional metadata to attach to the message. """self.add_message(AIMessage(content=message),metadata=metadata)
[docs]defadd_message(self,message:BaseMessage,metadata:Optional[Dict[str,Any]]=None)->None:"""Append the message to the Zep memory history"""fromzep_cloudimportMessageself.zep_client.memory.add(self.session_id,messages=[Message(content=str(message.content),role=message.type,role_type=get_zep_message_role_type(message.type),metadata=metadata,)],)
[docs]defadd_messages(self,messages:Sequence[BaseMessage])->None:"""Append the messages to the Zep memory history"""fromzep_cloudimportMessagezep_messages=[Message(content=str(message.content),role=message.type,role_type=get_zep_message_role_type(message.type),metadata=message.additional_kwargs.get("metadata",None),)formessageinmessages]self.zep_client.memory.add(self.session_id,messages=zep_messages)
[docs]asyncdefaadd_messages(self,messages:Sequence[BaseMessage])->None:"""Append the messages to the Zep memory history asynchronously"""fromzep_cloudimportMessagezep_messages=[Message(content=str(message.content),role=message.type,role_type=get_zep_message_role_type(message.type),metadata=message.additional_kwargs.get("metadata",None),)formessageinmessages]awaitself.zep_client_async.memory.add(self.session_id,messages=zep_messages)
[docs]defsearch(self,query:str,metadata:Optional[Dict]=None,search_scope:SearchScope="messages",search_type:SearchType="similarity",mmr_lambda:Optional[float]=None,limit:Optional[int]=None,)->List[MemorySearchResult]:"""Search Zep memory for messages matching the query"""returnself.zep_client.memory.search(self.session_id,text=query,metadata=metadata,search_scope=search_scope,search_type=search_type,mmr_lambda=mmr_lambda,limit=limit,)
[docs]defclear(self)->None:"""Clear session memory from Zep. Note that Zep is long-term storage for memory and this is not advised unless you have specific data retention requirements. """try:self.zep_client.memory.delete(self.session_id)exceptNotFoundError:logger.warning(f"Session {self.session_id} not found in Zep. Skipping delete.")
[docs]asyncdefaclear(self)->None:"""Clear session memory from Zep asynchronously. Note that Zep is long-term storage for memory and this is not advised unless you have specific data retention requirements. """try:awaitself.zep_client_async.memory.delete(self.session_id)exceptNotFoundError:logger.warning(f"Session {self.session_id} not found in Zep. Skipping delete.")