vv_agent/memory/manager/
config.rs1use std::fmt;
2use std::path::PathBuf;
3use std::sync::Arc;
4
5use crate::memory::session::SessionMemory;
6use crate::memory::MicrocompactionPolicy;
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 microcompaction_policy: MicrocompactionPolicy,
33 pub workspace: Option<PathBuf>,
34 pub session_memory: Option<SessionMemory>,
35}
36
37impl fmt::Debug for MemoryManagerConfig {
38 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
39 formatter
40 .debug_struct("MemoryManagerConfig")
41 .field("compact_threshold", &self.compact_threshold)
42 .field("keep_recent_messages", &self.keep_recent_messages)
43 .field("model", &self.model)
44 .field("model_context_window", &self.model_context_window)
45 .field("reserved_output_tokens", &self.reserved_output_tokens)
46 .field("autocompact_buffer_tokens", &self.autocompact_buffer_tokens)
47 .field("language", &self.language)
48 .field(
49 "warning_threshold_percentage",
50 &self.warning_threshold_percentage,
51 )
52 .field("include_memory_warning", &self.include_memory_warning)
53 .field("summary_event_limit", &self.summary_event_limit)
54 .field("summary_backend", &self.summary_backend)
55 .field("summary_model", &self.summary_model)
56 .field(
57 "summary_callback",
58 &self.summary_callback.as_ref().map(|_| "<callback>"),
59 )
60 .field(
61 "tool_result_compact_threshold",
62 &self.tool_result_compact_threshold,
63 )
64 .field("tool_result_keep_last", &self.tool_result_keep_last)
65 .field("tool_result_excerpt_head", &self.tool_result_excerpt_head)
66 .field("tool_result_excerpt_tail", &self.tool_result_excerpt_tail)
67 .field("tool_calls_keep_last", &self.tool_calls_keep_last)
68 .field(
69 "assistant_no_tool_keep_last",
70 &self.assistant_no_tool_keep_last,
71 )
72 .field("microcompaction_policy", &self.microcompaction_policy)
73 .field("workspace", &self.workspace)
74 .field("session_memory", &self.session_memory)
75 .finish()
76 }
77}
78
79impl Default for MemoryManagerConfig {
80 fn default() -> Self {
81 Self {
82 compact_threshold: 250_000,
83 keep_recent_messages: 10,
84 model: String::new(),
85 model_context_window: 279_000,
86 reserved_output_tokens: 16_000,
87 autocompact_buffer_tokens: 13_000,
88 language: "zh-CN".to_string(),
89 warning_threshold_percentage: 90,
90 include_memory_warning: false,
91 summary_event_limit: 40,
92 summary_backend: None,
93 summary_model: None,
94 summary_callback: None,
95 tool_result_compact_threshold: 2_000,
96 tool_result_keep_last: 3,
97 tool_result_excerpt_head: 200,
98 tool_result_excerpt_tail: 200,
99 tool_calls_keep_last: 3,
100 assistant_no_tool_keep_last: 1,
101 microcompaction_policy: MicrocompactionPolicy::default(),
102 workspace: None,
103 session_memory: None,
104 }
105 }
106}