use std::sync::Arc;
use kyma_embed::{EmbeddingBackend, EmbeddingConfig, EmbeddingProvider};
use tokio::sync::OnceCell;
use crate::error::{MemoryError, Result};
static SHARED: OnceCell<Arc<dyn EmbeddingBackend>> = OnceCell::const_new();
pub async fn shared_embedding() -> Result<Arc<dyn EmbeddingBackend>> {
SHARED
.get_or_try_init(|| async { build_embedding_backend(&EmbeddingConfig::from_env()).await })
.await
.map(|b| b.clone())
}
pub async fn build_embedding_backend(cfg: &EmbeddingConfig) -> Result<Arc<dyn EmbeddingBackend>> {
match &cfg.provider {
EmbeddingProvider::Fastembed { id, model_path } => {
let b = kyma_embed::FastembedBackend::new(id, model_path.as_deref())
.await
.map_err(|e| MemoryError::Embed(e.to_string()))?;
Ok(Arc::new(b))
}
other => Err(MemoryError::Embed(format!(
"embedding provider not enabled in this build: {other:?}; \
rebuild kyma-memory with the matching kyma-embed feature"
))),
}
}