Skip to main content

relay_knowledge/domain/graph/retrieval/
diagnostics.rs

1use serde::{Deserialize, Serialize};
2
3use super::{RerankMode, RetrieverSource};
4
5/// RRF constant used by Phase 1 hybrid retrieval.
6pub const RECIPROCAL_RANK_FUSION_K: f64 = 60.0;
7
8/// Per-retriever ranking signal preserved after fusion.
9#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
10pub struct RankingSignal {
11    pub source: RetrieverSource,
12    pub rank: usize,
13    pub score: f64,
14    pub explanation: String,
15}
16
17/// Final rerank signal applied after hybrid retrieval fusion.
18#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
19pub struct RerankSignal {
20    pub mode: RerankMode,
21    pub score: f64,
22    pub explanation: String,
23}
24
25/// Budget actually consumed by retrieval context packing.
26#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
27pub struct RetrievalBudgetUsed {
28    pub limit: usize,
29    pub candidate_count: usize,
30    pub returned_count: usize,
31    pub context_bytes: usize,
32}
33
34/// Diagnostics for reciprocal-rank fusion.
35#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
36pub struct FusionDiagnostics {
37    pub algorithm: String,
38    pub k: f64,
39    pub candidate_count: usize,
40}
41
42/// Diagnostics for post-fusion reranking.
43#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
44pub struct RerankDiagnostics {
45    pub requested_mode: RerankMode,
46    pub effective_mode: RerankMode,
47    pub algorithm: String,
48    pub candidate_count: usize,
49    pub returned_count: usize,
50    pub degraded: bool,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub reason: Option<String>,
53}