vtcode_core/config/
context.rs

1use crate::config::constants::context as context_defaults;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Deserialize, Serialize)]
5pub struct LedgerConfig {
6    #[serde(default = "default_enabled")]
7    pub enabled: bool,
8    #[serde(default = "default_max_entries")]
9    pub max_entries: usize,
10    /// Inject ledger into the system prompt each turn
11    #[serde(default = "default_include_in_prompt")]
12    pub include_in_prompt: bool,
13    /// Preserve ledger entries during context compression
14    #[serde(default = "default_preserve_in_compression")]
15    pub preserve_in_compression: bool,
16}
17
18impl Default for LedgerConfig {
19    fn default() -> Self {
20        Self {
21            enabled: default_enabled(),
22            max_entries: default_max_entries(),
23            include_in_prompt: default_include_in_prompt(),
24            preserve_in_compression: default_preserve_in_compression(),
25        }
26    }
27}
28
29fn default_enabled() -> bool {
30    true
31}
32fn default_max_entries() -> usize {
33    12
34}
35fn default_include_in_prompt() -> bool {
36    true
37}
38fn default_preserve_in_compression() -> bool {
39    true
40}
41
42#[derive(Debug, Clone, Deserialize, Serialize)]
43pub struct TokenBudgetConfig {
44    /// Enable token budget tracking
45    #[serde(default = "default_token_budget_enabled")]
46    pub enabled: bool,
47    /// Model name for tokenizer selection
48    #[serde(default = "default_token_budget_model")]
49    pub model: String,
50    /// Warning threshold (0.0-1.0)
51    #[serde(default = "default_warning_threshold")]
52    pub warning_threshold: f64,
53    /// Compaction threshold (0.0-1.0)
54    #[serde(default = "default_compaction_threshold")]
55    pub compaction_threshold: f64,
56    /// Enable detailed component tracking
57    #[serde(default = "default_detailed_tracking")]
58    pub detailed_tracking: bool,
59}
60
61impl Default for TokenBudgetConfig {
62    fn default() -> Self {
63        Self {
64            enabled: default_token_budget_enabled(),
65            model: default_token_budget_model(),
66            warning_threshold: default_warning_threshold(),
67            compaction_threshold: default_compaction_threshold(),
68            detailed_tracking: default_detailed_tracking(),
69        }
70    }
71}
72
73fn default_token_budget_enabled() -> bool {
74    true
75}
76fn default_token_budget_model() -> String {
77    "gpt-4o-mini".to_string()
78}
79fn default_warning_threshold() -> f64 {
80    0.75
81}
82fn default_compaction_threshold() -> f64 {
83    0.85
84}
85fn default_detailed_tracking() -> bool {
86    false
87}
88
89#[derive(Debug, Clone, Deserialize, Serialize)]
90pub struct ContextCurationConfig {
91    /// Enable dynamic context curation
92    #[serde(default = "default_curation_enabled")]
93    pub enabled: bool,
94    /// Maximum tokens per turn
95    #[serde(default = "default_max_tokens_per_turn")]
96    pub max_tokens_per_turn: usize,
97    /// Number of recent messages to always include
98    #[serde(default = "default_preserve_recent_messages")]
99    pub preserve_recent_messages: usize,
100    /// Maximum tool descriptions to include
101    #[serde(default = "default_max_tool_descriptions")]
102    pub max_tool_descriptions: usize,
103    /// Include decision ledger summary
104    #[serde(default = "default_include_ledger")]
105    pub include_ledger: bool,
106    /// Maximum ledger entries
107    #[serde(default = "default_ledger_max_entries")]
108    pub ledger_max_entries: usize,
109    /// Include recent errors
110    #[serde(default = "default_include_recent_errors")]
111    pub include_recent_errors: bool,
112    /// Maximum recent errors to include
113    #[serde(default = "default_max_recent_errors")]
114    pub max_recent_errors: usize,
115}
116
117impl Default for ContextCurationConfig {
118    fn default() -> Self {
119        Self {
120            enabled: default_curation_enabled(),
121            max_tokens_per_turn: default_max_tokens_per_turn(),
122            preserve_recent_messages: default_preserve_recent_messages(),
123            max_tool_descriptions: default_max_tool_descriptions(),
124            include_ledger: default_include_ledger(),
125            ledger_max_entries: default_ledger_max_entries(),
126            include_recent_errors: default_include_recent_errors(),
127            max_recent_errors: default_max_recent_errors(),
128        }
129    }
130}
131
132fn default_curation_enabled() -> bool {
133    true
134}
135fn default_max_tokens_per_turn() -> usize {
136    100_000
137}
138fn default_preserve_recent_messages() -> usize {
139    5
140}
141fn default_max_tool_descriptions() -> usize {
142    10
143}
144fn default_include_ledger() -> bool {
145    true
146}
147fn default_ledger_max_entries() -> usize {
148    12
149}
150fn default_include_recent_errors() -> bool {
151    true
152}
153fn default_max_recent_errors() -> usize {
154    3
155}
156
157#[derive(Debug, Clone, Deserialize, Serialize)]
158pub struct ContextFeaturesConfig {
159    #[serde(default)]
160    pub ledger: LedgerConfig,
161    #[serde(default)]
162    pub token_budget: TokenBudgetConfig,
163    #[serde(default)]
164    pub curation: ContextCurationConfig,
165    #[serde(default = "default_max_context_tokens")]
166    pub max_context_tokens: usize,
167    #[serde(default = "default_trim_to_percent")]
168    pub trim_to_percent: u8,
169    #[serde(default = "default_preserve_recent_turns")]
170    pub preserve_recent_turns: usize,
171}
172
173impl Default for ContextFeaturesConfig {
174    fn default() -> Self {
175        Self {
176            ledger: LedgerConfig::default(),
177            token_budget: TokenBudgetConfig::default(),
178            curation: ContextCurationConfig::default(),
179            max_context_tokens: default_max_context_tokens(),
180            trim_to_percent: default_trim_to_percent(),
181            preserve_recent_turns: default_preserve_recent_turns(),
182        }
183    }
184}
185
186fn default_max_context_tokens() -> usize {
187    context_defaults::DEFAULT_MAX_TOKENS
188}
189
190fn default_trim_to_percent() -> u8 {
191    context_defaults::DEFAULT_TRIM_TO_PERCENT
192}
193
194fn default_preserve_recent_turns() -> usize {
195    context_defaults::DEFAULT_PRESERVE_RECENT_TURNS
196}