llm_embedding/
provider.rs1use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5
6use crate::error::{EmbeddingError, Result};
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
10pub struct EmbeddingResult {
11 pub embeddings: Vec<Vec<f32>>,
13 pub prompt_tokens: u64,
15 pub total_tokens: u64,
17}
18
19#[async_trait]
21pub trait EmbeddingProvider: Send + Sync {
22 async fn embed(&self, texts: &[String]) -> Result<EmbeddingResult>;
24
25 async fn embed_one(&self, text: &str) -> Result<Vec<f32>> {
27 let result = self.embed(&[text.to_string()]).await?;
28 result
29 .embeddings
30 .into_iter()
31 .next()
32 .ok_or_else(|| EmbeddingError::Decode("provider returned no embedding".into()))
33 }
34
35 fn dimension(&self) -> usize;
37
38 fn model_name(&self) -> &str;
40}