use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ModelRole {
Embedding,
Reranker,
}
impl ModelRole {
pub fn as_str(&self) -> &'static str {
match self {
ModelRole::Embedding => "embedding",
ModelRole::Reranker => "reranker",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ModelStatus {
Available,
Missing,
Invalid,
Installing,
Disabled,
}
impl ModelStatus {
pub fn as_str(&self) -> &'static str {
match self {
ModelStatus::Available => "available",
ModelStatus::Missing => "missing",
ModelStatus::Invalid => "invalid",
ModelStatus::Installing => "installing",
ModelStatus::Disabled => "disabled",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SearchCapability {
KeywordOnly,
Hybrid,
HybridWithRerank,
}
pub fn search_capability(
embedding: Option<ModelStatus>,
reranker: Option<ModelStatus>,
) -> SearchCapability {
match (embedding, reranker) {
(Some(ModelStatus::Available), Some(ModelStatus::Available)) => {
SearchCapability::HybridWithRerank
}
(Some(ModelStatus::Available), _) => SearchCapability::Hybrid,
_ => SearchCapability::KeywordOnly,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn capability_degrades_gracefully() {
assert_eq!(search_capability(None, None), SearchCapability::KeywordOnly);
assert_eq!(
search_capability(Some(ModelStatus::Missing), None),
SearchCapability::KeywordOnly
);
assert_eq!(
search_capability(Some(ModelStatus::Available), None),
SearchCapability::Hybrid
);
assert_eq!(
search_capability(Some(ModelStatus::Available), Some(ModelStatus::Missing)),
SearchCapability::Hybrid
);
assert_eq!(
search_capability(Some(ModelStatus::Available), Some(ModelStatus::Available)),
SearchCapability::HybridWithRerank
);
}
}