use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LlmCoherenceConfig {
pub coherence_threshold: f64,
pub hallucination_sensitivity: f64,
pub max_response_length: usize,
pub gating_mode: GatingMode,
pub response_policy: ResponsePolicy,
pub lane_thresholds: CoherenceThresholds,
pub hallucination_policy: HallucinationPolicy,
pub semantic_consistency: bool,
pub citation_verification: bool,
pub factual_grounding: bool,
}
impl Default for LlmCoherenceConfig {
fn default() -> Self {
Self {
coherence_threshold: super::DEFAULT_COHERENCE_THRESHOLD,
hallucination_sensitivity: super::DEFAULT_HALLUCINATION_SENSITIVITY,
max_response_length: super::DEFAULT_MAX_RESPONSE_LENGTH,
gating_mode: GatingMode::default(),
response_policy: ResponsePolicy::default(),
lane_thresholds: CoherenceThresholds::default(),
hallucination_policy: HallucinationPolicy::default(),
semantic_consistency: true,
citation_verification: false,
factual_grounding: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum GatingMode {
Permissive,
#[default]
Standard,
Strict,
Adaptive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum ResponsePolicy {
#[default]
AllowIfCoherent,
RequireReview,
EscalateOnUncertain,
BlockUnlessVerified,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CoherenceThresholds {
pub reflex: f64,
pub retrieval: f64,
pub heavy: f64,
pub human: f64,
}
impl Default for CoherenceThresholds {
fn default() -> Self {
Self {
reflex: 0.9,
retrieval: 0.7,
heavy: 0.5,
human: 0.3,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HallucinationPolicy {
pub action: HallucinationAction,
pub confidence_threshold: f64,
pub log_all: bool,
pub max_rate: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum HallucinationAction {
LogOnly,
#[default]
Block,
Escalate,
Retry,
}
impl LlmCoherenceConfig {
pub fn permissive() -> Self {
Self {
gating_mode: GatingMode::Permissive,
coherence_threshold: 0.0,
hallucination_policy: HallucinationPolicy {
action: HallucinationAction::LogOnly,
..Default::default()
},
..Default::default()
}
}
pub fn strict() -> Self {
Self {
gating_mode: GatingMode::Strict,
coherence_threshold: 0.95,
hallucination_sensitivity: 0.9,
response_policy: ResponsePolicy::BlockUnlessVerified,
hallucination_policy: HallucinationPolicy {
action: HallucinationAction::Block,
confidence_threshold: 0.5,
log_all: true,
max_rate: 0.01,
},
semantic_consistency: true,
citation_verification: true,
factual_grounding: true,
..Default::default()
}
}
pub fn adaptive() -> Self {
Self {
gating_mode: GatingMode::Adaptive,
response_policy: ResponsePolicy::EscalateOnUncertain,
..Default::default()
}
}
}