mod hash;
#[cfg(feature = "onnx-embed")]
mod onnx;
pub mod gemini;
pub mod ollama;
pub use hash::HashEmbedder;
use crate::config::EmbedProvider;
use crate::{RagConfig, RagError, Result};
use async_trait::async_trait;
use std::sync::Arc;
#[async_trait]
pub trait Embedder: Send + Sync {
async fn embed(&self, texts: &[String]) -> Result<Vec<Vec<f32>>>;
fn dim(&self) -> usize;
fn id(&self) -> &str;
async fn embed_one(&self, text: &str) -> Result<Vec<f32>> {
let mut v = self.embed(std::slice::from_ref(&text.to_string())).await?;
v.pop()
.ok_or_else(|| RagError::Embedding("provider returned no vector".into()))
}
}
pub fn from_config(cfg: &RagConfig) -> Result<Arc<dyn Embedder>> {
match cfg.embed_provider {
EmbedProvider::Ollama => Ok(Arc::new(ollama::OllamaEmbedder::from_config(cfg))),
EmbedProvider::Gemini => Ok(Arc::new(gemini::GeminiEmbedder::from_config(cfg)?)),
EmbedProvider::Hash => Ok(Arc::new(HashEmbedder::new(cfg.embed_dim))),
EmbedProvider::Onnx => {
#[cfg(feature = "onnx-embed")]
{
Ok(Arc::new(onnx::OnnxEmbedder::from_config(cfg)?))
}
#[cfg(not(feature = "onnx-embed"))]
{
Err(RagError::FeatureDisabled(
"onnx".into(),
"onnx-embed".into(),
))
}
}
}
}