mockforge_intelligence/ai_studio/
config.rs1use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
12#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
13#[serde(rename_all = "snake_case")]
14#[derive(Default)]
15pub enum AiMode {
16 GenerateOnceFreeze,
19
20 #[default]
22 Live,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize, Default)]
27#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
28pub struct AiStudioConfig {
29 #[serde(default)]
31 pub deterministic_mode: DeterministicModeConfig,
32
33 #[serde(default)]
35 pub budgets: BudgetConfig,
36
37 #[serde(default)]
39 pub features: FeatureConfig,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize, Default)]
46#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
47#[serde(deny_unknown_fields)]
48pub struct AiGenerationConfig {
49 #[serde(default)]
51 pub seed: Option<i64>,
52 #[serde(default)]
54 pub deterministic_mode: DeterministicModeConfig,
55}
56
57#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
59#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
60#[serde(rename_all = "snake_case")]
61#[derive(Default)]
62pub enum FreezeMode {
63 Auto,
65 #[default]
67 Manual,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
75#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
76pub struct DeterministicModeConfig {
77 #[serde(default = "default_false")]
79 pub enabled: bool,
80
81 #[serde(default)]
83 pub mode: FreezeMode,
84
85 #[serde(default = "default_true")]
88 pub auto_freeze: bool,
89
90 #[serde(default = "default_freeze_format")]
92 pub freeze_format: String,
93
94 #[serde(default = "default_freeze_directory")]
96 pub freeze_directory: String,
97
98 #[serde(default = "default_true")]
100 pub track_metadata: bool,
101}
102
103impl DeterministicModeConfig {
104 pub fn is_auto_freeze_enabled(&self) -> bool {
106 self.mode == FreezeMode::Auto || self.auto_freeze
107 }
108}
109
110impl Default for DeterministicModeConfig {
111 fn default() -> Self {
112 Self {
113 enabled: false,
114 mode: FreezeMode::Manual,
115 auto_freeze: true, freeze_format: "yaml".to_string(),
117 freeze_directory: ".mockforge/frozen".to_string(),
118 track_metadata: true,
119 }
120 }
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
125#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
126pub struct BudgetConfig {
127 #[serde(default = "default_max_tokens")]
129 pub max_tokens_per_workspace: u64,
130
131 #[serde(default = "default_max_calls")]
133 pub max_ai_calls_per_day: u64,
134
135 #[serde(default = "default_rate_limit")]
137 pub rate_limit_per_minute: u64,
138
139 #[serde(default = "default_alert_threshold")]
141 pub alert_threshold: f64,
142}
143
144impl Default for BudgetConfig {
145 fn default() -> Self {
146 Self {
147 max_tokens_per_workspace: 100_000,
148 max_ai_calls_per_day: 1_000,
149 rate_limit_per_minute: 10,
150 alert_threshold: 0.8, }
152 }
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize)]
157#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
158pub struct FeatureConfig {
159 #[serde(default = "default_true")]
161 pub mock_generation: bool,
162
163 #[serde(default = "default_true")]
165 pub contract_diff: bool,
166
167 #[serde(default = "default_true")]
169 pub persona_generation: bool,
170
171 #[serde(default = "default_true")]
173 pub free_form_generation: bool,
174
175 #[serde(default = "default_true")]
177 pub debug_analysis: bool,
178}
179
180impl Default for FeatureConfig {
181 fn default() -> Self {
182 Self {
183 mock_generation: true,
184 contract_diff: true,
185 persona_generation: true,
186 free_form_generation: true,
187 debug_analysis: true,
188 }
189 }
190}
191
192fn default_false() -> bool {
195 false
196}
197
198fn default_true() -> bool {
199 true
200}
201
202fn default_freeze_format() -> String {
203 "yaml".to_string()
204}
205
206fn default_freeze_directory() -> String {
207 ".mockforge/frozen".to_string()
208}
209
210fn default_max_tokens() -> u64 {
211 100_000
212}
213
214fn default_max_calls() -> u64 {
215 1_000
216}
217
218fn default_rate_limit() -> u64 {
219 10
220}
221
222fn default_alert_threshold() -> f64 {
223 0.8
224}