Skip to main content

stynx_code_compact/
lib.rs

1pub mod auto_compact;
2pub mod full_compact;
3pub mod grouping;
4pub mod micro_compact;
5pub mod prompt;
6pub mod session_memory_compact;
7
8pub use auto_compact::AutoCompactor;
9pub use full_compact::FullCompactor;
10pub use grouping::MessageGroup;
11pub use micro_compact::MicroCompactor;
12pub use session_memory_compact::SessionMemoryCompactor;
13
14use stynx_code_errors::AppResult;
15use stynx_code_types::{Conversation, Provider};
16
17pub struct CompactionPipeline {
18    auto: AutoCompactor,
19    micro: MicroCompactor,
20    session_memory: SessionMemoryCompactor,
21    full: FullCompactor,
22}
23
24impl Default for CompactionPipeline {
25    fn default() -> Self {
26        Self::new()
27    }
28}
29
30impl CompactionPipeline {
31    pub fn new() -> Self {
32        Self {
33            auto: AutoCompactor::default(),
34            micro: MicroCompactor::default(),
35            session_memory: SessionMemoryCompactor::new(),
36            full: FullCompactor::new(),
37        }
38    }
39
40    pub fn with_threshold(threshold: f64) -> Self {
41        Self {
42            auto: AutoCompactor::new(threshold),
43            micro: MicroCompactor::default(),
44            session_memory: SessionMemoryCompactor::new(),
45            full: FullCompactor::new(),
46        }
47    }
48
49    pub async fn compact(
50        &self,
51        conversation: Conversation,
52        current_tokens: u64,
53        token_limit: u64,
54        provider: &dyn Provider,
55    ) -> AppResult<(Conversation, Vec<String>)> {
56
57        if !self.auto.should_compact(current_tokens, token_limit) {
58            return Ok((conversation, vec![]));
59        }
60
61        let compacted = self.micro.compact_conversation(&conversation);
62
63        let (memories, compacted) = self.session_memory.extract_and_compact(&compacted);
64
65        let compacted = self.full.compact(&compacted, provider).await?;
66
67        Ok((compacted, memories))
68    }
69}