2023-09-11 00:46:56 +08:00
import os
2023-09-13 17:55:27 +08:00
from .object import ObjectStore , ObjectRelationStore
2023-09-11 20:32:52 +08:00
from .data import ChunkStore , ChunkTracker , ChunkListWriter , ChunkReader
2023-09-12 15:28:59 +08:00
from .vector import ChromaVectorStore , VectorBase
2023-09-11 00:46:56 +08:00
import logging
2023-09-21 18:32:17 +08:00
import aios_kernel
2023-09-11 00:46:56 +08:00
2023-09-11 02:05:24 +08:00
# KnowledgeStore class, which aggregates ChunkStore, ChunkTracker, and ObjectStore, and is a global singleton that makes it easy to use these three built-in store examples
2023-09-11 00:46:56 +08:00
class KnowledgeStore :
_instance = None
def __new__ ( cls ):
if cls . _instance is None :
cls . _instance = super () . __new__ ( cls )
2023-09-21 18:32:17 +08:00
knowledge_dir = aios_kernel . storage . AIStorage () . get_myai_dir () / "knowledge"
2023-09-11 00:46:56 +08:00
2023-09-21 18:32:17 +08:00
if not os . path . exists ( knowledge_dir ):
os . makedirs ( knowledge_dir )
2023-09-11 00:46:56 +08:00
2023-09-21 18:32:17 +08:00
cls . _instance . __singleton_init__ ( knowledge_dir )
2023-09-11 00:46:56 +08:00
return cls . _instance
def __singleton_init__ ( self , root_dir : str ):
logging . info ( f "will init knowledge store, root_dir= { root_dir } " )
self . root = root_dir
2023-09-13 17:55:27 +08:00
relation_store_dir = os . path . join ( root_dir , "relation" )
self . relation_store = ObjectRelationStore ( relation_store_dir )
2023-09-11 00:46:56 +08:00
object_store_dir = os . path . join ( root_dir , "object" )
self . object_store = ObjectStore ( object_store_dir )
chunk_store_dir = os . path . join ( root_dir , "chunk" )
self . chunk_store = ChunkStore ( chunk_store_dir )
self . chunk_tracker = ChunkTracker ( chunk_store_dir )
2023-09-11 20:32:52 +08:00
self . chunk_list_writer = ChunkListWriter ( self . chunk_store , self . chunk_tracker )
self . chunk_reader = ChunkReader ( self . chunk_store , self . chunk_tracker )
2023-09-12 15:28:59 +08:00
self . vector_store = {}
2023-09-13 17:55:27 +08:00
def get_relation_store ( self ) -> ObjectRelationStore :
return self . relation_store
2023-09-11 00:46:56 +08:00
def get_object_store ( self ) -> ObjectStore :
return self . object_store
def get_chunk_store ( self ) -> ChunkStore :
return self . chunk_store
def get_chunk_tracker ( self ) -> ChunkTracker :
return self . chunk_tracker
2023-09-11 20:32:52 +08:00
def get_chunk_list_writer ( self ) -> ChunkListWriter :
return self . chunk_list_writer
def get_chunk_reader ( self ) -> ChunkReader :
return self . chunk_reader
2023-09-12 15:28:59 +08:00
def get_vector_store ( self , model_name : str ) -> VectorBase :
if model_name not in self . vector_store :
2023-09-21 18:32:17 +08:00
self . vector_store [ model_name ] = ChromaVectorStore ( self . root , model_name )
2023-09-12 15:28:59 +08:00
return self . vector_store [ model_name ]