use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::fmt;
use super::decision::{ModelRequest, ModelResponse};
use crate::context::AgentContext as Context;
#[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 {}
#[async_trait]
pub trait ConfidenceMonitorTrait: Send + Sync {
async fn evaluate(
&self,
_context: &Context,
_request: &ModelRequest,
_response: &ModelResponse,
) -> Result<ConfidenceEvaluation, ConfidenceError>;
}
#[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,
})
}
}