use std::sync::Arc;
use crate::error::Error;
use crate::provider::Provider;
use super::response::RerankResponse;
#[derive(Clone)]
pub struct RerankRequest {
pub model: String,
pub query: String,
pub documents: Vec<String>,
pub top_k: Option<u32>,
pub return_documents: bool,
pub provider_options: serde_json::Value,
}
impl RerankRequest {
pub fn new(model: impl Into<String>, query: impl Into<String>) -> Self {
Self {
model: model.into(),
query: query.into(),
documents: Vec::new(),
top_k: None,
return_documents: false,
provider_options: serde_json::Value::Null,
}
}
}
pub struct PendingRerankRequest {
provider: Arc<dyn Provider>,
request: RerankRequest,
}
impl PendingRerankRequest {
pub fn new(
provider: Arc<dyn Provider>,
model: impl Into<String>,
query: impl Into<String>,
) -> Self {
Self {
provider,
request: RerankRequest::new(model, query),
}
}
pub fn with_document(mut self, document: impl Into<String>) -> Self {
self.request.documents.push(document.into());
self
}
pub fn with_documents(
mut self,
documents: impl IntoIterator<Item = impl Into<String>>,
) -> Self {
self.request
.documents
.extend(documents.into_iter().map(Into::into));
self
}
pub fn with_top_k(mut self, top_k: u32) -> Self {
self.request.top_k = Some(top_k);
self
}
pub fn with_return_documents(mut self, return_documents: bool) -> Self {
self.request.return_documents = return_documents;
self
}
pub fn to_request(&self) -> RerankRequest {
self.request.clone()
}
pub async fn generate(self) -> Result<RerankResponse, Error> {
self.provider.rerank(self.request).await
}
}