Skip to main content

vtcode_config/models/model_id/
capabilities.rs

1use super::ModelId;
2
3impl ModelId {
4    /// Check if this is a "flash" variant (optimized for speed)
5    pub fn is_flash_variant(&self) -> bool {
6        matches!(
7            self,
8            ModelId::Gemini3FlashPreview | ModelId::OllamaGemini3FlashPreviewCloud
9        )
10    }
11
12    /// Check if this is a "pro" variant (optimized for capability)
13    pub fn is_pro_variant(&self) -> bool {
14        matches!(
15            self,
16            ModelId::Gemini31ProPreview
17                | ModelId::Gemini31ProPreviewCustomTools
18                | ModelId::GPT5
19                | ModelId::GPT52
20                | ModelId::GPT53Codex
21                | ModelId::ClaudeOpus46
22                | ModelId::ClaudeSonnet46
23                | ModelId::ClaudeOpus41
24                | ModelId::DeepSeekReasoner
25                | ModelId::XaiGrok4
26                | ModelId::ZaiGlm5
27                | ModelId::MinimaxM25
28                | ModelId::OllamaGlm5Cloud
29                | ModelId::OllamaMinimaxM25Cloud
30        )
31    }
32
33    /// Check if this is an optimized/efficient variant
34    pub fn is_efficient_variant(&self) -> bool {
35        if let Some(meta) = self.openrouter_metadata() {
36            return meta.efficient;
37        }
38        matches!(
39            self,
40            ModelId::Gemini3FlashPreview
41                | ModelId::GPT5Mini
42                | ModelId::GPT5Nano
43                | ModelId::ClaudeHaiku45
44                | ModelId::ClaudeHaiku35
45                | ModelId::DeepSeekChat
46                | ModelId::XaiGrok4Code
47        )
48    }
49
50    /// Check if this is a top-tier model
51    pub fn is_top_tier(&self) -> bool {
52        if let Some(meta) = self.openrouter_metadata() {
53            return meta.top_tier;
54        }
55        matches!(
56            self,
57            ModelId::Gemini31ProPreview
58                | ModelId::Gemini31ProPreviewCustomTools
59                | ModelId::Gemini3FlashPreview
60                | ModelId::GPT5
61                | ModelId::GPT52
62                | ModelId::GPT53Codex
63                | ModelId::ClaudeOpus46
64                | ModelId::ClaudeSonnet46
65                | ModelId::ClaudeOpus45
66                | ModelId::ClaudeOpus41
67                | ModelId::ClaudeOpus4
68                | ModelId::ClaudeSonnet45
69                | ModelId::ClaudeSonnet4
70                | ModelId::ClaudeSonnet37
71                | ModelId::DeepSeekReasoner
72                | ModelId::XaiGrok4
73                | ModelId::XaiGrok4CodeLatest
74                | ModelId::ZaiGlm5
75        )
76    }
77
78    /// Determine whether the model is a reasoning-capable variant
79    pub fn is_reasoning_variant(&self) -> bool {
80        if let Some(meta) = self.openrouter_metadata() {
81            return meta.reasoning;
82        }
83        matches!(self, ModelId::ZaiGlm5) || self.provider().supports_reasoning_effort(self.as_str())
84    }
85
86    /// Determine whether the model supports tool calls/function execution
87    pub fn supports_tool_calls(&self) -> bool {
88        if let Some(meta) = self.openrouter_metadata() {
89            return meta.tool_call;
90        }
91        true
92    }
93
94    /// Get the generation/version string for this model
95    pub fn generation(&self) -> &'static str {
96        if let Some(meta) = self.openrouter_metadata() {
97            return meta.generation;
98        }
99        match self {
100            // Gemini generations
101            ModelId::Gemini31ProPreview | ModelId::Gemini31ProPreviewCustomTools => "3.1",
102            ModelId::Gemini3ProPreview | ModelId::Gemini3FlashPreview => "3",
103            // OpenAI generations
104            ModelId::GPT52 | ModelId::GPT52Codex => "5.2",
105            ModelId::GPT53Codex => "5.3",
106            ModelId::GPT5
107            | ModelId::GPT5Mini
108            | ModelId::GPT5Nano
109            | ModelId::OpenAIGptOss20b
110            | ModelId::OpenAIGptOss120b => "5",
111            // Anthropic generations
112            ModelId::ClaudeOpus46 | ModelId::ClaudeSonnet46 => "4.6",
113            ModelId::ClaudeOpus45 | ModelId::ClaudeSonnet45 | ModelId::ClaudeHaiku45 => "4.5",
114            ModelId::ClaudeOpus41 => "4.1",
115            ModelId::ClaudeOpus4 | ModelId::ClaudeSonnet4 => "4",
116            ModelId::ClaudeSonnet37 => "3.7",
117            ModelId::ClaudeHaiku35 => "3.5",
118            // DeepSeek generations
119            ModelId::DeepSeekChat | ModelId::DeepSeekReasoner => "V3.2-Exp",
120            // xAI generations
121            ModelId::XaiGrok4
122            | ModelId::XaiGrok4Mini
123            | ModelId::XaiGrok4Code
124            | ModelId::XaiGrok4CodeLatest
125            | ModelId::XaiGrok4Vision => "4",
126            // Z.AI generations
127            ModelId::ZaiGlm5 => "GLM-5",
128            ModelId::OllamaGptOss20b => "oss",
129            ModelId::OllamaGptOss20bCloud => "oss-cloud",
130            ModelId::OllamaGptOss120bCloud => "oss-cloud",
131            ModelId::OllamaQwen317b => "oss",
132            ModelId::OllamaDeepseekV32Cloud => "deepseek-v3.2",
133            ModelId::OllamaQwen3Next80bCloud => "qwen3-next",
134            ModelId::OllamaMistralLarge3675bCloud => "mistral-large-3",
135            ModelId::OllamaQwen3Coder480bCloud => "qwen3-coder-cloud",
136            ModelId::OllamaMinimaxM2Cloud => "minimax-cloud",
137            ModelId::OllamaMinimaxM25Cloud => "minimax-cloud",
138            ModelId::OllamaGlm5Cloud => "glm-5-cloud",
139            ModelId::OllamaGemini3ProPreviewLatestCloud => "gemini-3-pro-cloud",
140            ModelId::OllamaGemini3FlashPreviewCloud => "gemini-3-flash-cloud",
141            ModelId::OllamaNemotron3Nano30bCloud => "nemotron-cloud",
142            ModelId::OllamaDevstral2123bCloud => "devstral-cloud",
143            ModelId::LmStudioMetaLlama38BInstruct => "meta-llama-3",
144            ModelId::LmStudioMetaLlama318BInstruct => "meta-llama-3.1",
145            ModelId::LmStudioQwen257BInstruct => "qwen2.5",
146            ModelId::LmStudioGemma22BIt => "gemma-2",
147            ModelId::LmStudioGemma29BIt => "gemma-2",
148            ModelId::LmStudioPhi31Mini4kInstruct => "phi-3.1",
149            ModelId::MinimaxM25
150            | ModelId::HuggingFaceMinimaxM25Novita
151            | ModelId::MoonshotMinimaxM25
152            | ModelId::OpenRouterMinimaxM25 => "M2.5",
153            ModelId::MinimaxM2 => "M2",
154            ModelId::HuggingFaceDeepseekV32 | ModelId::HuggingFaceDeepseekV32Novita => "v3.2",
155            ModelId::HuggingFaceXiaomiMimoV2FlashNovita => "v2-flash",
156            ModelId::HuggingFaceQwen3CoderNextNovita
157            | ModelId::OpenRouterQwen3CoderNext
158            | ModelId::MoonshotQwen3CoderNext => "qwen3-coder-next",
159            ModelId::HuggingFaceGlm5Novita => "GLM-5",
160            ModelId::HuggingFaceOpenAIGptOss20b | ModelId::HuggingFaceOpenAIGptOss120b => "oss",
161            _ => unreachable!(),
162        }
163    }
164}