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::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 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 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 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 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 pub fn generation(&self) -> &'static str {
96 if let Some(meta) = self.openrouter_metadata() {
97 return meta.generation;
98 }
99 match self {
100 ModelId::Gemini31ProPreview | ModelId::Gemini31ProPreviewCustomTools => "3.1",
102 ModelId::Gemini3ProPreview | ModelId::Gemini3FlashPreview => "3",
103 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 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 ModelId::DeepSeekChat | ModelId::DeepSeekReasoner => "V3.2-Exp",
120 ModelId::XaiGrok4
122 | ModelId::XaiGrok4Mini
123 | ModelId::XaiGrok4Code
124 | ModelId::XaiGrok4CodeLatest
125 | ModelId::XaiGrok4Vision => "4",
126 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}