use super::*;
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct SelfRecheckConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub prompt: Option<String>,
}
pub(crate) fn default_token_budget_exempt_control_chats() -> bool {
true
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TokenBudgetConfig {
#[serde(default)]
pub daily_per_chat: i64,
#[serde(default = "default_token_budget_exempt_control_chats")]
pub exempt_control_chats: bool,
}
impl Default for TokenBudgetConfig {
fn default() -> Self {
Self {
daily_per_chat: 0,
exempt_control_chats: default_token_budget_exempt_control_chats(),
}
}
}
impl TokenBudgetConfig {
pub fn blocks(&self, is_control_chat: bool, used: i64) -> bool {
if self.daily_per_chat <= 0 {
return false;
}
if self.exempt_control_chats && is_control_chat {
return false;
}
used >= self.daily_per_chat
}
}
pub(crate) fn default_alerts_interval_secs() -> u64 {
60
}
pub(crate) fn default_alerts_cooldown_secs() -> u64 {
900
}
pub(crate) fn default_alerts_restart_storm_threshold() -> u64 {
5
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct AlertsConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub webhook_url: String,
#[serde(default = "default_alerts_interval_secs")]
pub interval_secs: u64,
#[serde(default = "default_alerts_cooldown_secs")]
pub cooldown_secs: u64,
#[serde(default = "default_alerts_restart_storm_threshold")]
pub restart_storm_threshold: u64,
}
impl Default for AlertsConfig {
fn default() -> Self {
Self {
enabled: false,
webhook_url: String::new(),
interval_secs: default_alerts_interval_secs(),
cooldown_secs: default_alerts_cooldown_secs(),
restart_storm_threshold: default_alerts_restart_storm_threshold(),
}
}
}
pub(crate) fn default_trust_report_interval_days() -> u64 {
7
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TrustReportConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_trust_report_interval_days")]
pub interval_days: u64,
}
impl Default for TrustReportConfig {
fn default() -> Self {
Self {
enabled: false,
interval_days: default_trust_report_interval_days(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[allow(unused_imports)]
use crate::config::test_prelude::*;
#[test]
fn token_budget_disabled_never_blocks() {
let cfg = TokenBudgetConfig::default();
assert!(!cfg.blocks(false, i64::MAX));
assert!(!cfg.blocks(true, i64::MAX));
}
#[test]
fn token_budget_blocks_at_cap_but_exempts_control_chats() {
let cfg = TokenBudgetConfig {
daily_per_chat: 1000,
exempt_control_chats: true,
};
assert!(!cfg.blocks(false, 999));
assert!(cfg.blocks(false, 1000));
assert!(cfg.blocks(false, 5000));
assert!(!cfg.blocks(true, 5000));
let strict = TokenBudgetConfig {
daily_per_chat: 1000,
exempt_control_chats: false,
};
assert!(strict.blocks(true, 1000));
}
}