1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4pub struct AiConfig {
5 #[serde(default = "default_ai_provider")]
7 pub provider: String,
8 pub endpoint: Option<String>,
10 pub model: Option<String>,
12 pub api_key: Option<String>,
14 #[serde(default)]
16 pub alerts: Option<AiAlertConfig>,
17 #[serde(default)]
19 pub auto_remediate: Option<AutoRemediateConfig>,
20}
21
22fn default_ai_provider() -> String {
23 "ollama".into()
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct AiAlertConfig {
28 #[serde(default = "default_true")]
30 pub enabled: bool,
31 #[serde(default = "default_analysis_interval")]
33 pub analysis_interval_secs: u64,
34 pub channels: Option<AlertDeliveryChannels>,
36}
37
38fn default_true() -> bool {
39 true
40}
41
42fn default_analysis_interval() -> u64 {
43 60
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
47pub struct AlertDeliveryChannels {
48 pub webhook: Option<String>,
50 pub slack: Option<String>,
52 pub email: Option<String>,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct AutoRemediateConfig {
58 #[serde(default = "default_true")]
60 pub restart_crashed: bool,
61 #[serde(default)]
63 pub scale_on_pressure: bool,
64 #[serde(default)]
66 pub rollback_on_failure: bool,
67}