[docs]classMongoDBChatMessageHistory(BaseChatMessageHistory):"""Chat message history that stores history in MongoDB. Setup: Install ``langchain-mongodb`` python package. .. code-block:: bash pip install langchain-mongodb Instantiate: .. code-block:: python from langchain_mongodb import MongoDBChatMessageHistory history = MongoDBChatMessageHistory( connection_string="mongodb://your-host:your-port/", # mongodb://localhost:27017/ session_id = "your-session-id", ) Add and retrieve messages: .. code-block:: python # Add single message history.add_message(message) # Add batch messages history.add_messages([message1, message2, message3, ...]) # Add human message history.add_user_message(human_message) # Add ai message history.add_ai_message(ai_message) # Retrieve messages messages = history.messages """# noqa: E501
[docs]def__init__(self,connection_string:Optional[str],session_id:str,database_name:str=DEFAULT_DBNAME,collection_name:str=DEFAULT_COLLECTION_NAME,*,session_id_key:str=DEFAULT_SESSION_ID_KEY,history_key:str=DEFAULT_HISTORY_KEY,create_index:bool=True,history_size:Optional[int]=None,index_kwargs:Optional[Dict]=None,client:Optional[MongoClient]=None,):"""Initialize with a MongoDBChatMessageHistory instance. Args: connection_string: Optional[str] connection string to connect to MongoDB. Can be None if mongo_client is provided. session_id: str arbitrary key that is used to store the messages of a single chat session. database_name: Optional[str] name of the database to use. collection_name: Optional[str] name of the collection to use. session_id_key: Optional[str] name of the field that stores the session id. history_key: Optional[str] name of the field that stores the chat history. create_index: Optional[bool] whether to create an index on the session id field. history_size: Optional[int] count of (most recent) messages to fetch from MongoDB. index_kwargs: Optional[Dict] additional keyword arguments to pass to the index creation. client: Optional[MongoClient] an existing MongoClient instance. If provided, connection_string is ignored. """self.session_id=session_idself.database_name=database_nameself.collection_name=collection_nameself.session_id_key=session_id_keyself.history_key=history_keyself.history_size=history_sizeifclient:ifconnection_string:raiseValueError("Must provide connection_string or client, not both")self.client=clientelifconnection_string:try:self.client=MongoClient(connection_string,driver=DriverInfo(name="Langchain",version=version("langchain-mongodb")),)excepterrors.ConnectionFailureaserror:logger.error(error)else:raiseValueError("Either connection_string or client must be provided")self.db=self.client[database_name]self.collection=self.db[collection_name]ifcreate_index:index_kwargs=index_kwargsor{}self.collection.create_index(self.session_id_key,**index_kwargs)
@propertydefmessages(self)->List[BaseMessage]:# type: ignore"""Retrieve the messages from MongoDB"""try:ifself.history_sizeisNone:cursor=self.collection.find({self.session_id_key:self.session_id})else:skip_count=max(0,self.collection.count_documents({self.session_id_key:self.session_id})-self.history_size,)cursor=self.collection.find({self.session_id_key:self.session_id},skip=skip_count)excepterrors.OperationFailureaserror:logger.error(error)ifcursor:items=[json.loads(document[self.history_key])fordocumentincursor]else:items=[]messages=messages_from_dict(items)returnmessages
[docs]defclose(self)->None:"""Close the resources used by the MongoDBChatMessageHistory."""self.client.close()
[docs]defadd_message(self,message:BaseMessage)->None:"""Append the message to the record in MongoDB"""try:self.collection.insert_one({self.session_id_key:self.session_id,self.history_key:json.dumps(message_to_dict(message)),})excepterrors.WriteErroraserr:logger.error(err)
[docs]defclear(self)->None:"""Clear session memory from MongoDB"""try:self.collection.delete_many({self.session_id_key:self.session_id})excepterrors.WriteErroraserr:logger.error(err)