claude_agent/models/
family.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
4#[serde(rename_all = "lowercase")]
5pub enum ModelFamily {
6    Opus,
7    Sonnet,
8    Haiku,
9}
10
11impl ModelFamily {
12    pub fn aliases(&self) -> &'static [&'static str] {
13        match self {
14            Self::Opus => &["opus", "reasoning", "large"],
15            Self::Sonnet => &["sonnet", "default", "primary", "balanced"],
16            Self::Haiku => &["haiku", "small", "fast"],
17        }
18    }
19
20    pub fn default_role(&self) -> ModelRole {
21        match self {
22            Self::Opus => ModelRole::Reasoning,
23            Self::Sonnet => ModelRole::Primary,
24            Self::Haiku => ModelRole::Small,
25        }
26    }
27}
28
29#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
30#[serde(rename_all = "lowercase")]
31pub enum ModelRole {
32    Primary,
33    Small,
34    Reasoning,
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test_family_aliases() {
43        assert!(ModelFamily::Sonnet.aliases().contains(&"sonnet"));
44        assert!(ModelFamily::Haiku.aliases().contains(&"fast"));
45        assert!(ModelFamily::Opus.aliases().contains(&"reasoning"));
46    }
47
48    #[test]
49    fn test_default_roles() {
50        assert_eq!(ModelFamily::Sonnet.default_role(), ModelRole::Primary);
51        assert_eq!(ModelFamily::Haiku.default_role(), ModelRole::Small);
52        assert_eq!(ModelFamily::Opus.default_role(), ModelRole::Reasoning);
53    }
54}