Source code for langchain_community.chat_message_histories.astradb
"""Astra DB - based chat message history, based on astrapy."""from__future__importannotationsimportjsonimporttimefromtypingimportTYPE_CHECKING,List,Optional,Sequencefromlangchain_community.utilities.astradbimport(SetupMode,_AstraDBCollectionEnvironment,)ifTYPE_CHECKING:fromastrapy.dbimportAstraDB,AsyncAstraDBfromlangchain_core._api.deprecationimportdeprecatedfromlangchain_core.chat_historyimportBaseChatMessageHistoryfromlangchain_core.messagesimport(BaseMessage,message_to_dict,messages_from_dict,)DEFAULT_COLLECTION_NAME="langchain_message_store"
[docs]def__init__(self,*,session_id:str,collection_name:str=DEFAULT_COLLECTION_NAME,token:Optional[str]=None,api_endpoint:Optional[str]=None,astra_db_client:Optional[AstraDB]=None,async_astra_db_client:Optional[AsyncAstraDB]=None,namespace:Optional[str]=None,setup_mode:SetupMode=SetupMode.SYNC,pre_delete_collection:bool=False,)->None:"""Chat message history that stores history in Astra DB. Args: session_id: arbitrary key that is used to store the messages of a single chat session. collection_name: name of the Astra DB collection to create/use. token: API token for Astra DB usage. api_endpoint: full URL to the API endpoint, such as "https://<DB-ID>-us-east1.apps.astra.datastax.com". astra_db_client: *alternative to token+api_endpoint*, you can pass an already-created 'astrapy.db.AstraDB' instance. async_astra_db_client: *alternative to token+api_endpoint*, you can pass an already-created 'astrapy.db.AsyncAstraDB' instance. namespace: namespace (aka keyspace) where the collection is created. Defaults to the database's "default namespace". setup_mode: mode used to create the Astra DB collection (SYNC, ASYNC or OFF). pre_delete_collection: whether to delete the collection before creating it. If False and the collection already exists, the collection will be used as is. """self.astra_env=_AstraDBCollectionEnvironment(collection_name=collection_name,token=token,api_endpoint=api_endpoint,astra_db_client=astra_db_client,async_astra_db_client=async_astra_db_client,namespace=namespace,setup_mode=setup_mode,pre_delete_collection=pre_delete_collection,)self.collection=self.astra_env.collectionself.async_collection=self.astra_env.async_collectionself.session_id=session_idself.collection_name=collection_name
@propertydefmessages(self)->List[BaseMessage]:"""Retrieve all session messages from DB"""self.astra_env.ensure_db_setup()message_blobs=[doc["body_blob"]fordocinsorted(self.collection.paginated_find(filter={"session_id":self.session_id,},projection={"timestamp":1,"body_blob":1,},),key=lambda_doc:_doc["timestamp"],)]items=[json.loads(message_blob)formessage_blobinmessage_blobs]messages=messages_from_dict(items)returnmessages@messages.setterdefmessages(self,messages:List[BaseMessage])->None:raiseNotImplementedError("Use add_messages instead")