use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RerankResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<i64>,
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_id: Option<String>,
pub results: Vec<RerankResult>,
pub usage: RerankUsage,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RerankResult {
pub index: usize,
pub relevance_score: f32,
pub document: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RerankUsage {
pub prompt_tokens: u64,
pub total_tokens: u64,
}
#[cfg(test)]
mod tests {
use super::RerankResponse;
#[test]
fn accepts_optional_top_level_metadata() {
let response: RerankResponse = serde_json::from_value(serde_json::json!({
"id": "rerank-1",
"results": [{
"document": "first",
"index": 0,
"relevance_score": 0.9
}],
"usage": {
"prompt_tokens": 2,
"total_tokens": 2
}
}))
.expect("created and request_id are optional");
assert_eq!(response.created, None);
assert_eq!(response.results[0].document, "first");
}
#[test]
fn rejects_missing_required_fields() {
for value in [
serde_json::json!({}),
serde_json::json!({
"id": "rerank-1",
"results": [],
"usage": { "prompt_tokens": 1 }
}),
serde_json::json!({
"id": "rerank-1",
"results": [{ "index": 0, "relevance_score": 0.9 }],
"usage": { "prompt_tokens": 1, "total_tokens": 1 }
}),
] {
assert!(serde_json::from_value::<RerankResponse>(value).is_err());
}
}
}