use crate::any::AnyProvider;
use crate::provider::LlmProvider;
use crate::router::RouterProvider;
mod sealed {
pub trait Sealed {}
}
pub trait RouterAware: sealed::Sealed {
fn set_memory_confidence(&self, confidence: Option<f32>);
fn record_quality_outcome(&self, provider_name: &str, success: bool);
}
impl sealed::Sealed for RouterProvider {}
impl RouterAware for RouterProvider {
fn set_memory_confidence(&self, confidence: Option<f32>) {
RouterProvider::set_memory_confidence(self, confidence);
}
fn record_quality_outcome(&self, provider_name: &str, success: bool) {
RouterProvider::record_quality_outcome(self, provider_name, success);
}
}
impl sealed::Sealed for AnyProvider {}
impl RouterAware for AnyProvider {
fn set_memory_confidence(&self, confidence: Option<f32>) {
if let AnyProvider::Router(r) = self {
r.set_memory_confidence(confidence);
} else {
tracing::trace!(
provider_variant = self.name(),
confidence = ?confidence,
"set_memory_confidence: no-op (non-router provider; MAR signal requires RouterProvider)"
);
}
}
fn record_quality_outcome(&self, provider_name: &str, success: bool) {
if let AnyProvider::Router(p) = self {
p.record_quality_outcome(provider_name, success);
} else {
tracing::trace!(
provider_name,
success,
provider_variant = self.name(),
"record_quality_outcome: no-op (non-router provider; quality signals require RouterProvider)"
);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::claude::ClaudeProvider;
use crate::mock::MockProvider;
use crate::ollama::OllamaProvider;
#[test]
fn router_aware_noop_on_ollama_set_memory_confidence() {
let provider = AnyProvider::Ollama(OllamaProvider::new(
"http://localhost:11434",
"test".into(),
"embed".into(),
));
provider.set_memory_confidence(Some(0.9));
}
#[test]
fn router_aware_noop_on_claude_record_quality_outcome() {
let provider = AnyProvider::Claude(ClaudeProvider::new("key".into(), "model".into(), 1024));
provider.record_quality_outcome("claude", true);
}
#[test]
fn router_aware_noop_on_mock_set_memory_confidence() {
let provider = AnyProvider::Mock(MockProvider::with_responses(vec!["ok".into()]));
provider.set_memory_confidence(None);
}
#[test]
fn router_aware_noop_on_mock_record_quality_outcome() {
let provider = AnyProvider::Mock(MockProvider::with_responses(vec!["ok".into()]));
provider.record_quality_outcome("mock", false);
}
}