use crate::embeddings::EmbeddingBase;
use crate::engine::config::{EngineConfig, ExtractionConfig, GraphConfig};
use crate::error::NeomemxError;
use crate::error::Result;
use crate::extraction::{FactConsolidator, FactExtractor};
use crate::llm::LlmBase;
use crate::search::ResultReranker;
use crate::storage::{GraphBackend, HistoryStore};
use crate::vector_store::VectorStoreBase;
use std::sync::Arc;
pub struct EngineBuilder {
llm_provider: Option<Arc<dyn LlmBase>>,
embedding_provider: Option<Arc<dyn EmbeddingBase>>,
vector_backend: Option<Arc<dyn VectorStoreBase>>,
graph_backend: Option<Arc<dyn GraphBackend>>,
history_store: Option<Arc<dyn HistoryStore>>,
fact_extractor: Option<Arc<dyn FactExtractor>>,
fact_consolidator: Option<Arc<dyn FactConsolidator>>,
reranker: Option<Arc<dyn ResultReranker>>,
extraction_config: ExtractionConfig,
graph_config: GraphConfig,
}
impl EngineBuilder {
pub fn new() -> Self {
Self {
llm_provider: None,
embedding_provider: None,
vector_backend: None,
graph_backend: None,
history_store: None,
fact_extractor: None,
fact_consolidator: None,
reranker: None,
extraction_config: ExtractionConfig::default(),
graph_config: GraphConfig::default(),
}
}
pub fn with_llm_provider(mut self, provider: Arc<dyn LlmBase>) -> Self {
self.llm_provider = Some(provider);
self
}
pub fn with_embedding_provider(mut self, provider: Arc<dyn EmbeddingBase>) -> Self {
self.embedding_provider = Some(provider);
self
}
pub fn with_vector_backend(mut self, backend: Arc<dyn VectorStoreBase>) -> Self {
self.vector_backend = Some(backend);
self
}
pub fn with_graph_backend(mut self, backend: Arc<dyn GraphBackend>) -> Self {
self.graph_backend = Some(backend);
self
}
pub fn with_history_store(mut self, store: Arc<dyn HistoryStore>) -> Self {
self.history_store = Some(store);
self
}
pub fn with_fact_extractor(mut self, extractor: Arc<dyn FactExtractor>) -> Self {
self.fact_extractor = Some(extractor);
self
}
pub fn with_fact_consolidator(mut self, consolidator: Arc<dyn FactConsolidator>) -> Self {
self.fact_consolidator = Some(consolidator);
self
}
pub fn with_reranker(mut self, reranker: Option<Arc<dyn ResultReranker>>) -> Self {
self.reranker = reranker;
self
}
pub fn enable_extraction(mut self, enabled: bool) -> Self {
self.extraction_config.enabled = enabled;
self
}
pub fn with_extraction_config(mut self, config: ExtractionConfig) -> Self {
self.extraction_config = config;
self
}
pub fn enable_graph(mut self, enabled: bool) -> Self {
self.graph_config.enabled = enabled;
self
}
pub fn with_graph_config(mut self, config: GraphConfig) -> Self {
self.graph_config = config;
self
}
pub fn build(self) -> Result<EngineConfig> {
Ok(EngineConfig {
llm_provider: self
.llm_provider
.ok_or_else(|| NeomemxError::config_missing("llm_provider"))?,
embedding_provider: self
.embedding_provider
.ok_or_else(|| NeomemxError::config_missing("embedding_provider"))?,
vector_backend: self
.vector_backend
.ok_or_else(|| NeomemxError::config_missing("vector_backend"))?,
graph_backend: self.graph_backend,
history_store: self
.history_store
.ok_or_else(|| NeomemxError::config_missing("history_store"))?,
fact_extractor: self
.fact_extractor
.ok_or_else(|| NeomemxError::config_missing("fact_extractor"))?,
fact_consolidator: self
.fact_consolidator
.ok_or_else(|| NeomemxError::config_missing("fact_consolidator"))?,
reranker: self.reranker,
extraction_config: self.extraction_config,
graph_config: self.graph_config,
})
}
}
impl Default for EngineBuilder {
fn default() -> Self {
Self::new()
}
}