use anyhow::Result;
use async_trait::async_trait;
pub use trusty_common::embedder::{FastEmbedder, EMBED_DIM};
#[cfg(any(test, feature = "test-support"))]
pub use trusty_common::embedder::MockEmbedder;
#[async_trait]
pub trait Embedder: Send + Sync {
async fn embed(&self, text: &str) -> Result<Vec<f32>>;
async fn embed_batch(&self, texts: &[&str]) -> Result<Vec<Vec<f32>>>;
fn dimension(&self) -> usize;
fn provider(&self) -> trusty_common::embedder::ExecutionProvider {
trusty_common::embedder::ExecutionProvider::Cpu
}
}
#[async_trait]
impl<E> Embedder for E
where
E: trusty_common::embedder::Embedder,
{
async fn embed(&self, text: &str) -> Result<Vec<f32>> {
trusty_common::embedder::embed_one(self, text).await
}
async fn embed_batch(&self, texts: &[&str]) -> Result<Vec<Vec<f32>>> {
let owned: Vec<String> = texts.iter().map(|s| (*s).to_owned()).collect();
<E as trusty_common::embedder::Embedder>::embed_batch(self, &owned).await
}
fn dimension(&self) -> usize {
<E as trusty_common::embedder::Embedder>::dimension(self)
}
fn provider(&self) -> trusty_common::embedder::ExecutionProvider {
<E as trusty_common::embedder::Embedder>::provider(self)
}
}