General textual memory implementation for storing and retrieving memories.
| 37 | |
| 38 | |
| 39 | class TreeTextMemory(BaseTextMemory): |
| 40 | """General textual memory implementation for storing and retrieving memories.""" |
| 41 | |
| 42 | def __init__(self, config: TreeTextMemoryConfig): |
| 43 | """Initialize memory with the given configuration.""" |
| 44 | # Set mode from class default or override if needed |
| 45 | self.mode = config.mode |
| 46 | logger.info(f"Tree mode is {self.mode}") |
| 47 | |
| 48 | self.config: TreeTextMemoryConfig = config |
| 49 | self.extractor_llm: OpenAILLM | OllamaLLM | AzureLLM = LLMFactory.from_config( |
| 50 | config.extractor_llm |
| 51 | ) |
| 52 | self.dispatcher_llm: OpenAILLM | OllamaLLM | AzureLLM = LLMFactory.from_config( |
| 53 | config.dispatcher_llm |
| 54 | ) |
| 55 | self.embedder: OllamaEmbedder = EmbedderFactory.from_config(config.embedder) |
| 56 | self.graph_store: Neo4jGraphDB = GraphStoreFactory.from_config(config.graph_db) |
| 57 | |
| 58 | self.search_strategy = config.search_strategy |
| 59 | self.bm25_retriever = ( |
| 60 | EnhancedBM25() if self.search_strategy and self.search_strategy["bm25"] else None |
| 61 | ) |
| 62 | |
| 63 | if config.reranker is None: |
| 64 | default_cfg = RerankerConfigFactory.model_validate( |
| 65 | { |
| 66 | "backend": "cosine_local", |
| 67 | "config": { |
| 68 | "level_weights": {"topic": 1.0, "concept": 1.0, "fact": 1.0}, |
| 69 | "level_field": "background", |
| 70 | }, |
| 71 | } |
| 72 | ) |
| 73 | self.reranker = RerankerFactory.from_config(default_cfg) |
| 74 | else: |
| 75 | self.reranker = RerankerFactory.from_config(config.reranker) |
| 76 | self.is_reorganize = config.reorganize |
| 77 | self.memory_manager: MemoryManager = MemoryManager( |
| 78 | self.graph_store, |
| 79 | self.embedder, |
| 80 | self.extractor_llm, |
| 81 | memory_size=config.memory_size |
| 82 | or { |
| 83 | "WorkingMemory": 20, |
| 84 | "LongTermMemory": 1500, |
| 85 | "UserMemory": 480, |
| 86 | }, |
| 87 | is_reorganize=self.is_reorganize, |
| 88 | ) |
| 89 | # Create internet retriever if configured |
| 90 | self.internet_retriever = None |
| 91 | if config.internet_retriever is not None: |
| 92 | self.internet_retriever = InternetRetrieverFactory.from_config( |
| 93 | config.internet_retriever, self.embedder |
| 94 | ) |
| 95 | logger.info( |
| 96 | f"Internet retriever initialized with backend: {config.internet_retriever.backend}" |
no outgoing calls