use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::fmt;
use super::decision::{ModelRequest, ModelResponse, RoutingContext};
use super::error::TaskType;
use crate::context::AgentContext as Context;
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct ConfidenceConfig {
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct ConfidenceEvaluation {
pub meets_threshold: bool,
pub recommendation: ConfidenceRecommendation,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ConfidenceRecommendation {
#[default]
UseResponse,
FallbackToLLM,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ConfidenceError {
EvaluationFailed,
}
impl fmt::Display for ConfidenceError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ConfidenceError::EvaluationFailed => write!(f, "Confidence evaluation failed"),
}
}
}
impl std::error::Error for ConfidenceError {}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct ConfidenceStatistics {
pub total_evaluations: u64,
}
#[async_trait]
pub trait ConfidenceMonitorTrait: Send + Sync {
async fn evaluate(
&self,
_context: &Context,
_request: &ModelRequest,
_response: &ModelResponse,
) -> Result<ConfidenceEvaluation, ConfidenceError>;
}
#[derive(Debug)]
pub struct ConfidenceMonitor {
_config: ConfidenceConfig,
statistics: ConfidenceStatistics,
}
impl ConfidenceMonitor {
pub fn new(config: ConfidenceConfig) -> Self {
Self {
_config: config,
statistics: ConfidenceStatistics::default(),
}
}
pub async fn evaluate_confidence(
&self,
_response: &ModelResponse,
_task_type: &TaskType,
_context: &RoutingContext,
) -> Result<ConfidenceEvaluation, ConfidenceError> {
Ok(ConfidenceEvaluation {
meets_threshold: true,
recommendation: ConfidenceRecommendation::UseResponse,
})
}
pub async fn record_evaluation(
&mut self,
_task_type: TaskType,
_confidence_score: f64,
_model_id: String,
_user_feedback: Option<bool>,
) {
self.statistics.total_evaluations += 1;
}
pub async fn get_statistics(&self) -> ConfidenceStatistics {
self.statistics.clone()
}
}
#[derive(Debug, Default, Clone)]
pub struct NoOpConfidenceMonitor;
#[async_trait]
impl ConfidenceMonitorTrait for NoOpConfidenceMonitor {
async fn evaluate(
&self,
_context: &Context,
_request: &ModelRequest,
_response: &ModelResponse,
) -> Result<ConfidenceEvaluation, ConfidenceError> {
Ok(ConfidenceEvaluation {
meets_threshold: true,
recommendation: ConfidenceRecommendation::UseResponse,
})
}
}