stynx_code_compact/
micro_compact.rs1use 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}