Skip to main content

stynx_code_compact/
micro_compact.rs

1use stynx_code_types::{ContentBlock, Conversation, Message};
2
3pub struct MicroCompactor {
4
5    pub max_tool_result_size: usize,
6}
7
8impl Default for MicroCompactor {
9    fn default() -> Self {
10        Self {
11            max_tool_result_size: 10_000,
12        }
13    }
14}
15
16impl MicroCompactor {
17    pub fn new(max_tool_result_size: usize) -> Self {
18        Self {
19            max_tool_result_size,
20        }
21    }
22
23    pub fn compact_message(&self, message: &Message) -> Message {
24        let content = message
25            .content
26            .iter()
27            .map(|block| match block {
28                ContentBlock::ToolResult {
29                    tool_use_id,
30                    content,
31                    is_error,
32                } => {
33                    if content.len() > self.max_tool_result_size {
34                        let original_len = content.len();
35                        let truncated =
36                            format!("{}...\n[truncated - {original_len} chars]", &content[..self.max_tool_result_size]);
37                        ContentBlock::ToolResult {
38                            tool_use_id: tool_use_id.clone(),
39                            content: truncated,
40                            is_error: *is_error,
41                        }
42                    } else {
43                        block.clone()
44                    }
45                }
46                _ => block.clone(),
47            })
48            .collect();
49
50        Message {
51            role: message.role.clone(),
52            content,
53        }
54    }
55
56    pub fn compact_conversation(&self, conversation: &Conversation) -> Conversation {
57        let messages = conversation
58            .messages
59            .iter()
60            .map(|msg| self.compact_message(msg))
61            .collect();
62
63        Conversation {
64            system: conversation.system.clone(),
65            messages,
66        }
67    }
68}