use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use crate::error::AiMuxError;
use crate::shared::{
AbortSignal, SharedHeaders, SharedProviderMetadata, SharedProviderOptions, Warning,
};
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export)]
pub enum RerankingDocuments {
Text { values: Vec<String> },
Object { values: Vec<serde_json::Value> },
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct RerankingCallOptions {
pub documents: RerankingDocuments,
pub query: String,
pub top_n: Option<u32>,
#[serde(skip)]
#[ts(skip)]
pub abort_signal: Option<AbortSignal>,
pub provider_options: Option<SharedProviderOptions>,
pub headers: Option<SharedHeaders>,
}
impl RerankingCallOptions {
pub fn new(query: impl Into<String>, documents: RerankingDocuments) -> Self {
Self {
documents,
query: query.into(),
top_n: None,
abort_signal: None,
provider_options: None,
headers: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct RerankingRank {
pub index: u32,
pub relevance_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct RerankingResult {
pub ranking: Vec<RerankingRank>,
pub provider_metadata: Option<SharedProviderMetadata>,
pub warnings: Option<Vec<Warning>>,
pub response: Option<RerankingResponse>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct RerankingResponse {
pub id: Option<String>,
pub timestamp: Option<String>,
pub model_id: Option<String>,
pub headers: Option<SharedHeaders>,
pub body: Option<serde_json::Value>,
}
#[async_trait]
pub trait RerankingModel: Send + Sync {
fn specification_version(&self) -> &'static str {
"v4"
}
fn provider(&self) -> &str;
fn model_id(&self) -> &str;
async fn do_rerank(
&self,
options: &RerankingCallOptions,
) -> Result<RerankingResult, AiMuxError>;
}