Skip to main content

codetether_rlm/
config.rs

1//! RLM configuration type and defaults.
2
3use serde::{Deserialize, Serialize};
4
5/// RLM configuration.
6///
7/// # Examples
8///
9/// ```rust
10/// use codetether_rlm::RlmConfig;
11///
12/// let cfg = RlmConfig::default();
13/// assert_eq!(cfg.mode, "auto");
14/// assert_eq!(cfg.max_iterations, 15);
15/// ```
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct RlmConfig {
18    /// Mode: "auto", "off", or "always"
19    #[serde(default = "config_defaults::default_mode")]
20    pub mode: String,
21    /// Threshold ratio of context window to trigger RLM (0.0-1.0)
22    #[serde(default = "config_defaults::default_threshold")]
23    pub threshold: f64,
24    /// Maximum iterations for RLM processing.
25    #[serde(default = "config_defaults::default_max_iterations")]
26    pub max_iterations: usize,
27    /// Maximum recursive sub-calls
28    #[serde(default = "config_defaults::default_max_subcalls")]
29    pub max_subcalls: usize,
30    /// Preferred runtime: "rust", "bun", or "python"
31    #[serde(default = "config_defaults::default_runtime")]
32    pub runtime: String,
33    /// Model reference for root processing (`provider/model` or bare model).
34    pub root_model: Option<String>,
35    /// Model reference for subcalls (`provider/model` or bare model).
36    pub subcall_model: Option<String>,
37    /// Message count trigger for RLM compaction. `0` disables.
38    #[serde(default = "config_defaults::default_history_trigger_messages")]
39    pub history_trigger_messages: usize,
40}
41
42mod config_defaults {
43    pub fn default_mode() -> String {
44        "auto".into()
45    }
46    pub fn default_threshold() -> f64 {
47        0.35
48    }
49    pub fn default_max_iterations() -> usize {
50        15
51    }
52    pub fn default_max_subcalls() -> usize {
53        50
54    }
55    pub fn default_runtime() -> String {
56        "rust".into()
57    }
58    pub fn default_history_trigger_messages() -> usize {
59        0
60    }
61}
62
63impl Default for RlmConfig {
64    fn default() -> Self {
65        use config_defaults::*;
66        Self {
67            mode: default_mode(),
68            threshold: default_threshold(),
69            max_iterations: default_max_iterations(),
70            max_subcalls: default_max_subcalls(),
71            runtime: default_runtime(),
72            root_model: None,
73            subcall_model: None,
74            history_trigger_messages: default_history_trigger_messages(),
75        }
76    }
77}
78
79#[cfg(test)]
80mod tests {
81    use super::RlmConfig;
82
83    #[test]
84    fn default_history_trigger_is_disabled() {
85        assert_eq!(RlmConfig::default().history_trigger_messages, 0);
86    }
87}