use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::error::{EmbeddingError, Result};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct EmbeddingResult {
pub embeddings: Vec<Vec<f32>>,
pub prompt_tokens: u64,
pub total_tokens: u64,
}
#[async_trait]
pub trait EmbeddingProvider: Send + Sync {
async fn embed(&self, texts: &[String]) -> Result<EmbeddingResult>;
async fn embed_one(&self, text: &str) -> Result<Vec<f32>> {
let result = self.embed(&[text.to_string()]).await?;
result
.embeddings
.into_iter()
.next()
.ok_or_else(|| EmbeddingError::Decode("provider returned no embedding".into()))
}
fn dimension(&self) -> usize;
fn model_name(&self) -> &str;
}