use semantic_memory::{MemoryStore, MemoryConfig, EmbeddingConfig, SearchConfig};
use semantic_memory::embedder::{OllamaEmbedder, MockEmbedder, Embedder};
use std::path::PathBuf;
use tokio::runtime::Handle;
pub struct MemoryBridge {
pub store: MemoryStore,
}
pub struct BridgeConfig {
pub memory_dir: PathBuf,
pub embedding_url: String,
pub embedding_model: String,
pub embedding_dims: usize,
pub use_mock_embedder: bool,
}
impl BridgeConfig {
pub fn from_args(
memory_dir: &str,
embedding_url: Option<&str>,
embedding_model: Option<&str>,
embedding_dims: Option<usize>,
) -> Self {
Self {
memory_dir: PathBuf::from(memory_dir),
embedding_url: embedding_url.unwrap_or("http://localhost:11434").to_string(),
embedding_model: embedding_model.unwrap_or("nomic-embed-text").to_string(),
embedding_dims: embedding_dims.unwrap_or(768),
use_mock_embedder: false,
}
}
}
impl MemoryBridge {
pub fn open(config: BridgeConfig) -> anyhow::Result<Self> {
let embedding_config = EmbeddingConfig {
ollama_url: config.embedding_url,
model: config.embedding_model,
dimensions: config.embedding_dims,
batch_size: 32,
timeout_secs: 60,
};
let embedder: Box<dyn Embedder> = if config.use_mock_embedder {
Box::new(MockEmbedder::new(config.embedding_dims))
} else {
Box::new(OllamaEmbedder::try_new(&embedding_config)?)
};
let mem_config = MemoryConfig {
base_dir: config.memory_dir,
embedding: embedding_config,
search: SearchConfig::default(),
..Default::default()
};
let store = MemoryStore::open_with_embedder(mem_config, embedder)?;
Ok(Self { store })
}
pub fn handle() -> Handle {
Handle::current()
}
}