use std::sync::Arc;
use anyhow::Result;
use async_trait::async_trait;
use tracing::warn;
#[cfg(feature = "rerank")]
mod onnx;
#[cfg(feature = "rerank-voyage")]
mod voyage;
#[cfg(feature = "rerank")]
pub use onnx::OnnxCrossEncoder;
#[cfg(feature = "rerank-voyage")]
pub use voyage::VoyageReranker;
#[async_trait]
pub trait Reranker: Send + Sync {
async fn score(&self, query: &str, documents: &[String]) -> Result<Vec<f32>>;
}
pub struct FallbackReranker {
primary: Arc<dyn Reranker>,
fallback: Arc<dyn Reranker>,
}
impl FallbackReranker {
pub fn new(primary: Arc<dyn Reranker>, fallback: Arc<dyn Reranker>) -> Self {
Self { primary, fallback }
}
}
#[async_trait]
impl Reranker for FallbackReranker {
async fn score(&self, query: &str, documents: &[String]) -> Result<Vec<f32>> {
match self.primary.score(query, documents).await {
Ok(scores) => Ok(scores),
Err(e) => {
warn!("Reranker failed, using the fallback: {:#}", e);
self.fallback.score(query, documents).await
}
}
}
}