1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
7#[serde(rename_all = "lowercase")]
8pub enum EffortLevel {
9 Low,
11 Medium,
13 High,
15 Max,
17}
18
19impl EffortLevel {
20 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 pub fn temperature(&self) -> Option<f32> {
32 match self {
33 Self::Low => Some(0.3),
34 Self::Medium => None, 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()); }
84}