classWordliftVectorStore(BasePydanticVectorStore):stores_text:bool=True_account:Optional[AccountInfo]=PrivateAttr(default=None)_configuration:Configuration=PrivateAttr()_fields:Optional[List[str]]=PrivateAttr()def__init__(self,key:Optional[str]=None,configuration:Optional[Configuration]=None,fields:Optional[List[str]]=None,):super().__init__(use_async=True)try:nest_asyncio.apply()exceptValueError:# We may not be in asynciopassifconfigurationisNone:self._configuration=_make_configuration(key=key)else:self._configuration=configurationiffieldsisNone:self._fields=["schema:url","schema:name"]else:self._fields=fields@propertydefaccount(self)->AccountInfo:ifself._accountisNone:self._account=asyncio.get_event_loop().run_until_complete(self._get_account())returnself._accountasyncdef_get_account(self):""" Get the account data for the provided key. :return: """asyncwithwordlift_client.ApiClient(self._configuration)asapi_client:api_instance=wordlift_client.AccountApi(api_client)try:returnawaitapi_instance.get_me()exceptApiExceptionase:raiseRuntimeError("Failed to get account info, check the provided key")frome@propertydefclient(self)->Any:returnself.accountdefadd(self,nodes:List[BaseNode],**add_kwargs:Any)->List[str]:returnasyncio.get_event_loop().run_until_complete(self.async_add(nodes,**add_kwargs))asyncdefasync_add(self,nodes:List[BaseNode],**kwargs:Any,)->List[str]:# Empty nodes, return empty listifnotnodes:return[]log.debug(f"{len(nodes)} node(s) received\n")requests=[]fornodeinnodes:node_dict=node.dict()# metadata: Dict[str, Any] = node_dict.get("metadata", {})metadata=_make_metadata_as_node_request_metadata_value(node_dict.get("metadata",{}))# Get or generate an IDentity_id=metadata.get("entity_id",None)ifentity_idisNone:entity_id=_generate_id(self.account,node.id_)entry=NodeRequest(entity_id=entity_id,node_id=node.node_id,embeddings=node.get_embedding(),text=node.get_content(metadata_mode=MetadataMode.NONE)or"",metadata=metadata,)requests.append(entry)asyncwithwordlift_client.ApiClient(self._configuration)asapi_client:api_instance=wordlift_client.VectorSearchNodesApi(api_client)try:awaitapi_instance.update_nodes_collection(node_request=requests)exceptApiExceptionase:raiseRuntimeError("Error creating entities")fromereturn[node.node_idfornodeinnodes]defdelete(self,ref_doc_id:str,**delete_kwargs:Any)->None:returnasyncio.get_event_loop().run_until_complete(self.adelete(ref_doc_id,**delete_kwargs))asyncdefadelete(self,ref_doc_id:str,**delete_kwargs:Any)->None:awaitself.adelete_nodes([ref_doc_id],**delete_kwargs)defdelete_nodes(self,node_ids:Optional[List[str]]=None,filters:Optional[MetadataFilters]=None,**delete_kwargs:Any,)->None:returnasyncio.get_event_loop().run_until_complete(self.adelete_nodes(node_ids,filters,**delete_kwargs))asyncdefadelete_nodes(self,node_ids:Optional[List[str]]=None,filters:Optional[MetadataFilters]=None,**delete_kwargs:Any,)->None:# Bail out if the list is not provided.ifnode_idsisNone:return# Create the IDs.ids=[]fornode_idinnode_ids:ids.append(_generate_id(self.account,node_id))asyncwithwordlift_client.ApiClient(self._configuration)asapi_client:api_instance=wordlift_client.EntitiesApi(api_client)try:awaitapi_instance.delete_entities(id=ids)exceptApiExceptionase:raiseRuntimeError("Error deleting entities")fromedefquery(self,query:VectorStoreQuery,**kwargs:Any)->VectorStoreQueryResult:returnasyncio.get_event_loop().run_until_complete(self.aquery(query,**kwargs))asyncdefaquery(self,query:VectorStoreQuery,**kwargs:Any)->VectorStoreQueryResult:filters=MetadataFiltersToFilters.metadata_filters_to_filters(query.filtersifquery.filterselse[])ifquery.query_str:request=VectorSearchQueryRequest(query_string=query.query_str,similarity_top_k=query.similarity_top_k,fields=self._fields,filters=filters,)else:request=VectorSearchQueryRequest(query_embedding=query.query_embedding,similarity_top_k=query.similarity_top_k,fields=self._fields,filters=filters,)asyncwithwordlift_client.ApiClient(self._configuration)asapi_client:api_instance=wordlift_client.VectorSearchQueriesApi(api_client)try:page=awaitapi_instance.create_query(vector_search_query_request=request,)exceptApiExceptionase:log.error(f"Error querying for entities with the following request: {json.dumps(api_client.sanitize_for_serialization(request))}",exc_info=True,)nodes:List[TextNode]=[]similarities:List[float]=[]ids:List[str]=[]foriteminpage.items:metadata=item.metadataifitem.metadataelse{}fields=item.fieldsifitem.fieldselse{}metadata={**metadata,**fields}nodes.append(TextNode(text=item.textifitem.textelse"",id_=item.node_idifitem.node_idelse"",embedding=(item.embeddingsif"embeddings"initemelseNone),metadata=metadata,))similarities.append(item.score)ids.append(item.node_id)returnVectorStoreQueryResult(nodes=nodes,similarities=similarities,ids=ids)