[docs]classSearchScope(str,Enum):"""Scope for the document search. Messages or Summaries?"""messages="messages""""Search chat history messages."""summary="summary""""Search chat history summaries."""
[docs]classSearchType(str,Enum):"""Enumerator of the types of search to perform."""similarity="similarity""""Similarity search."""mmr="mmr""""Maximal Marginal Relevance reranking of similarity search."""
[docs]classZepChatMessageHistory(BaseChatMessageHistory):"""Chat message history that uses Zep as a backend. Recommended usage:: # Set up Zep Chat History zep_chat_history = ZepChatMessageHistory( session_id=session_id, url=ZEP_API_URL, 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 provides long-term conversation storage for LLM apps. The server stores, summarizes, embeds, indexes, and enriches conversational AI chat histories, and exposes them via simple, low-latency APIs. For server installation instructions and more, see: https://docs.getzep.com/deployment/quickstart/ This class is a thin wrapper around the zep-python package. Additional Zep functionality is exposed via the `zep_summary` and `zep_messages` properties. For more information on the zep-python package, see: https://github.com/getzep/zep-python """
[docs]def__init__(self,session_id:str,url:str="http://localhost:8000",api_key:Optional[str]=None,)->None:try:fromzep_pythonimportZepClientexceptImportError:raiseImportError("Could not import zep-python package. ""Please install it with `pip install zep-python`.")self.zep_client=ZepClient(base_url=url,api_key=api_key)self.session_id=session_id
@propertydefmessages(self)->List[BaseMessage]:# type: ignore"""Retrieve messages from Zep memory"""zep_memory:Optional[Memory]=self._get_memory()ifnotzep_memory:return[]messages:List[BaseMessage]=[]# Extract summary, if present, and messagesifzep_memory.summary:iflen(zep_memory.summary.content)>0:messages.append(SystemMessage(content=zep_memory.summary.content))ifzep_memory.messages:msg:Messageformsginzep_memory.messages:metadata:Dict={"uuid":msg.uuid,"created_at":msg.created_at,"token_count":msg.token_count,"metadata":msg.metadata,}ifmsg.role=="ai":messages.append(AIMessage(content=msg.content,additional_kwargs=metadata))else:messages.append(HumanMessage(content=msg.content,additional_kwargs=metadata))returnmessages@propertydefzep_messages(self)->List[Message]:"""Retrieve summary from Zep memory"""zep_memory:Optional[Memory]=self._get_memory()ifnotzep_memory:return[]returnzep_memory.messages@propertydefzep_summary(self)->Optional[str]:"""Retrieve summary from Zep memory"""zep_memory:Optional[Memory]=self._get_memory()ifnotzep_memoryornotzep_memory.summary:returnNonereturnzep_memory.summary.contentdef_get_memory(self)->Optional[Memory]:"""Retrieve memory from Zep"""fromzep_pythonimportNotFoundErrortry:zep_memory:Memory=self.zep_client.memory.get_memory(self.session_id)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_pythonimportMemory,Messagezep_message=Message(content=message.content,role=message.type,metadata=metadata)zep_memory=Memory(messages=[zep_message])self.zep_client.memory.add_memory(self.session_id,zep_memory)
[docs]defadd_messages(self,messages:Sequence[BaseMessage])->None:"""Append the messages to the Zep memory history"""fromzep_pythonimportMemory,Messagezep_messages=[Message(content=message.content,role=message.type,metadata=message.additional_kwargs.get("metadata",None),)formessageinmessages]zep_memory=Memory(messages=zep_messages)self.zep_client.memory.add_memory(self.session_id,zep_memory)
[docs]asyncdefaadd_messages(self,messages:Sequence[BaseMessage])->None:"""Append the messages to the Zep memory history asynchronously"""fromzep_pythonimportMemory,Messagezep_messages=[Message(content=message.content,role=message.type,metadata=message.additional_kwargs.get("metadata",None),)formessageinmessages]zep_memory=Memory(messages=zep_messages)awaitself.zep_client.memory.aadd_memory(self.session_id,zep_memory)
[docs]defsearch(self,query:str,metadata:Optional[Dict]=None,search_scope:SearchScope=SearchScope.messages,search_type:SearchType=SearchType.similarity,mmr_lambda:Optional[float]=None,limit:Optional[int]=None,)->List[MemorySearchResult]:"""Search Zep memory for messages matching the query"""fromzep_pythonimportMemorySearchPayloadpayload=MemorySearchPayload(text=query,metadata=metadata,search_scope=search_scope,search_type=search_type,mmr_lambda=mmr_lambda,)returnself.zep_client.memory.search_memory(self.session_id,payload,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_memory(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.memory.adelete_memory(self.session_id)exceptNotFoundError:logger.warning(f"Session {self.session_id} not found in Zep. Skipping delete.")