[docs]classNeo4jChatMessageHistory(BaseChatMessageHistory):"""Chat message history stored in a Neo4j database."""
[docs]def__init__(self,session_id:Union[str,int],url:Optional[str]=None,username:Optional[str]=None,password:Optional[str]=None,database:str="neo4j",node_label:str="Session",window:int=3,*,graph:Optional[Neo4jGraph]=None,):# Make sure session id is not nullifnotsession_id:raiseValueError("Please ensure that the session_id parameter is provided")# Graph object takes precedent over env or input paramsifgraph:self._driver=graph._driverself._database=graph._databaseelse:# Handle if the credentials are environment variablesurl=get_from_dict_or_env({"url":url},"url","NEO4J_URI")username=get_from_dict_or_env({"username":username},"username","NEO4J_USERNAME")password=get_from_dict_or_env({"password":password},"password","NEO4J_PASSWORD")database=get_from_dict_or_env({"database":database},"database","NEO4J_DATABASE","neo4j")self._driver=neo4j.GraphDatabase.driver(url,auth=(username,password))self._database=database# Verify connectiontry:self._driver.verify_connectivity()exceptneo4j.exceptions.ServiceUnavailable:raiseValueError("Could not connect to Neo4j database. ""Please ensure that the url is correct")exceptneo4j.exceptions.AuthError:raiseValueError("Could not connect to Neo4j database. ""Please ensure that the username and password are correct")self._session_id=session_idself._node_label=node_labelself._window=window# Create session nodeself._driver.execute_query(CREATE_SESSION_NODE_QUERY.format(node_label=self._node_label),{"session_id":self._session_id},)
@propertydefmessages(self)->List[BaseMessage]:"""Retrieve the messages from Neo4j"""records,_,_=self._driver.execute_query(GET_MESSAGES_QUERY.format(node_label=self._node_label,window=self._window*2),{"session_id":self._session_id},)messages=[{"data":el["result"]["data"],"type":el["result"]["role"],}forelinrecords]returnmessages_from_dict(messages)@messages.setterdefmessages(self,messages:List[BaseMessage])->None:raiseNotImplementedError("Direct assignment to 'messages' is not allowed."" Use the 'add_messages' instead.")
[docs]defadd_message(self,message:BaseMessage)->None:"""Append the message to the record in Neo4j"""self._driver.execute_query(ADD_MESSAGE_QUERY.format(node_label=self._node_label),{"role":message.type,"content":message.content,"session_id":self._session_id,},)
[docs]defclear(self,delete_session_node:bool=False)->None:"""Clear session memory from Neo4j Args: delete_session_node (bool): Whether to delete the session node. Defaults to False. """ifdelete_session_node:self._driver.execute_query(query_=DELETE_SESSION_AND_MESSAGES_QUERY.format(node_label=self._node_label),parameters_={"session_id":self._session_id},)else:self._driver.execute_query(query_=DELETE_MESSAGES_QUERY.format(node_label=self._node_label),parameters_={"session_id":self._session_id},)