Skip to main content

rig_core/
rerank.rs

1//! Provider-agnostic reranking abstractions.
2//!
3//! Reranking models reorder a list of documents by relevance to a query.
4//! A [`Model`](crate::driver::Model) over a rerank wire calls one, and
5//! [`RerankResponse`] carries both the scored results and token usage.
6//!
7//! ```no_run
8//! use rig_core::DynModel;
9//! use rig_core::operation::{Rerank, RerankRequest};
10//!
11//! # async fn example(model: &DynModel<Rerank>) -> Result<(), Box<dyn std::error::Error>> {
12//! let request = RerankRequest {
13//!     query: "Rust".into(),
14//!     documents: vec!["A systems programming language".into()],
15//! };
16//! let response = model.call(request).await?;
17//! # let _ = response;
18//! # Ok(())
19//! # }
20//! ```
21
22use crate::completion::Usage;
23use serde::{Deserialize, Serialize};
24
25/// A single reranked document result.
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct RerankResult {
28    /// Index of the document in the original input list.
29    pub index: usize,
30    /// The document text, if requested via `return_documents`.
31    pub document: Option<String>,
32    /// Relevance score, with higher values more relevant within this response.
33    /// The range is provider-specific and may include negative values. Do not
34    /// interpret it as a probability or compare scores across responses.
35    pub relevance_score: f64,
36}
37
38/// Ranked documents and normalized provider metadata.
39/// Provider-specific response data is available through [`Self::raw`].
40#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct RerankResponse {
42    /// Reranked results sorted by relevance (highest first).
43    pub results: Vec<RerankResult>,
44    /// Provider-reported model identifier, or `None` when omitted.
45    #[serde(default)]
46    pub model: Option<String>,
47    /// Token usage for this rerank request; every counter is `None` when the
48    /// provider reported none (see [`Usage`]).
49    #[serde(default)]
50    pub usage: Usage,
51    /// Stable descriptor name of the provider that produced this response,
52    /// for example `"voyageai"`. Always populated.
53    pub provider: String,
54    /// Provider-assigned response-scoped identifier, when reported.
55    #[serde(default, skip_serializing_if = "Option::is_none")]
56    pub response_id: Option<String>,
57    /// Transport request ID from HTTP headers, or `None` when unreported.
58    #[serde(default, skip_serializing_if = "Option::is_none")]
59    pub provider_request_id: Option<String>,
60    /// Provider response document. Defaults to null until populated.
61    #[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
62    pub raw: serde_json::Value,
63}
64
65impl RerankResponse {
66    /// A response carrying `results`. The driver writes the provider, the
67    /// transport request id and the reply document; decoders set what the
68    /// provider reported.
69    pub fn new(results: Vec<RerankResult>) -> Self {
70        Self {
71            results,
72            model: None,
73            usage: Usage::default(),
74            provider: String::new(),
75            response_id: None,
76            provider_request_id: None,
77            raw: serde_json::Value::Null,
78        }
79    }
80}