stynx_code_compact/
lib.rs1pub 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}