Skip to main content

agentik_sdk/types/
models.rs

1use serde::{Deserialize, Serialize};
2
3/// Supported Claude model variants
4#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
5pub enum Model {
6    // Claude 3.5 Sonnet models
7    #[serde(rename = "claude-3-5-sonnet-latest")]
8    Claude3_5SonnetLatest,
9    #[serde(rename = "claude-3-5-sonnet-20241022")]
10    Claude3_5Sonnet20241022,
11    #[serde(rename = "claude-3-5-sonnet-20240620")]
12    Claude3_5Sonnet20240620,
13
14    // Claude 3.5 Haiku models
15    #[serde(rename = "claude-3-5-haiku-latest")]
16    Claude3_5HaikuLatest,
17    #[serde(rename = "claude-3-5-haiku-20241022")]
18    Claude3_5Haiku20241022,
19
20    // Claude 3 Opus models
21    #[serde(rename = "claude-3-opus-latest")]
22    Claude3OpusLatest,
23    #[serde(rename = "claude-3-opus-20240229")]
24    Claude3Opus20240229,
25
26    // Claude 3 Sonnet models
27    #[serde(rename = "claude-3-sonnet-20240229")]
28    Claude3Sonnet20240229,
29
30    // Claude 3 Haiku models
31    #[serde(rename = "claude-3-haiku-20240307")]
32    Claude3Haiku20240307,
33
34    // Legacy Claude 2 models
35    #[serde(rename = "claude-2.1")]
36    Claude2_1,
37    #[serde(rename = "claude-2.0")]
38    Claude2_0,
39}
40
41impl Model {
42    /// Get the string representation of the model
43    pub fn as_str(&self) -> &'static str {
44        match self {
45            Self::Claude3_5SonnetLatest => "claude-3-5-sonnet-latest",
46            Self::Claude3_5Sonnet20241022 => "claude-3-5-sonnet-20241022",
47            Self::Claude3_5Sonnet20240620 => "claude-3-5-sonnet-20240620",
48            Self::Claude3_5HaikuLatest => "claude-3-5-haiku-latest",
49            Self::Claude3_5Haiku20241022 => "claude-3-5-haiku-20241022",
50            Self::Claude3OpusLatest => "claude-3-opus-latest",
51            Self::Claude3Opus20240229 => "claude-3-opus-20240229",
52            Self::Claude3Sonnet20240229 => "claude-3-sonnet-20240229",
53            Self::Claude3Haiku20240307 => "claude-3-haiku-20240307",
54            Self::Claude2_1 => "claude-2.1",
55            Self::Claude2_0 => "claude-2.0",
56        }
57    }
58
59    /// Get the family of the model (e.g., "sonnet", "haiku", "opus")
60    pub fn family(&self) -> &'static str {
61        match self {
62            Self::Claude3_5SonnetLatest
63            | Self::Claude3_5Sonnet20241022
64            | Self::Claude3_5Sonnet20240620
65            | Self::Claude3Sonnet20240229 => "sonnet",
66            Self::Claude3_5HaikuLatest
67            | Self::Claude3_5Haiku20241022
68            | Self::Claude3Haiku20240307 => "haiku",
69            Self::Claude3OpusLatest | Self::Claude3Opus20240229 => "opus",
70            Self::Claude2_1 | Self::Claude2_0 => "claude-2",
71        }
72    }
73
74    /// Check if this model supports vision (image inputs)
75    pub fn supports_vision(&self) -> bool {
76        match self {
77            Self::Claude2_1 | Self::Claude2_0 => false,
78            _ => true,
79        }
80    }
81
82    /// Check if this model supports tool use
83    pub fn supports_tools(&self) -> bool {
84        match self {
85            Self::Claude2_1 | Self::Claude2_0 => false,
86            _ => true,
87        }
88    }
89}
90
91impl std::fmt::Display for Model {
92    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
93        write!(f, "{}", self.as_str())
94    }
95}
96
97impl From<Model> for String {
98    fn from(model: Model) -> String {
99        model.as_str().to_string()
100    }
101}
102