use std::sync::{Mutex, OnceLock};
use fastembed::{EmbeddingModel, TextEmbedding, TextInitOptions};
fn model() -> &'static Mutex<TextEmbedding> {
static MODEL: OnceLock<Mutex<TextEmbedding>> = OnceLock::new();
MODEL.get_or_init(|| {
Mutex::new(
TextEmbedding::try_new(TextInitOptions::new(EmbeddingModel::AllMpnetBaseV2))
.expect("failed to load the all-mpnet-base-v2 embedding model"),
)
})
}
pub fn embed(text: &str) -> anyhow::Result<Vec<f32>> {
let model = model();
let mut model = model.lock().unwrap();
let mut embeddings = model.embed(vec![text], None)?;
embeddings
.pop()
.ok_or_else(|| anyhow::anyhow!("embedding model returned no output for the given text"))
}