vtcode_config/constants/
tool_limits.rs1pub const DEFAULT_MAX_TOOL_CALLS_PER_TURN: usize = 120;
3pub const DEFAULT_SAFETY_MAX_TOOL_CALLS_PER_SESSION: usize = 100;
5pub const DEFAULT_MAX_TOOL_LOOPS: usize = 60;
7pub const DEFAULT_FULL_AUTO_MAX_TURNS: usize = 100;
9pub const DEFAULT_MAX_CONVERSATION_TURNS: usize = 150;
12
13pub const PLANNING_WORKFLOW_MIN_TOOL_CALLS_PER_TURN: usize = 120;
15pub const APPROVED_PLAN_MIN_TOOL_CALLS_PER_TURN: usize = 120;
17
18pub const MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP: usize = 120;
20pub const MAX_TOOL_LOOP_CAP_MULTIPLIER: usize = 3;
22pub const MAX_TOOL_LOOP_INCREMENT_PER_PROMPT: usize = 50;
24pub const APPROVED_PLAN_TOOL_LOOP_INCREMENT: usize = 50;
28pub const PLANNING_WORKFLOW_MIN_TOOL_LOOPS: usize = 60;
30pub const PLANNING_WORKFLOW_MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP: usize = 240;
32pub const PLANNING_WORKFLOW_TOOL_LOOP_CAP_MULTIPLIER: usize = 6;
34pub const PLANNING_WORKFLOW_MAX_TOOL_LOOP_INCREMENT_PER_PROMPT: usize = 80;
36
37pub const MAX_SESSION_AUTO_GRANT_TOTAL_HEADROOM: usize = 2000;
44
45pub const MAX_CONTROL_PLANE_TOOL_CALLS_PER_TURN: usize = 64;
54
55#[inline]
61pub const fn session_auto_grant_increment(already_auto_granted: usize, requested: usize) -> usize {
62 let remaining = MAX_SESSION_AUTO_GRANT_TOTAL_HEADROOM.saturating_sub(already_auto_granted);
63 if remaining == 0 {
64 return 0;
65 }
66 if requested > remaining {
67 return remaining;
68 }
69 requested
70}
71
72pub const fn tool_loop_hard_cap(base_limit: usize, planning_active: bool) -> usize {
76 if planning_active {
77 if base_limit >= PLANNING_WORKFLOW_MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP {
78 return base_limit;
79 }
80 let scaled = base_limit.saturating_mul(PLANNING_WORKFLOW_TOOL_LOOP_CAP_MULTIPLIER);
81 if scaled > PLANNING_WORKFLOW_MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP {
82 return PLANNING_WORKFLOW_MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP;
83 }
84 return scaled;
85 }
86 if base_limit >= MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP {
87 return base_limit;
88 }
89 let scaled = base_limit.saturating_mul(MAX_TOOL_LOOP_CAP_MULTIPLIER);
90 if scaled > MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP {
91 return MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP;
92 }
93 scaled
94}
95
96const _: () = {
101 assert!(MAX_CONTROL_PLANE_TOOL_CALLS_PER_TURN < DEFAULT_MAX_TOOL_CALLS_PER_TURN);
102 assert!(MAX_CONTROL_PLANE_TOOL_CALLS_PER_TURN >= 32);
103};
104
105#[cfg(test)]
106mod tests {
107 use super::*;
108
109 #[test]
110 fn default_execution_loop_budgets_are_moderate_and_bounded() {
111 assert_eq!(DEFAULT_MAX_TOOL_CALLS_PER_TURN, 120);
112 assert_eq!(DEFAULT_MAX_TOOL_LOOPS, 60);
113 assert_eq!(DEFAULT_FULL_AUTO_MAX_TURNS, 100);
114 assert_eq!(DEFAULT_MAX_CONVERSATION_TURNS, 150);
115 }
116
117 #[test]
118 fn planning_and_approved_plan_budgets_are_explicitly_separate() {
119 assert_eq!(PLANNING_WORKFLOW_MIN_TOOL_CALLS_PER_TURN, 120);
120 assert_eq!(APPROVED_PLAN_MIN_TOOL_CALLS_PER_TURN, 120);
121 assert_eq!(PLANNING_WORKFLOW_MIN_TOOL_LOOPS, 60);
122 assert_eq!(MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP, 120);
123 assert_eq!(PLANNING_WORKFLOW_MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP, 240);
124 assert_eq!(APPROVED_PLAN_TOOL_LOOP_INCREMENT, 50);
125 }
126
127 #[test]
128 fn control_plane_exempt_budget_is_bounded_but_generous() {
129 assert_eq!(MAX_CONTROL_PLANE_TOOL_CALLS_PER_TURN, 64);
133 }
134
135 #[test]
136 fn tool_loop_hard_cap_scales_and_bounds() {
137 assert_eq!(tool_loop_hard_cap(20, false), 60);
138 assert_eq!(tool_loop_hard_cap(40, false), 120);
139 assert_eq!(tool_loop_hard_cap(60, false), 120);
140 assert_eq!(tool_loop_hard_cap(120, false), 120);
141 assert_eq!(tool_loop_hard_cap(200, false), 200);
142 assert_eq!(tool_loop_hard_cap(0, false), 0);
143 assert_eq!(tool_loop_hard_cap(40, true), 240);
144 assert_eq!(tool_loop_hard_cap(120, true), 240);
145 assert_eq!(tool_loop_hard_cap(300, true), 300);
146 }
147
148 #[test]
149 fn session_auto_grant_increment_bounds_total_headroom() {
150 assert_eq!(session_auto_grant_increment(0, 100), 100);
151 assert_eq!(session_auto_grant_increment(1950, 100), 50);
152 assert_eq!(session_auto_grant_increment(2000, 100), 0);
153 assert_eq!(session_auto_grant_increment(2500, 100), 0);
154 assert_eq!(session_auto_grant_increment(0, 0), 0);
155 }
156}