vtcode_config/models/model_id/
capabilities.rs1use super::ModelId;
2
3impl ModelId {
4 pub fn is_flash_variant(&self) -> bool {
6 matches!(
7 self,
8 ModelId::Gemini3FlashPreview | ModelId::OllamaGemini3FlashPreviewCloud
9 )
10 }
11
12 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 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 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 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 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 pub fn generation(&self) -> &'static str {
90 if let Some(meta) = self.openrouter_metadata() {
91 return meta.generation;
92 }
93 match self {
94 ModelId::Gemini3ProPreview | ModelId::Gemini3FlashPreview => "3",
96 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 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 ModelId::DeepSeekChat | ModelId::DeepSeekReasoner => "V3.2-Exp",
118 ModelId::XaiGrok4
120 | ModelId::XaiGrok4Mini
121 | ModelId::XaiGrok4Code
122 | ModelId::XaiGrok4CodeLatest
123 | ModelId::XaiGrok4Vision => "4",
124 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}