Skip to main content

cersei_agent/
effort.rs

1//! Effort levels: control thinking budget and temperature.
2
3use serde::{Deserialize, Serialize};
4
5/// Effort level controlling thinking depth and quality.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
7#[serde(rename_all = "lowercase")]
8pub enum EffortLevel {
9    /// Minimal thinking, fast responses.
10    Low,
11    /// Moderate thinking (default).
12    Medium,
13    /// Deep thinking for complex tasks.
14    High,
15    /// Maximum thinking budget.
16    Max,
17}
18
19impl EffortLevel {
20    /// Thinking budget in tokens for this effort level.
21    pub fn thinking_budget_tokens(&self) -> u32 {
22        match self {
23            Self::Low => 1024,
24            Self::Medium => 4096,
25            Self::High => 8192,
26            Self::Max => 32768,
27        }
28    }
29
30    /// Temperature override for this effort level.
31    pub fn temperature(&self) -> Option<f32> {
32        match self {
33            Self::Low => Some(0.3),
34            Self::Medium => None, // use default
35            Self::High => None,
36            Self::Max => Some(1.0),
37        }
38    }
39
40    pub fn from_str(s: &str) -> Self {
41        match s.to_lowercase().as_str() {
42            "low" | "min" => Self::Low,
43            "medium" | "med" | "default" => Self::Medium,
44            "high" => Self::High,
45            "max" | "maximum" => Self::Max,
46            _ => Self::Medium,
47        }
48    }
49}
50
51impl Default for EffortLevel {
52    fn default() -> Self {
53        Self::Medium
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::*;
60
61    #[test]
62    fn test_thinking_budget() {
63        assert!(
64            EffortLevel::Low.thinking_budget_tokens() < EffortLevel::High.thinking_budget_tokens()
65        );
66        assert!(
67            EffortLevel::High.thinking_budget_tokens() < EffortLevel::Max.thinking_budget_tokens()
68        );
69    }
70
71    #[test]
72    fn test_from_str() {
73        assert_eq!(EffortLevel::from_str("low"), EffortLevel::Low);
74        assert_eq!(EffortLevel::from_str("HIGH"), EffortLevel::High);
75        assert_eq!(EffortLevel::from_str("max"), EffortLevel::Max);
76        assert_eq!(EffortLevel::from_str("unknown"), EffortLevel::Medium);
77    }
78
79    #[test]
80    fn test_temperature() {
81        assert!(EffortLevel::Low.temperature().is_some());
82        assert!(EffortLevel::Medium.temperature().is_none()); // default
83    }
84}