use tracing;
#[derive(Clone, Debug)]
pub struct CompressionConfig {
pub enabled: bool,
pub trigger_tokens: usize,
pub keep_recent_messages: usize,
pub max_summary_chars: usize,
pub max_transcript_chars: usize,
}
impl Default for CompressionConfig {
fn default() -> Self {
Self {
enabled: true,
trigger_tokens: 256_000,
keep_recent_messages: 16,
max_summary_chars: 10 * 1024, max_transcript_chars: 20 * 1024, }
}
}
impl CompressionConfig {
pub fn builder() -> Self {
Self::default()
}
pub fn with_enabled(mut self, enabled: bool) -> Self {
self.enabled = enabled;
self
}
pub fn with_trigger_tokens(mut self, tokens: usize) -> Self {
self.trigger_tokens = tokens;
self
}
pub fn with_keep_recent_messages(mut self, n: usize) -> Self {
self.keep_recent_messages = n;
self
}
pub fn with_max_summary_chars(mut self, chars: usize) -> Self {
self.max_summary_chars = chars;
self
}
pub fn with_max_transcript_chars(mut self, chars: usize) -> Self {
self.max_transcript_chars = chars;
self
}
pub fn validate_context_window(mut self, context_window: usize) -> Self {
if self.trigger_tokens >= context_window {
tracing::warn!(
trigger_tokens = self.trigger_tokens,
context_window,
"trigger_tokens >= context_window, clamping to 50% of context_window"
);
self.trigger_tokens = context_window / 2;
}
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_values() {
let cfg = CompressionConfig::default();
assert!(cfg.enabled);
assert_eq!(cfg.trigger_tokens, 256_000);
assert_eq!(cfg.keep_recent_messages, 16);
assert_eq!(cfg.max_summary_chars, 10 * 1024);
assert_eq!(cfg.max_transcript_chars, 20 * 1024);
}
#[test]
fn test_builder_chaining() {
let cfg = CompressionConfig::builder()
.with_enabled(false)
.with_trigger_tokens(50_000)
.with_keep_recent_messages(20)
.with_max_summary_chars(8_000)
.with_max_transcript_chars(16_000);
assert!(!cfg.enabled);
assert_eq!(cfg.trigger_tokens, 50_000);
assert_eq!(cfg.keep_recent_messages, 20);
assert_eq!(cfg.max_summary_chars, 8_000);
assert_eq!(cfg.max_transcript_chars, 16_000);
}
}