use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecisionEngineConfig {
pub id: String,
pub enabled: bool,
pub decision_interval: Duration,
pub min_decision_gap: Duration,
pub max_concurrent_decisions: usize,
pub decision_timeout: Duration,
pub auto_execute: bool,
pub require_approval: bool,
pub strategies: StrategyConfigs,
pub safety: SafetyConfig,
pub monitoring: MonitoringConfig,
}
impl Default for DecisionEngineConfig {
fn default() -> Self {
Self {
id: "decision-engine".to_string(),
enabled: true,
decision_interval: Duration::from_secs(60),
min_decision_gap: Duration::from_secs(300),
max_concurrent_decisions: 3,
decision_timeout: Duration::from_secs(30),
auto_execute: false,
require_approval: true,
strategies: StrategyConfigs::default(),
safety: SafetyConfig::default(),
monitoring: MonitoringConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StrategyConfigs {
pub model_selection: ModelSelectionConfig,
pub caching: CachingConfig,
pub rate_limiting: RateLimitingConfig,
pub batching: BatchingConfig,
pub prompt_optimization: PromptOptimizationConfig,
}
impl Default for StrategyConfigs {
fn default() -> Self {
Self {
model_selection: ModelSelectionConfig::default(),
caching: CachingConfig::default(),
rate_limiting: RateLimitingConfig::default(),
batching: BatchingConfig::default(),
prompt_optimization: PromptOptimizationConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelSelectionConfig {
pub enabled: bool,
pub priority: u32,
pub min_confidence: f64,
pub cost_weight: f64,
pub performance_weight: f64,
pub quality_weight: f64,
pub available_models: Vec<String>,
pub min_evaluation_period: Duration,
pub max_cost_increase_pct: f64,
}
impl Default for ModelSelectionConfig {
fn default() -> Self {
Self {
enabled: true,
priority: 100,
min_confidence: 0.7,
cost_weight: 0.4,
performance_weight: 0.3,
quality_weight: 0.3,
available_models: vec![
"gpt-4".to_string(),
"gpt-3.5-turbo".to_string(),
"claude-3-opus".to_string(),
"claude-3-sonnet".to_string(),
],
min_evaluation_period: Duration::from_secs(3600), max_cost_increase_pct: 50.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CachingConfig {
pub enabled: bool,
pub priority: u32,
pub min_confidence: f64,
pub min_request_frequency: f64,
pub min_similarity_threshold: f64,
pub cache_ttl: Duration,
pub max_cache_size: usize,
pub min_expected_hit_rate_pct: f64,
}
impl Default for CachingConfig {
fn default() -> Self {
Self {
enabled: true,
priority: 90,
min_confidence: 0.7,
min_request_frequency: 10.0,
min_similarity_threshold: 0.85,
cache_ttl: Duration::from_secs(3600),
max_cache_size: 10000,
min_expected_hit_rate_pct: 20.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimitingConfig {
pub enabled: bool,
pub priority: u32,
pub min_confidence: f64,
pub max_requests_per_second: f64,
pub max_tokens_per_minute: u64,
pub max_cost_per_hour: f64,
pub burst_multiplier: f64,
pub adaptive_enabled: bool,
pub target_error_rate_pct: f64,
}
impl Default for RateLimitingConfig {
fn default() -> Self {
Self {
enabled: true,
priority: 80,
min_confidence: 0.7,
max_requests_per_second: 100.0,
max_tokens_per_minute: 100000,
max_cost_per_hour: 10.0,
burst_multiplier: 1.5,
adaptive_enabled: true,
target_error_rate_pct: 1.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchingConfig {
pub enabled: bool,
pub priority: u32,
pub min_confidence: f64,
pub max_batch_size: usize,
pub batch_timeout: Duration,
pub min_requests_for_batching: usize,
pub max_latency_increase_ms: f64,
pub min_cost_savings_pct: f64,
}
impl Default for BatchingConfig {
fn default() -> Self {
Self {
enabled: true,
priority: 70,
min_confidence: 0.7,
max_batch_size: 10,
batch_timeout: Duration::from_millis(100),
min_requests_for_batching: 5,
max_latency_increase_ms: 200.0,
min_cost_savings_pct: 15.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromptOptimizationConfig {
pub enabled: bool,
pub priority: u32,
pub min_confidence: f64,
pub min_token_reduction_pct: f64,
pub ab_test_duration: Duration,
pub ab_test_traffic_split: f64,
pub min_quality_score: f64,
pub max_quality_degradation_pct: f64,
}
impl Default for PromptOptimizationConfig {
fn default() -> Self {
Self {
enabled: true,
priority: 85,
min_confidence: 0.7,
min_token_reduction_pct: 10.0,
ab_test_duration: Duration::from_secs(3600),
ab_test_traffic_split: 0.1,
min_quality_score: 4.0,
max_quality_degradation_pct: 5.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SafetyConfig {
pub max_cost_increase_usd: f64,
pub max_latency_increase_ms: f64,
pub min_quality_score: f64,
pub min_success_rate_pct: f64,
pub circuit_breaker_enabled: bool,
pub circuit_breaker_error_threshold_pct: f64,
pub circuit_breaker_timeout: Duration,
pub auto_rollback_enabled: bool,
pub rollback_timeout: Duration,
}
impl Default for SafetyConfig {
fn default() -> Self {
Self {
max_cost_increase_usd: 100.0,
max_latency_increase_ms: 500.0,
min_quality_score: 3.5,
min_success_rate_pct: 95.0,
circuit_breaker_enabled: true,
circuit_breaker_error_threshold_pct: 10.0,
circuit_breaker_timeout: Duration::from_secs(300),
auto_rollback_enabled: true,
rollback_timeout: Duration::from_secs(600),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MonitoringConfig {
pub enable_logging: bool,
pub enable_metrics: bool,
pub enable_tracing: bool,
pub metrics_interval: Duration,
pub decision_history_size: usize,
pub outcome_history_size: usize,
}
impl Default for MonitoringConfig {
fn default() -> Self {
Self {
enable_logging: true,
enable_metrics: true,
enable_tracing: true,
metrics_interval: Duration::from_secs(60),
decision_history_size: 1000,
outcome_history_size: 1000,
}
}
}