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