pub const DEFAULT_MAX_TOOL_CALLS_PER_TURN: usize = 120;
pub const DEFAULT_SAFETY_MAX_TOOL_CALLS_PER_SESSION: usize = 100;
pub const DEFAULT_MAX_TOOL_LOOPS: usize = 40;
pub const DEFAULT_FULL_AUTO_MAX_TURNS: usize = 100;
pub const DEFAULT_MAX_CONVERSATION_TURNS: usize = 150;
pub const PLANNING_WORKFLOW_MIN_TOOL_CALLS_PER_TURN: usize = 120;
pub const APPROVED_PLAN_MIN_TOOL_CALLS_PER_TURN: usize = 120;
pub const MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP: usize = 120;
pub const MAX_TOOL_LOOP_CAP_MULTIPLIER: usize = 3;
pub const MAX_TOOL_LOOP_INCREMENT_PER_PROMPT: usize = 50;
pub const APPROVED_PLAN_TOOL_LOOP_INCREMENT: usize = 50;
pub const PLANNING_WORKFLOW_MIN_TOOL_LOOPS: usize = 60;
pub const PLANNING_WORKFLOW_MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP: usize = 240;
pub const PLANNING_WORKFLOW_TOOL_LOOP_CAP_MULTIPLIER: usize = 6;
pub const PLANNING_WORKFLOW_MAX_TOOL_LOOP_INCREMENT_PER_PROMPT: usize = 80;
pub const fn tool_loop_hard_cap(base_limit: usize, planning_active: bool) -> usize {
if planning_active {
if base_limit >= PLANNING_WORKFLOW_MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP {
return base_limit;
}
let scaled = base_limit.saturating_mul(PLANNING_WORKFLOW_TOOL_LOOP_CAP_MULTIPLIER);
if scaled > PLANNING_WORKFLOW_MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP {
return PLANNING_WORKFLOW_MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP;
}
return scaled;
}
if base_limit >= MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP {
return base_limit;
}
let scaled = base_limit.saturating_mul(MAX_TOOL_LOOP_CAP_MULTIPLIER);
if scaled > MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP {
return MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP;
}
scaled
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_execution_loop_budgets_are_moderate_and_bounded() {
assert_eq!(DEFAULT_MAX_TOOL_CALLS_PER_TURN, 120);
assert_eq!(DEFAULT_MAX_TOOL_LOOPS, 40);
assert_eq!(DEFAULT_FULL_AUTO_MAX_TURNS, 100);
assert_eq!(DEFAULT_MAX_CONVERSATION_TURNS, 150);
}
#[test]
fn planning_and_approved_plan_budgets_are_explicitly_separate() {
assert_eq!(PLANNING_WORKFLOW_MIN_TOOL_CALLS_PER_TURN, 120);
assert_eq!(APPROVED_PLAN_MIN_TOOL_CALLS_PER_TURN, 120);
assert_eq!(PLANNING_WORKFLOW_MIN_TOOL_LOOPS, 60);
assert_eq!(MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP, 120);
assert_eq!(PLANNING_WORKFLOW_MAX_TOOL_LOOP_LIMIT_ABSOLUTE_CAP, 240);
assert_eq!(APPROVED_PLAN_TOOL_LOOP_INCREMENT, 50);
}
#[test]
fn tool_loop_hard_cap_scales_and_bounds() {
assert_eq!(tool_loop_hard_cap(20, false), 60);
assert_eq!(tool_loop_hard_cap(40, false), 120);
assert_eq!(tool_loop_hard_cap(120, false), 120);
assert_eq!(tool_loop_hard_cap(200, false), 200);
assert_eq!(tool_loop_hard_cap(0, false), 0);
assert_eq!(tool_loop_hard_cap(40, true), 240);
assert_eq!(tool_loop_hard_cap(120, true), 240);
assert_eq!(tool_loop_hard_cap(300, true), 300);
}
}