1use std::collections::BTreeSet;
2use std::fmt;
3use std::path::PathBuf;
4use std::sync::Arc;
5
6use crate::memory::session::SessionMemory;
7
8pub type SummaryCallback =
9 Arc<dyn Fn(&str, Option<&str>, Option<&str>) -> Option<String> + Send + Sync + 'static>;
10
11#[derive(Clone)]
12pub struct MemoryManagerConfig {
13 pub compact_threshold: u64,
14 pub keep_recent_messages: usize,
15 pub model: String,
16 pub model_context_window: u64,
17 pub reserved_output_tokens: u64,
18 pub autocompact_buffer_tokens: u64,
19 pub language: String,
20 pub warning_threshold_percentage: u8,
21 pub include_memory_warning: bool,
22 pub summary_event_limit: usize,
23 pub summary_backend: Option<String>,
24 pub summary_model: Option<String>,
25 pub summary_callback: Option<SummaryCallback>,
26 pub tool_result_compact_threshold: usize,
27 pub tool_result_keep_last: usize,
28 pub tool_result_excerpt_head: usize,
29 pub tool_result_excerpt_tail: usize,
30 pub tool_calls_keep_last: usize,
31 pub assistant_no_tool_keep_last: usize,
32 pub tool_result_artifact_dir: PathBuf,
33 pub microcompact_trigger_ratio: f64,
34 pub microcompact_keep_recent_cycles: usize,
35 pub microcompact_min_result_length: usize,
36 pub microcompact_compactable_tools: Option<BTreeSet<String>>,
37 pub workspace: Option<PathBuf>,
38 pub session_memory: Option<SessionMemory>,
39}
40
41impl fmt::Debug for MemoryManagerConfig {
42 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
43 formatter
44 .debug_struct("MemoryManagerConfig")
45 .field("compact_threshold", &self.compact_threshold)
46 .field("keep_recent_messages", &self.keep_recent_messages)
47 .field("model", &self.model)
48 .field("model_context_window", &self.model_context_window)
49 .field("reserved_output_tokens", &self.reserved_output_tokens)
50 .field("autocompact_buffer_tokens", &self.autocompact_buffer_tokens)
51 .field("language", &self.language)
52 .field(
53 "warning_threshold_percentage",
54 &self.warning_threshold_percentage,
55 )
56 .field("include_memory_warning", &self.include_memory_warning)
57 .field("summary_event_limit", &self.summary_event_limit)
58 .field("summary_backend", &self.summary_backend)
59 .field("summary_model", &self.summary_model)
60 .field(
61 "summary_callback",
62 &self.summary_callback.as_ref().map(|_| "<callback>"),
63 )
64 .field(
65 "tool_result_compact_threshold",
66 &self.tool_result_compact_threshold,
67 )
68 .field("tool_result_keep_last", &self.tool_result_keep_last)
69 .field("tool_result_excerpt_head", &self.tool_result_excerpt_head)
70 .field("tool_result_excerpt_tail", &self.tool_result_excerpt_tail)
71 .field("tool_calls_keep_last", &self.tool_calls_keep_last)
72 .field(
73 "assistant_no_tool_keep_last",
74 &self.assistant_no_tool_keep_last,
75 )
76 .field("tool_result_artifact_dir", &self.tool_result_artifact_dir)
77 .field(
78 "microcompact_trigger_ratio",
79 &self.microcompact_trigger_ratio,
80 )
81 .field(
82 "microcompact_keep_recent_cycles",
83 &self.microcompact_keep_recent_cycles,
84 )
85 .field(
86 "microcompact_min_result_length",
87 &self.microcompact_min_result_length,
88 )
89 .field(
90 "microcompact_compactable_tools",
91 &self.microcompact_compactable_tools,
92 )
93 .field("workspace", &self.workspace)
94 .field("session_memory", &self.session_memory)
95 .finish()
96 }
97}
98
99impl Default for MemoryManagerConfig {
100 fn default() -> Self {
101 Self {
102 compact_threshold: 128_000,
103 keep_recent_messages: 10,
104 model: String::new(),
105 model_context_window: 200_000,
106 reserved_output_tokens: 16_000,
107 autocompact_buffer_tokens: 13_000,
108 language: "zh-CN".to_string(),
109 warning_threshold_percentage: 90,
110 include_memory_warning: false,
111 summary_event_limit: 40,
112 summary_backend: None,
113 summary_model: None,
114 summary_callback: None,
115 tool_result_compact_threshold: 2_000,
116 tool_result_keep_last: 3,
117 tool_result_excerpt_head: 200,
118 tool_result_excerpt_tail: 200,
119 tool_calls_keep_last: 3,
120 assistant_no_tool_keep_last: 1,
121 tool_result_artifact_dir: PathBuf::from(".memory/tool_results"),
122 microcompact_trigger_ratio: 0.75,
123 microcompact_keep_recent_cycles: 3,
124 microcompact_min_result_length: 500,
125 microcompact_compactable_tools: None,
126 workspace: None,
127 session_memory: None,
128 }
129 }
130}