mockforge_core/ai_studio/
config.rs1use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize, Default)]
10#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
11pub struct AiStudioConfig {
12 #[serde(default)]
14 pub deterministic_mode: DeterministicModeConfig,
15
16 #[serde(default)]
18 pub budgets: BudgetConfig,
19
20 #[serde(default)]
22 pub features: FeatureConfig,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
30#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
31pub struct DeterministicModeConfig {
32 #[serde(default = "default_false")]
34 pub enabled: bool,
35
36 #[serde(default = "default_true")]
38 pub auto_freeze: bool,
39
40 #[serde(default = "default_freeze_format")]
42 pub freeze_format: String,
43
44 #[serde(default = "default_freeze_directory")]
46 pub freeze_directory: String,
47}
48
49impl Default for DeterministicModeConfig {
50 fn default() -> Self {
51 Self {
52 enabled: false,
53 auto_freeze: true,
54 freeze_format: "yaml".to_string(),
55 freeze_directory: ".mockforge/frozen".to_string(),
56 }
57 }
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
62#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
63pub struct BudgetConfig {
64 #[serde(default = "default_max_tokens")]
66 pub max_tokens_per_workspace: u64,
67
68 #[serde(default = "default_max_calls")]
70 pub max_ai_calls_per_day: u64,
71
72 #[serde(default = "default_rate_limit")]
74 pub rate_limit_per_minute: u64,
75
76 #[serde(default = "default_alert_threshold")]
78 pub alert_threshold: f64,
79}
80
81impl Default for BudgetConfig {
82 fn default() -> Self {
83 Self {
84 max_tokens_per_workspace: 100_000,
85 max_ai_calls_per_day: 1_000,
86 rate_limit_per_minute: 10,
87 alert_threshold: 0.8, }
89 }
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
94#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
95pub struct FeatureConfig {
96 #[serde(default = "default_true")]
98 pub mock_generation: bool,
99
100 #[serde(default = "default_true")]
102 pub contract_diff: bool,
103
104 #[serde(default = "default_true")]
106 pub persona_generation: bool,
107
108 #[serde(default = "default_true")]
110 pub free_form_generation: bool,
111
112 #[serde(default = "default_true")]
114 pub debug_analysis: bool,
115}
116
117impl Default for FeatureConfig {
118 fn default() -> Self {
119 Self {
120 mock_generation: true,
121 contract_diff: true,
122 persona_generation: true,
123 free_form_generation: true,
124 debug_analysis: true,
125 }
126 }
127}
128
129fn default_false() -> bool {
132 false
133}
134
135fn default_true() -> bool {
136 true
137}
138
139fn default_freeze_format() -> String {
140 "yaml".to_string()
141}
142
143fn default_freeze_directory() -> String {
144 ".mockforge/frozen".to_string()
145}
146
147fn default_max_tokens() -> u64 {
148 100_000
149}
150
151fn default_max_calls() -> u64 {
152 1_000
153}
154
155fn default_rate_limit() -> u64 {
156 10
157}
158
159fn default_alert_threshold() -> f64 {
160 0.8
161}