1use std::borrow::Cow;
5use std::sync::LazyLock;
6use crate::ReasoningEffort;
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8pub enum AnthropicModel {
9 Claude35Haiku20241022,
10 Claude35Sonnet20240620,
11 Claude35Sonnet20241022,
12 Claude37Sonnet20250219,
13 Claude3Haiku20240307,
14 Claude3Opus20240229,
15 Claude3Sonnet20240229,
16 ClaudeHaiku45,
17 ClaudeHaiku4520251001,
18 ClaudeOpus40,
19 ClaudeOpus41,
20 ClaudeOpus4120250805,
21 ClaudeOpus420250514,
22 ClaudeOpus45,
23 ClaudeOpus4520251101,
24 ClaudeOpus46,
25 ClaudeOpus47,
26 ClaudeSonnet40,
27 ClaudeSonnet420250514,
28 ClaudeSonnet45,
29 ClaudeSonnet4520250929,
30 ClaudeSonnet46,
31}
32#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
33pub enum CodexModel {
34 Gpt5,
35 Gpt5Codex,
36 Gpt51,
37 Gpt51Codex,
38 Gpt51CodexMax,
39 Gpt51CodexMini,
40 Gpt52,
41 Gpt52Codex,
42 Gpt52Pro,
43 Gpt53Codex,
44 Gpt53CodexSpark,
45 Gpt54,
46 Gpt54Mini,
47 Gpt54Nano,
48 Gpt54Pro,
49 Gpt55,
50 Gpt55Pro,
51}
52#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
53pub enum DeepSeekModel {
54 DeepseekChat,
55 DeepseekReasoner,
56 DeepseekV4Flash,
57 DeepseekV4Pro,
58}
59#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
60pub enum GeminiModel {
61 Gemini15Flash,
62 Gemini15Flash8b,
63 Gemini15Pro,
64 Gemini20Flash,
65 Gemini20FlashLite,
66 Gemini25Flash,
67 Gemini25FlashLite,
68 Gemini25FlashLitePreview0617,
69 Gemini25FlashLitePreview092025,
70 Gemini25FlashPreview0417,
71 Gemini25FlashPreview0520,
72 Gemini25FlashPreview092025,
73 Gemini25Pro,
74 Gemini25ProPreview0506,
75 Gemini25ProPreview0605,
76 Gemini3FlashPreview,
77 Gemini3ProPreview,
78 Gemini31FlashLite,
79 Gemini31FlashLitePreview,
80 Gemini31ProPreview,
81 Gemini31ProPreviewCustomtools,
82 Gemini35Flash,
83 GeminiLive25Flash,
84 GeminiLive25FlashPreviewNativeAudio,
85 Gemma327bIt,
86 Gemma426bA4bIt,
87 Gemma431bIt,
88}
89#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
90pub enum MoonshotModel {
91 KimiK20711Preview,
92 KimiK20905Preview,
93 KimiK2Thinking,
94 KimiK2ThinkingTurbo,
95 KimiK2TurboPreview,
96 KimiK25,
97 KimiK26,
98}
99#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
100pub enum OpenaiModel {
101 Gpt4,
102 Gpt4Turbo,
103 Gpt41,
104 Gpt41Mini,
105 Gpt41Nano,
106 Gpt4o,
107 Gpt4o20240513,
108 Gpt4o20240806,
109 Gpt4o20241120,
110 Gpt4oMini,
111 Gpt5,
112 Gpt5Codex,
113 Gpt5Mini,
114 Gpt5Nano,
115 Gpt5Pro,
116 Gpt51,
117 Gpt51Codex,
118 Gpt51CodexMax,
119 Gpt51CodexMini,
120 Gpt52,
121 Gpt52Codex,
122 Gpt52Pro,
123 Gpt53Codex,
124 Gpt53CodexSpark,
125 Gpt54,
126 Gpt54Mini,
127 Gpt54Nano,
128 Gpt54Pro,
129 Gpt55,
130 Gpt55Pro,
131 O1,
132 O1Pro,
133 O3,
134 O3DeepResearch,
135 O3Mini,
136 O3Pro,
137 O4Mini,
138 O4MiniDeepResearch,
139}
140#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
141pub enum OpenRouterModel {
142 Ai21JambaLarge17,
143 AlibabaTongyiDeepresearch30bA3b,
144 AmazonNova2LiteV1,
145 AmazonNovaLiteV1,
146 AmazonNovaMicroV1,
147 AmazonNovaPremierV1,
148 AmazonNovaProV1,
149 AnthropicClaude3Haiku,
150 AnthropicClaude35Haiku,
151 AnthropicClaudeHaiku45,
152 AnthropicClaudeOpus4,
153 AnthropicClaudeOpus41,
154 AnthropicClaudeOpus45,
155 AnthropicClaudeOpus46,
156 AnthropicClaudeOpus46Fast,
157 AnthropicClaudeOpus47,
158 AnthropicClaudeOpus47Fast,
159 AnthropicClaudeSonnet4,
160 AnthropicClaudeSonnet45,
161 AnthropicClaudeSonnet46,
162 ArceeAiTrinityLargePreview,
163 ArceeAiTrinityLargeThinking,
164 ArceeAiTrinityLargeThinkingFree,
165 ArceeAiTrinityMini,
166 ArceeAiVirtuosoLarge,
167 BaiduCobuddyFree,
168 BaiduErnie4521bA3b,
169 BaiduErnie45Vl28bA3b,
170 BytedanceSeedSeed16,
171 BytedanceSeedSeed16Flash,
172 BytedanceSeedSeed20Lite,
173 BytedanceSeedSeed20Mini,
174 CohereCommandR082024,
175 CohereCommandRPlus082024,
176 DeepseekDeepseekChat,
177 DeepseekDeepseekChatV30324,
178 DeepseekDeepseekChatV31,
179 DeepseekDeepseekR1,
180 DeepseekDeepseekR10528,
181 DeepseekDeepseekV31Terminus,
182 DeepseekDeepseekV32,
183 DeepseekDeepseekV32Exp,
184 DeepseekDeepseekV4Flash,
185 DeepseekDeepseekV4FlashFree,
186 DeepseekDeepseekV4Pro,
187 EssentialaiRnj1Instruct,
188 GoogleGemini20Flash001,
189 GoogleGemini20FlashLite001,
190 GoogleGemini25Flash,
191 GoogleGemini25FlashLite,
192 GoogleGemini25FlashLitePreview092025,
193 GoogleGemini25Pro,
194 GoogleGemini25ProPreview,
195 GoogleGemini25ProPreview0506,
196 GoogleGemini3FlashPreview,
197 GoogleGemini31FlashLite,
198 GoogleGemini31FlashLitePreview,
199 GoogleGemini31ProPreview,
200 GoogleGemini31ProPreviewCustomtools,
201 GoogleGemini35Flash,
202 GoogleGemma312bIt,
203 GoogleGemma327bIt,
204 GoogleGemma426bA4bIt,
205 GoogleGemma426bA4bItFree,
206 GoogleGemma431bIt,
207 GoogleGemma431bItFree,
208 IbmGraniteGranite418b,
209 InceptionMercury2,
210 InclusionaiLing261t,
211 InclusionaiLing26Flash,
212 InclusionaiRing261t,
213 KwaipilotKatCoderProV2,
214 MetaLlamaLlama3170bInstruct,
215 MetaLlamaLlama318bInstruct,
216 MetaLlamaLlama3370bInstruct,
217 MetaLlamaLlama3370bInstructFree,
218 MetaLlamaLlama4Scout,
219 MinimaxMinimaxM1,
220 MinimaxMinimaxM2,
221 MinimaxMinimaxM21,
222 MinimaxMinimaxM25,
223 MinimaxMinimaxM25Free,
224 MinimaxMinimaxM27,
225 MistralaiCodestral2508,
226 MistralaiDevstral2512,
227 MistralaiDevstralMedium,
228 MistralaiDevstralSmall,
229 MistralaiMinistral14b2512,
230 MistralaiMinistral3b2512,
231 MistralaiMinistral8b2512,
232 MistralaiMistralLarge,
233 MistralaiMistralLarge2407,
234 MistralaiMistralLarge2411,
235 MistralaiMistralLarge2512,
236 MistralaiMistralMedium3,
237 MistralaiMistralMedium35,
238 MistralaiMistralMedium31,
239 MistralaiMistralNemo,
240 MistralaiMistralSaba,
241 MistralaiMistralSmall2603,
242 MistralaiMistralSmall3224bInstruct,
243 MistralaiMixtral8x22bInstruct,
244 MistralaiPixtralLarge2411,
245 MistralaiVoxtralSmall24b2507,
246 MoonshotaiKimiK2,
247 MoonshotaiKimiK20905,
248 MoonshotaiKimiK2Thinking,
249 MoonshotaiKimiK25,
250 MoonshotaiKimiK26,
251 NexAgiDeepseekV31NexN1,
252 NvidiaLlama33NemotronSuper49bV15,
253 NvidiaNemotron3Nano30bA3b,
254 NvidiaNemotron3Nano30bA3bFree,
255 NvidiaNemotron3NanoOmni30bA3bReasoningFree,
256 NvidiaNemotron3Super120bA12b,
257 NvidiaNemotron3Super120bA12bFree,
258 NvidiaNemotronNano12bV2VlFree,
259 NvidiaNemotronNano9bV2,
260 NvidiaNemotronNano9bV2Free,
261 OpenaiGpt35Turbo,
262 OpenaiGpt35Turbo0613,
263 OpenaiGpt35Turbo16k,
264 OpenaiGpt4,
265 OpenaiGpt40314,
266 OpenaiGpt41106Preview,
267 OpenaiGpt4Turbo,
268 OpenaiGpt4TurboPreview,
269 OpenaiGpt41,
270 OpenaiGpt41Mini,
271 OpenaiGpt41Nano,
272 OpenaiGpt4o,
273 OpenaiGpt4o20240513,
274 OpenaiGpt4o20240806,
275 OpenaiGpt4o20241120,
276 OpenaiGpt4oAudioPreview,
277 OpenaiGpt4oMini,
278 OpenaiGpt4oMini20240718,
279 OpenaiGpt5,
280 OpenaiGpt5Codex,
281 OpenaiGpt5Mini,
282 OpenaiGpt5Nano,
283 OpenaiGpt5Pro,
284 OpenaiGpt51,
285 OpenaiGpt51Chat,
286 OpenaiGpt51Codex,
287 OpenaiGpt51CodexMax,
288 OpenaiGpt51CodexMini,
289 OpenaiGpt52,
290 OpenaiGpt52Chat,
291 OpenaiGpt52Codex,
292 OpenaiGpt52Pro,
293 OpenaiGpt53Chat,
294 OpenaiGpt53Codex,
295 OpenaiGpt54,
296 OpenaiGpt54Mini,
297 OpenaiGpt54Nano,
298 OpenaiGpt54Pro,
299 OpenaiGpt55,
300 OpenaiGpt55Pro,
301 OpenaiGptAudio,
302 OpenaiGptAudioMini,
303 OpenaiGptOss120b,
304 OpenaiGptOss120bFree,
305 OpenaiGptOss20b,
306 OpenaiGptOss20bFree,
307 OpenaiGptOssSafeguard20b,
308 OpenaiO1,
309 OpenaiO3,
310 OpenaiO3DeepResearch,
311 OpenaiO3Mini,
312 OpenaiO3MiniHigh,
313 OpenaiO3Pro,
314 OpenaiO4Mini,
315 OpenaiO4MiniDeepResearch,
316 OpenaiO4MiniHigh,
317 OpenrouterAuto,
318 OpenrouterFree,
319 OpenrouterOwlAlpha,
320 PoolsideLagunaM1Free,
321 PoolsideLagunaXs2Free,
322 PrimeIntellectIntellect3,
323 QwenQwen2572bInstruct,
324 QwenQwen257bInstruct,
325 QwenQwenPlus,
326 QwenQwenPlus20250728,
327 QwenQwenPlus20250728Thinking,
328 QwenQwen314b,
329 QwenQwen3235bA22b,
330 QwenQwen3235bA22b2507,
331 QwenQwen3235bA22bThinking2507,
332 QwenQwen330bA3b,
333 QwenQwen330bA3bInstruct2507,
334 QwenQwen330bA3bThinking2507,
335 QwenQwen332b,
336 QwenQwen38b,
337 QwenQwen3Coder,
338 QwenQwen3Coder30bA3bInstruct,
339 QwenQwen3CoderFlash,
340 QwenQwen3CoderNext,
341 QwenQwen3CoderPlus,
342 QwenQwen3CoderFree,
343 QwenQwen3Max,
344 QwenQwen3MaxThinking,
345 QwenQwen3Next80bA3bInstruct,
346 QwenQwen3Next80bA3bInstructFree,
347 QwenQwen3Next80bA3bThinking,
348 QwenQwen3Vl235bA22bInstruct,
349 QwenQwen3Vl235bA22bThinking,
350 QwenQwen3Vl30bA3bInstruct,
351 QwenQwen3Vl30bA3bThinking,
352 QwenQwen3Vl32bInstruct,
353 QwenQwen3Vl8bInstruct,
354 QwenQwen3Vl8bThinking,
355 QwenQwen35122bA10b,
356 QwenQwen3527b,
357 QwenQwen3535bA3b,
358 QwenQwen35397bA17b,
359 QwenQwen359b,
360 QwenQwen35Flash0223,
361 QwenQwen35Plus0215,
362 QwenQwen35Plus20260420,
363 QwenQwen3627b,
364 QwenQwen3635bA3b,
365 QwenQwen36Flash,
366 QwenQwen36MaxPreview,
367 QwenQwen36Plus,
368 RekaaiRekaEdge,
369 RelaceRelaceSearch,
370 Sao10kL3Euryale70b,
371 Sao10kL31Euryale70b,
372 StepfunStep35Flash,
373 TencentHy3Preview,
374 ThedrummerRocinante12b,
375 ThedrummerUnslopnemo12b,
376 UpstageSolarPro3,
377 XAiGrok420,
378 XAiGrok43,
379 XiaomiMimoV2Flash,
380 XiaomiMimoV2Omni,
381 XiaomiMimoV2Pro,
382 XiaomiMimoV25,
383 XiaomiMimoV25Pro,
384 ZAiGlm432b,
385 ZAiGlm45,
386 ZAiGlm45Air,
387 ZAiGlm45AirFree,
388 ZAiGlm45v,
389 ZAiGlm46,
390 ZAiGlm46v,
391 ZAiGlm47,
392 ZAiGlm47Flash,
393 ZAiGlm5,
394 ZAiGlm5Turbo,
395 ZAiGlm51,
396 ZAiGlm5vTurbo,
397}
398#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
399pub enum ZAiModel {
400 Glm45,
401 Glm45Air,
402 Glm45Flash,
403 Glm45v,
404 Glm46,
405 Glm46v,
406 Glm47,
407 Glm47Flash,
408 Glm47Flashx,
409 Glm5,
410 Glm5Turbo,
411 Glm51,
412 Glm5vTurbo,
413}
414#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
415pub enum BedrockFoundationModel {
416 AmazonNova2LiteV10,
417 AmazonNovaLiteV10,
418 AmazonNovaMicroV10,
419 AmazonNovaProV10,
420 AnthropicClaudeHaiku4520251001V10,
421 AnthropicClaudeOpus4120250805V10,
422 AnthropicClaudeOpus4520251101V10,
423 AnthropicClaudeOpus46V1,
424 AnthropicClaudeOpus47,
425 AnthropicClaudeSonnet4520250929V10,
426 AnthropicClaudeSonnet46,
427 AuAnthropicClaudeHaiku4520251001V10,
428 AuAnthropicClaudeOpus46V1,
429 AuAnthropicClaudeSonnet4520250929V10,
430 AuAnthropicClaudeSonnet46,
431 DeepseekR1V10,
432 DeepseekV3V10,
433 DeepseekV32,
434 EuAnthropicClaudeHaiku4520251001V10,
435 EuAnthropicClaudeOpus4520251101V10,
436 EuAnthropicClaudeOpus46V1,
437 EuAnthropicClaudeOpus47,
438 EuAnthropicClaudeSonnet4520250929V10,
439 EuAnthropicClaudeSonnet46,
440 GlobalAnthropicClaudeHaiku4520251001V10,
441 GlobalAnthropicClaudeOpus4520251101V10,
442 GlobalAnthropicClaudeOpus46V1,
443 GlobalAnthropicClaudeOpus47,
444 GlobalAnthropicClaudeSonnet4520250929V10,
445 GlobalAnthropicClaudeSonnet46,
446 GoogleGemma327bIt,
447 GoogleGemma34bIt,
448 JpAnthropicClaudeOpus47,
449 JpAnthropicClaudeSonnet4520250929V10,
450 JpAnthropicClaudeSonnet46,
451 MetaLlama3170bInstructV10,
452 MetaLlama318bInstructV10,
453 MetaLlama3370bInstructV10,
454 MetaLlama4Maverick17bInstructV10,
455 MetaLlama4Scout17bInstructV10,
456 MinimaxMinimaxM2,
457 MinimaxMinimaxM21,
458 MinimaxMinimaxM25,
459 MistralDevstral2123b,
460 MistralMagistralSmall2509,
461 MistralMinistral314bInstruct,
462 MistralMinistral33bInstruct,
463 MistralMinistral38bInstruct,
464 MistralMistralLarge3675bInstruct,
465 MistralPixtralLarge2502V10,
466 MistralVoxtralMini3b2507,
467 MistralVoxtralSmall24b2507,
468 MoonshotKimiK2Thinking,
469 MoonshotaiKimiK25,
470 NvidiaNemotronNano12bV2,
471 NvidiaNemotronNano330b,
472 NvidiaNemotronNano9bV2,
473 NvidiaNemotronSuper3120b,
474 OpenaiGptOss120b10,
475 OpenaiGptOss20b10,
476 OpenaiGptOssSafeguard120b,
477 OpenaiGptOssSafeguard20b,
478 QwenQwen3235bA22b2507V10,
479 QwenQwen332bV10,
480 QwenQwen3Coder30bA3bV10,
481 QwenQwen3Coder480bA35bV10,
482 QwenQwen3CoderNext,
483 QwenQwen3Next80bA3b,
484 QwenQwen3Vl235bA22b,
485 UsAnthropicClaudeHaiku4520251001V10,
486 UsAnthropicClaudeOpus4120250805V10,
487 UsAnthropicClaudeOpus4520251101V10,
488 UsAnthropicClaudeOpus46V1,
489 UsAnthropicClaudeOpus47,
490 UsAnthropicClaudeSonnet4520250929V10,
491 UsAnthropicClaudeSonnet46,
492 UsDeepseekR1V10,
493 UsMetaLlama4Maverick17bInstructV10,
494 UsMetaLlama4Scout17bInstructV10,
495 WriterPalmyraX4V10,
496 WriterPalmyraX5V10,
497 ZaiGlm47,
498 ZaiGlm47Flash,
499 ZaiGlm5,
500}
501impl AnthropicModel {
502 #[allow(clippy::too_many_lines)]
503 fn model_id(self) -> &'static str {
504 match self {
505 Self::Claude35Haiku20241022 => "claude-3-5-haiku-20241022",
506 Self::Claude35Sonnet20240620 => "claude-3-5-sonnet-20240620",
507 Self::Claude35Sonnet20241022 => "claude-3-5-sonnet-20241022",
508 Self::Claude37Sonnet20250219 => "claude-3-7-sonnet-20250219",
509 Self::Claude3Haiku20240307 => "claude-3-haiku-20240307",
510 Self::Claude3Opus20240229 => "claude-3-opus-20240229",
511 Self::Claude3Sonnet20240229 => "claude-3-sonnet-20240229",
512 Self::ClaudeHaiku45 => "claude-haiku-4-5",
513 Self::ClaudeHaiku4520251001 => "claude-haiku-4-5-20251001",
514 Self::ClaudeOpus40 => "claude-opus-4-0",
515 Self::ClaudeOpus41 => "claude-opus-4-1",
516 Self::ClaudeOpus4120250805 => "claude-opus-4-1-20250805",
517 Self::ClaudeOpus420250514 => "claude-opus-4-20250514",
518 Self::ClaudeOpus45 => "claude-opus-4-5",
519 Self::ClaudeOpus4520251101 => "claude-opus-4-5-20251101",
520 Self::ClaudeOpus46 => "claude-opus-4-6",
521 Self::ClaudeOpus47 => "claude-opus-4-7",
522 Self::ClaudeSonnet40 => "claude-sonnet-4-0",
523 Self::ClaudeSonnet420250514 => "claude-sonnet-4-20250514",
524 Self::ClaudeSonnet45 => "claude-sonnet-4-5",
525 Self::ClaudeSonnet4520250929 => "claude-sonnet-4-5-20250929",
526 Self::ClaudeSonnet46 => "claude-sonnet-4-6",
527 }
528 }
529 #[allow(clippy::too_many_lines)]
530 fn display_name(self) -> &'static str {
531 match self {
532 Self::Claude3Haiku20240307 => "Claude Haiku 3",
533 Self::Claude35Haiku20241022 => "Claude Haiku 3.5",
534 Self::ClaudeHaiku4520251001 => "Claude Haiku 4.5",
535 Self::ClaudeHaiku45 => "Claude Haiku 4.5 (latest)",
536 Self::Claude3Opus20240229 => "Claude Opus 3",
537 Self::ClaudeOpus420250514 => "Claude Opus 4",
538 Self::ClaudeOpus40 => "Claude Opus 4 (latest)",
539 Self::ClaudeOpus4120250805 => "Claude Opus 4.1",
540 Self::ClaudeOpus41 => "Claude Opus 4.1 (latest)",
541 Self::ClaudeOpus4520251101 => "Claude Opus 4.5",
542 Self::ClaudeOpus45 => "Claude Opus 4.5 (latest)",
543 Self::ClaudeOpus46 => "Claude Opus 4.6",
544 Self::ClaudeOpus47 => "Claude Opus 4.7",
545 Self::Claude3Sonnet20240229 => "Claude Sonnet 3",
546 Self::Claude35Sonnet20240620 => "Claude Sonnet 3.5",
547 Self::Claude35Sonnet20241022 => "Claude Sonnet 3.5 v2",
548 Self::Claude37Sonnet20250219 => "Claude Sonnet 3.7",
549 Self::ClaudeSonnet420250514 => "Claude Sonnet 4",
550 Self::ClaudeSonnet40 => "Claude Sonnet 4 (latest)",
551 Self::ClaudeSonnet4520250929 => "Claude Sonnet 4.5",
552 Self::ClaudeSonnet45 => "Claude Sonnet 4.5 (latest)",
553 Self::ClaudeSonnet46 => "Claude Sonnet 4.6",
554 }
555 }
556 #[allow(clippy::too_many_lines)]
557 fn context_window(self) -> u32 {
558 match self {
559 Self::Claude35Haiku20241022
560 | Self::Claude35Sonnet20240620
561 | Self::Claude35Sonnet20241022
562 | Self::Claude37Sonnet20250219
563 | Self::Claude3Haiku20240307
564 | Self::Claude3Opus20240229
565 | Self::Claude3Sonnet20240229
566 | Self::ClaudeHaiku45
567 | Self::ClaudeHaiku4520251001
568 | Self::ClaudeOpus40
569 | Self::ClaudeOpus41
570 | Self::ClaudeOpus4120250805
571 | Self::ClaudeOpus420250514
572 | Self::ClaudeOpus45
573 | Self::ClaudeOpus4520251101
574 | Self::ClaudeSonnet40
575 | Self::ClaudeSonnet420250514
576 | Self::ClaudeSonnet45
577 | Self::ClaudeSonnet4520250929 => 200_000,
578 Self::ClaudeOpus46 | Self::ClaudeOpus47 | Self::ClaudeSonnet46 => 1_000_000,
579 }
580 }
581 #[allow(clippy::too_many_lines)]
582 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
583 match self {
584 Self::Claude35Haiku20241022
585 | Self::Claude35Sonnet20240620
586 | Self::Claude35Sonnet20241022
587 | Self::Claude3Haiku20240307
588 | Self::Claude3Opus20240229
589 | Self::Claude3Sonnet20240229 => &[],
590 Self::Claude37Sonnet20250219
591 | Self::ClaudeHaiku45
592 | Self::ClaudeHaiku4520251001
593 | Self::ClaudeOpus40
594 | Self::ClaudeOpus41
595 | Self::ClaudeOpus4120250805
596 | Self::ClaudeOpus420250514
597 | Self::ClaudeOpus45
598 | Self::ClaudeOpus4520251101
599 | Self::ClaudeOpus46
600 | Self::ClaudeOpus47
601 | Self::ClaudeSonnet40
602 | Self::ClaudeSonnet420250514
603 | Self::ClaudeSonnet45
604 | Self::ClaudeSonnet4520250929
605 | Self::ClaudeSonnet46 => {
606 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
607 }
608 }
609 }
610 pub fn supports_reasoning(self) -> bool {
611 !self.reasoning_levels().is_empty()
612 }
613 #[allow(clippy::too_many_lines)]
614 pub fn supports_prompt_caching(self) -> bool {
615 match self {
616 Self::Claude35Haiku20241022
617 | Self::Claude35Sonnet20240620
618 | Self::Claude35Sonnet20241022
619 | Self::Claude37Sonnet20250219
620 | Self::Claude3Haiku20240307
621 | Self::Claude3Opus20240229
622 | Self::Claude3Sonnet20240229
623 | Self::ClaudeHaiku45
624 | Self::ClaudeHaiku4520251001
625 | Self::ClaudeOpus40
626 | Self::ClaudeOpus41
627 | Self::ClaudeOpus4120250805
628 | Self::ClaudeOpus420250514
629 | Self::ClaudeOpus45
630 | Self::ClaudeOpus4520251101
631 | Self::ClaudeOpus46
632 | Self::ClaudeOpus47
633 | Self::ClaudeSonnet40
634 | Self::ClaudeSonnet420250514
635 | Self::ClaudeSonnet45
636 | Self::ClaudeSonnet4520250929
637 | Self::ClaudeSonnet46 => true,
638 }
639 }
640 #[allow(clippy::too_many_lines)]
641 pub fn supports_image(self) -> bool {
642 match self {
643 Self::Claude35Haiku20241022
644 | Self::Claude35Sonnet20240620
645 | Self::Claude35Sonnet20241022
646 | Self::Claude37Sonnet20250219
647 | Self::Claude3Haiku20240307
648 | Self::Claude3Opus20240229
649 | Self::Claude3Sonnet20240229
650 | Self::ClaudeHaiku45
651 | Self::ClaudeHaiku4520251001
652 | Self::ClaudeOpus40
653 | Self::ClaudeOpus41
654 | Self::ClaudeOpus4120250805
655 | Self::ClaudeOpus420250514
656 | Self::ClaudeOpus45
657 | Self::ClaudeOpus4520251101
658 | Self::ClaudeOpus46
659 | Self::ClaudeOpus47
660 | Self::ClaudeSonnet40
661 | Self::ClaudeSonnet420250514
662 | Self::ClaudeSonnet45
663 | Self::ClaudeSonnet4520250929
664 | Self::ClaudeSonnet46 => true,
665 }
666 }
667 #[allow(clippy::too_many_lines)]
668 pub fn supports_audio(self) -> bool {
669 match self {
670 Self::Claude35Haiku20241022
671 | Self::Claude35Sonnet20240620
672 | Self::Claude35Sonnet20241022
673 | Self::Claude37Sonnet20250219
674 | Self::Claude3Haiku20240307
675 | Self::Claude3Opus20240229
676 | Self::Claude3Sonnet20240229
677 | Self::ClaudeHaiku45
678 | Self::ClaudeHaiku4520251001
679 | Self::ClaudeOpus40
680 | Self::ClaudeOpus41
681 | Self::ClaudeOpus4120250805
682 | Self::ClaudeOpus420250514
683 | Self::ClaudeOpus45
684 | Self::ClaudeOpus4520251101
685 | Self::ClaudeOpus46
686 | Self::ClaudeOpus47
687 | Self::ClaudeSonnet40
688 | Self::ClaudeSonnet420250514
689 | Self::ClaudeSonnet45
690 | Self::ClaudeSonnet4520250929
691 | Self::ClaudeSonnet46 => false,
692 }
693 }
694 const ALL: &[AnthropicModel] = &[
695 Self::Claude35Haiku20241022,
696 Self::Claude35Sonnet20240620,
697 Self::Claude35Sonnet20241022,
698 Self::Claude37Sonnet20250219,
699 Self::Claude3Haiku20240307,
700 Self::Claude3Opus20240229,
701 Self::Claude3Sonnet20240229,
702 Self::ClaudeHaiku45,
703 Self::ClaudeHaiku4520251001,
704 Self::ClaudeOpus40,
705 Self::ClaudeOpus41,
706 Self::ClaudeOpus4120250805,
707 Self::ClaudeOpus420250514,
708 Self::ClaudeOpus45,
709 Self::ClaudeOpus4520251101,
710 Self::ClaudeOpus46,
711 Self::ClaudeOpus47,
712 Self::ClaudeSonnet40,
713 Self::ClaudeSonnet420250514,
714 Self::ClaudeSonnet45,
715 Self::ClaudeSonnet4520250929,
716 Self::ClaudeSonnet46,
717 ];
718}
719impl std::str::FromStr for AnthropicModel {
720 type Err = String;
721 #[allow(clippy::too_many_lines)]
722 fn from_str(s: &str) -> Result<Self, Self::Err> {
723 match s {
724 "claude-3-5-haiku-20241022" => Ok(Self::Claude35Haiku20241022),
725 "claude-3-5-sonnet-20240620" => Ok(Self::Claude35Sonnet20240620),
726 "claude-3-5-sonnet-20241022" => Ok(Self::Claude35Sonnet20241022),
727 "claude-3-7-sonnet-20250219" => Ok(Self::Claude37Sonnet20250219),
728 "claude-3-haiku-20240307" => Ok(Self::Claude3Haiku20240307),
729 "claude-3-opus-20240229" => Ok(Self::Claude3Opus20240229),
730 "claude-3-sonnet-20240229" => Ok(Self::Claude3Sonnet20240229),
731 "claude-haiku-4-5" => Ok(Self::ClaudeHaiku45),
732 "claude-haiku-4-5-20251001" => Ok(Self::ClaudeHaiku4520251001),
733 "claude-opus-4-0" => Ok(Self::ClaudeOpus40),
734 "claude-opus-4-1" => Ok(Self::ClaudeOpus41),
735 "claude-opus-4-1-20250805" => Ok(Self::ClaudeOpus4120250805),
736 "claude-opus-4-20250514" => Ok(Self::ClaudeOpus420250514),
737 "claude-opus-4-5" => Ok(Self::ClaudeOpus45),
738 "claude-opus-4-5-20251101" => Ok(Self::ClaudeOpus4520251101),
739 "claude-opus-4-6" => Ok(Self::ClaudeOpus46),
740 "claude-opus-4-7" => Ok(Self::ClaudeOpus47),
741 "claude-sonnet-4-0" => Ok(Self::ClaudeSonnet40),
742 "claude-sonnet-4-20250514" => Ok(Self::ClaudeSonnet420250514),
743 "claude-sonnet-4-5" => Ok(Self::ClaudeSonnet45),
744 "claude-sonnet-4-5-20250929" => Ok(Self::ClaudeSonnet4520250929),
745 "claude-sonnet-4-6" => Ok(Self::ClaudeSonnet46),
746 _ => Err(format!("Unknown anthropic model: '{s}'")),
747 }
748 }
749}
750impl CodexModel {
751 #[allow(clippy::too_many_lines)]
752 fn model_id(self) -> &'static str {
753 match self {
754 Self::Gpt5 => "gpt-5",
755 Self::Gpt5Codex => "gpt-5-codex",
756 Self::Gpt51 => "gpt-5.1",
757 Self::Gpt51Codex => "gpt-5.1-codex",
758 Self::Gpt51CodexMax => "gpt-5.1-codex-max",
759 Self::Gpt51CodexMini => "gpt-5.1-codex-mini",
760 Self::Gpt52 => "gpt-5.2",
761 Self::Gpt52Codex => "gpt-5.2-codex",
762 Self::Gpt52Pro => "gpt-5.2-pro",
763 Self::Gpt53Codex => "gpt-5.3-codex",
764 Self::Gpt53CodexSpark => "gpt-5.3-codex-spark",
765 Self::Gpt54 => "gpt-5.4",
766 Self::Gpt54Mini => "gpt-5.4-mini",
767 Self::Gpt54Nano => "gpt-5.4-nano",
768 Self::Gpt54Pro => "gpt-5.4-pro",
769 Self::Gpt55 => "gpt-5.5",
770 Self::Gpt55Pro => "gpt-5.5-pro",
771 }
772 }
773 #[allow(clippy::too_many_lines)]
774 fn display_name(self) -> &'static str {
775 match self {
776 Self::Gpt5 => "GPT-5",
777 Self::Gpt5Codex => "GPT-5-Codex",
778 Self::Gpt51 => "GPT-5.1",
779 Self::Gpt51Codex => "GPT-5.1 Codex",
780 Self::Gpt51CodexMax => "GPT-5.1 Codex Max",
781 Self::Gpt51CodexMini => "GPT-5.1 Codex mini",
782 Self::Gpt52 => "GPT-5.2",
783 Self::Gpt52Codex => "GPT-5.2 Codex",
784 Self::Gpt52Pro => "GPT-5.2 Pro",
785 Self::Gpt53Codex => "GPT-5.3 Codex",
786 Self::Gpt53CodexSpark => "GPT-5.3 Codex Spark",
787 Self::Gpt54 => "GPT-5.4",
788 Self::Gpt54Pro => "GPT-5.4 Pro",
789 Self::Gpt54Mini => "GPT-5.4 mini",
790 Self::Gpt54Nano => "GPT-5.4 nano",
791 Self::Gpt55 => "GPT-5.5",
792 Self::Gpt55Pro => "GPT-5.5 Pro",
793 }
794 }
795 #[allow(clippy::too_many_lines)]
796 fn context_window(self) -> u32 {
797 match self {
798 Self::Gpt53CodexSpark => 128_000,
799 Self::Gpt52
800 | Self::Gpt53Codex
801 | Self::Gpt54
802 | Self::Gpt54Mini
803 | Self::Gpt55 => 272_000,
804 Self::Gpt5
805 | Self::Gpt5Codex
806 | Self::Gpt51
807 | Self::Gpt51Codex
808 | Self::Gpt51CodexMax
809 | Self::Gpt51CodexMini
810 | Self::Gpt52Codex
811 | Self::Gpt52Pro
812 | Self::Gpt54Nano => 400_000,
813 Self::Gpt54Pro | Self::Gpt55Pro => 1_050_000,
814 }
815 }
816 #[allow(clippy::too_many_lines)]
817 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
818 match self {
819 Self::Gpt5
820 | Self::Gpt5Codex
821 | Self::Gpt51
822 | Self::Gpt51Codex
823 | Self::Gpt51CodexMax
824 | Self::Gpt51CodexMini
825 | Self::Gpt52
826 | Self::Gpt52Codex
827 | Self::Gpt52Pro
828 | Self::Gpt53Codex
829 | Self::Gpt53CodexSpark
830 | Self::Gpt54
831 | Self::Gpt54Mini
832 | Self::Gpt54Nano
833 | Self::Gpt54Pro
834 | Self::Gpt55
835 | Self::Gpt55Pro => {
836 &[
837 ReasoningEffort::Low,
838 ReasoningEffort::Medium,
839 ReasoningEffort::High,
840 ReasoningEffort::Xhigh,
841 ]
842 }
843 }
844 }
845 pub fn supports_reasoning(self) -> bool {
846 !self.reasoning_levels().is_empty()
847 }
848 #[allow(clippy::too_many_lines)]
849 pub fn supports_prompt_caching(self) -> bool {
850 match self {
851 Self::Gpt52Pro | Self::Gpt54Pro | Self::Gpt55Pro => false,
852 Self::Gpt5
853 | Self::Gpt5Codex
854 | Self::Gpt51
855 | Self::Gpt51Codex
856 | Self::Gpt51CodexMax
857 | Self::Gpt51CodexMini
858 | Self::Gpt52
859 | Self::Gpt52Codex
860 | Self::Gpt53Codex
861 | Self::Gpt53CodexSpark
862 | Self::Gpt54
863 | Self::Gpt54Mini
864 | Self::Gpt54Nano
865 | Self::Gpt55 => true,
866 }
867 }
868 #[allow(clippy::too_many_lines)]
869 pub fn supports_image(self) -> bool {
870 match self {
871 Self::Gpt5
872 | Self::Gpt5Codex
873 | Self::Gpt51
874 | Self::Gpt51Codex
875 | Self::Gpt51CodexMax
876 | Self::Gpt51CodexMini
877 | Self::Gpt52
878 | Self::Gpt52Codex
879 | Self::Gpt52Pro
880 | Self::Gpt53Codex
881 | Self::Gpt53CodexSpark
882 | Self::Gpt54
883 | Self::Gpt54Mini
884 | Self::Gpt54Nano
885 | Self::Gpt54Pro
886 | Self::Gpt55
887 | Self::Gpt55Pro => true,
888 }
889 }
890 #[allow(clippy::too_many_lines)]
891 pub fn supports_audio(self) -> bool {
892 match self {
893 Self::Gpt5
894 | Self::Gpt5Codex
895 | Self::Gpt51
896 | Self::Gpt51Codex
897 | Self::Gpt51CodexMax
898 | Self::Gpt51CodexMini
899 | Self::Gpt52
900 | Self::Gpt52Codex
901 | Self::Gpt52Pro
902 | Self::Gpt53Codex
903 | Self::Gpt53CodexSpark
904 | Self::Gpt54
905 | Self::Gpt54Mini
906 | Self::Gpt54Nano
907 | Self::Gpt54Pro
908 | Self::Gpt55
909 | Self::Gpt55Pro => false,
910 }
911 }
912 const ALL: &[CodexModel] = &[
913 Self::Gpt5,
914 Self::Gpt5Codex,
915 Self::Gpt51,
916 Self::Gpt51Codex,
917 Self::Gpt51CodexMax,
918 Self::Gpt51CodexMini,
919 Self::Gpt52,
920 Self::Gpt52Codex,
921 Self::Gpt52Pro,
922 Self::Gpt53Codex,
923 Self::Gpt53CodexSpark,
924 Self::Gpt54,
925 Self::Gpt54Mini,
926 Self::Gpt54Nano,
927 Self::Gpt54Pro,
928 Self::Gpt55,
929 Self::Gpt55Pro,
930 ];
931}
932impl std::str::FromStr for CodexModel {
933 type Err = String;
934 #[allow(clippy::too_many_lines)]
935 fn from_str(s: &str) -> Result<Self, Self::Err> {
936 match s {
937 "gpt-5" => Ok(Self::Gpt5),
938 "gpt-5-codex" => Ok(Self::Gpt5Codex),
939 "gpt-5.1" => Ok(Self::Gpt51),
940 "gpt-5.1-codex" => Ok(Self::Gpt51Codex),
941 "gpt-5.1-codex-max" => Ok(Self::Gpt51CodexMax),
942 "gpt-5.1-codex-mini" => Ok(Self::Gpt51CodexMini),
943 "gpt-5.2" => Ok(Self::Gpt52),
944 "gpt-5.2-codex" => Ok(Self::Gpt52Codex),
945 "gpt-5.2-pro" => Ok(Self::Gpt52Pro),
946 "gpt-5.3-codex" => Ok(Self::Gpt53Codex),
947 "gpt-5.3-codex-spark" => Ok(Self::Gpt53CodexSpark),
948 "gpt-5.4" => Ok(Self::Gpt54),
949 "gpt-5.4-mini" => Ok(Self::Gpt54Mini),
950 "gpt-5.4-nano" => Ok(Self::Gpt54Nano),
951 "gpt-5.4-pro" => Ok(Self::Gpt54Pro),
952 "gpt-5.5" => Ok(Self::Gpt55),
953 "gpt-5.5-pro" => Ok(Self::Gpt55Pro),
954 _ => Err(format!("Unknown codex model: '{s}'")),
955 }
956 }
957}
958impl DeepSeekModel {
959 #[allow(clippy::too_many_lines)]
960 fn model_id(self) -> &'static str {
961 match self {
962 Self::DeepseekChat => "deepseek-chat",
963 Self::DeepseekReasoner => "deepseek-reasoner",
964 Self::DeepseekV4Flash => "deepseek-v4-flash",
965 Self::DeepseekV4Pro => "deepseek-v4-pro",
966 }
967 }
968 #[allow(clippy::too_many_lines)]
969 fn display_name(self) -> &'static str {
970 match self {
971 Self::DeepseekChat => "DeepSeek Chat",
972 Self::DeepseekReasoner => "DeepSeek Reasoner",
973 Self::DeepseekV4Flash => "DeepSeek V4 Flash",
974 Self::DeepseekV4Pro => "DeepSeek V4 Pro",
975 }
976 }
977 #[allow(clippy::too_many_lines)]
978 fn context_window(self) -> u32 {
979 match self {
980 Self::DeepseekChat
981 | Self::DeepseekReasoner
982 | Self::DeepseekV4Flash
983 | Self::DeepseekV4Pro => 1_000_000,
984 }
985 }
986 #[allow(clippy::too_many_lines)]
987 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
988 match self {
989 Self::DeepseekChat => &[],
990 Self::DeepseekReasoner | Self::DeepseekV4Flash | Self::DeepseekV4Pro => {
991 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
992 }
993 }
994 }
995 pub fn supports_reasoning(self) -> bool {
996 !self.reasoning_levels().is_empty()
997 }
998 #[allow(clippy::too_many_lines)]
999 pub fn supports_prompt_caching(self) -> bool {
1000 match self {
1001 Self::DeepseekChat
1002 | Self::DeepseekReasoner
1003 | Self::DeepseekV4Flash
1004 | Self::DeepseekV4Pro => true,
1005 }
1006 }
1007 #[allow(clippy::too_many_lines)]
1008 pub fn supports_image(self) -> bool {
1009 match self {
1010 Self::DeepseekChat
1011 | Self::DeepseekReasoner
1012 | Self::DeepseekV4Flash
1013 | Self::DeepseekV4Pro => false,
1014 }
1015 }
1016 #[allow(clippy::too_many_lines)]
1017 pub fn supports_audio(self) -> bool {
1018 match self {
1019 Self::DeepseekChat
1020 | Self::DeepseekReasoner
1021 | Self::DeepseekV4Flash
1022 | Self::DeepseekV4Pro => false,
1023 }
1024 }
1025 const ALL: &[DeepSeekModel] = &[
1026 Self::DeepseekChat,
1027 Self::DeepseekReasoner,
1028 Self::DeepseekV4Flash,
1029 Self::DeepseekV4Pro,
1030 ];
1031}
1032impl std::str::FromStr for DeepSeekModel {
1033 type Err = String;
1034 #[allow(clippy::too_many_lines)]
1035 fn from_str(s: &str) -> Result<Self, Self::Err> {
1036 match s {
1037 "deepseek-chat" => Ok(Self::DeepseekChat),
1038 "deepseek-reasoner" => Ok(Self::DeepseekReasoner),
1039 "deepseek-v4-flash" => Ok(Self::DeepseekV4Flash),
1040 "deepseek-v4-pro" => Ok(Self::DeepseekV4Pro),
1041 _ => Err(format!("Unknown deepseek model: '{s}'")),
1042 }
1043 }
1044}
1045impl GeminiModel {
1046 #[allow(clippy::too_many_lines)]
1047 fn model_id(self) -> &'static str {
1048 match self {
1049 Self::Gemini15Flash => "gemini-1.5-flash",
1050 Self::Gemini15Flash8b => "gemini-1.5-flash-8b",
1051 Self::Gemini15Pro => "gemini-1.5-pro",
1052 Self::Gemini20Flash => "gemini-2.0-flash",
1053 Self::Gemini20FlashLite => "gemini-2.0-flash-lite",
1054 Self::Gemini25Flash => "gemini-2.5-flash",
1055 Self::Gemini25FlashLite => "gemini-2.5-flash-lite",
1056 Self::Gemini25FlashLitePreview0617 => "gemini-2.5-flash-lite-preview-06-17",
1057 Self::Gemini25FlashLitePreview092025 => {
1058 "gemini-2.5-flash-lite-preview-09-2025"
1059 }
1060 Self::Gemini25FlashPreview0417 => "gemini-2.5-flash-preview-04-17",
1061 Self::Gemini25FlashPreview0520 => "gemini-2.5-flash-preview-05-20",
1062 Self::Gemini25FlashPreview092025 => "gemini-2.5-flash-preview-09-2025",
1063 Self::Gemini25Pro => "gemini-2.5-pro",
1064 Self::Gemini25ProPreview0506 => "gemini-2.5-pro-preview-05-06",
1065 Self::Gemini25ProPreview0605 => "gemini-2.5-pro-preview-06-05",
1066 Self::Gemini3FlashPreview => "gemini-3-flash-preview",
1067 Self::Gemini3ProPreview => "gemini-3-pro-preview",
1068 Self::Gemini31FlashLite => "gemini-3.1-flash-lite",
1069 Self::Gemini31FlashLitePreview => "gemini-3.1-flash-lite-preview",
1070 Self::Gemini31ProPreview => "gemini-3.1-pro-preview",
1071 Self::Gemini31ProPreviewCustomtools => "gemini-3.1-pro-preview-customtools",
1072 Self::Gemini35Flash => "gemini-3.5-flash",
1073 Self::GeminiLive25Flash => "gemini-live-2.5-flash",
1074 Self::GeminiLive25FlashPreviewNativeAudio => {
1075 "gemini-live-2.5-flash-preview-native-audio"
1076 }
1077 Self::Gemma327bIt => "gemma-3-27b-it",
1078 Self::Gemma426bA4bIt => "gemma-4-26b-a4b-it",
1079 Self::Gemma431bIt => "gemma-4-31b-it",
1080 }
1081 }
1082 #[allow(clippy::too_many_lines)]
1083 fn display_name(self) -> &'static str {
1084 match self {
1085 Self::Gemini15Flash => "Gemini 1.5 Flash",
1086 Self::Gemini15Flash8b => "Gemini 1.5 Flash-8B",
1087 Self::Gemini15Pro => "Gemini 1.5 Pro",
1088 Self::Gemini20Flash => "Gemini 2.0 Flash",
1089 Self::Gemini20FlashLite => "Gemini 2.0 Flash Lite",
1090 Self::Gemini25Flash => "Gemini 2.5 Flash",
1091 Self::Gemini25FlashLite => "Gemini 2.5 Flash Lite",
1092 Self::Gemini25FlashLitePreview0617 => "Gemini 2.5 Flash Lite Preview 06-17",
1093 Self::Gemini25FlashLitePreview092025 => "Gemini 2.5 Flash Lite Preview 09-25",
1094 Self::Gemini25FlashPreview0417 => "Gemini 2.5 Flash Preview 04-17",
1095 Self::Gemini25FlashPreview0520 => "Gemini 2.5 Flash Preview 05-20",
1096 Self::Gemini25FlashPreview092025 => "Gemini 2.5 Flash Preview 09-25",
1097 Self::Gemini25Pro => "Gemini 2.5 Pro",
1098 Self::Gemini25ProPreview0506 => "Gemini 2.5 Pro Preview 05-06",
1099 Self::Gemini25ProPreview0605 => "Gemini 2.5 Pro Preview 06-05",
1100 Self::Gemini3FlashPreview => "Gemini 3 Flash Preview",
1101 Self::Gemini3ProPreview => "Gemini 3 Pro Preview",
1102 Self::Gemini31FlashLite => "Gemini 3.1 Flash Lite",
1103 Self::Gemini31FlashLitePreview => "Gemini 3.1 Flash Lite Preview",
1104 Self::Gemini31ProPreview => "Gemini 3.1 Pro Preview",
1105 Self::Gemini31ProPreviewCustomtools => "Gemini 3.1 Pro Preview Custom Tools",
1106 Self::Gemini35Flash => "Gemini 3.5 Flash",
1107 Self::GeminiLive25Flash => "Gemini Live 2.5 Flash",
1108 Self::GeminiLive25FlashPreviewNativeAudio => {
1109 "Gemini Live 2.5 Flash Preview Native Audio"
1110 }
1111 Self::Gemma327bIt => "Gemma 3 27B",
1112 Self::Gemma426bA4bIt => "Gemma 4 26B",
1113 Self::Gemma431bIt => "Gemma 4 31B",
1114 }
1115 }
1116 #[allow(clippy::too_many_lines)]
1117 fn context_window(self) -> u32 {
1118 match self {
1119 Self::GeminiLive25Flash => 128_000,
1120 Self::GeminiLive25FlashPreviewNativeAudio | Self::Gemma327bIt => 131_072,
1121 Self::Gemma426bA4bIt | Self::Gemma431bIt => 256_000,
1122 Self::Gemini15Flash
1123 | Self::Gemini15Flash8b
1124 | Self::Gemini15Pro
1125 | Self::Gemini3ProPreview => 1_000_000,
1126 Self::Gemini20Flash
1127 | Self::Gemini20FlashLite
1128 | Self::Gemini25Flash
1129 | Self::Gemini25FlashLite
1130 | Self::Gemini25FlashLitePreview0617
1131 | Self::Gemini25FlashLitePreview092025
1132 | Self::Gemini25FlashPreview0417
1133 | Self::Gemini25FlashPreview0520
1134 | Self::Gemini25FlashPreview092025
1135 | Self::Gemini25Pro
1136 | Self::Gemini25ProPreview0506
1137 | Self::Gemini25ProPreview0605
1138 | Self::Gemini3FlashPreview
1139 | Self::Gemini31FlashLite
1140 | Self::Gemini31FlashLitePreview
1141 | Self::Gemini31ProPreview
1142 | Self::Gemini31ProPreviewCustomtools
1143 | Self::Gemini35Flash => 1_048_576,
1144 }
1145 }
1146 #[allow(clippy::too_many_lines)]
1147 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1148 match self {
1149 Self::Gemini15Flash
1150 | Self::Gemini15Flash8b
1151 | Self::Gemini15Pro
1152 | Self::Gemini20Flash
1153 | Self::Gemini20FlashLite
1154 | Self::Gemma327bIt => &[],
1155 Self::Gemini25Flash
1156 | Self::Gemini25FlashLite
1157 | Self::Gemini25FlashLitePreview0617
1158 | Self::Gemini25FlashLitePreview092025
1159 | Self::Gemini25FlashPreview0417
1160 | Self::Gemini25FlashPreview0520
1161 | Self::Gemini25FlashPreview092025
1162 | Self::Gemini25Pro
1163 | Self::Gemini25ProPreview0506
1164 | Self::Gemini25ProPreview0605
1165 | Self::Gemini3FlashPreview
1166 | Self::Gemini3ProPreview
1167 | Self::Gemini31FlashLite
1168 | Self::Gemini31FlashLitePreview
1169 | Self::Gemini31ProPreview
1170 | Self::Gemini31ProPreviewCustomtools
1171 | Self::Gemini35Flash
1172 | Self::GeminiLive25Flash
1173 | Self::GeminiLive25FlashPreviewNativeAudio
1174 | Self::Gemma426bA4bIt
1175 | Self::Gemma431bIt => {
1176 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
1177 }
1178 }
1179 }
1180 pub fn supports_reasoning(self) -> bool {
1181 !self.reasoning_levels().is_empty()
1182 }
1183 #[allow(clippy::too_many_lines)]
1184 pub fn supports_prompt_caching(self) -> bool {
1185 match self {
1186 Self::Gemini20FlashLite
1187 | Self::GeminiLive25Flash
1188 | Self::GeminiLive25FlashPreviewNativeAudio
1189 | Self::Gemma327bIt
1190 | Self::Gemma426bA4bIt
1191 | Self::Gemma431bIt => false,
1192 Self::Gemini15Flash
1193 | Self::Gemini15Flash8b
1194 | Self::Gemini15Pro
1195 | Self::Gemini20Flash
1196 | Self::Gemini25Flash
1197 | Self::Gemini25FlashLite
1198 | Self::Gemini25FlashLitePreview0617
1199 | Self::Gemini25FlashLitePreview092025
1200 | Self::Gemini25FlashPreview0417
1201 | Self::Gemini25FlashPreview0520
1202 | Self::Gemini25FlashPreview092025
1203 | Self::Gemini25Pro
1204 | Self::Gemini25ProPreview0506
1205 | Self::Gemini25ProPreview0605
1206 | Self::Gemini3FlashPreview
1207 | Self::Gemini3ProPreview
1208 | Self::Gemini31FlashLite
1209 | Self::Gemini31FlashLitePreview
1210 | Self::Gemini31ProPreview
1211 | Self::Gemini31ProPreviewCustomtools
1212 | Self::Gemini35Flash => true,
1213 }
1214 }
1215 #[allow(clippy::too_many_lines)]
1216 pub fn supports_image(self) -> bool {
1217 match self {
1218 Self::GeminiLive25FlashPreviewNativeAudio => false,
1219 Self::Gemini15Flash
1220 | Self::Gemini15Flash8b
1221 | Self::Gemini15Pro
1222 | Self::Gemini20Flash
1223 | Self::Gemini20FlashLite
1224 | Self::Gemini25Flash
1225 | Self::Gemini25FlashLite
1226 | Self::Gemini25FlashLitePreview0617
1227 | Self::Gemini25FlashLitePreview092025
1228 | Self::Gemini25FlashPreview0417
1229 | Self::Gemini25FlashPreview0520
1230 | Self::Gemini25FlashPreview092025
1231 | Self::Gemini25Pro
1232 | Self::Gemini25ProPreview0506
1233 | Self::Gemini25ProPreview0605
1234 | Self::Gemini3FlashPreview
1235 | Self::Gemini3ProPreview
1236 | Self::Gemini31FlashLite
1237 | Self::Gemini31FlashLitePreview
1238 | Self::Gemini31ProPreview
1239 | Self::Gemini31ProPreviewCustomtools
1240 | Self::Gemini35Flash
1241 | Self::GeminiLive25Flash
1242 | Self::Gemma327bIt
1243 | Self::Gemma426bA4bIt
1244 | Self::Gemma431bIt => true,
1245 }
1246 }
1247 #[allow(clippy::too_many_lines)]
1248 pub fn supports_audio(self) -> bool {
1249 match self {
1250 Self::Gemma327bIt | Self::Gemma426bA4bIt | Self::Gemma431bIt => false,
1251 Self::Gemini15Flash
1252 | Self::Gemini15Flash8b
1253 | Self::Gemini15Pro
1254 | Self::Gemini20Flash
1255 | Self::Gemini20FlashLite
1256 | Self::Gemini25Flash
1257 | Self::Gemini25FlashLite
1258 | Self::Gemini25FlashLitePreview0617
1259 | Self::Gemini25FlashLitePreview092025
1260 | Self::Gemini25FlashPreview0417
1261 | Self::Gemini25FlashPreview0520
1262 | Self::Gemini25FlashPreview092025
1263 | Self::Gemini25Pro
1264 | Self::Gemini25ProPreview0506
1265 | Self::Gemini25ProPreview0605
1266 | Self::Gemini3FlashPreview
1267 | Self::Gemini3ProPreview
1268 | Self::Gemini31FlashLite
1269 | Self::Gemini31FlashLitePreview
1270 | Self::Gemini31ProPreview
1271 | Self::Gemini31ProPreviewCustomtools
1272 | Self::Gemini35Flash
1273 | Self::GeminiLive25Flash
1274 | Self::GeminiLive25FlashPreviewNativeAudio => true,
1275 }
1276 }
1277 const ALL: &[GeminiModel] = &[
1278 Self::Gemini15Flash,
1279 Self::Gemini15Flash8b,
1280 Self::Gemini15Pro,
1281 Self::Gemini20Flash,
1282 Self::Gemini20FlashLite,
1283 Self::Gemini25Flash,
1284 Self::Gemini25FlashLite,
1285 Self::Gemini25FlashLitePreview0617,
1286 Self::Gemini25FlashLitePreview092025,
1287 Self::Gemini25FlashPreview0417,
1288 Self::Gemini25FlashPreview0520,
1289 Self::Gemini25FlashPreview092025,
1290 Self::Gemini25Pro,
1291 Self::Gemini25ProPreview0506,
1292 Self::Gemini25ProPreview0605,
1293 Self::Gemini3FlashPreview,
1294 Self::Gemini3ProPreview,
1295 Self::Gemini31FlashLite,
1296 Self::Gemini31FlashLitePreview,
1297 Self::Gemini31ProPreview,
1298 Self::Gemini31ProPreviewCustomtools,
1299 Self::Gemini35Flash,
1300 Self::GeminiLive25Flash,
1301 Self::GeminiLive25FlashPreviewNativeAudio,
1302 Self::Gemma327bIt,
1303 Self::Gemma426bA4bIt,
1304 Self::Gemma431bIt,
1305 ];
1306}
1307impl std::str::FromStr for GeminiModel {
1308 type Err = String;
1309 #[allow(clippy::too_many_lines)]
1310 fn from_str(s: &str) -> Result<Self, Self::Err> {
1311 match s {
1312 "gemini-1.5-flash" => Ok(Self::Gemini15Flash),
1313 "gemini-1.5-flash-8b" => Ok(Self::Gemini15Flash8b),
1314 "gemini-1.5-pro" => Ok(Self::Gemini15Pro),
1315 "gemini-2.0-flash" => Ok(Self::Gemini20Flash),
1316 "gemini-2.0-flash-lite" => Ok(Self::Gemini20FlashLite),
1317 "gemini-2.5-flash" => Ok(Self::Gemini25Flash),
1318 "gemini-2.5-flash-lite" => Ok(Self::Gemini25FlashLite),
1319 "gemini-2.5-flash-lite-preview-06-17" => {
1320 Ok(Self::Gemini25FlashLitePreview0617)
1321 }
1322 "gemini-2.5-flash-lite-preview-09-2025" => {
1323 Ok(Self::Gemini25FlashLitePreview092025)
1324 }
1325 "gemini-2.5-flash-preview-04-17" => Ok(Self::Gemini25FlashPreview0417),
1326 "gemini-2.5-flash-preview-05-20" => Ok(Self::Gemini25FlashPreview0520),
1327 "gemini-2.5-flash-preview-09-2025" => Ok(Self::Gemini25FlashPreview092025),
1328 "gemini-2.5-pro" => Ok(Self::Gemini25Pro),
1329 "gemini-2.5-pro-preview-05-06" => Ok(Self::Gemini25ProPreview0506),
1330 "gemini-2.5-pro-preview-06-05" => Ok(Self::Gemini25ProPreview0605),
1331 "gemini-3-flash-preview" => Ok(Self::Gemini3FlashPreview),
1332 "gemini-3-pro-preview" => Ok(Self::Gemini3ProPreview),
1333 "gemini-3.1-flash-lite" => Ok(Self::Gemini31FlashLite),
1334 "gemini-3.1-flash-lite-preview" => Ok(Self::Gemini31FlashLitePreview),
1335 "gemini-3.1-pro-preview" => Ok(Self::Gemini31ProPreview),
1336 "gemini-3.1-pro-preview-customtools" => {
1337 Ok(Self::Gemini31ProPreviewCustomtools)
1338 }
1339 "gemini-3.5-flash" => Ok(Self::Gemini35Flash),
1340 "gemini-live-2.5-flash" => Ok(Self::GeminiLive25Flash),
1341 "gemini-live-2.5-flash-preview-native-audio" => {
1342 Ok(Self::GeminiLive25FlashPreviewNativeAudio)
1343 }
1344 "gemma-3-27b-it" => Ok(Self::Gemma327bIt),
1345 "gemma-4-26b-a4b-it" => Ok(Self::Gemma426bA4bIt),
1346 "gemma-4-31b-it" => Ok(Self::Gemma431bIt),
1347 _ => Err(format!("Unknown gemini model: '{s}'")),
1348 }
1349 }
1350}
1351impl MoonshotModel {
1352 #[allow(clippy::too_many_lines)]
1353 fn model_id(self) -> &'static str {
1354 match self {
1355 Self::KimiK20711Preview => "kimi-k2-0711-preview",
1356 Self::KimiK20905Preview => "kimi-k2-0905-preview",
1357 Self::KimiK2Thinking => "kimi-k2-thinking",
1358 Self::KimiK2ThinkingTurbo => "kimi-k2-thinking-turbo",
1359 Self::KimiK2TurboPreview => "kimi-k2-turbo-preview",
1360 Self::KimiK25 => "kimi-k2.5",
1361 Self::KimiK26 => "kimi-k2.6",
1362 }
1363 }
1364 #[allow(clippy::too_many_lines)]
1365 fn display_name(self) -> &'static str {
1366 match self {
1367 Self::KimiK20711Preview => "Kimi K2 0711",
1368 Self::KimiK20905Preview => "Kimi K2 0905",
1369 Self::KimiK2Thinking => "Kimi K2 Thinking",
1370 Self::KimiK2ThinkingTurbo => "Kimi K2 Thinking Turbo",
1371 Self::KimiK2TurboPreview => "Kimi K2 Turbo",
1372 Self::KimiK25 => "Kimi K2.5",
1373 Self::KimiK26 => "Kimi K2.6",
1374 }
1375 }
1376 #[allow(clippy::too_many_lines)]
1377 fn context_window(self) -> u32 {
1378 match self {
1379 Self::KimiK20711Preview => 131_072,
1380 Self::KimiK20905Preview
1381 | Self::KimiK2Thinking
1382 | Self::KimiK2ThinkingTurbo
1383 | Self::KimiK2TurboPreview
1384 | Self::KimiK25
1385 | Self::KimiK26 => 262_144,
1386 }
1387 }
1388 #[allow(clippy::too_many_lines)]
1389 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1390 match self {
1391 Self::KimiK20711Preview
1392 | Self::KimiK20905Preview
1393 | Self::KimiK2TurboPreview => &[],
1394 Self::KimiK2Thinking
1395 | Self::KimiK2ThinkingTurbo
1396 | Self::KimiK25
1397 | Self::KimiK26 => {
1398 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
1399 }
1400 }
1401 }
1402 pub fn supports_reasoning(self) -> bool {
1403 !self.reasoning_levels().is_empty()
1404 }
1405 #[allow(clippy::too_many_lines)]
1406 pub fn supports_prompt_caching(self) -> bool {
1407 match self {
1408 Self::KimiK20711Preview
1409 | Self::KimiK20905Preview
1410 | Self::KimiK2Thinking
1411 | Self::KimiK2ThinkingTurbo
1412 | Self::KimiK2TurboPreview
1413 | Self::KimiK25
1414 | Self::KimiK26 => true,
1415 }
1416 }
1417 #[allow(clippy::too_many_lines)]
1418 pub fn supports_image(self) -> bool {
1419 match self {
1420 Self::KimiK20711Preview
1421 | Self::KimiK20905Preview
1422 | Self::KimiK2Thinking
1423 | Self::KimiK2ThinkingTurbo
1424 | Self::KimiK2TurboPreview => false,
1425 Self::KimiK25 | Self::KimiK26 => true,
1426 }
1427 }
1428 #[allow(clippy::too_many_lines)]
1429 pub fn supports_audio(self) -> bool {
1430 match self {
1431 Self::KimiK20711Preview
1432 | Self::KimiK20905Preview
1433 | Self::KimiK2Thinking
1434 | Self::KimiK2ThinkingTurbo
1435 | Self::KimiK2TurboPreview
1436 | Self::KimiK25
1437 | Self::KimiK26 => false,
1438 }
1439 }
1440 const ALL: &[MoonshotModel] = &[
1441 Self::KimiK20711Preview,
1442 Self::KimiK20905Preview,
1443 Self::KimiK2Thinking,
1444 Self::KimiK2ThinkingTurbo,
1445 Self::KimiK2TurboPreview,
1446 Self::KimiK25,
1447 Self::KimiK26,
1448 ];
1449}
1450impl std::str::FromStr for MoonshotModel {
1451 type Err = String;
1452 #[allow(clippy::too_many_lines)]
1453 fn from_str(s: &str) -> Result<Self, Self::Err> {
1454 match s {
1455 "kimi-k2-0711-preview" => Ok(Self::KimiK20711Preview),
1456 "kimi-k2-0905-preview" => Ok(Self::KimiK20905Preview),
1457 "kimi-k2-thinking" => Ok(Self::KimiK2Thinking),
1458 "kimi-k2-thinking-turbo" => Ok(Self::KimiK2ThinkingTurbo),
1459 "kimi-k2-turbo-preview" => Ok(Self::KimiK2TurboPreview),
1460 "kimi-k2.5" => Ok(Self::KimiK25),
1461 "kimi-k2.6" => Ok(Self::KimiK26),
1462 _ => Err(format!("Unknown moonshot model: '{s}'")),
1463 }
1464 }
1465}
1466impl OpenaiModel {
1467 #[allow(clippy::too_many_lines)]
1468 fn model_id(self) -> &'static str {
1469 match self {
1470 Self::Gpt4 => "gpt-4",
1471 Self::Gpt4Turbo => "gpt-4-turbo",
1472 Self::Gpt41 => "gpt-4.1",
1473 Self::Gpt41Mini => "gpt-4.1-mini",
1474 Self::Gpt41Nano => "gpt-4.1-nano",
1475 Self::Gpt4o => "gpt-4o",
1476 Self::Gpt4o20240513 => "gpt-4o-2024-05-13",
1477 Self::Gpt4o20240806 => "gpt-4o-2024-08-06",
1478 Self::Gpt4o20241120 => "gpt-4o-2024-11-20",
1479 Self::Gpt4oMini => "gpt-4o-mini",
1480 Self::Gpt5 => "gpt-5",
1481 Self::Gpt5Codex => "gpt-5-codex",
1482 Self::Gpt5Mini => "gpt-5-mini",
1483 Self::Gpt5Nano => "gpt-5-nano",
1484 Self::Gpt5Pro => "gpt-5-pro",
1485 Self::Gpt51 => "gpt-5.1",
1486 Self::Gpt51Codex => "gpt-5.1-codex",
1487 Self::Gpt51CodexMax => "gpt-5.1-codex-max",
1488 Self::Gpt51CodexMini => "gpt-5.1-codex-mini",
1489 Self::Gpt52 => "gpt-5.2",
1490 Self::Gpt52Codex => "gpt-5.2-codex",
1491 Self::Gpt52Pro => "gpt-5.2-pro",
1492 Self::Gpt53Codex => "gpt-5.3-codex",
1493 Self::Gpt53CodexSpark => "gpt-5.3-codex-spark",
1494 Self::Gpt54 => "gpt-5.4",
1495 Self::Gpt54Mini => "gpt-5.4-mini",
1496 Self::Gpt54Nano => "gpt-5.4-nano",
1497 Self::Gpt54Pro => "gpt-5.4-pro",
1498 Self::Gpt55 => "gpt-5.5",
1499 Self::Gpt55Pro => "gpt-5.5-pro",
1500 Self::O1 => "o1",
1501 Self::O1Pro => "o1-pro",
1502 Self::O3 => "o3",
1503 Self::O3DeepResearch => "o3-deep-research",
1504 Self::O3Mini => "o3-mini",
1505 Self::O3Pro => "o3-pro",
1506 Self::O4Mini => "o4-mini",
1507 Self::O4MiniDeepResearch => "o4-mini-deep-research",
1508 }
1509 }
1510 #[allow(clippy::too_many_lines)]
1511 fn display_name(self) -> &'static str {
1512 match self {
1513 Self::Gpt4 => "GPT-4",
1514 Self::Gpt4Turbo => "GPT-4 Turbo",
1515 Self::Gpt41 => "GPT-4.1",
1516 Self::Gpt41Mini => "GPT-4.1 mini",
1517 Self::Gpt41Nano => "GPT-4.1 nano",
1518 Self::Gpt4o => "GPT-4o",
1519 Self::Gpt4o20240513 => "GPT-4o (2024-05-13)",
1520 Self::Gpt4o20240806 => "GPT-4o (2024-08-06)",
1521 Self::Gpt4o20241120 => "GPT-4o (2024-11-20)",
1522 Self::Gpt4oMini => "GPT-4o mini",
1523 Self::Gpt5 => "GPT-5",
1524 Self::Gpt5Mini => "GPT-5 Mini",
1525 Self::Gpt5Nano => "GPT-5 Nano",
1526 Self::Gpt5Pro => "GPT-5 Pro",
1527 Self::Gpt5Codex => "GPT-5-Codex",
1528 Self::Gpt51 => "GPT-5.1",
1529 Self::Gpt51Codex => "GPT-5.1 Codex",
1530 Self::Gpt51CodexMax => "GPT-5.1 Codex Max",
1531 Self::Gpt51CodexMini => "GPT-5.1 Codex mini",
1532 Self::Gpt52 => "GPT-5.2",
1533 Self::Gpt52Codex => "GPT-5.2 Codex",
1534 Self::Gpt52Pro => "GPT-5.2 Pro",
1535 Self::Gpt53Codex => "GPT-5.3 Codex",
1536 Self::Gpt53CodexSpark => "GPT-5.3 Codex Spark",
1537 Self::Gpt54 => "GPT-5.4",
1538 Self::Gpt54Pro => "GPT-5.4 Pro",
1539 Self::Gpt54Mini => "GPT-5.4 mini",
1540 Self::Gpt54Nano => "GPT-5.4 nano",
1541 Self::Gpt55 => "GPT-5.5",
1542 Self::Gpt55Pro => "GPT-5.5 Pro",
1543 Self::O1 => "o1",
1544 Self::O1Pro => "o1-pro",
1545 Self::O3 => "o3",
1546 Self::O3DeepResearch => "o3-deep-research",
1547 Self::O3Mini => "o3-mini",
1548 Self::O3Pro => "o3-pro",
1549 Self::O4Mini => "o4-mini",
1550 Self::O4MiniDeepResearch => "o4-mini-deep-research",
1551 }
1552 }
1553 #[allow(clippy::too_many_lines)]
1554 fn context_window(self) -> u32 {
1555 match self {
1556 Self::Gpt4 => 8192,
1557 Self::Gpt4Turbo
1558 | Self::Gpt4o
1559 | Self::Gpt4o20240513
1560 | Self::Gpt4o20240806
1561 | Self::Gpt4o20241120
1562 | Self::Gpt4oMini
1563 | Self::Gpt53CodexSpark => 128_000,
1564 Self::O1
1565 | Self::O1Pro
1566 | Self::O3
1567 | Self::O3DeepResearch
1568 | Self::O3Mini
1569 | Self::O3Pro
1570 | Self::O4Mini
1571 | Self::O4MiniDeepResearch => 200_000,
1572 Self::Gpt5
1573 | Self::Gpt5Codex
1574 | Self::Gpt5Mini
1575 | Self::Gpt5Nano
1576 | Self::Gpt5Pro
1577 | Self::Gpt51
1578 | Self::Gpt51Codex
1579 | Self::Gpt51CodexMax
1580 | Self::Gpt51CodexMini
1581 | Self::Gpt52
1582 | Self::Gpt52Codex
1583 | Self::Gpt52Pro
1584 | Self::Gpt53Codex
1585 | Self::Gpt54Mini
1586 | Self::Gpt54Nano => 400_000,
1587 Self::Gpt41 | Self::Gpt41Mini | Self::Gpt41Nano => 1_047_576,
1588 Self::Gpt54 | Self::Gpt54Pro | Self::Gpt55 | Self::Gpt55Pro => 1_050_000,
1589 }
1590 }
1591 #[allow(clippy::too_many_lines)]
1592 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1593 match self {
1594 Self::Gpt4
1595 | Self::Gpt4Turbo
1596 | Self::Gpt41
1597 | Self::Gpt41Mini
1598 | Self::Gpt41Nano
1599 | Self::Gpt4o
1600 | Self::Gpt4o20240513
1601 | Self::Gpt4o20240806
1602 | Self::Gpt4o20241120
1603 | Self::Gpt4oMini => &[],
1604 Self::Gpt5
1605 | Self::Gpt5Codex
1606 | Self::Gpt5Mini
1607 | Self::Gpt5Nano
1608 | Self::Gpt5Pro
1609 | Self::Gpt51
1610 | Self::Gpt51Codex
1611 | Self::Gpt51CodexMax
1612 | Self::Gpt51CodexMini
1613 | Self::Gpt52
1614 | Self::Gpt52Codex
1615 | Self::Gpt52Pro
1616 | Self::Gpt53Codex
1617 | Self::Gpt53CodexSpark
1618 | Self::Gpt54
1619 | Self::Gpt54Mini
1620 | Self::Gpt54Nano
1621 | Self::Gpt54Pro
1622 | Self::Gpt55
1623 | Self::Gpt55Pro
1624 | Self::O1
1625 | Self::O1Pro
1626 | Self::O3
1627 | Self::O3DeepResearch
1628 | Self::O3Mini
1629 | Self::O3Pro
1630 | Self::O4Mini
1631 | Self::O4MiniDeepResearch => {
1632 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
1633 }
1634 }
1635 }
1636 pub fn supports_reasoning(self) -> bool {
1637 !self.reasoning_levels().is_empty()
1638 }
1639 #[allow(clippy::too_many_lines)]
1640 pub fn supports_prompt_caching(self) -> bool {
1641 match self {
1642 Self::Gpt4
1643 | Self::Gpt4Turbo
1644 | Self::Gpt4o20240513
1645 | Self::Gpt5Pro
1646 | Self::Gpt52Pro
1647 | Self::Gpt54Pro
1648 | Self::Gpt55Pro
1649 | Self::O1Pro
1650 | Self::O3Pro => false,
1651 Self::Gpt41
1652 | Self::Gpt41Mini
1653 | Self::Gpt41Nano
1654 | Self::Gpt4o
1655 | Self::Gpt4o20240806
1656 | Self::Gpt4o20241120
1657 | Self::Gpt4oMini
1658 | Self::Gpt5
1659 | Self::Gpt5Codex
1660 | Self::Gpt5Mini
1661 | Self::Gpt5Nano
1662 | Self::Gpt51
1663 | Self::Gpt51Codex
1664 | Self::Gpt51CodexMax
1665 | Self::Gpt51CodexMini
1666 | Self::Gpt52
1667 | Self::Gpt52Codex
1668 | Self::Gpt53Codex
1669 | Self::Gpt53CodexSpark
1670 | Self::Gpt54
1671 | Self::Gpt54Mini
1672 | Self::Gpt54Nano
1673 | Self::Gpt55
1674 | Self::O1
1675 | Self::O3
1676 | Self::O3DeepResearch
1677 | Self::O3Mini
1678 | Self::O4Mini
1679 | Self::O4MiniDeepResearch => true,
1680 }
1681 }
1682 #[allow(clippy::too_many_lines)]
1683 pub fn supports_image(self) -> bool {
1684 match self {
1685 Self::Gpt4 | Self::O3Mini => false,
1686 Self::Gpt4Turbo
1687 | Self::Gpt41
1688 | Self::Gpt41Mini
1689 | Self::Gpt41Nano
1690 | Self::Gpt4o
1691 | Self::Gpt4o20240513
1692 | Self::Gpt4o20240806
1693 | Self::Gpt4o20241120
1694 | Self::Gpt4oMini
1695 | Self::Gpt5
1696 | Self::Gpt5Codex
1697 | Self::Gpt5Mini
1698 | Self::Gpt5Nano
1699 | Self::Gpt5Pro
1700 | Self::Gpt51
1701 | Self::Gpt51Codex
1702 | Self::Gpt51CodexMax
1703 | Self::Gpt51CodexMini
1704 | Self::Gpt52
1705 | Self::Gpt52Codex
1706 | Self::Gpt52Pro
1707 | Self::Gpt53Codex
1708 | Self::Gpt53CodexSpark
1709 | Self::Gpt54
1710 | Self::Gpt54Mini
1711 | Self::Gpt54Nano
1712 | Self::Gpt54Pro
1713 | Self::Gpt55
1714 | Self::Gpt55Pro
1715 | Self::O1
1716 | Self::O1Pro
1717 | Self::O3
1718 | Self::O3DeepResearch
1719 | Self::O3Pro
1720 | Self::O4Mini
1721 | Self::O4MiniDeepResearch => true,
1722 }
1723 }
1724 #[allow(clippy::too_many_lines)]
1725 pub fn supports_audio(self) -> bool {
1726 match self {
1727 Self::Gpt4
1728 | Self::Gpt4Turbo
1729 | Self::Gpt41
1730 | Self::Gpt41Mini
1731 | Self::Gpt41Nano
1732 | Self::Gpt4o
1733 | Self::Gpt4o20240513
1734 | Self::Gpt4o20240806
1735 | Self::Gpt4o20241120
1736 | Self::Gpt4oMini
1737 | Self::Gpt5
1738 | Self::Gpt5Codex
1739 | Self::Gpt5Mini
1740 | Self::Gpt5Nano
1741 | Self::Gpt5Pro
1742 | Self::Gpt51
1743 | Self::Gpt51Codex
1744 | Self::Gpt51CodexMax
1745 | Self::Gpt51CodexMini
1746 | Self::Gpt52
1747 | Self::Gpt52Codex
1748 | Self::Gpt52Pro
1749 | Self::Gpt53Codex
1750 | Self::Gpt53CodexSpark
1751 | Self::Gpt54
1752 | Self::Gpt54Mini
1753 | Self::Gpt54Nano
1754 | Self::Gpt54Pro
1755 | Self::Gpt55
1756 | Self::Gpt55Pro
1757 | Self::O1
1758 | Self::O1Pro
1759 | Self::O3
1760 | Self::O3DeepResearch
1761 | Self::O3Mini
1762 | Self::O3Pro
1763 | Self::O4Mini
1764 | Self::O4MiniDeepResearch => false,
1765 }
1766 }
1767 const ALL: &[OpenaiModel] = &[
1768 Self::Gpt4,
1769 Self::Gpt4Turbo,
1770 Self::Gpt41,
1771 Self::Gpt41Mini,
1772 Self::Gpt41Nano,
1773 Self::Gpt4o,
1774 Self::Gpt4o20240513,
1775 Self::Gpt4o20240806,
1776 Self::Gpt4o20241120,
1777 Self::Gpt4oMini,
1778 Self::Gpt5,
1779 Self::Gpt5Codex,
1780 Self::Gpt5Mini,
1781 Self::Gpt5Nano,
1782 Self::Gpt5Pro,
1783 Self::Gpt51,
1784 Self::Gpt51Codex,
1785 Self::Gpt51CodexMax,
1786 Self::Gpt51CodexMini,
1787 Self::Gpt52,
1788 Self::Gpt52Codex,
1789 Self::Gpt52Pro,
1790 Self::Gpt53Codex,
1791 Self::Gpt53CodexSpark,
1792 Self::Gpt54,
1793 Self::Gpt54Mini,
1794 Self::Gpt54Nano,
1795 Self::Gpt54Pro,
1796 Self::Gpt55,
1797 Self::Gpt55Pro,
1798 Self::O1,
1799 Self::O1Pro,
1800 Self::O3,
1801 Self::O3DeepResearch,
1802 Self::O3Mini,
1803 Self::O3Pro,
1804 Self::O4Mini,
1805 Self::O4MiniDeepResearch,
1806 ];
1807}
1808impl std::str::FromStr for OpenaiModel {
1809 type Err = String;
1810 #[allow(clippy::too_many_lines)]
1811 fn from_str(s: &str) -> Result<Self, Self::Err> {
1812 match s {
1813 "gpt-4" => Ok(Self::Gpt4),
1814 "gpt-4-turbo" => Ok(Self::Gpt4Turbo),
1815 "gpt-4.1" => Ok(Self::Gpt41),
1816 "gpt-4.1-mini" => Ok(Self::Gpt41Mini),
1817 "gpt-4.1-nano" => Ok(Self::Gpt41Nano),
1818 "gpt-4o" => Ok(Self::Gpt4o),
1819 "gpt-4o-2024-05-13" => Ok(Self::Gpt4o20240513),
1820 "gpt-4o-2024-08-06" => Ok(Self::Gpt4o20240806),
1821 "gpt-4o-2024-11-20" => Ok(Self::Gpt4o20241120),
1822 "gpt-4o-mini" => Ok(Self::Gpt4oMini),
1823 "gpt-5" => Ok(Self::Gpt5),
1824 "gpt-5-codex" => Ok(Self::Gpt5Codex),
1825 "gpt-5-mini" => Ok(Self::Gpt5Mini),
1826 "gpt-5-nano" => Ok(Self::Gpt5Nano),
1827 "gpt-5-pro" => Ok(Self::Gpt5Pro),
1828 "gpt-5.1" => Ok(Self::Gpt51),
1829 "gpt-5.1-codex" => Ok(Self::Gpt51Codex),
1830 "gpt-5.1-codex-max" => Ok(Self::Gpt51CodexMax),
1831 "gpt-5.1-codex-mini" => Ok(Self::Gpt51CodexMini),
1832 "gpt-5.2" => Ok(Self::Gpt52),
1833 "gpt-5.2-codex" => Ok(Self::Gpt52Codex),
1834 "gpt-5.2-pro" => Ok(Self::Gpt52Pro),
1835 "gpt-5.3-codex" => Ok(Self::Gpt53Codex),
1836 "gpt-5.3-codex-spark" => Ok(Self::Gpt53CodexSpark),
1837 "gpt-5.4" => Ok(Self::Gpt54),
1838 "gpt-5.4-mini" => Ok(Self::Gpt54Mini),
1839 "gpt-5.4-nano" => Ok(Self::Gpt54Nano),
1840 "gpt-5.4-pro" => Ok(Self::Gpt54Pro),
1841 "gpt-5.5" => Ok(Self::Gpt55),
1842 "gpt-5.5-pro" => Ok(Self::Gpt55Pro),
1843 "o1" => Ok(Self::O1),
1844 "o1-pro" => Ok(Self::O1Pro),
1845 "o3" => Ok(Self::O3),
1846 "o3-deep-research" => Ok(Self::O3DeepResearch),
1847 "o3-mini" => Ok(Self::O3Mini),
1848 "o3-pro" => Ok(Self::O3Pro),
1849 "o4-mini" => Ok(Self::O4Mini),
1850 "o4-mini-deep-research" => Ok(Self::O4MiniDeepResearch),
1851 _ => Err(format!("Unknown openai model: '{s}'")),
1852 }
1853 }
1854}
1855impl OpenRouterModel {
1856 #[allow(clippy::too_many_lines)]
1857 fn model_id(self) -> &'static str {
1858 match self {
1859 Self::Ai21JambaLarge17 => "ai21/jamba-large-1.7",
1860 Self::AlibabaTongyiDeepresearch30bA3b => {
1861 "alibaba/tongyi-deepresearch-30b-a3b"
1862 }
1863 Self::AmazonNova2LiteV1 => "amazon/nova-2-lite-v1",
1864 Self::AmazonNovaLiteV1 => "amazon/nova-lite-v1",
1865 Self::AmazonNovaMicroV1 => "amazon/nova-micro-v1",
1866 Self::AmazonNovaPremierV1 => "amazon/nova-premier-v1",
1867 Self::AmazonNovaProV1 => "amazon/nova-pro-v1",
1868 Self::AnthropicClaude3Haiku => "anthropic/claude-3-haiku",
1869 Self::AnthropicClaude35Haiku => "anthropic/claude-3.5-haiku",
1870 Self::AnthropicClaudeHaiku45 => "anthropic/claude-haiku-4.5",
1871 Self::AnthropicClaudeOpus4 => "anthropic/claude-opus-4",
1872 Self::AnthropicClaudeOpus41 => "anthropic/claude-opus-4.1",
1873 Self::AnthropicClaudeOpus45 => "anthropic/claude-opus-4.5",
1874 Self::AnthropicClaudeOpus46 => "anthropic/claude-opus-4.6",
1875 Self::AnthropicClaudeOpus46Fast => "anthropic/claude-opus-4.6-fast",
1876 Self::AnthropicClaudeOpus47 => "anthropic/claude-opus-4.7",
1877 Self::AnthropicClaudeOpus47Fast => "anthropic/claude-opus-4.7-fast",
1878 Self::AnthropicClaudeSonnet4 => "anthropic/claude-sonnet-4",
1879 Self::AnthropicClaudeSonnet45 => "anthropic/claude-sonnet-4.5",
1880 Self::AnthropicClaudeSonnet46 => "anthropic/claude-sonnet-4.6",
1881 Self::ArceeAiTrinityLargePreview => "arcee-ai/trinity-large-preview",
1882 Self::ArceeAiTrinityLargeThinking => "arcee-ai/trinity-large-thinking",
1883 Self::ArceeAiTrinityLargeThinkingFree => {
1884 "arcee-ai/trinity-large-thinking:free"
1885 }
1886 Self::ArceeAiTrinityMini => "arcee-ai/trinity-mini",
1887 Self::ArceeAiVirtuosoLarge => "arcee-ai/virtuoso-large",
1888 Self::BaiduCobuddyFree => "baidu/cobuddy:free",
1889 Self::BaiduErnie4521bA3b => "baidu/ernie-4.5-21b-a3b",
1890 Self::BaiduErnie45Vl28bA3b => "baidu/ernie-4.5-vl-28b-a3b",
1891 Self::BytedanceSeedSeed16 => "bytedance-seed/seed-1.6",
1892 Self::BytedanceSeedSeed16Flash => "bytedance-seed/seed-1.6-flash",
1893 Self::BytedanceSeedSeed20Lite => "bytedance-seed/seed-2.0-lite",
1894 Self::BytedanceSeedSeed20Mini => "bytedance-seed/seed-2.0-mini",
1895 Self::CohereCommandR082024 => "cohere/command-r-08-2024",
1896 Self::CohereCommandRPlus082024 => "cohere/command-r-plus-08-2024",
1897 Self::DeepseekDeepseekChat => "deepseek/deepseek-chat",
1898 Self::DeepseekDeepseekChatV30324 => "deepseek/deepseek-chat-v3-0324",
1899 Self::DeepseekDeepseekChatV31 => "deepseek/deepseek-chat-v3.1",
1900 Self::DeepseekDeepseekR1 => "deepseek/deepseek-r1",
1901 Self::DeepseekDeepseekR10528 => "deepseek/deepseek-r1-0528",
1902 Self::DeepseekDeepseekV31Terminus => "deepseek/deepseek-v3.1-terminus",
1903 Self::DeepseekDeepseekV32 => "deepseek/deepseek-v3.2",
1904 Self::DeepseekDeepseekV32Exp => "deepseek/deepseek-v3.2-exp",
1905 Self::DeepseekDeepseekV4Flash => "deepseek/deepseek-v4-flash",
1906 Self::DeepseekDeepseekV4FlashFree => "deepseek/deepseek-v4-flash:free",
1907 Self::DeepseekDeepseekV4Pro => "deepseek/deepseek-v4-pro",
1908 Self::EssentialaiRnj1Instruct => "essentialai/rnj-1-instruct",
1909 Self::GoogleGemini20Flash001 => "google/gemini-2.0-flash-001",
1910 Self::GoogleGemini20FlashLite001 => "google/gemini-2.0-flash-lite-001",
1911 Self::GoogleGemini25Flash => "google/gemini-2.5-flash",
1912 Self::GoogleGemini25FlashLite => "google/gemini-2.5-flash-lite",
1913 Self::GoogleGemini25FlashLitePreview092025 => {
1914 "google/gemini-2.5-flash-lite-preview-09-2025"
1915 }
1916 Self::GoogleGemini25Pro => "google/gemini-2.5-pro",
1917 Self::GoogleGemini25ProPreview => "google/gemini-2.5-pro-preview",
1918 Self::GoogleGemini25ProPreview0506 => "google/gemini-2.5-pro-preview-05-06",
1919 Self::GoogleGemini3FlashPreview => "google/gemini-3-flash-preview",
1920 Self::GoogleGemini31FlashLite => "google/gemini-3.1-flash-lite",
1921 Self::GoogleGemini31FlashLitePreview => {
1922 "google/gemini-3.1-flash-lite-preview"
1923 }
1924 Self::GoogleGemini31ProPreview => "google/gemini-3.1-pro-preview",
1925 Self::GoogleGemini31ProPreviewCustomtools => {
1926 "google/gemini-3.1-pro-preview-customtools"
1927 }
1928 Self::GoogleGemini35Flash => "google/gemini-3.5-flash",
1929 Self::GoogleGemma312bIt => "google/gemma-3-12b-it",
1930 Self::GoogleGemma327bIt => "google/gemma-3-27b-it",
1931 Self::GoogleGemma426bA4bIt => "google/gemma-4-26b-a4b-it",
1932 Self::GoogleGemma426bA4bItFree => "google/gemma-4-26b-a4b-it:free",
1933 Self::GoogleGemma431bIt => "google/gemma-4-31b-it",
1934 Self::GoogleGemma431bItFree => "google/gemma-4-31b-it:free",
1935 Self::IbmGraniteGranite418b => "ibm-granite/granite-4.1-8b",
1936 Self::InceptionMercury2 => "inception/mercury-2",
1937 Self::InclusionaiLing261t => "inclusionai/ling-2.6-1t",
1938 Self::InclusionaiLing26Flash => "inclusionai/ling-2.6-flash",
1939 Self::InclusionaiRing261t => "inclusionai/ring-2.6-1t",
1940 Self::KwaipilotKatCoderProV2 => "kwaipilot/kat-coder-pro-v2",
1941 Self::MetaLlamaLlama3170bInstruct => "meta-llama/llama-3.1-70b-instruct",
1942 Self::MetaLlamaLlama318bInstruct => "meta-llama/llama-3.1-8b-instruct",
1943 Self::MetaLlamaLlama3370bInstruct => "meta-llama/llama-3.3-70b-instruct",
1944 Self::MetaLlamaLlama3370bInstructFree => {
1945 "meta-llama/llama-3.3-70b-instruct:free"
1946 }
1947 Self::MetaLlamaLlama4Scout => "meta-llama/llama-4-scout",
1948 Self::MinimaxMinimaxM1 => "minimax/minimax-m1",
1949 Self::MinimaxMinimaxM2 => "minimax/minimax-m2",
1950 Self::MinimaxMinimaxM21 => "minimax/minimax-m2.1",
1951 Self::MinimaxMinimaxM25 => "minimax/minimax-m2.5",
1952 Self::MinimaxMinimaxM25Free => "minimax/minimax-m2.5:free",
1953 Self::MinimaxMinimaxM27 => "minimax/minimax-m2.7",
1954 Self::MistralaiCodestral2508 => "mistralai/codestral-2508",
1955 Self::MistralaiDevstral2512 => "mistralai/devstral-2512",
1956 Self::MistralaiDevstralMedium => "mistralai/devstral-medium",
1957 Self::MistralaiDevstralSmall => "mistralai/devstral-small",
1958 Self::MistralaiMinistral14b2512 => "mistralai/ministral-14b-2512",
1959 Self::MistralaiMinistral3b2512 => "mistralai/ministral-3b-2512",
1960 Self::MistralaiMinistral8b2512 => "mistralai/ministral-8b-2512",
1961 Self::MistralaiMistralLarge => "mistralai/mistral-large",
1962 Self::MistralaiMistralLarge2407 => "mistralai/mistral-large-2407",
1963 Self::MistralaiMistralLarge2411 => "mistralai/mistral-large-2411",
1964 Self::MistralaiMistralLarge2512 => "mistralai/mistral-large-2512",
1965 Self::MistralaiMistralMedium3 => "mistralai/mistral-medium-3",
1966 Self::MistralaiMistralMedium35 => "mistralai/mistral-medium-3-5",
1967 Self::MistralaiMistralMedium31 => "mistralai/mistral-medium-3.1",
1968 Self::MistralaiMistralNemo => "mistralai/mistral-nemo",
1969 Self::MistralaiMistralSaba => "mistralai/mistral-saba",
1970 Self::MistralaiMistralSmall2603 => "mistralai/mistral-small-2603",
1971 Self::MistralaiMistralSmall3224bInstruct => {
1972 "mistralai/mistral-small-3.2-24b-instruct"
1973 }
1974 Self::MistralaiMixtral8x22bInstruct => "mistralai/mixtral-8x22b-instruct",
1975 Self::MistralaiPixtralLarge2411 => "mistralai/pixtral-large-2411",
1976 Self::MistralaiVoxtralSmall24b2507 => "mistralai/voxtral-small-24b-2507",
1977 Self::MoonshotaiKimiK2 => "moonshotai/kimi-k2",
1978 Self::MoonshotaiKimiK20905 => "moonshotai/kimi-k2-0905",
1979 Self::MoonshotaiKimiK2Thinking => "moonshotai/kimi-k2-thinking",
1980 Self::MoonshotaiKimiK25 => "moonshotai/kimi-k2.5",
1981 Self::MoonshotaiKimiK26 => "moonshotai/kimi-k2.6",
1982 Self::NexAgiDeepseekV31NexN1 => "nex-agi/deepseek-v3.1-nex-n1",
1983 Self::NvidiaLlama33NemotronSuper49bV15 => {
1984 "nvidia/llama-3.3-nemotron-super-49b-v1.5"
1985 }
1986 Self::NvidiaNemotron3Nano30bA3b => "nvidia/nemotron-3-nano-30b-a3b",
1987 Self::NvidiaNemotron3Nano30bA3bFree => "nvidia/nemotron-3-nano-30b-a3b:free",
1988 Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree => {
1989 "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free"
1990 }
1991 Self::NvidiaNemotron3Super120bA12b => "nvidia/nemotron-3-super-120b-a12b",
1992 Self::NvidiaNemotron3Super120bA12bFree => {
1993 "nvidia/nemotron-3-super-120b-a12b:free"
1994 }
1995 Self::NvidiaNemotronNano12bV2VlFree => "nvidia/nemotron-nano-12b-v2-vl:free",
1996 Self::NvidiaNemotronNano9bV2 => "nvidia/nemotron-nano-9b-v2",
1997 Self::NvidiaNemotronNano9bV2Free => "nvidia/nemotron-nano-9b-v2:free",
1998 Self::OpenaiGpt35Turbo => "openai/gpt-3.5-turbo",
1999 Self::OpenaiGpt35Turbo0613 => "openai/gpt-3.5-turbo-0613",
2000 Self::OpenaiGpt35Turbo16k => "openai/gpt-3.5-turbo-16k",
2001 Self::OpenaiGpt4 => "openai/gpt-4",
2002 Self::OpenaiGpt40314 => "openai/gpt-4-0314",
2003 Self::OpenaiGpt41106Preview => "openai/gpt-4-1106-preview",
2004 Self::OpenaiGpt4Turbo => "openai/gpt-4-turbo",
2005 Self::OpenaiGpt4TurboPreview => "openai/gpt-4-turbo-preview",
2006 Self::OpenaiGpt41 => "openai/gpt-4.1",
2007 Self::OpenaiGpt41Mini => "openai/gpt-4.1-mini",
2008 Self::OpenaiGpt41Nano => "openai/gpt-4.1-nano",
2009 Self::OpenaiGpt4o => "openai/gpt-4o",
2010 Self::OpenaiGpt4o20240513 => "openai/gpt-4o-2024-05-13",
2011 Self::OpenaiGpt4o20240806 => "openai/gpt-4o-2024-08-06",
2012 Self::OpenaiGpt4o20241120 => "openai/gpt-4o-2024-11-20",
2013 Self::OpenaiGpt4oAudioPreview => "openai/gpt-4o-audio-preview",
2014 Self::OpenaiGpt4oMini => "openai/gpt-4o-mini",
2015 Self::OpenaiGpt4oMini20240718 => "openai/gpt-4o-mini-2024-07-18",
2016 Self::OpenaiGpt5 => "openai/gpt-5",
2017 Self::OpenaiGpt5Codex => "openai/gpt-5-codex",
2018 Self::OpenaiGpt5Mini => "openai/gpt-5-mini",
2019 Self::OpenaiGpt5Nano => "openai/gpt-5-nano",
2020 Self::OpenaiGpt5Pro => "openai/gpt-5-pro",
2021 Self::OpenaiGpt51 => "openai/gpt-5.1",
2022 Self::OpenaiGpt51Chat => "openai/gpt-5.1-chat",
2023 Self::OpenaiGpt51Codex => "openai/gpt-5.1-codex",
2024 Self::OpenaiGpt51CodexMax => "openai/gpt-5.1-codex-max",
2025 Self::OpenaiGpt51CodexMini => "openai/gpt-5.1-codex-mini",
2026 Self::OpenaiGpt52 => "openai/gpt-5.2",
2027 Self::OpenaiGpt52Chat => "openai/gpt-5.2-chat",
2028 Self::OpenaiGpt52Codex => "openai/gpt-5.2-codex",
2029 Self::OpenaiGpt52Pro => "openai/gpt-5.2-pro",
2030 Self::OpenaiGpt53Chat => "openai/gpt-5.3-chat",
2031 Self::OpenaiGpt53Codex => "openai/gpt-5.3-codex",
2032 Self::OpenaiGpt54 => "openai/gpt-5.4",
2033 Self::OpenaiGpt54Mini => "openai/gpt-5.4-mini",
2034 Self::OpenaiGpt54Nano => "openai/gpt-5.4-nano",
2035 Self::OpenaiGpt54Pro => "openai/gpt-5.4-pro",
2036 Self::OpenaiGpt55 => "openai/gpt-5.5",
2037 Self::OpenaiGpt55Pro => "openai/gpt-5.5-pro",
2038 Self::OpenaiGptAudio => "openai/gpt-audio",
2039 Self::OpenaiGptAudioMini => "openai/gpt-audio-mini",
2040 Self::OpenaiGptOss120b => "openai/gpt-oss-120b",
2041 Self::OpenaiGptOss120bFree => "openai/gpt-oss-120b:free",
2042 Self::OpenaiGptOss20b => "openai/gpt-oss-20b",
2043 Self::OpenaiGptOss20bFree => "openai/gpt-oss-20b:free",
2044 Self::OpenaiGptOssSafeguard20b => "openai/gpt-oss-safeguard-20b",
2045 Self::OpenaiO1 => "openai/o1",
2046 Self::OpenaiO3 => "openai/o3",
2047 Self::OpenaiO3DeepResearch => "openai/o3-deep-research",
2048 Self::OpenaiO3Mini => "openai/o3-mini",
2049 Self::OpenaiO3MiniHigh => "openai/o3-mini-high",
2050 Self::OpenaiO3Pro => "openai/o3-pro",
2051 Self::OpenaiO4Mini => "openai/o4-mini",
2052 Self::OpenaiO4MiniDeepResearch => "openai/o4-mini-deep-research",
2053 Self::OpenaiO4MiniHigh => "openai/o4-mini-high",
2054 Self::OpenrouterAuto => "openrouter/auto",
2055 Self::OpenrouterFree => "openrouter/free",
2056 Self::OpenrouterOwlAlpha => "openrouter/owl-alpha",
2057 Self::PoolsideLagunaM1Free => "poolside/laguna-m.1:free",
2058 Self::PoolsideLagunaXs2Free => "poolside/laguna-xs.2:free",
2059 Self::PrimeIntellectIntellect3 => "prime-intellect/intellect-3",
2060 Self::QwenQwen2572bInstruct => "qwen/qwen-2.5-72b-instruct",
2061 Self::QwenQwen257bInstruct => "qwen/qwen-2.5-7b-instruct",
2062 Self::QwenQwenPlus => "qwen/qwen-plus",
2063 Self::QwenQwenPlus20250728 => "qwen/qwen-plus-2025-07-28",
2064 Self::QwenQwenPlus20250728Thinking => "qwen/qwen-plus-2025-07-28:thinking",
2065 Self::QwenQwen314b => "qwen/qwen3-14b",
2066 Self::QwenQwen3235bA22b => "qwen/qwen3-235b-a22b",
2067 Self::QwenQwen3235bA22b2507 => "qwen/qwen3-235b-a22b-2507",
2068 Self::QwenQwen3235bA22bThinking2507 => "qwen/qwen3-235b-a22b-thinking-2507",
2069 Self::QwenQwen330bA3b => "qwen/qwen3-30b-a3b",
2070 Self::QwenQwen330bA3bInstruct2507 => "qwen/qwen3-30b-a3b-instruct-2507",
2071 Self::QwenQwen330bA3bThinking2507 => "qwen/qwen3-30b-a3b-thinking-2507",
2072 Self::QwenQwen332b => "qwen/qwen3-32b",
2073 Self::QwenQwen38b => "qwen/qwen3-8b",
2074 Self::QwenQwen3Coder => "qwen/qwen3-coder",
2075 Self::QwenQwen3Coder30bA3bInstruct => "qwen/qwen3-coder-30b-a3b-instruct",
2076 Self::QwenQwen3CoderFlash => "qwen/qwen3-coder-flash",
2077 Self::QwenQwen3CoderNext => "qwen/qwen3-coder-next",
2078 Self::QwenQwen3CoderPlus => "qwen/qwen3-coder-plus",
2079 Self::QwenQwen3CoderFree => "qwen/qwen3-coder:free",
2080 Self::QwenQwen3Max => "qwen/qwen3-max",
2081 Self::QwenQwen3MaxThinking => "qwen/qwen3-max-thinking",
2082 Self::QwenQwen3Next80bA3bInstruct => "qwen/qwen3-next-80b-a3b-instruct",
2083 Self::QwenQwen3Next80bA3bInstructFree => {
2084 "qwen/qwen3-next-80b-a3b-instruct:free"
2085 }
2086 Self::QwenQwen3Next80bA3bThinking => "qwen/qwen3-next-80b-a3b-thinking",
2087 Self::QwenQwen3Vl235bA22bInstruct => "qwen/qwen3-vl-235b-a22b-instruct",
2088 Self::QwenQwen3Vl235bA22bThinking => "qwen/qwen3-vl-235b-a22b-thinking",
2089 Self::QwenQwen3Vl30bA3bInstruct => "qwen/qwen3-vl-30b-a3b-instruct",
2090 Self::QwenQwen3Vl30bA3bThinking => "qwen/qwen3-vl-30b-a3b-thinking",
2091 Self::QwenQwen3Vl32bInstruct => "qwen/qwen3-vl-32b-instruct",
2092 Self::QwenQwen3Vl8bInstruct => "qwen/qwen3-vl-8b-instruct",
2093 Self::QwenQwen3Vl8bThinking => "qwen/qwen3-vl-8b-thinking",
2094 Self::QwenQwen35122bA10b => "qwen/qwen3.5-122b-a10b",
2095 Self::QwenQwen3527b => "qwen/qwen3.5-27b",
2096 Self::QwenQwen3535bA3b => "qwen/qwen3.5-35b-a3b",
2097 Self::QwenQwen35397bA17b => "qwen/qwen3.5-397b-a17b",
2098 Self::QwenQwen359b => "qwen/qwen3.5-9b",
2099 Self::QwenQwen35Flash0223 => "qwen/qwen3.5-flash-02-23",
2100 Self::QwenQwen35Plus0215 => "qwen/qwen3.5-plus-02-15",
2101 Self::QwenQwen35Plus20260420 => "qwen/qwen3.5-plus-20260420",
2102 Self::QwenQwen3627b => "qwen/qwen3.6-27b",
2103 Self::QwenQwen3635bA3b => "qwen/qwen3.6-35b-a3b",
2104 Self::QwenQwen36Flash => "qwen/qwen3.6-flash",
2105 Self::QwenQwen36MaxPreview => "qwen/qwen3.6-max-preview",
2106 Self::QwenQwen36Plus => "qwen/qwen3.6-plus",
2107 Self::RekaaiRekaEdge => "rekaai/reka-edge",
2108 Self::RelaceRelaceSearch => "relace/relace-search",
2109 Self::Sao10kL3Euryale70b => "sao10k/l3-euryale-70b",
2110 Self::Sao10kL31Euryale70b => "sao10k/l3.1-euryale-70b",
2111 Self::StepfunStep35Flash => "stepfun/step-3.5-flash",
2112 Self::TencentHy3Preview => "tencent/hy3-preview",
2113 Self::ThedrummerRocinante12b => "thedrummer/rocinante-12b",
2114 Self::ThedrummerUnslopnemo12b => "thedrummer/unslopnemo-12b",
2115 Self::UpstageSolarPro3 => "upstage/solar-pro-3",
2116 Self::XAiGrok420 => "x-ai/grok-4.20",
2117 Self::XAiGrok43 => "x-ai/grok-4.3",
2118 Self::XiaomiMimoV2Flash => "xiaomi/mimo-v2-flash",
2119 Self::XiaomiMimoV2Omni => "xiaomi/mimo-v2-omni",
2120 Self::XiaomiMimoV2Pro => "xiaomi/mimo-v2-pro",
2121 Self::XiaomiMimoV25 => "xiaomi/mimo-v2.5",
2122 Self::XiaomiMimoV25Pro => "xiaomi/mimo-v2.5-pro",
2123 Self::ZAiGlm432b => "z-ai/glm-4-32b",
2124 Self::ZAiGlm45 => "z-ai/glm-4.5",
2125 Self::ZAiGlm45Air => "z-ai/glm-4.5-air",
2126 Self::ZAiGlm45AirFree => "z-ai/glm-4.5-air:free",
2127 Self::ZAiGlm45v => "z-ai/glm-4.5v",
2128 Self::ZAiGlm46 => "z-ai/glm-4.6",
2129 Self::ZAiGlm46v => "z-ai/glm-4.6v",
2130 Self::ZAiGlm47 => "z-ai/glm-4.7",
2131 Self::ZAiGlm47Flash => "z-ai/glm-4.7-flash",
2132 Self::ZAiGlm5 => "z-ai/glm-5",
2133 Self::ZAiGlm5Turbo => "z-ai/glm-5-turbo",
2134 Self::ZAiGlm51 => "z-ai/glm-5.1",
2135 Self::ZAiGlm5vTurbo => "z-ai/glm-5v-turbo",
2136 }
2137 }
2138 #[allow(clippy::too_many_lines)]
2139 fn display_name(self) -> &'static str {
2140 match self {
2141 Self::OpenrouterAuto => "Auto Router",
2142 Self::AnthropicClaude3Haiku => "Claude 3 Haiku",
2143 Self::AnthropicClaude35Haiku => "Claude 3.5 Haiku",
2144 Self::AnthropicClaudeHaiku45 => "Claude Haiku 4.5",
2145 Self::AnthropicClaudeOpus4 => "Claude Opus 4",
2146 Self::AnthropicClaudeOpus41 => "Claude Opus 4.1",
2147 Self::AnthropicClaudeOpus45 => "Claude Opus 4.5",
2148 Self::AnthropicClaudeOpus46 => "Claude Opus 4.6",
2149 Self::AnthropicClaudeOpus46Fast => "Claude Opus 4.6 (Fast)",
2150 Self::AnthropicClaudeOpus47 => "Claude Opus 4.7",
2151 Self::AnthropicClaudeOpus47Fast => "Claude Opus 4.7 (Fast)",
2152 Self::AnthropicClaudeSonnet4 => "Claude Sonnet 4",
2153 Self::AnthropicClaudeSonnet45 => "Claude Sonnet 4.5",
2154 Self::AnthropicClaudeSonnet46 => "Claude Sonnet 4.6",
2155 Self::BaiduCobuddyFree => "CoBuddy (free)",
2156 Self::MistralaiCodestral2508 => "Codestral 2508",
2157 Self::CohereCommandR082024 => "Command R (08-2024)",
2158 Self::CohereCommandRPlus082024 => "Command R+ (08-2024)",
2159 Self::DeepseekDeepseekChat => "DeepSeek V3",
2160 Self::DeepseekDeepseekChatV30324 => "DeepSeek V3 0324",
2161 Self::DeepseekDeepseekChatV31 => "DeepSeek V3.1",
2162 Self::NexAgiDeepseekV31NexN1 => "DeepSeek V3.1 Nex N1",
2163 Self::DeepseekDeepseekV31Terminus => "DeepSeek V3.1 Terminus",
2164 Self::DeepseekDeepseekV32 => "DeepSeek V3.2",
2165 Self::DeepseekDeepseekV32Exp => "DeepSeek V3.2 Exp",
2166 Self::DeepseekDeepseekV4Flash => "DeepSeek V4 Flash",
2167 Self::DeepseekDeepseekV4FlashFree => "DeepSeek V4 Flash (free)",
2168 Self::DeepseekDeepseekV4Pro => "DeepSeek V4 Pro",
2169 Self::MistralaiDevstral2512 => "Devstral 2 2512",
2170 Self::MistralaiDevstralMedium => "Devstral Medium",
2171 Self::MistralaiDevstralSmall => "Devstral Small 1.1",
2172 Self::BaiduErnie4521bA3b => "ERNIE 4.5 21B A3B",
2173 Self::BaiduErnie45Vl28bA3b => "ERNIE 4.5 VL 28B A3B",
2174 Self::OpenrouterFree => "Free Models Router",
2175 Self::ZAiGlm432b => "GLM 4 32B ",
2176 Self::ZAiGlm45 => "GLM 4.5",
2177 Self::ZAiGlm45Air => "GLM 4.5 Air",
2178 Self::ZAiGlm45AirFree => "GLM 4.5 Air (free)",
2179 Self::ZAiGlm45v => "GLM 4.5V",
2180 Self::ZAiGlm46 => "GLM 4.6",
2181 Self::ZAiGlm46v => "GLM 4.6V",
2182 Self::ZAiGlm47 => "GLM 4.7",
2183 Self::ZAiGlm47Flash => "GLM 4.7 Flash",
2184 Self::ZAiGlm5 => "GLM 5",
2185 Self::ZAiGlm5Turbo => "GLM 5 Turbo",
2186 Self::ZAiGlm51 => "GLM 5.1",
2187 Self::ZAiGlm5vTurbo => "GLM 5V Turbo",
2188 Self::OpenaiGptAudio => "GPT Audio",
2189 Self::OpenaiGptAudioMini => "GPT Audio Mini",
2190 Self::OpenaiGpt35Turbo => "GPT-3.5 Turbo",
2191 Self::OpenaiGpt35Turbo0613 => "GPT-3.5 Turbo (older v0613)",
2192 Self::OpenaiGpt35Turbo16k => "GPT-3.5 Turbo 16k",
2193 Self::OpenaiGpt4 => "GPT-4",
2194 Self::OpenaiGpt40314 => "GPT-4 (older v0314)",
2195 Self::OpenaiGpt4Turbo => "GPT-4 Turbo",
2196 Self::OpenaiGpt41106Preview => "GPT-4 Turbo (older v1106)",
2197 Self::OpenaiGpt4TurboPreview => "GPT-4 Turbo Preview",
2198 Self::OpenaiGpt41 => "GPT-4.1",
2199 Self::OpenaiGpt41Mini => "GPT-4.1 Mini",
2200 Self::OpenaiGpt41Nano => "GPT-4.1 Nano",
2201 Self::OpenaiGpt4o => "GPT-4o",
2202 Self::OpenaiGpt4o20240513 => "GPT-4o (2024-05-13)",
2203 Self::OpenaiGpt4o20240806 => "GPT-4o (2024-08-06)",
2204 Self::OpenaiGpt4o20241120 => "GPT-4o (2024-11-20)",
2205 Self::OpenaiGpt4oAudioPreview => "GPT-4o Audio",
2206 Self::OpenaiGpt4oMini => "GPT-4o-mini",
2207 Self::OpenaiGpt4oMini20240718 => "GPT-4o-mini (2024-07-18)",
2208 Self::OpenaiGpt5 => "GPT-5",
2209 Self::OpenaiGpt5Codex => "GPT-5 Codex",
2210 Self::OpenaiGpt5Mini => "GPT-5 Mini",
2211 Self::OpenaiGpt5Nano => "GPT-5 Nano",
2212 Self::OpenaiGpt5Pro => "GPT-5 Pro",
2213 Self::OpenaiGpt51 => "GPT-5.1",
2214 Self::OpenaiGpt51Chat => "GPT-5.1 Chat",
2215 Self::OpenaiGpt51Codex => "GPT-5.1-Codex",
2216 Self::OpenaiGpt51CodexMax => "GPT-5.1-Codex-Max",
2217 Self::OpenaiGpt51CodexMini => "GPT-5.1-Codex-Mini",
2218 Self::OpenaiGpt52 => "GPT-5.2",
2219 Self::OpenaiGpt52Chat => "GPT-5.2 Chat",
2220 Self::OpenaiGpt52Pro => "GPT-5.2 Pro",
2221 Self::OpenaiGpt52Codex => "GPT-5.2-Codex",
2222 Self::OpenaiGpt53Chat => "GPT-5.3 Chat",
2223 Self::OpenaiGpt53Codex => "GPT-5.3-Codex",
2224 Self::OpenaiGpt54 => "GPT-5.4",
2225 Self::OpenaiGpt54Mini => "GPT-5.4 Mini",
2226 Self::OpenaiGpt54Nano => "GPT-5.4 Nano",
2227 Self::OpenaiGpt54Pro => "GPT-5.4 Pro",
2228 Self::OpenaiGpt55 => "GPT-5.5",
2229 Self::OpenaiGpt55Pro => "GPT-5.5 Pro",
2230 Self::GoogleGemini20Flash001 => "Gemini 2.0 Flash",
2231 Self::GoogleGemini20FlashLite001 => "Gemini 2.0 Flash Lite",
2232 Self::GoogleGemini25Flash => "Gemini 2.5 Flash",
2233 Self::GoogleGemini25FlashLite => "Gemini 2.5 Flash Lite",
2234 Self::GoogleGemini25FlashLitePreview092025 => {
2235 "Gemini 2.5 Flash Lite Preview 09-2025"
2236 }
2237 Self::GoogleGemini25Pro => "Gemini 2.5 Pro",
2238 Self::GoogleGemini25ProPreview0506 => "Gemini 2.5 Pro Preview 05-06",
2239 Self::GoogleGemini25ProPreview => "Gemini 2.5 Pro Preview 06-05",
2240 Self::GoogleGemini3FlashPreview => "Gemini 3 Flash Preview",
2241 Self::GoogleGemini31FlashLite => "Gemini 3.1 Flash Lite",
2242 Self::GoogleGemini31FlashLitePreview => "Gemini 3.1 Flash Lite Preview",
2243 Self::GoogleGemini31ProPreview => "Gemini 3.1 Pro Preview",
2244 Self::GoogleGemini31ProPreviewCustomtools => {
2245 "Gemini 3.1 Pro Preview Custom Tools"
2246 }
2247 Self::GoogleGemini35Flash => "Gemini 3.5 Flash",
2248 Self::GoogleGemma312bIt => "Gemma 3 12B",
2249 Self::GoogleGemma327bIt => "Gemma 3 27B",
2250 Self::GoogleGemma426bA4bIt => "Gemma 4 26B A4B ",
2251 Self::GoogleGemma426bA4bItFree => "Gemma 4 26B A4B (free)",
2252 Self::GoogleGemma431bIt => "Gemma 4 31B",
2253 Self::GoogleGemma431bItFree => "Gemma 4 31B (free)",
2254 Self::IbmGraniteGranite418b => "Granite 4.1 8B",
2255 Self::XAiGrok420 => "Grok 4.20",
2256 Self::XAiGrok43 => "Grok 4.3",
2257 Self::TencentHy3Preview => "Hy3 preview",
2258 Self::PrimeIntellectIntellect3 => "INTELLECT-3",
2259 Self::Ai21JambaLarge17 => "Jamba Large 1.7",
2260 Self::KwaipilotKatCoderProV2 => "KAT-Coder-Pro V2",
2261 Self::MoonshotaiKimiK2 => "Kimi K2 0711",
2262 Self::MoonshotaiKimiK20905 => "Kimi K2 0905",
2263 Self::MoonshotaiKimiK2Thinking => "Kimi K2 Thinking",
2264 Self::MoonshotaiKimiK25 => "Kimi K2.5",
2265 Self::MoonshotaiKimiK26 => "Kimi K2.6",
2266 Self::PoolsideLagunaM1Free => "Laguna M.1 (free)",
2267 Self::PoolsideLagunaXs2Free => "Laguna XS.2 (free)",
2268 Self::InclusionaiLing261t => "Ling-2.6-1T",
2269 Self::InclusionaiLing26Flash => "Ling-2.6-flash",
2270 Self::Sao10kL3Euryale70b => "Llama 3 Euryale 70B v2.1",
2271 Self::MetaLlamaLlama3170bInstruct => "Llama 3.1 70B Instruct",
2272 Self::MetaLlamaLlama318bInstruct => "Llama 3.1 8B Instruct",
2273 Self::Sao10kL31Euryale70b => "Llama 3.1 Euryale 70B v2.2",
2274 Self::MetaLlamaLlama3370bInstruct => "Llama 3.3 70B Instruct",
2275 Self::MetaLlamaLlama3370bInstructFree => "Llama 3.3 70B Instruct (free)",
2276 Self::NvidiaLlama33NemotronSuper49bV15 => "Llama 3.3 Nemotron Super 49B V1.5",
2277 Self::MetaLlamaLlama4Scout => "Llama 4 Scout",
2278 Self::InceptionMercury2 => "Mercury 2",
2279 Self::XiaomiMimoV2Flash => "MiMo-V2-Flash",
2280 Self::XiaomiMimoV2Omni => "MiMo-V2-Omni",
2281 Self::XiaomiMimoV2Pro => "MiMo-V2-Pro",
2282 Self::XiaomiMimoV25 => "MiMo-V2.5",
2283 Self::XiaomiMimoV25Pro => "MiMo-V2.5-Pro",
2284 Self::MinimaxMinimaxM1 => "MiniMax M1",
2285 Self::MinimaxMinimaxM2 => "MiniMax M2",
2286 Self::MinimaxMinimaxM21 => "MiniMax M2.1",
2287 Self::MinimaxMinimaxM25 => "MiniMax M2.5",
2288 Self::MinimaxMinimaxM25Free => "MiniMax M2.5 (free)",
2289 Self::MinimaxMinimaxM27 => "MiniMax M2.7",
2290 Self::MistralaiMinistral14b2512 => "Ministral 3 14B 2512",
2291 Self::MistralaiMinistral3b2512 => "Ministral 3 3B 2512",
2292 Self::MistralaiMinistral8b2512 => "Ministral 3 8B 2512",
2293 Self::MistralaiMistralLarge => "Mistral Large",
2294 Self::MistralaiMistralLarge2407 => "Mistral Large 2407",
2295 Self::MistralaiMistralLarge2411 => "Mistral Large 2411",
2296 Self::MistralaiMistralLarge2512 => "Mistral Large 3 2512",
2297 Self::MistralaiMistralMedium3 => "Mistral Medium 3",
2298 Self::MistralaiMistralMedium31 => "Mistral Medium 3.1",
2299 Self::MistralaiMistralMedium35 => "Mistral Medium 3.5",
2300 Self::MistralaiMistralNemo => "Mistral Nemo",
2301 Self::MistralaiMistralSmall3224bInstruct => "Mistral Small 3.2 24B",
2302 Self::MistralaiMistralSmall2603 => "Mistral Small 4",
2303 Self::MistralaiMixtral8x22bInstruct => "Mixtral 8x22B Instruct",
2304 Self::NvidiaNemotron3Nano30bA3b => "Nemotron 3 Nano 30B A3B",
2305 Self::NvidiaNemotron3Nano30bA3bFree => "Nemotron 3 Nano 30B A3B (free)",
2306 Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree => {
2307 "Nemotron 3 Nano Omni (free)"
2308 }
2309 Self::NvidiaNemotron3Super120bA12b => "Nemotron 3 Super",
2310 Self::NvidiaNemotron3Super120bA12bFree => "Nemotron 3 Super (free)",
2311 Self::NvidiaNemotronNano12bV2VlFree => "Nemotron Nano 12B 2 VL (free)",
2312 Self::NvidiaNemotronNano9bV2 => "Nemotron Nano 9B V2",
2313 Self::NvidiaNemotronNano9bV2Free => "Nemotron Nano 9B V2 (free)",
2314 Self::AmazonNova2LiteV1 => "Nova 2 Lite",
2315 Self::AmazonNovaLiteV1 => "Nova Lite 1.0",
2316 Self::AmazonNovaMicroV1 => "Nova Micro 1.0",
2317 Self::AmazonNovaPremierV1 => "Nova Premier 1.0",
2318 Self::AmazonNovaProV1 => "Nova Pro 1.0",
2319 Self::OpenrouterOwlAlpha => "Owl Alpha",
2320 Self::MistralaiPixtralLarge2411 => "Pixtral Large 2411",
2321 Self::QwenQwenPlus20250728 => "Qwen Plus 0728",
2322 Self::QwenQwenPlus20250728Thinking => "Qwen Plus 0728 (thinking)",
2323 Self::QwenQwenPlus => "Qwen-Plus",
2324 Self::QwenQwen2572bInstruct => "Qwen2.5 72B Instruct",
2325 Self::QwenQwen257bInstruct => "Qwen2.5 7B Instruct",
2326 Self::QwenQwen314b => "Qwen3 14B",
2327 Self::QwenQwen3235bA22b => "Qwen3 235B A22B",
2328 Self::QwenQwen3235bA22b2507 => "Qwen3 235B A22B Instruct 2507",
2329 Self::QwenQwen3235bA22bThinking2507 => "Qwen3 235B A22B Thinking 2507",
2330 Self::QwenQwen330bA3b => "Qwen3 30B A3B",
2331 Self::QwenQwen330bA3bInstruct2507 => "Qwen3 30B A3B Instruct 2507",
2332 Self::QwenQwen330bA3bThinking2507 => "Qwen3 30B A3B Thinking 2507",
2333 Self::QwenQwen332b => "Qwen3 32B",
2334 Self::QwenQwen38b => "Qwen3 8B",
2335 Self::QwenQwen3Coder30bA3bInstruct => "Qwen3 Coder 30B A3B Instruct",
2336 Self::QwenQwen3Coder => "Qwen3 Coder 480B A35B",
2337 Self::QwenQwen3CoderFree => "Qwen3 Coder 480B A35B (free)",
2338 Self::QwenQwen3CoderFlash => "Qwen3 Coder Flash",
2339 Self::QwenQwen3CoderNext => "Qwen3 Coder Next",
2340 Self::QwenQwen3CoderPlus => "Qwen3 Coder Plus",
2341 Self::QwenQwen3Max => "Qwen3 Max",
2342 Self::QwenQwen3MaxThinking => "Qwen3 Max Thinking",
2343 Self::QwenQwen3Next80bA3bInstruct => "Qwen3 Next 80B A3B Instruct",
2344 Self::QwenQwen3Next80bA3bInstructFree => "Qwen3 Next 80B A3B Instruct (free)",
2345 Self::QwenQwen3Next80bA3bThinking => "Qwen3 Next 80B A3B Thinking",
2346 Self::QwenQwen3Vl235bA22bInstruct => "Qwen3 VL 235B A22B Instruct",
2347 Self::QwenQwen3Vl235bA22bThinking => "Qwen3 VL 235B A22B Thinking",
2348 Self::QwenQwen3Vl30bA3bInstruct => "Qwen3 VL 30B A3B Instruct",
2349 Self::QwenQwen3Vl30bA3bThinking => "Qwen3 VL 30B A3B Thinking",
2350 Self::QwenQwen3Vl32bInstruct => "Qwen3 VL 32B Instruct",
2351 Self::QwenQwen3Vl8bInstruct => "Qwen3 VL 8B Instruct",
2352 Self::QwenQwen3Vl8bThinking => "Qwen3 VL 8B Thinking",
2353 Self::QwenQwen35397bA17b => "Qwen3.5 397B A17B",
2354 Self::QwenQwen35Plus0215 => "Qwen3.5 Plus 2026-02-15",
2355 Self::QwenQwen35Plus20260420 => "Qwen3.5 Plus 2026-04-20",
2356 Self::QwenQwen35122bA10b => "Qwen3.5-122B-A10B",
2357 Self::QwenQwen3527b => "Qwen3.5-27B",
2358 Self::QwenQwen3535bA3b => "Qwen3.5-35B-A3B",
2359 Self::QwenQwen359b => "Qwen3.5-9B",
2360 Self::QwenQwen35Flash0223 => "Qwen3.5-Flash",
2361 Self::QwenQwen3627b => "Qwen3.6 27B",
2362 Self::QwenQwen3635bA3b => "Qwen3.6 35B A3B",
2363 Self::QwenQwen36Flash => "Qwen3.6 Flash",
2364 Self::QwenQwen36MaxPreview => "Qwen3.6 Max Preview",
2365 Self::QwenQwen36Plus => "Qwen3.6 Plus",
2366 Self::DeepseekDeepseekR1 => "R1",
2367 Self::DeepseekDeepseekR10528 => "R1 0528",
2368 Self::RekaaiRekaEdge => "Reka Edge",
2369 Self::RelaceRelaceSearch => "Relace Search",
2370 Self::InclusionaiRing261t => "Ring-2.6-1T",
2371 Self::EssentialaiRnj1Instruct => "Rnj 1 Instruct",
2372 Self::ThedrummerRocinante12b => "Rocinante 12B",
2373 Self::MistralaiMistralSaba => "Saba",
2374 Self::BytedanceSeedSeed16 => "Seed 1.6",
2375 Self::BytedanceSeedSeed16Flash => "Seed 1.6 Flash",
2376 Self::BytedanceSeedSeed20Lite => "Seed-2.0-Lite",
2377 Self::BytedanceSeedSeed20Mini => "Seed-2.0-Mini",
2378 Self::UpstageSolarPro3 => "Solar Pro 3",
2379 Self::StepfunStep35Flash => "Step 3.5 Flash",
2380 Self::AlibabaTongyiDeepresearch30bA3b => "Tongyi DeepResearch 30B A3B",
2381 Self::ArceeAiTrinityLargePreview => "Trinity Large Preview",
2382 Self::ArceeAiTrinityLargeThinking => "Trinity Large Thinking",
2383 Self::ArceeAiTrinityLargeThinkingFree => "Trinity Large Thinking (free)",
2384 Self::ArceeAiTrinityMini => "Trinity Mini",
2385 Self::ThedrummerUnslopnemo12b => "UnslopNemo 12B",
2386 Self::ArceeAiVirtuosoLarge => "Virtuoso Large",
2387 Self::MistralaiVoxtralSmall24b2507 => "Voxtral Small 24B 2507",
2388 Self::OpenaiGptOss120b => "gpt-oss-120b",
2389 Self::OpenaiGptOss120bFree => "gpt-oss-120b (free)",
2390 Self::OpenaiGptOss20b => "gpt-oss-20b",
2391 Self::OpenaiGptOss20bFree => "gpt-oss-20b (free)",
2392 Self::OpenaiGptOssSafeguard20b => "gpt-oss-safeguard-20b",
2393 Self::OpenaiO1 => "o1",
2394 Self::OpenaiO3 => "o3",
2395 Self::OpenaiO3DeepResearch => "o3 Deep Research",
2396 Self::OpenaiO3Mini => "o3 Mini",
2397 Self::OpenaiO3MiniHigh => "o3 Mini High",
2398 Self::OpenaiO3Pro => "o3 Pro",
2399 Self::OpenaiO4Mini => "o4 Mini",
2400 Self::OpenaiO4MiniDeepResearch => "o4 Mini Deep Research",
2401 Self::OpenaiO4MiniHigh => "o4 Mini High",
2402 }
2403 }
2404 #[allow(clippy::too_many_lines)]
2405 fn context_window(self) -> u32 {
2406 match self {
2407 Self::OpenaiGpt35Turbo0613 => 4095,
2408 Self::OpenaiGpt4 | Self::OpenaiGpt40314 => 8191,
2409 Self::Sao10kL3Euryale70b => 8192,
2410 Self::MetaLlamaLlama318bInstruct | Self::RekaaiRekaEdge => 16_384,
2411 Self::OpenaiGpt35Turbo | Self::OpenaiGpt35Turbo16k => 16_385,
2412 Self::BaiduErnie45Vl28bA3b => 30_000,
2413 Self::MistralaiVoxtralSmall24b2507 => 32_000,
2414 Self::EssentialaiRnj1Instruct
2415 | Self::MistralaiMistralSaba
2416 | Self::QwenQwen2572bInstruct
2417 | Self::QwenQwen257bInstruct
2418 | Self::ThedrummerRocinante12b
2419 | Self::ThedrummerUnslopnemo12b => 32_768,
2420 Self::QwenQwen314b
2421 | Self::QwenQwen330bA3b
2422 | Self::QwenQwen332b
2423 | Self::QwenQwen38b => 40_960,
2424 Self::DeepseekDeepseekR1 => 64_000,
2425 Self::MetaLlamaLlama3370bInstructFree
2426 | Self::MistralaiMixtral8x22bInstruct
2427 | Self::ZAiGlm45v => 65_536,
2428 Self::BaiduErnie4521bA3b => 120_000,
2429 Self::AmazonNovaMicroV1
2430 | Self::CohereCommandR082024
2431 | Self::CohereCommandRPlus082024
2432 | Self::InceptionMercury2
2433 | Self::MistralaiMistralLarge
2434 | Self::MistralaiMistralSmall3224bInstruct
2435 | Self::NvidiaNemotronNano12bV2VlFree
2436 | Self::NvidiaNemotronNano9bV2Free
2437 | Self::OpenaiGpt41106Preview
2438 | Self::OpenaiGpt4Turbo
2439 | Self::OpenaiGpt4TurboPreview
2440 | Self::OpenaiGpt4o
2441 | Self::OpenaiGpt4o20240513
2442 | Self::OpenaiGpt4o20240806
2443 | Self::OpenaiGpt4o20241120
2444 | Self::OpenaiGpt4oAudioPreview
2445 | Self::OpenaiGpt4oMini
2446 | Self::OpenaiGpt4oMini20240718
2447 | Self::OpenaiGpt51Chat
2448 | Self::OpenaiGpt52Chat
2449 | Self::OpenaiGpt53Chat
2450 | Self::OpenaiGptAudio
2451 | Self::OpenaiGptAudioMini
2452 | Self::UpstageSolarPro3
2453 | Self::ZAiGlm432b => 128_000,
2454 Self::ArceeAiTrinityLargePreview => 131_000,
2455 Self::AlibabaTongyiDeepresearch30bA3b
2456 | Self::ArceeAiTrinityMini
2457 | Self::ArceeAiVirtuosoLarge
2458 | Self::BaiduCobuddyFree
2459 | Self::DeepseekDeepseekV32
2460 | Self::GoogleGemma312bIt
2461 | Self::GoogleGemma327bIt
2462 | Self::IbmGraniteGranite418b
2463 | Self::MetaLlamaLlama3170bInstruct
2464 | Self::MetaLlamaLlama3370bInstruct
2465 | Self::MistralaiDevstralMedium
2466 | Self::MistralaiDevstralSmall
2467 | Self::MistralaiMinistral3b2512
2468 | Self::MistralaiMistralLarge2407
2469 | Self::MistralaiMistralLarge2411
2470 | Self::MistralaiMistralMedium3
2471 | Self::MistralaiMistralMedium31
2472 | Self::MistralaiMistralNemo
2473 | Self::MistralaiPixtralLarge2411
2474 | Self::MoonshotaiKimiK2
2475 | Self::NexAgiDeepseekV31NexN1
2476 | Self::NvidiaLlama33NemotronSuper49bV15
2477 | Self::NvidiaNemotronNano9bV2
2478 | Self::OpenaiGptOss120b
2479 | Self::OpenaiGptOss120bFree
2480 | Self::OpenaiGptOss20b
2481 | Self::OpenaiGptOss20bFree
2482 | Self::OpenaiGptOssSafeguard20b
2483 | Self::PoolsideLagunaM1Free
2484 | Self::PoolsideLagunaXs2Free
2485 | Self::PrimeIntellectIntellect3
2486 | Self::QwenQwen3235bA22b
2487 | Self::QwenQwen3235bA22bThinking2507
2488 | Self::QwenQwen330bA3bThinking2507
2489 | Self::QwenQwen3Next80bA3bThinking
2490 | Self::QwenQwen3Vl235bA22bThinking
2491 | Self::QwenQwen3Vl30bA3bInstruct
2492 | Self::QwenQwen3Vl30bA3bThinking
2493 | Self::QwenQwen3Vl32bInstruct
2494 | Self::QwenQwen3Vl8bInstruct
2495 | Self::QwenQwen3Vl8bThinking
2496 | Self::Sao10kL31Euryale70b
2497 | Self::ZAiGlm45
2498 | Self::ZAiGlm45Air
2499 | Self::ZAiGlm45AirFree
2500 | Self::ZAiGlm46v => 131_072,
2501 Self::QwenQwen3Coder30bA3bInstruct => 160_000,
2502 Self::DeepseekDeepseekChat
2503 | Self::DeepseekDeepseekChatV30324
2504 | Self::DeepseekDeepseekChatV31
2505 | Self::DeepseekDeepseekR10528
2506 | Self::DeepseekDeepseekV31Terminus
2507 | Self::DeepseekDeepseekV32Exp => 163_840,
2508 Self::MinimaxMinimaxM2
2509 | Self::MinimaxMinimaxM21
2510 | Self::MinimaxMinimaxM25
2511 | Self::MinimaxMinimaxM25Free
2512 | Self::MinimaxMinimaxM27 => 196_608,
2513 Self::AnthropicClaude3Haiku
2514 | Self::AnthropicClaude35Haiku
2515 | Self::AnthropicClaudeHaiku45
2516 | Self::AnthropicClaudeOpus4
2517 | Self::AnthropicClaudeOpus41
2518 | Self::AnthropicClaudeOpus45
2519 | Self::OpenaiO1
2520 | Self::OpenaiO3
2521 | Self::OpenaiO3DeepResearch
2522 | Self::OpenaiO3Mini
2523 | Self::OpenaiO3MiniHigh
2524 | Self::OpenaiO3Pro
2525 | Self::OpenaiO4Mini
2526 | Self::OpenaiO4MiniDeepResearch
2527 | Self::OpenaiO4MiniHigh
2528 | Self::OpenrouterFree => 200_000,
2529 Self::ZAiGlm46
2530 | Self::ZAiGlm47
2531 | Self::ZAiGlm47Flash
2532 | Self::ZAiGlm5
2533 | Self::ZAiGlm5Turbo
2534 | Self::ZAiGlm5vTurbo => 202_752,
2535 Self::ZAiGlm51 => 202_800,
2536 Self::Ai21JambaLarge17
2537 | Self::KwaipilotKatCoderProV2
2538 | Self::MistralaiCodestral2508
2539 | Self::NvidiaNemotron3Nano30bA3bFree
2540 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
2541 | Self::RelaceRelaceSearch => 256_000,
2542 Self::QwenQwen3CoderFree => 262_000,
2543 Self::MoonshotaiKimiK26 => 262_142,
2544 Self::ArceeAiTrinityLargeThinking
2545 | Self::ArceeAiTrinityLargeThinkingFree
2546 | Self::BytedanceSeedSeed16
2547 | Self::BytedanceSeedSeed16Flash
2548 | Self::BytedanceSeedSeed20Lite
2549 | Self::BytedanceSeedSeed20Mini
2550 | Self::GoogleGemma426bA4bIt
2551 | Self::GoogleGemma426bA4bItFree
2552 | Self::GoogleGemma431bIt
2553 | Self::GoogleGemma431bItFree
2554 | Self::InclusionaiLing261t
2555 | Self::InclusionaiLing26Flash
2556 | Self::InclusionaiRing261t
2557 | Self::MistralaiDevstral2512
2558 | Self::MistralaiMinistral14b2512
2559 | Self::MistralaiMinistral8b2512
2560 | Self::MistralaiMistralLarge2512
2561 | Self::MistralaiMistralMedium35
2562 | Self::MistralaiMistralSmall2603
2563 | Self::MoonshotaiKimiK20905
2564 | Self::MoonshotaiKimiK2Thinking
2565 | Self::MoonshotaiKimiK25
2566 | Self::NvidiaNemotron3Nano30bA3b
2567 | Self::NvidiaNemotron3Super120bA12b
2568 | Self::NvidiaNemotron3Super120bA12bFree
2569 | Self::QwenQwen3235bA22b2507
2570 | Self::QwenQwen330bA3bInstruct2507
2571 | Self::QwenQwen3Coder
2572 | Self::QwenQwen3CoderNext
2573 | Self::QwenQwen3Max
2574 | Self::QwenQwen3MaxThinking
2575 | Self::QwenQwen3Next80bA3bInstruct
2576 | Self::QwenQwen3Next80bA3bInstructFree
2577 | Self::QwenQwen3Vl235bA22bInstruct
2578 | Self::QwenQwen35122bA10b
2579 | Self::QwenQwen3527b
2580 | Self::QwenQwen3535bA3b
2581 | Self::QwenQwen35397bA17b
2582 | Self::QwenQwen359b
2583 | Self::QwenQwen3627b
2584 | Self::QwenQwen3635bA3b
2585 | Self::QwenQwen36MaxPreview
2586 | Self::StepfunStep35Flash
2587 | Self::TencentHy3Preview
2588 | Self::XiaomiMimoV2Flash
2589 | Self::XiaomiMimoV2Omni => 262_144,
2590 Self::AmazonNovaLiteV1 | Self::AmazonNovaProV1 => 300_000,
2591 Self::MetaLlamaLlama4Scout => 327_680,
2592 Self::OpenaiGpt5
2593 | Self::OpenaiGpt5Codex
2594 | Self::OpenaiGpt5Mini
2595 | Self::OpenaiGpt5Nano
2596 | Self::OpenaiGpt5Pro
2597 | Self::OpenaiGpt51
2598 | Self::OpenaiGpt51Codex
2599 | Self::OpenaiGpt51CodexMax
2600 | Self::OpenaiGpt51CodexMini
2601 | Self::OpenaiGpt52
2602 | Self::OpenaiGpt52Codex
2603 | Self::OpenaiGpt52Pro
2604 | Self::OpenaiGpt53Codex
2605 | Self::OpenaiGpt54Mini
2606 | Self::OpenaiGpt54Nano => 400_000,
2607 Self::AmazonNova2LiteV1
2608 | Self::AmazonNovaPremierV1
2609 | Self::AnthropicClaudeOpus46
2610 | Self::AnthropicClaudeOpus46Fast
2611 | Self::AnthropicClaudeOpus47
2612 | Self::AnthropicClaudeOpus47Fast
2613 | Self::AnthropicClaudeSonnet4
2614 | Self::AnthropicClaudeSonnet45
2615 | Self::AnthropicClaudeSonnet46
2616 | Self::GoogleGemini20Flash001
2617 | Self::MinimaxMinimaxM1
2618 | Self::QwenQwenPlus
2619 | Self::QwenQwenPlus20250728
2620 | Self::QwenQwenPlus20250728Thinking
2621 | Self::QwenQwen3CoderFlash
2622 | Self::QwenQwen3CoderPlus
2623 | Self::QwenQwen35Flash0223
2624 | Self::QwenQwen35Plus0215
2625 | Self::QwenQwen35Plus20260420
2626 | Self::QwenQwen36Flash
2627 | Self::QwenQwen36Plus
2628 | Self::XAiGrok43 => 1_000_000,
2629 Self::OpenaiGpt41 | Self::OpenaiGpt41Mini | Self::OpenaiGpt41Nano => {
2630 1_047_576
2631 }
2632 Self::DeepseekDeepseekV4Flash => 1_048_575,
2633 Self::DeepseekDeepseekV4FlashFree
2634 | Self::DeepseekDeepseekV4Pro
2635 | Self::GoogleGemini20FlashLite001
2636 | Self::GoogleGemini25Flash
2637 | Self::GoogleGemini25FlashLite
2638 | Self::GoogleGemini25FlashLitePreview092025
2639 | Self::GoogleGemini25Pro
2640 | Self::GoogleGemini25ProPreview
2641 | Self::GoogleGemini25ProPreview0506
2642 | Self::GoogleGemini3FlashPreview
2643 | Self::GoogleGemini31FlashLite
2644 | Self::GoogleGemini31FlashLitePreview
2645 | Self::GoogleGemini31ProPreview
2646 | Self::GoogleGemini31ProPreviewCustomtools
2647 | Self::GoogleGemini35Flash
2648 | Self::XiaomiMimoV2Pro
2649 | Self::XiaomiMimoV25
2650 | Self::XiaomiMimoV25Pro => 1_048_576,
2651 Self::OpenrouterOwlAlpha => 1_048_756,
2652 Self::OpenaiGpt54
2653 | Self::OpenaiGpt54Pro
2654 | Self::OpenaiGpt55
2655 | Self::OpenaiGpt55Pro => 1_050_000,
2656 Self::OpenrouterAuto | Self::XAiGrok420 => 2_000_000,
2657 }
2658 }
2659 #[allow(clippy::too_many_lines)]
2660 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
2661 match self {
2662 Self::Ai21JambaLarge17
2663 | Self::AmazonNovaLiteV1
2664 | Self::AmazonNovaMicroV1
2665 | Self::AmazonNovaPremierV1
2666 | Self::AmazonNovaProV1
2667 | Self::AnthropicClaude3Haiku
2668 | Self::AnthropicClaude35Haiku
2669 | Self::ArceeAiTrinityLargePreview
2670 | Self::ArceeAiVirtuosoLarge
2671 | Self::BaiduErnie4521bA3b
2672 | Self::CohereCommandR082024
2673 | Self::CohereCommandRPlus082024
2674 | Self::DeepseekDeepseekChat
2675 | Self::DeepseekDeepseekChatV30324
2676 | Self::EssentialaiRnj1Instruct
2677 | Self::GoogleGemini20Flash001
2678 | Self::GoogleGemini20FlashLite001
2679 | Self::GoogleGemma312bIt
2680 | Self::GoogleGemma327bIt
2681 | Self::IbmGraniteGranite418b
2682 | Self::InclusionaiLing261t
2683 | Self::InclusionaiLing26Flash
2684 | Self::KwaipilotKatCoderProV2
2685 | Self::MetaLlamaLlama3170bInstruct
2686 | Self::MetaLlamaLlama318bInstruct
2687 | Self::MetaLlamaLlama3370bInstruct
2688 | Self::MetaLlamaLlama3370bInstructFree
2689 | Self::MetaLlamaLlama4Scout
2690 | Self::MistralaiCodestral2508
2691 | Self::MistralaiDevstral2512
2692 | Self::MistralaiDevstralMedium
2693 | Self::MistralaiDevstralSmall
2694 | Self::MistralaiMinistral14b2512
2695 | Self::MistralaiMinistral3b2512
2696 | Self::MistralaiMinistral8b2512
2697 | Self::MistralaiMistralLarge
2698 | Self::MistralaiMistralLarge2407
2699 | Self::MistralaiMistralLarge2411
2700 | Self::MistralaiMistralLarge2512
2701 | Self::MistralaiMistralMedium3
2702 | Self::MistralaiMistralMedium31
2703 | Self::MistralaiMistralNemo
2704 | Self::MistralaiMistralSaba
2705 | Self::MistralaiMistralSmall3224bInstruct
2706 | Self::MistralaiMixtral8x22bInstruct
2707 | Self::MistralaiPixtralLarge2411
2708 | Self::MistralaiVoxtralSmall24b2507
2709 | Self::MoonshotaiKimiK2
2710 | Self::MoonshotaiKimiK20905
2711 | Self::NexAgiDeepseekV31NexN1
2712 | Self::OpenaiGpt35Turbo
2713 | Self::OpenaiGpt35Turbo0613
2714 | Self::OpenaiGpt35Turbo16k
2715 | Self::OpenaiGpt4
2716 | Self::OpenaiGpt40314
2717 | Self::OpenaiGpt41106Preview
2718 | Self::OpenaiGpt4Turbo
2719 | Self::OpenaiGpt4TurboPreview
2720 | Self::OpenaiGpt41
2721 | Self::OpenaiGpt41Mini
2722 | Self::OpenaiGpt41Nano
2723 | Self::OpenaiGpt4o
2724 | Self::OpenaiGpt4o20240513
2725 | Self::OpenaiGpt4o20240806
2726 | Self::OpenaiGpt4o20241120
2727 | Self::OpenaiGpt4oAudioPreview
2728 | Self::OpenaiGpt4oMini
2729 | Self::OpenaiGpt4oMini20240718
2730 | Self::OpenaiGpt51Chat
2731 | Self::OpenaiGpt52Chat
2732 | Self::OpenaiGpt53Chat
2733 | Self::OpenaiGptAudio
2734 | Self::OpenaiGptAudioMini
2735 | Self::OpenrouterOwlAlpha
2736 | Self::QwenQwen2572bInstruct
2737 | Self::QwenQwen257bInstruct
2738 | Self::QwenQwenPlus
2739 | Self::QwenQwenPlus20250728
2740 | Self::QwenQwen3235bA22b2507
2741 | Self::QwenQwen330bA3bInstruct2507
2742 | Self::QwenQwen3Coder
2743 | Self::QwenQwen3Coder30bA3bInstruct
2744 | Self::QwenQwen3CoderFlash
2745 | Self::QwenQwen3CoderNext
2746 | Self::QwenQwen3CoderPlus
2747 | Self::QwenQwen3CoderFree
2748 | Self::QwenQwen3Max
2749 | Self::QwenQwen3Next80bA3bInstruct
2750 | Self::QwenQwen3Next80bA3bInstructFree
2751 | Self::QwenQwen3Vl235bA22bInstruct
2752 | Self::QwenQwen3Vl30bA3bInstruct
2753 | Self::QwenQwen3Vl32bInstruct
2754 | Self::QwenQwen3Vl8bInstruct
2755 | Self::RekaaiRekaEdge
2756 | Self::RelaceRelaceSearch
2757 | Self::Sao10kL3Euryale70b
2758 | Self::Sao10kL31Euryale70b
2759 | Self::ThedrummerRocinante12b
2760 | Self::ThedrummerUnslopnemo12b
2761 | Self::ZAiGlm432b => &[],
2762 Self::AlibabaTongyiDeepresearch30bA3b
2763 | Self::AmazonNova2LiteV1
2764 | Self::AnthropicClaudeHaiku45
2765 | Self::AnthropicClaudeOpus4
2766 | Self::AnthropicClaudeOpus41
2767 | Self::AnthropicClaudeOpus45
2768 | Self::AnthropicClaudeOpus46
2769 | Self::AnthropicClaudeOpus46Fast
2770 | Self::AnthropicClaudeOpus47
2771 | Self::AnthropicClaudeOpus47Fast
2772 | Self::AnthropicClaudeSonnet4
2773 | Self::AnthropicClaudeSonnet45
2774 | Self::AnthropicClaudeSonnet46
2775 | Self::ArceeAiTrinityLargeThinking
2776 | Self::ArceeAiTrinityLargeThinkingFree
2777 | Self::ArceeAiTrinityMini
2778 | Self::BaiduCobuddyFree
2779 | Self::BaiduErnie45Vl28bA3b
2780 | Self::BytedanceSeedSeed16
2781 | Self::BytedanceSeedSeed16Flash
2782 | Self::BytedanceSeedSeed20Lite
2783 | Self::BytedanceSeedSeed20Mini
2784 | Self::DeepseekDeepseekChatV31
2785 | Self::DeepseekDeepseekR1
2786 | Self::DeepseekDeepseekR10528
2787 | Self::DeepseekDeepseekV31Terminus
2788 | Self::DeepseekDeepseekV32
2789 | Self::DeepseekDeepseekV32Exp
2790 | Self::DeepseekDeepseekV4Flash
2791 | Self::DeepseekDeepseekV4FlashFree
2792 | Self::DeepseekDeepseekV4Pro
2793 | Self::GoogleGemini25Flash
2794 | Self::GoogleGemini25FlashLite
2795 | Self::GoogleGemini25FlashLitePreview092025
2796 | Self::GoogleGemini25Pro
2797 | Self::GoogleGemini25ProPreview
2798 | Self::GoogleGemini25ProPreview0506
2799 | Self::GoogleGemini3FlashPreview
2800 | Self::GoogleGemini31FlashLite
2801 | Self::GoogleGemini31FlashLitePreview
2802 | Self::GoogleGemini31ProPreview
2803 | Self::GoogleGemini31ProPreviewCustomtools
2804 | Self::GoogleGemini35Flash
2805 | Self::GoogleGemma426bA4bIt
2806 | Self::GoogleGemma426bA4bItFree
2807 | Self::GoogleGemma431bIt
2808 | Self::GoogleGemma431bItFree
2809 | Self::InceptionMercury2
2810 | Self::InclusionaiRing261t
2811 | Self::MinimaxMinimaxM1
2812 | Self::MinimaxMinimaxM2
2813 | Self::MinimaxMinimaxM21
2814 | Self::MinimaxMinimaxM25
2815 | Self::MinimaxMinimaxM25Free
2816 | Self::MinimaxMinimaxM27
2817 | Self::MistralaiMistralMedium35
2818 | Self::MistralaiMistralSmall2603
2819 | Self::MoonshotaiKimiK2Thinking
2820 | Self::MoonshotaiKimiK25
2821 | Self::MoonshotaiKimiK26
2822 | Self::NvidiaLlama33NemotronSuper49bV15
2823 | Self::NvidiaNemotron3Nano30bA3b
2824 | Self::NvidiaNemotron3Nano30bA3bFree
2825 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
2826 | Self::NvidiaNemotron3Super120bA12b
2827 | Self::NvidiaNemotron3Super120bA12bFree
2828 | Self::NvidiaNemotronNano12bV2VlFree
2829 | Self::NvidiaNemotronNano9bV2
2830 | Self::NvidiaNemotronNano9bV2Free
2831 | Self::OpenaiGpt5
2832 | Self::OpenaiGpt5Codex
2833 | Self::OpenaiGpt5Mini
2834 | Self::OpenaiGpt5Nano
2835 | Self::OpenaiGpt5Pro
2836 | Self::OpenaiGpt51
2837 | Self::OpenaiGpt51Codex
2838 | Self::OpenaiGpt51CodexMax
2839 | Self::OpenaiGpt51CodexMini
2840 | Self::OpenaiGpt52
2841 | Self::OpenaiGpt52Codex
2842 | Self::OpenaiGpt52Pro
2843 | Self::OpenaiGpt53Codex
2844 | Self::OpenaiGpt54
2845 | Self::OpenaiGpt54Mini
2846 | Self::OpenaiGpt54Nano
2847 | Self::OpenaiGpt54Pro
2848 | Self::OpenaiGpt55
2849 | Self::OpenaiGpt55Pro
2850 | Self::OpenaiGptOss120b
2851 | Self::OpenaiGptOss120bFree
2852 | Self::OpenaiGptOss20b
2853 | Self::OpenaiGptOss20bFree
2854 | Self::OpenaiGptOssSafeguard20b
2855 | Self::OpenaiO1
2856 | Self::OpenaiO3
2857 | Self::OpenaiO3DeepResearch
2858 | Self::OpenaiO3Mini
2859 | Self::OpenaiO3MiniHigh
2860 | Self::OpenaiO3Pro
2861 | Self::OpenaiO4Mini
2862 | Self::OpenaiO4MiniDeepResearch
2863 | Self::OpenaiO4MiniHigh
2864 | Self::OpenrouterAuto
2865 | Self::OpenrouterFree
2866 | Self::PoolsideLagunaM1Free
2867 | Self::PoolsideLagunaXs2Free
2868 | Self::PrimeIntellectIntellect3
2869 | Self::QwenQwenPlus20250728Thinking
2870 | Self::QwenQwen314b
2871 | Self::QwenQwen3235bA22b
2872 | Self::QwenQwen3235bA22bThinking2507
2873 | Self::QwenQwen330bA3b
2874 | Self::QwenQwen330bA3bThinking2507
2875 | Self::QwenQwen332b
2876 | Self::QwenQwen38b
2877 | Self::QwenQwen3MaxThinking
2878 | Self::QwenQwen3Next80bA3bThinking
2879 | Self::QwenQwen3Vl235bA22bThinking
2880 | Self::QwenQwen3Vl30bA3bThinking
2881 | Self::QwenQwen3Vl8bThinking
2882 | Self::QwenQwen35122bA10b
2883 | Self::QwenQwen3527b
2884 | Self::QwenQwen3535bA3b
2885 | Self::QwenQwen35397bA17b
2886 | Self::QwenQwen359b
2887 | Self::QwenQwen35Flash0223
2888 | Self::QwenQwen35Plus0215
2889 | Self::QwenQwen35Plus20260420
2890 | Self::QwenQwen3627b
2891 | Self::QwenQwen3635bA3b
2892 | Self::QwenQwen36Flash
2893 | Self::QwenQwen36MaxPreview
2894 | Self::QwenQwen36Plus
2895 | Self::StepfunStep35Flash
2896 | Self::TencentHy3Preview
2897 | Self::UpstageSolarPro3
2898 | Self::XAiGrok420
2899 | Self::XAiGrok43
2900 | Self::XiaomiMimoV2Flash
2901 | Self::XiaomiMimoV2Omni
2902 | Self::XiaomiMimoV2Pro
2903 | Self::XiaomiMimoV25
2904 | Self::XiaomiMimoV25Pro
2905 | Self::ZAiGlm45
2906 | Self::ZAiGlm45Air
2907 | Self::ZAiGlm45AirFree
2908 | Self::ZAiGlm45v
2909 | Self::ZAiGlm46
2910 | Self::ZAiGlm46v
2911 | Self::ZAiGlm47
2912 | Self::ZAiGlm47Flash
2913 | Self::ZAiGlm5
2914 | Self::ZAiGlm5Turbo
2915 | Self::ZAiGlm51
2916 | Self::ZAiGlm5vTurbo => {
2917 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
2918 }
2919 }
2920 }
2921 pub fn supports_reasoning(self) -> bool {
2922 !self.reasoning_levels().is_empty()
2923 }
2924 #[allow(clippy::too_many_lines)]
2925 pub fn supports_prompt_caching(self) -> bool {
2926 match self {
2927 Self::Ai21JambaLarge17
2928 | Self::AmazonNova2LiteV1
2929 | Self::AmazonNovaLiteV1
2930 | Self::AmazonNovaMicroV1
2931 | Self::AmazonNovaProV1
2932 | Self::ArceeAiTrinityLargePreview
2933 | Self::ArceeAiTrinityLargeThinkingFree
2934 | Self::ArceeAiTrinityMini
2935 | Self::ArceeAiVirtuosoLarge
2936 | Self::BaiduCobuddyFree
2937 | Self::BaiduErnie4521bA3b
2938 | Self::BaiduErnie45Vl28bA3b
2939 | Self::BytedanceSeedSeed16
2940 | Self::BytedanceSeedSeed16Flash
2941 | Self::BytedanceSeedSeed20Lite
2942 | Self::BytedanceSeedSeed20Mini
2943 | Self::CohereCommandR082024
2944 | Self::CohereCommandRPlus082024
2945 | Self::DeepseekDeepseekChat
2946 | Self::DeepseekDeepseekR1
2947 | Self::DeepseekDeepseekV32Exp
2948 | Self::DeepseekDeepseekV4FlashFree
2949 | Self::EssentialaiRnj1Instruct
2950 | Self::GoogleGemini20FlashLite001
2951 | Self::GoogleGemma312bIt
2952 | Self::GoogleGemma327bIt
2953 | Self::GoogleGemma426bA4bIt
2954 | Self::GoogleGemma426bA4bItFree
2955 | Self::GoogleGemma431bIt
2956 | Self::GoogleGemma431bItFree
2957 | Self::MetaLlamaLlama3170bInstruct
2958 | Self::MetaLlamaLlama318bInstruct
2959 | Self::MetaLlamaLlama3370bInstruct
2960 | Self::MetaLlamaLlama3370bInstructFree
2961 | Self::MetaLlamaLlama4Scout
2962 | Self::MinimaxMinimaxM1
2963 | Self::MinimaxMinimaxM25
2964 | Self::MinimaxMinimaxM25Free
2965 | Self::MinimaxMinimaxM27
2966 | Self::MistralaiMistralMedium35
2967 | Self::MistralaiMistralNemo
2968 | Self::MistralaiMistralSmall3224bInstruct
2969 | Self::MoonshotaiKimiK2
2970 | Self::MoonshotaiKimiK20905
2971 | Self::MoonshotaiKimiK2Thinking
2972 | Self::NexAgiDeepseekV31NexN1
2973 | Self::NvidiaLlama33NemotronSuper49bV15
2974 | Self::NvidiaNemotron3Nano30bA3b
2975 | Self::NvidiaNemotron3Nano30bA3bFree
2976 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
2977 | Self::NvidiaNemotron3Super120bA12b
2978 | Self::NvidiaNemotron3Super120bA12bFree
2979 | Self::NvidiaNemotronNano12bV2VlFree
2980 | Self::NvidiaNemotronNano9bV2
2981 | Self::NvidiaNemotronNano9bV2Free
2982 | Self::OpenaiGpt35Turbo
2983 | Self::OpenaiGpt35Turbo0613
2984 | Self::OpenaiGpt35Turbo16k
2985 | Self::OpenaiGpt4
2986 | Self::OpenaiGpt40314
2987 | Self::OpenaiGpt41106Preview
2988 | Self::OpenaiGpt4Turbo
2989 | Self::OpenaiGpt4TurboPreview
2990 | Self::OpenaiGpt4o
2991 | Self::OpenaiGpt4o20240513
2992 | Self::OpenaiGpt4oAudioPreview
2993 | Self::OpenaiGpt5Pro
2994 | Self::OpenaiGpt52Pro
2995 | Self::OpenaiGpt54Pro
2996 | Self::OpenaiGpt55Pro
2997 | Self::OpenaiGptAudio
2998 | Self::OpenaiGptAudioMini
2999 | Self::OpenaiGptOss120b
3000 | Self::OpenaiGptOss120bFree
3001 | Self::OpenaiGptOss20b
3002 | Self::OpenaiGptOss20bFree
3003 | Self::OpenaiO3Pro
3004 | Self::OpenrouterAuto
3005 | Self::OpenrouterFree
3006 | Self::OpenrouterOwlAlpha
3007 | Self::PoolsideLagunaM1Free
3008 | Self::PoolsideLagunaXs2Free
3009 | Self::PrimeIntellectIntellect3
3010 | Self::QwenQwen2572bInstruct
3011 | Self::QwenQwen257bInstruct
3012 | Self::QwenQwen314b
3013 | Self::QwenQwen3235bA22b
3014 | Self::QwenQwen3235bA22b2507
3015 | Self::QwenQwen3235bA22bThinking2507
3016 | Self::QwenQwen330bA3b
3017 | Self::QwenQwen330bA3bInstruct2507
3018 | Self::QwenQwen332b
3019 | Self::QwenQwen3Coder
3020 | Self::QwenQwen3Coder30bA3bInstruct
3021 | Self::QwenQwen3CoderFree
3022 | Self::QwenQwen3MaxThinking
3023 | Self::QwenQwen3Next80bA3bInstruct
3024 | Self::QwenQwen3Next80bA3bInstructFree
3025 | Self::QwenQwen3Next80bA3bThinking
3026 | Self::QwenQwen3Vl235bA22bThinking
3027 | Self::QwenQwen3Vl30bA3bInstruct
3028 | Self::QwenQwen3Vl30bA3bThinking
3029 | Self::QwenQwen3Vl32bInstruct
3030 | Self::QwenQwen3Vl8bInstruct
3031 | Self::QwenQwen3Vl8bThinking
3032 | Self::QwenQwen35122bA10b
3033 | Self::QwenQwen3527b
3034 | Self::QwenQwen3535bA3b
3035 | Self::QwenQwen359b
3036 | Self::QwenQwen35Plus20260420
3037 | Self::QwenQwen3627b
3038 | Self::QwenQwen3635bA3b
3039 | Self::RekaaiRekaEdge
3040 | Self::RelaceRelaceSearch
3041 | Self::Sao10kL3Euryale70b
3042 | Self::Sao10kL31Euryale70b
3043 | Self::StepfunStep35Flash
3044 | Self::ThedrummerRocinante12b
3045 | Self::ThedrummerUnslopnemo12b
3046 | Self::ZAiGlm432b
3047 | Self::ZAiGlm45AirFree
3048 | Self::ZAiGlm51 => false,
3049 Self::AlibabaTongyiDeepresearch30bA3b
3050 | Self::AmazonNovaPremierV1
3051 | Self::AnthropicClaude3Haiku
3052 | Self::AnthropicClaude35Haiku
3053 | Self::AnthropicClaudeHaiku45
3054 | Self::AnthropicClaudeOpus4
3055 | Self::AnthropicClaudeOpus41
3056 | Self::AnthropicClaudeOpus45
3057 | Self::AnthropicClaudeOpus46
3058 | Self::AnthropicClaudeOpus46Fast
3059 | Self::AnthropicClaudeOpus47
3060 | Self::AnthropicClaudeOpus47Fast
3061 | Self::AnthropicClaudeSonnet4
3062 | Self::AnthropicClaudeSonnet45
3063 | Self::AnthropicClaudeSonnet46
3064 | Self::ArceeAiTrinityLargeThinking
3065 | Self::DeepseekDeepseekChatV30324
3066 | Self::DeepseekDeepseekChatV31
3067 | Self::DeepseekDeepseekR10528
3068 | Self::DeepseekDeepseekV31Terminus
3069 | Self::DeepseekDeepseekV32
3070 | Self::DeepseekDeepseekV4Flash
3071 | Self::DeepseekDeepseekV4Pro
3072 | Self::GoogleGemini20Flash001
3073 | Self::GoogleGemini25Flash
3074 | Self::GoogleGemini25FlashLite
3075 | Self::GoogleGemini25FlashLitePreview092025
3076 | Self::GoogleGemini25Pro
3077 | Self::GoogleGemini25ProPreview
3078 | Self::GoogleGemini25ProPreview0506
3079 | Self::GoogleGemini3FlashPreview
3080 | Self::GoogleGemini31FlashLite
3081 | Self::GoogleGemini31FlashLitePreview
3082 | Self::GoogleGemini31ProPreview
3083 | Self::GoogleGemini31ProPreviewCustomtools
3084 | Self::GoogleGemini35Flash
3085 | Self::IbmGraniteGranite418b
3086 | Self::InceptionMercury2
3087 | Self::InclusionaiLing261t
3088 | Self::InclusionaiLing26Flash
3089 | Self::InclusionaiRing261t
3090 | Self::KwaipilotKatCoderProV2
3091 | Self::MinimaxMinimaxM2
3092 | Self::MinimaxMinimaxM21
3093 | Self::MistralaiCodestral2508
3094 | Self::MistralaiDevstral2512
3095 | Self::MistralaiDevstralMedium
3096 | Self::MistralaiDevstralSmall
3097 | Self::MistralaiMinistral14b2512
3098 | Self::MistralaiMinistral3b2512
3099 | Self::MistralaiMinistral8b2512
3100 | Self::MistralaiMistralLarge
3101 | Self::MistralaiMistralLarge2407
3102 | Self::MistralaiMistralLarge2411
3103 | Self::MistralaiMistralLarge2512
3104 | Self::MistralaiMistralMedium3
3105 | Self::MistralaiMistralMedium31
3106 | Self::MistralaiMistralSaba
3107 | Self::MistralaiMistralSmall2603
3108 | Self::MistralaiMixtral8x22bInstruct
3109 | Self::MistralaiPixtralLarge2411
3110 | Self::MistralaiVoxtralSmall24b2507
3111 | Self::MoonshotaiKimiK25
3112 | Self::MoonshotaiKimiK26
3113 | Self::OpenaiGpt41
3114 | Self::OpenaiGpt41Mini
3115 | Self::OpenaiGpt41Nano
3116 | Self::OpenaiGpt4o20240806
3117 | Self::OpenaiGpt4o20241120
3118 | Self::OpenaiGpt4oMini
3119 | Self::OpenaiGpt4oMini20240718
3120 | Self::OpenaiGpt5
3121 | Self::OpenaiGpt5Codex
3122 | Self::OpenaiGpt5Mini
3123 | Self::OpenaiGpt5Nano
3124 | Self::OpenaiGpt51
3125 | Self::OpenaiGpt51Chat
3126 | Self::OpenaiGpt51Codex
3127 | Self::OpenaiGpt51CodexMax
3128 | Self::OpenaiGpt51CodexMini
3129 | Self::OpenaiGpt52
3130 | Self::OpenaiGpt52Chat
3131 | Self::OpenaiGpt52Codex
3132 | Self::OpenaiGpt53Chat
3133 | Self::OpenaiGpt53Codex
3134 | Self::OpenaiGpt54
3135 | Self::OpenaiGpt54Mini
3136 | Self::OpenaiGpt54Nano
3137 | Self::OpenaiGpt55
3138 | Self::OpenaiGptOssSafeguard20b
3139 | Self::OpenaiO1
3140 | Self::OpenaiO3
3141 | Self::OpenaiO3DeepResearch
3142 | Self::OpenaiO3Mini
3143 | Self::OpenaiO3MiniHigh
3144 | Self::OpenaiO4Mini
3145 | Self::OpenaiO4MiniDeepResearch
3146 | Self::OpenaiO4MiniHigh
3147 | Self::QwenQwenPlus
3148 | Self::QwenQwenPlus20250728
3149 | Self::QwenQwenPlus20250728Thinking
3150 | Self::QwenQwen330bA3bThinking2507
3151 | Self::QwenQwen38b
3152 | Self::QwenQwen3CoderFlash
3153 | Self::QwenQwen3CoderNext
3154 | Self::QwenQwen3CoderPlus
3155 | Self::QwenQwen3Max
3156 | Self::QwenQwen3Vl235bA22bInstruct
3157 | Self::QwenQwen35397bA17b
3158 | Self::QwenQwen35Flash0223
3159 | Self::QwenQwen35Plus0215
3160 | Self::QwenQwen36Flash
3161 | Self::QwenQwen36MaxPreview
3162 | Self::QwenQwen36Plus
3163 | Self::TencentHy3Preview
3164 | Self::UpstageSolarPro3
3165 | Self::XAiGrok420
3166 | Self::XAiGrok43
3167 | Self::XiaomiMimoV2Flash
3168 | Self::XiaomiMimoV2Omni
3169 | Self::XiaomiMimoV2Pro
3170 | Self::XiaomiMimoV25
3171 | Self::XiaomiMimoV25Pro
3172 | Self::ZAiGlm45
3173 | Self::ZAiGlm45Air
3174 | Self::ZAiGlm45v
3175 | Self::ZAiGlm46
3176 | Self::ZAiGlm46v
3177 | Self::ZAiGlm47
3178 | Self::ZAiGlm47Flash
3179 | Self::ZAiGlm5
3180 | Self::ZAiGlm5Turbo
3181 | Self::ZAiGlm5vTurbo => true,
3182 }
3183 }
3184 #[allow(clippy::too_many_lines)]
3185 pub fn supports_image(self) -> bool {
3186 match self {
3187 Self::Ai21JambaLarge17
3188 | Self::AlibabaTongyiDeepresearch30bA3b
3189 | Self::AmazonNovaMicroV1
3190 | Self::ArceeAiTrinityLargePreview
3191 | Self::ArceeAiTrinityLargeThinking
3192 | Self::ArceeAiTrinityLargeThinkingFree
3193 | Self::ArceeAiTrinityMini
3194 | Self::ArceeAiVirtuosoLarge
3195 | Self::BaiduCobuddyFree
3196 | Self::BaiduErnie4521bA3b
3197 | Self::CohereCommandR082024
3198 | Self::CohereCommandRPlus082024
3199 | Self::DeepseekDeepseekChat
3200 | Self::DeepseekDeepseekChatV30324
3201 | Self::DeepseekDeepseekChatV31
3202 | Self::DeepseekDeepseekR1
3203 | Self::DeepseekDeepseekR10528
3204 | Self::DeepseekDeepseekV31Terminus
3205 | Self::DeepseekDeepseekV32
3206 | Self::DeepseekDeepseekV32Exp
3207 | Self::DeepseekDeepseekV4Flash
3208 | Self::DeepseekDeepseekV4FlashFree
3209 | Self::DeepseekDeepseekV4Pro
3210 | Self::EssentialaiRnj1Instruct
3211 | Self::IbmGraniteGranite418b
3212 | Self::InceptionMercury2
3213 | Self::InclusionaiLing261t
3214 | Self::InclusionaiLing26Flash
3215 | Self::InclusionaiRing261t
3216 | Self::KwaipilotKatCoderProV2
3217 | Self::MetaLlamaLlama3170bInstruct
3218 | Self::MetaLlamaLlama318bInstruct
3219 | Self::MetaLlamaLlama3370bInstruct
3220 | Self::MetaLlamaLlama3370bInstructFree
3221 | Self::MinimaxMinimaxM1
3222 | Self::MinimaxMinimaxM2
3223 | Self::MinimaxMinimaxM21
3224 | Self::MinimaxMinimaxM25
3225 | Self::MinimaxMinimaxM25Free
3226 | Self::MinimaxMinimaxM27
3227 | Self::MistralaiCodestral2508
3228 | Self::MistralaiDevstral2512
3229 | Self::MistralaiDevstralMedium
3230 | Self::MistralaiDevstralSmall
3231 | Self::MistralaiMistralLarge
3232 | Self::MistralaiMistralLarge2407
3233 | Self::MistralaiMistralLarge2411
3234 | Self::MistralaiMistralNemo
3235 | Self::MistralaiMistralSaba
3236 | Self::MistralaiMixtral8x22bInstruct
3237 | Self::MistralaiVoxtralSmall24b2507
3238 | Self::MoonshotaiKimiK2
3239 | Self::MoonshotaiKimiK20905
3240 | Self::MoonshotaiKimiK2Thinking
3241 | Self::NexAgiDeepseekV31NexN1
3242 | Self::NvidiaLlama33NemotronSuper49bV15
3243 | Self::NvidiaNemotron3Nano30bA3b
3244 | Self::NvidiaNemotron3Nano30bA3bFree
3245 | Self::NvidiaNemotron3Super120bA12b
3246 | Self::NvidiaNemotron3Super120bA12bFree
3247 | Self::NvidiaNemotronNano9bV2
3248 | Self::NvidiaNemotronNano9bV2Free
3249 | Self::OpenaiGpt35Turbo
3250 | Self::OpenaiGpt35Turbo0613
3251 | Self::OpenaiGpt35Turbo16k
3252 | Self::OpenaiGpt4
3253 | Self::OpenaiGpt40314
3254 | Self::OpenaiGpt41106Preview
3255 | Self::OpenaiGpt4TurboPreview
3256 | Self::OpenaiGpt4oAudioPreview
3257 | Self::OpenaiGptAudio
3258 | Self::OpenaiGptAudioMini
3259 | Self::OpenaiGptOss120b
3260 | Self::OpenaiGptOss120bFree
3261 | Self::OpenaiGptOss20b
3262 | Self::OpenaiGptOss20bFree
3263 | Self::OpenaiGptOssSafeguard20b
3264 | Self::OpenaiO3Mini
3265 | Self::OpenaiO3MiniHigh
3266 | Self::OpenrouterOwlAlpha
3267 | Self::PoolsideLagunaM1Free
3268 | Self::PoolsideLagunaXs2Free
3269 | Self::PrimeIntellectIntellect3
3270 | Self::QwenQwen2572bInstruct
3271 | Self::QwenQwen257bInstruct
3272 | Self::QwenQwenPlus
3273 | Self::QwenQwenPlus20250728
3274 | Self::QwenQwenPlus20250728Thinking
3275 | Self::QwenQwen314b
3276 | Self::QwenQwen3235bA22b
3277 | Self::QwenQwen3235bA22b2507
3278 | Self::QwenQwen3235bA22bThinking2507
3279 | Self::QwenQwen330bA3b
3280 | Self::QwenQwen330bA3bInstruct2507
3281 | Self::QwenQwen330bA3bThinking2507
3282 | Self::QwenQwen332b
3283 | Self::QwenQwen38b
3284 | Self::QwenQwen3Coder
3285 | Self::QwenQwen3Coder30bA3bInstruct
3286 | Self::QwenQwen3CoderFlash
3287 | Self::QwenQwen3CoderNext
3288 | Self::QwenQwen3CoderPlus
3289 | Self::QwenQwen3CoderFree
3290 | Self::QwenQwen3Max
3291 | Self::QwenQwen3MaxThinking
3292 | Self::QwenQwen3Next80bA3bInstruct
3293 | Self::QwenQwen3Next80bA3bInstructFree
3294 | Self::QwenQwen3Next80bA3bThinking
3295 | Self::QwenQwen36MaxPreview
3296 | Self::RelaceRelaceSearch
3297 | Self::Sao10kL3Euryale70b
3298 | Self::Sao10kL31Euryale70b
3299 | Self::StepfunStep35Flash
3300 | Self::TencentHy3Preview
3301 | Self::ThedrummerRocinante12b
3302 | Self::ThedrummerUnslopnemo12b
3303 | Self::UpstageSolarPro3
3304 | Self::XiaomiMimoV2Flash
3305 | Self::XiaomiMimoV2Pro
3306 | Self::XiaomiMimoV25Pro
3307 | Self::ZAiGlm432b
3308 | Self::ZAiGlm45
3309 | Self::ZAiGlm45Air
3310 | Self::ZAiGlm45AirFree
3311 | Self::ZAiGlm46
3312 | Self::ZAiGlm47
3313 | Self::ZAiGlm47Flash
3314 | Self::ZAiGlm5
3315 | Self::ZAiGlm5Turbo
3316 | Self::ZAiGlm51 => false,
3317 Self::AmazonNova2LiteV1
3318 | Self::AmazonNovaLiteV1
3319 | Self::AmazonNovaPremierV1
3320 | Self::AmazonNovaProV1
3321 | Self::AnthropicClaude3Haiku
3322 | Self::AnthropicClaude35Haiku
3323 | Self::AnthropicClaudeHaiku45
3324 | Self::AnthropicClaudeOpus4
3325 | Self::AnthropicClaudeOpus41
3326 | Self::AnthropicClaudeOpus45
3327 | Self::AnthropicClaudeOpus46
3328 | Self::AnthropicClaudeOpus46Fast
3329 | Self::AnthropicClaudeOpus47
3330 | Self::AnthropicClaudeOpus47Fast
3331 | Self::AnthropicClaudeSonnet4
3332 | Self::AnthropicClaudeSonnet45
3333 | Self::AnthropicClaudeSonnet46
3334 | Self::BaiduErnie45Vl28bA3b
3335 | Self::BytedanceSeedSeed16
3336 | Self::BytedanceSeedSeed16Flash
3337 | Self::BytedanceSeedSeed20Lite
3338 | Self::BytedanceSeedSeed20Mini
3339 | Self::GoogleGemini20Flash001
3340 | Self::GoogleGemini20FlashLite001
3341 | Self::GoogleGemini25Flash
3342 | Self::GoogleGemini25FlashLite
3343 | Self::GoogleGemini25FlashLitePreview092025
3344 | Self::GoogleGemini25Pro
3345 | Self::GoogleGemini25ProPreview
3346 | Self::GoogleGemini25ProPreview0506
3347 | Self::GoogleGemini3FlashPreview
3348 | Self::GoogleGemini31FlashLite
3349 | Self::GoogleGemini31FlashLitePreview
3350 | Self::GoogleGemini31ProPreview
3351 | Self::GoogleGemini31ProPreviewCustomtools
3352 | Self::GoogleGemini35Flash
3353 | Self::GoogleGemma312bIt
3354 | Self::GoogleGemma327bIt
3355 | Self::GoogleGemma426bA4bIt
3356 | Self::GoogleGemma426bA4bItFree
3357 | Self::GoogleGemma431bIt
3358 | Self::GoogleGemma431bItFree
3359 | Self::MetaLlamaLlama4Scout
3360 | Self::MistralaiMinistral14b2512
3361 | Self::MistralaiMinistral3b2512
3362 | Self::MistralaiMinistral8b2512
3363 | Self::MistralaiMistralLarge2512
3364 | Self::MistralaiMistralMedium3
3365 | Self::MistralaiMistralMedium35
3366 | Self::MistralaiMistralMedium31
3367 | Self::MistralaiMistralSmall2603
3368 | Self::MistralaiMistralSmall3224bInstruct
3369 | Self::MistralaiPixtralLarge2411
3370 | Self::MoonshotaiKimiK25
3371 | Self::MoonshotaiKimiK26
3372 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
3373 | Self::NvidiaNemotronNano12bV2VlFree
3374 | Self::OpenaiGpt4Turbo
3375 | Self::OpenaiGpt41
3376 | Self::OpenaiGpt41Mini
3377 | Self::OpenaiGpt41Nano
3378 | Self::OpenaiGpt4o
3379 | Self::OpenaiGpt4o20240513
3380 | Self::OpenaiGpt4o20240806
3381 | Self::OpenaiGpt4o20241120
3382 | Self::OpenaiGpt4oMini
3383 | Self::OpenaiGpt4oMini20240718
3384 | Self::OpenaiGpt5
3385 | Self::OpenaiGpt5Codex
3386 | Self::OpenaiGpt5Mini
3387 | Self::OpenaiGpt5Nano
3388 | Self::OpenaiGpt5Pro
3389 | Self::OpenaiGpt51
3390 | Self::OpenaiGpt51Chat
3391 | Self::OpenaiGpt51Codex
3392 | Self::OpenaiGpt51CodexMax
3393 | Self::OpenaiGpt51CodexMini
3394 | Self::OpenaiGpt52
3395 | Self::OpenaiGpt52Chat
3396 | Self::OpenaiGpt52Codex
3397 | Self::OpenaiGpt52Pro
3398 | Self::OpenaiGpt53Chat
3399 | Self::OpenaiGpt53Codex
3400 | Self::OpenaiGpt54
3401 | Self::OpenaiGpt54Mini
3402 | Self::OpenaiGpt54Nano
3403 | Self::OpenaiGpt54Pro
3404 | Self::OpenaiGpt55
3405 | Self::OpenaiGpt55Pro
3406 | Self::OpenaiO1
3407 | Self::OpenaiO3
3408 | Self::OpenaiO3DeepResearch
3409 | Self::OpenaiO3Pro
3410 | Self::OpenaiO4Mini
3411 | Self::OpenaiO4MiniDeepResearch
3412 | Self::OpenaiO4MiniHigh
3413 | Self::OpenrouterAuto
3414 | Self::OpenrouterFree
3415 | Self::QwenQwen3Vl235bA22bInstruct
3416 | Self::QwenQwen3Vl235bA22bThinking
3417 | Self::QwenQwen3Vl30bA3bInstruct
3418 | Self::QwenQwen3Vl30bA3bThinking
3419 | Self::QwenQwen3Vl32bInstruct
3420 | Self::QwenQwen3Vl8bInstruct
3421 | Self::QwenQwen3Vl8bThinking
3422 | Self::QwenQwen35122bA10b
3423 | Self::QwenQwen3527b
3424 | Self::QwenQwen3535bA3b
3425 | Self::QwenQwen35397bA17b
3426 | Self::QwenQwen359b
3427 | Self::QwenQwen35Flash0223
3428 | Self::QwenQwen35Plus0215
3429 | Self::QwenQwen35Plus20260420
3430 | Self::QwenQwen3627b
3431 | Self::QwenQwen3635bA3b
3432 | Self::QwenQwen36Flash
3433 | Self::QwenQwen36Plus
3434 | Self::RekaaiRekaEdge
3435 | Self::XAiGrok420
3436 | Self::XAiGrok43
3437 | Self::XiaomiMimoV2Omni
3438 | Self::XiaomiMimoV25
3439 | Self::ZAiGlm45v
3440 | Self::ZAiGlm46v
3441 | Self::ZAiGlm5vTurbo => true,
3442 }
3443 }
3444 #[allow(clippy::too_many_lines)]
3445 pub fn supports_audio(self) -> bool {
3446 match self {
3447 Self::Ai21JambaLarge17
3448 | Self::AlibabaTongyiDeepresearch30bA3b
3449 | Self::AmazonNova2LiteV1
3450 | Self::AmazonNovaLiteV1
3451 | Self::AmazonNovaMicroV1
3452 | Self::AmazonNovaPremierV1
3453 | Self::AmazonNovaProV1
3454 | Self::AnthropicClaude3Haiku
3455 | Self::AnthropicClaude35Haiku
3456 | Self::AnthropicClaudeHaiku45
3457 | Self::AnthropicClaudeOpus4
3458 | Self::AnthropicClaudeOpus41
3459 | Self::AnthropicClaudeOpus45
3460 | Self::AnthropicClaudeOpus46
3461 | Self::AnthropicClaudeOpus46Fast
3462 | Self::AnthropicClaudeOpus47
3463 | Self::AnthropicClaudeOpus47Fast
3464 | Self::AnthropicClaudeSonnet4
3465 | Self::AnthropicClaudeSonnet45
3466 | Self::AnthropicClaudeSonnet46
3467 | Self::ArceeAiTrinityLargePreview
3468 | Self::ArceeAiTrinityLargeThinking
3469 | Self::ArceeAiTrinityLargeThinkingFree
3470 | Self::ArceeAiTrinityMini
3471 | Self::ArceeAiVirtuosoLarge
3472 | Self::BaiduCobuddyFree
3473 | Self::BaiduErnie4521bA3b
3474 | Self::BaiduErnie45Vl28bA3b
3475 | Self::BytedanceSeedSeed16
3476 | Self::BytedanceSeedSeed16Flash
3477 | Self::BytedanceSeedSeed20Lite
3478 | Self::BytedanceSeedSeed20Mini
3479 | Self::CohereCommandR082024
3480 | Self::CohereCommandRPlus082024
3481 | Self::DeepseekDeepseekChat
3482 | Self::DeepseekDeepseekChatV30324
3483 | Self::DeepseekDeepseekChatV31
3484 | Self::DeepseekDeepseekR1
3485 | Self::DeepseekDeepseekR10528
3486 | Self::DeepseekDeepseekV31Terminus
3487 | Self::DeepseekDeepseekV32
3488 | Self::DeepseekDeepseekV32Exp
3489 | Self::DeepseekDeepseekV4Flash
3490 | Self::DeepseekDeepseekV4FlashFree
3491 | Self::DeepseekDeepseekV4Pro
3492 | Self::EssentialaiRnj1Instruct
3493 | Self::GoogleGemma312bIt
3494 | Self::GoogleGemma327bIt
3495 | Self::GoogleGemma426bA4bIt
3496 | Self::GoogleGemma426bA4bItFree
3497 | Self::GoogleGemma431bIt
3498 | Self::GoogleGemma431bItFree
3499 | Self::IbmGraniteGranite418b
3500 | Self::InceptionMercury2
3501 | Self::InclusionaiLing261t
3502 | Self::InclusionaiLing26Flash
3503 | Self::InclusionaiRing261t
3504 | Self::KwaipilotKatCoderProV2
3505 | Self::MetaLlamaLlama3170bInstruct
3506 | Self::MetaLlamaLlama318bInstruct
3507 | Self::MetaLlamaLlama3370bInstruct
3508 | Self::MetaLlamaLlama3370bInstructFree
3509 | Self::MetaLlamaLlama4Scout
3510 | Self::MinimaxMinimaxM1
3511 | Self::MinimaxMinimaxM2
3512 | Self::MinimaxMinimaxM21
3513 | Self::MinimaxMinimaxM25
3514 | Self::MinimaxMinimaxM25Free
3515 | Self::MinimaxMinimaxM27
3516 | Self::MistralaiCodestral2508
3517 | Self::MistralaiDevstral2512
3518 | Self::MistralaiDevstralMedium
3519 | Self::MistralaiDevstralSmall
3520 | Self::MistralaiMinistral14b2512
3521 | Self::MistralaiMinistral3b2512
3522 | Self::MistralaiMinistral8b2512
3523 | Self::MistralaiMistralLarge
3524 | Self::MistralaiMistralLarge2407
3525 | Self::MistralaiMistralLarge2411
3526 | Self::MistralaiMistralLarge2512
3527 | Self::MistralaiMistralMedium3
3528 | Self::MistralaiMistralMedium35
3529 | Self::MistralaiMistralMedium31
3530 | Self::MistralaiMistralNemo
3531 | Self::MistralaiMistralSaba
3532 | Self::MistralaiMistralSmall2603
3533 | Self::MistralaiMistralSmall3224bInstruct
3534 | Self::MistralaiMixtral8x22bInstruct
3535 | Self::MistralaiPixtralLarge2411
3536 | Self::MoonshotaiKimiK2
3537 | Self::MoonshotaiKimiK20905
3538 | Self::MoonshotaiKimiK2Thinking
3539 | Self::MoonshotaiKimiK25
3540 | Self::MoonshotaiKimiK26
3541 | Self::NexAgiDeepseekV31NexN1
3542 | Self::NvidiaLlama33NemotronSuper49bV15
3543 | Self::NvidiaNemotron3Nano30bA3b
3544 | Self::NvidiaNemotron3Nano30bA3bFree
3545 | Self::NvidiaNemotron3Super120bA12b
3546 | Self::NvidiaNemotron3Super120bA12bFree
3547 | Self::NvidiaNemotronNano12bV2VlFree
3548 | Self::NvidiaNemotronNano9bV2
3549 | Self::NvidiaNemotronNano9bV2Free
3550 | Self::OpenaiGpt35Turbo
3551 | Self::OpenaiGpt35Turbo0613
3552 | Self::OpenaiGpt35Turbo16k
3553 | Self::OpenaiGpt4
3554 | Self::OpenaiGpt40314
3555 | Self::OpenaiGpt41106Preview
3556 | Self::OpenaiGpt4Turbo
3557 | Self::OpenaiGpt4TurboPreview
3558 | Self::OpenaiGpt41
3559 | Self::OpenaiGpt41Mini
3560 | Self::OpenaiGpt41Nano
3561 | Self::OpenaiGpt4o
3562 | Self::OpenaiGpt4o20240513
3563 | Self::OpenaiGpt4o20240806
3564 | Self::OpenaiGpt4o20241120
3565 | Self::OpenaiGpt4oMini
3566 | Self::OpenaiGpt4oMini20240718
3567 | Self::OpenaiGpt5
3568 | Self::OpenaiGpt5Codex
3569 | Self::OpenaiGpt5Mini
3570 | Self::OpenaiGpt5Nano
3571 | Self::OpenaiGpt5Pro
3572 | Self::OpenaiGpt51
3573 | Self::OpenaiGpt51Chat
3574 | Self::OpenaiGpt51Codex
3575 | Self::OpenaiGpt51CodexMax
3576 | Self::OpenaiGpt51CodexMini
3577 | Self::OpenaiGpt52
3578 | Self::OpenaiGpt52Chat
3579 | Self::OpenaiGpt52Codex
3580 | Self::OpenaiGpt52Pro
3581 | Self::OpenaiGpt53Chat
3582 | Self::OpenaiGpt53Codex
3583 | Self::OpenaiGpt54
3584 | Self::OpenaiGpt54Mini
3585 | Self::OpenaiGpt54Nano
3586 | Self::OpenaiGpt54Pro
3587 | Self::OpenaiGpt55
3588 | Self::OpenaiGpt55Pro
3589 | Self::OpenaiGptOss120b
3590 | Self::OpenaiGptOss120bFree
3591 | Self::OpenaiGptOss20b
3592 | Self::OpenaiGptOss20bFree
3593 | Self::OpenaiGptOssSafeguard20b
3594 | Self::OpenaiO1
3595 | Self::OpenaiO3
3596 | Self::OpenaiO3DeepResearch
3597 | Self::OpenaiO3Mini
3598 | Self::OpenaiO3MiniHigh
3599 | Self::OpenaiO3Pro
3600 | Self::OpenaiO4Mini
3601 | Self::OpenaiO4MiniDeepResearch
3602 | Self::OpenaiO4MiniHigh
3603 | Self::OpenrouterFree
3604 | Self::OpenrouterOwlAlpha
3605 | Self::PoolsideLagunaM1Free
3606 | Self::PoolsideLagunaXs2Free
3607 | Self::PrimeIntellectIntellect3
3608 | Self::QwenQwen2572bInstruct
3609 | Self::QwenQwen257bInstruct
3610 | Self::QwenQwenPlus
3611 | Self::QwenQwenPlus20250728
3612 | Self::QwenQwenPlus20250728Thinking
3613 | Self::QwenQwen314b
3614 | Self::QwenQwen3235bA22b
3615 | Self::QwenQwen3235bA22b2507
3616 | Self::QwenQwen3235bA22bThinking2507
3617 | Self::QwenQwen330bA3b
3618 | Self::QwenQwen330bA3bInstruct2507
3619 | Self::QwenQwen330bA3bThinking2507
3620 | Self::QwenQwen332b
3621 | Self::QwenQwen38b
3622 | Self::QwenQwen3Coder
3623 | Self::QwenQwen3Coder30bA3bInstruct
3624 | Self::QwenQwen3CoderFlash
3625 | Self::QwenQwen3CoderNext
3626 | Self::QwenQwen3CoderPlus
3627 | Self::QwenQwen3CoderFree
3628 | Self::QwenQwen3Max
3629 | Self::QwenQwen3MaxThinking
3630 | Self::QwenQwen3Next80bA3bInstruct
3631 | Self::QwenQwen3Next80bA3bInstructFree
3632 | Self::QwenQwen3Next80bA3bThinking
3633 | Self::QwenQwen3Vl235bA22bInstruct
3634 | Self::QwenQwen3Vl235bA22bThinking
3635 | Self::QwenQwen3Vl30bA3bInstruct
3636 | Self::QwenQwen3Vl30bA3bThinking
3637 | Self::QwenQwen3Vl32bInstruct
3638 | Self::QwenQwen3Vl8bInstruct
3639 | Self::QwenQwen3Vl8bThinking
3640 | Self::QwenQwen35122bA10b
3641 | Self::QwenQwen3527b
3642 | Self::QwenQwen3535bA3b
3643 | Self::QwenQwen35397bA17b
3644 | Self::QwenQwen359b
3645 | Self::QwenQwen35Flash0223
3646 | Self::QwenQwen35Plus0215
3647 | Self::QwenQwen35Plus20260420
3648 | Self::QwenQwen3627b
3649 | Self::QwenQwen3635bA3b
3650 | Self::QwenQwen36Flash
3651 | Self::QwenQwen36MaxPreview
3652 | Self::QwenQwen36Plus
3653 | Self::RekaaiRekaEdge
3654 | Self::RelaceRelaceSearch
3655 | Self::Sao10kL3Euryale70b
3656 | Self::Sao10kL31Euryale70b
3657 | Self::StepfunStep35Flash
3658 | Self::TencentHy3Preview
3659 | Self::ThedrummerRocinante12b
3660 | Self::ThedrummerUnslopnemo12b
3661 | Self::UpstageSolarPro3
3662 | Self::XAiGrok420
3663 | Self::XAiGrok43
3664 | Self::XiaomiMimoV2Flash
3665 | Self::XiaomiMimoV2Pro
3666 | Self::XiaomiMimoV25Pro
3667 | Self::ZAiGlm432b
3668 | Self::ZAiGlm45
3669 | Self::ZAiGlm45Air
3670 | Self::ZAiGlm45AirFree
3671 | Self::ZAiGlm45v
3672 | Self::ZAiGlm46
3673 | Self::ZAiGlm46v
3674 | Self::ZAiGlm47
3675 | Self::ZAiGlm47Flash
3676 | Self::ZAiGlm5
3677 | Self::ZAiGlm5Turbo
3678 | Self::ZAiGlm51
3679 | Self::ZAiGlm5vTurbo => false,
3680 Self::GoogleGemini20Flash001
3681 | Self::GoogleGemini20FlashLite001
3682 | Self::GoogleGemini25Flash
3683 | Self::GoogleGemini25FlashLite
3684 | Self::GoogleGemini25FlashLitePreview092025
3685 | Self::GoogleGemini25Pro
3686 | Self::GoogleGemini25ProPreview
3687 | Self::GoogleGemini25ProPreview0506
3688 | Self::GoogleGemini3FlashPreview
3689 | Self::GoogleGemini31FlashLite
3690 | Self::GoogleGemini31FlashLitePreview
3691 | Self::GoogleGemini31ProPreview
3692 | Self::GoogleGemini31ProPreviewCustomtools
3693 | Self::GoogleGemini35Flash
3694 | Self::MistralaiVoxtralSmall24b2507
3695 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
3696 | Self::OpenaiGpt4oAudioPreview
3697 | Self::OpenaiGptAudio
3698 | Self::OpenaiGptAudioMini
3699 | Self::OpenrouterAuto
3700 | Self::XiaomiMimoV2Omni
3701 | Self::XiaomiMimoV25 => true,
3702 }
3703 }
3704 const ALL: &[OpenRouterModel] = &[
3705 Self::Ai21JambaLarge17,
3706 Self::AlibabaTongyiDeepresearch30bA3b,
3707 Self::AmazonNova2LiteV1,
3708 Self::AmazonNovaLiteV1,
3709 Self::AmazonNovaMicroV1,
3710 Self::AmazonNovaPremierV1,
3711 Self::AmazonNovaProV1,
3712 Self::AnthropicClaude3Haiku,
3713 Self::AnthropicClaude35Haiku,
3714 Self::AnthropicClaudeHaiku45,
3715 Self::AnthropicClaudeOpus4,
3716 Self::AnthropicClaudeOpus41,
3717 Self::AnthropicClaudeOpus45,
3718 Self::AnthropicClaudeOpus46,
3719 Self::AnthropicClaudeOpus46Fast,
3720 Self::AnthropicClaudeOpus47,
3721 Self::AnthropicClaudeOpus47Fast,
3722 Self::AnthropicClaudeSonnet4,
3723 Self::AnthropicClaudeSonnet45,
3724 Self::AnthropicClaudeSonnet46,
3725 Self::ArceeAiTrinityLargePreview,
3726 Self::ArceeAiTrinityLargeThinking,
3727 Self::ArceeAiTrinityLargeThinkingFree,
3728 Self::ArceeAiTrinityMini,
3729 Self::ArceeAiVirtuosoLarge,
3730 Self::BaiduCobuddyFree,
3731 Self::BaiduErnie4521bA3b,
3732 Self::BaiduErnie45Vl28bA3b,
3733 Self::BytedanceSeedSeed16,
3734 Self::BytedanceSeedSeed16Flash,
3735 Self::BytedanceSeedSeed20Lite,
3736 Self::BytedanceSeedSeed20Mini,
3737 Self::CohereCommandR082024,
3738 Self::CohereCommandRPlus082024,
3739 Self::DeepseekDeepseekChat,
3740 Self::DeepseekDeepseekChatV30324,
3741 Self::DeepseekDeepseekChatV31,
3742 Self::DeepseekDeepseekR1,
3743 Self::DeepseekDeepseekR10528,
3744 Self::DeepseekDeepseekV31Terminus,
3745 Self::DeepseekDeepseekV32,
3746 Self::DeepseekDeepseekV32Exp,
3747 Self::DeepseekDeepseekV4Flash,
3748 Self::DeepseekDeepseekV4FlashFree,
3749 Self::DeepseekDeepseekV4Pro,
3750 Self::EssentialaiRnj1Instruct,
3751 Self::GoogleGemini20Flash001,
3752 Self::GoogleGemini20FlashLite001,
3753 Self::GoogleGemini25Flash,
3754 Self::GoogleGemini25FlashLite,
3755 Self::GoogleGemini25FlashLitePreview092025,
3756 Self::GoogleGemini25Pro,
3757 Self::GoogleGemini25ProPreview,
3758 Self::GoogleGemini25ProPreview0506,
3759 Self::GoogleGemini3FlashPreview,
3760 Self::GoogleGemini31FlashLite,
3761 Self::GoogleGemini31FlashLitePreview,
3762 Self::GoogleGemini31ProPreview,
3763 Self::GoogleGemini31ProPreviewCustomtools,
3764 Self::GoogleGemini35Flash,
3765 Self::GoogleGemma312bIt,
3766 Self::GoogleGemma327bIt,
3767 Self::GoogleGemma426bA4bIt,
3768 Self::GoogleGemma426bA4bItFree,
3769 Self::GoogleGemma431bIt,
3770 Self::GoogleGemma431bItFree,
3771 Self::IbmGraniteGranite418b,
3772 Self::InceptionMercury2,
3773 Self::InclusionaiLing261t,
3774 Self::InclusionaiLing26Flash,
3775 Self::InclusionaiRing261t,
3776 Self::KwaipilotKatCoderProV2,
3777 Self::MetaLlamaLlama3170bInstruct,
3778 Self::MetaLlamaLlama318bInstruct,
3779 Self::MetaLlamaLlama3370bInstruct,
3780 Self::MetaLlamaLlama3370bInstructFree,
3781 Self::MetaLlamaLlama4Scout,
3782 Self::MinimaxMinimaxM1,
3783 Self::MinimaxMinimaxM2,
3784 Self::MinimaxMinimaxM21,
3785 Self::MinimaxMinimaxM25,
3786 Self::MinimaxMinimaxM25Free,
3787 Self::MinimaxMinimaxM27,
3788 Self::MistralaiCodestral2508,
3789 Self::MistralaiDevstral2512,
3790 Self::MistralaiDevstralMedium,
3791 Self::MistralaiDevstralSmall,
3792 Self::MistralaiMinistral14b2512,
3793 Self::MistralaiMinistral3b2512,
3794 Self::MistralaiMinistral8b2512,
3795 Self::MistralaiMistralLarge,
3796 Self::MistralaiMistralLarge2407,
3797 Self::MistralaiMistralLarge2411,
3798 Self::MistralaiMistralLarge2512,
3799 Self::MistralaiMistralMedium3,
3800 Self::MistralaiMistralMedium35,
3801 Self::MistralaiMistralMedium31,
3802 Self::MistralaiMistralNemo,
3803 Self::MistralaiMistralSaba,
3804 Self::MistralaiMistralSmall2603,
3805 Self::MistralaiMistralSmall3224bInstruct,
3806 Self::MistralaiMixtral8x22bInstruct,
3807 Self::MistralaiPixtralLarge2411,
3808 Self::MistralaiVoxtralSmall24b2507,
3809 Self::MoonshotaiKimiK2,
3810 Self::MoonshotaiKimiK20905,
3811 Self::MoonshotaiKimiK2Thinking,
3812 Self::MoonshotaiKimiK25,
3813 Self::MoonshotaiKimiK26,
3814 Self::NexAgiDeepseekV31NexN1,
3815 Self::NvidiaLlama33NemotronSuper49bV15,
3816 Self::NvidiaNemotron3Nano30bA3b,
3817 Self::NvidiaNemotron3Nano30bA3bFree,
3818 Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree,
3819 Self::NvidiaNemotron3Super120bA12b,
3820 Self::NvidiaNemotron3Super120bA12bFree,
3821 Self::NvidiaNemotronNano12bV2VlFree,
3822 Self::NvidiaNemotronNano9bV2,
3823 Self::NvidiaNemotronNano9bV2Free,
3824 Self::OpenaiGpt35Turbo,
3825 Self::OpenaiGpt35Turbo0613,
3826 Self::OpenaiGpt35Turbo16k,
3827 Self::OpenaiGpt4,
3828 Self::OpenaiGpt40314,
3829 Self::OpenaiGpt41106Preview,
3830 Self::OpenaiGpt4Turbo,
3831 Self::OpenaiGpt4TurboPreview,
3832 Self::OpenaiGpt41,
3833 Self::OpenaiGpt41Mini,
3834 Self::OpenaiGpt41Nano,
3835 Self::OpenaiGpt4o,
3836 Self::OpenaiGpt4o20240513,
3837 Self::OpenaiGpt4o20240806,
3838 Self::OpenaiGpt4o20241120,
3839 Self::OpenaiGpt4oAudioPreview,
3840 Self::OpenaiGpt4oMini,
3841 Self::OpenaiGpt4oMini20240718,
3842 Self::OpenaiGpt5,
3843 Self::OpenaiGpt5Codex,
3844 Self::OpenaiGpt5Mini,
3845 Self::OpenaiGpt5Nano,
3846 Self::OpenaiGpt5Pro,
3847 Self::OpenaiGpt51,
3848 Self::OpenaiGpt51Chat,
3849 Self::OpenaiGpt51Codex,
3850 Self::OpenaiGpt51CodexMax,
3851 Self::OpenaiGpt51CodexMini,
3852 Self::OpenaiGpt52,
3853 Self::OpenaiGpt52Chat,
3854 Self::OpenaiGpt52Codex,
3855 Self::OpenaiGpt52Pro,
3856 Self::OpenaiGpt53Chat,
3857 Self::OpenaiGpt53Codex,
3858 Self::OpenaiGpt54,
3859 Self::OpenaiGpt54Mini,
3860 Self::OpenaiGpt54Nano,
3861 Self::OpenaiGpt54Pro,
3862 Self::OpenaiGpt55,
3863 Self::OpenaiGpt55Pro,
3864 Self::OpenaiGptAudio,
3865 Self::OpenaiGptAudioMini,
3866 Self::OpenaiGptOss120b,
3867 Self::OpenaiGptOss120bFree,
3868 Self::OpenaiGptOss20b,
3869 Self::OpenaiGptOss20bFree,
3870 Self::OpenaiGptOssSafeguard20b,
3871 Self::OpenaiO1,
3872 Self::OpenaiO3,
3873 Self::OpenaiO3DeepResearch,
3874 Self::OpenaiO3Mini,
3875 Self::OpenaiO3MiniHigh,
3876 Self::OpenaiO3Pro,
3877 Self::OpenaiO4Mini,
3878 Self::OpenaiO4MiniDeepResearch,
3879 Self::OpenaiO4MiniHigh,
3880 Self::OpenrouterAuto,
3881 Self::OpenrouterFree,
3882 Self::OpenrouterOwlAlpha,
3883 Self::PoolsideLagunaM1Free,
3884 Self::PoolsideLagunaXs2Free,
3885 Self::PrimeIntellectIntellect3,
3886 Self::QwenQwen2572bInstruct,
3887 Self::QwenQwen257bInstruct,
3888 Self::QwenQwenPlus,
3889 Self::QwenQwenPlus20250728,
3890 Self::QwenQwenPlus20250728Thinking,
3891 Self::QwenQwen314b,
3892 Self::QwenQwen3235bA22b,
3893 Self::QwenQwen3235bA22b2507,
3894 Self::QwenQwen3235bA22bThinking2507,
3895 Self::QwenQwen330bA3b,
3896 Self::QwenQwen330bA3bInstruct2507,
3897 Self::QwenQwen330bA3bThinking2507,
3898 Self::QwenQwen332b,
3899 Self::QwenQwen38b,
3900 Self::QwenQwen3Coder,
3901 Self::QwenQwen3Coder30bA3bInstruct,
3902 Self::QwenQwen3CoderFlash,
3903 Self::QwenQwen3CoderNext,
3904 Self::QwenQwen3CoderPlus,
3905 Self::QwenQwen3CoderFree,
3906 Self::QwenQwen3Max,
3907 Self::QwenQwen3MaxThinking,
3908 Self::QwenQwen3Next80bA3bInstruct,
3909 Self::QwenQwen3Next80bA3bInstructFree,
3910 Self::QwenQwen3Next80bA3bThinking,
3911 Self::QwenQwen3Vl235bA22bInstruct,
3912 Self::QwenQwen3Vl235bA22bThinking,
3913 Self::QwenQwen3Vl30bA3bInstruct,
3914 Self::QwenQwen3Vl30bA3bThinking,
3915 Self::QwenQwen3Vl32bInstruct,
3916 Self::QwenQwen3Vl8bInstruct,
3917 Self::QwenQwen3Vl8bThinking,
3918 Self::QwenQwen35122bA10b,
3919 Self::QwenQwen3527b,
3920 Self::QwenQwen3535bA3b,
3921 Self::QwenQwen35397bA17b,
3922 Self::QwenQwen359b,
3923 Self::QwenQwen35Flash0223,
3924 Self::QwenQwen35Plus0215,
3925 Self::QwenQwen35Plus20260420,
3926 Self::QwenQwen3627b,
3927 Self::QwenQwen3635bA3b,
3928 Self::QwenQwen36Flash,
3929 Self::QwenQwen36MaxPreview,
3930 Self::QwenQwen36Plus,
3931 Self::RekaaiRekaEdge,
3932 Self::RelaceRelaceSearch,
3933 Self::Sao10kL3Euryale70b,
3934 Self::Sao10kL31Euryale70b,
3935 Self::StepfunStep35Flash,
3936 Self::TencentHy3Preview,
3937 Self::ThedrummerRocinante12b,
3938 Self::ThedrummerUnslopnemo12b,
3939 Self::UpstageSolarPro3,
3940 Self::XAiGrok420,
3941 Self::XAiGrok43,
3942 Self::XiaomiMimoV2Flash,
3943 Self::XiaomiMimoV2Omni,
3944 Self::XiaomiMimoV2Pro,
3945 Self::XiaomiMimoV25,
3946 Self::XiaomiMimoV25Pro,
3947 Self::ZAiGlm432b,
3948 Self::ZAiGlm45,
3949 Self::ZAiGlm45Air,
3950 Self::ZAiGlm45AirFree,
3951 Self::ZAiGlm45v,
3952 Self::ZAiGlm46,
3953 Self::ZAiGlm46v,
3954 Self::ZAiGlm47,
3955 Self::ZAiGlm47Flash,
3956 Self::ZAiGlm5,
3957 Self::ZAiGlm5Turbo,
3958 Self::ZAiGlm51,
3959 Self::ZAiGlm5vTurbo,
3960 ];
3961}
3962impl std::str::FromStr for OpenRouterModel {
3963 type Err = String;
3964 #[allow(clippy::too_many_lines)]
3965 fn from_str(s: &str) -> Result<Self, Self::Err> {
3966 match s {
3967 "ai21/jamba-large-1.7" => Ok(Self::Ai21JambaLarge17),
3968 "alibaba/tongyi-deepresearch-30b-a3b" => {
3969 Ok(Self::AlibabaTongyiDeepresearch30bA3b)
3970 }
3971 "amazon/nova-2-lite-v1" => Ok(Self::AmazonNova2LiteV1),
3972 "amazon/nova-lite-v1" => Ok(Self::AmazonNovaLiteV1),
3973 "amazon/nova-micro-v1" => Ok(Self::AmazonNovaMicroV1),
3974 "amazon/nova-premier-v1" => Ok(Self::AmazonNovaPremierV1),
3975 "amazon/nova-pro-v1" => Ok(Self::AmazonNovaProV1),
3976 "anthropic/claude-3-haiku" => Ok(Self::AnthropicClaude3Haiku),
3977 "anthropic/claude-3.5-haiku" => Ok(Self::AnthropicClaude35Haiku),
3978 "anthropic/claude-haiku-4.5" => Ok(Self::AnthropicClaudeHaiku45),
3979 "anthropic/claude-opus-4" => Ok(Self::AnthropicClaudeOpus4),
3980 "anthropic/claude-opus-4.1" => Ok(Self::AnthropicClaudeOpus41),
3981 "anthropic/claude-opus-4.5" => Ok(Self::AnthropicClaudeOpus45),
3982 "anthropic/claude-opus-4.6" => Ok(Self::AnthropicClaudeOpus46),
3983 "anthropic/claude-opus-4.6-fast" => Ok(Self::AnthropicClaudeOpus46Fast),
3984 "anthropic/claude-opus-4.7" => Ok(Self::AnthropicClaudeOpus47),
3985 "anthropic/claude-opus-4.7-fast" => Ok(Self::AnthropicClaudeOpus47Fast),
3986 "anthropic/claude-sonnet-4" => Ok(Self::AnthropicClaudeSonnet4),
3987 "anthropic/claude-sonnet-4.5" => Ok(Self::AnthropicClaudeSonnet45),
3988 "anthropic/claude-sonnet-4.6" => Ok(Self::AnthropicClaudeSonnet46),
3989 "arcee-ai/trinity-large-preview" => Ok(Self::ArceeAiTrinityLargePreview),
3990 "arcee-ai/trinity-large-thinking" => Ok(Self::ArceeAiTrinityLargeThinking),
3991 "arcee-ai/trinity-large-thinking:free" => {
3992 Ok(Self::ArceeAiTrinityLargeThinkingFree)
3993 }
3994 "arcee-ai/trinity-mini" => Ok(Self::ArceeAiTrinityMini),
3995 "arcee-ai/virtuoso-large" => Ok(Self::ArceeAiVirtuosoLarge),
3996 "baidu/cobuddy:free" => Ok(Self::BaiduCobuddyFree),
3997 "baidu/ernie-4.5-21b-a3b" => Ok(Self::BaiduErnie4521bA3b),
3998 "baidu/ernie-4.5-vl-28b-a3b" => Ok(Self::BaiduErnie45Vl28bA3b),
3999 "bytedance-seed/seed-1.6" => Ok(Self::BytedanceSeedSeed16),
4000 "bytedance-seed/seed-1.6-flash" => Ok(Self::BytedanceSeedSeed16Flash),
4001 "bytedance-seed/seed-2.0-lite" => Ok(Self::BytedanceSeedSeed20Lite),
4002 "bytedance-seed/seed-2.0-mini" => Ok(Self::BytedanceSeedSeed20Mini),
4003 "cohere/command-r-08-2024" => Ok(Self::CohereCommandR082024),
4004 "cohere/command-r-plus-08-2024" => Ok(Self::CohereCommandRPlus082024),
4005 "deepseek/deepseek-chat" => Ok(Self::DeepseekDeepseekChat),
4006 "deepseek/deepseek-chat-v3-0324" => Ok(Self::DeepseekDeepseekChatV30324),
4007 "deepseek/deepseek-chat-v3.1" => Ok(Self::DeepseekDeepseekChatV31),
4008 "deepseek/deepseek-r1" => Ok(Self::DeepseekDeepseekR1),
4009 "deepseek/deepseek-r1-0528" => Ok(Self::DeepseekDeepseekR10528),
4010 "deepseek/deepseek-v3.1-terminus" => Ok(Self::DeepseekDeepseekV31Terminus),
4011 "deepseek/deepseek-v3.2" => Ok(Self::DeepseekDeepseekV32),
4012 "deepseek/deepseek-v3.2-exp" => Ok(Self::DeepseekDeepseekV32Exp),
4013 "deepseek/deepseek-v4-flash" => Ok(Self::DeepseekDeepseekV4Flash),
4014 "deepseek/deepseek-v4-flash:free" => Ok(Self::DeepseekDeepseekV4FlashFree),
4015 "deepseek/deepseek-v4-pro" => Ok(Self::DeepseekDeepseekV4Pro),
4016 "essentialai/rnj-1-instruct" => Ok(Self::EssentialaiRnj1Instruct),
4017 "google/gemini-2.0-flash-001" => Ok(Self::GoogleGemini20Flash001),
4018 "google/gemini-2.0-flash-lite-001" => Ok(Self::GoogleGemini20FlashLite001),
4019 "google/gemini-2.5-flash" => Ok(Self::GoogleGemini25Flash),
4020 "google/gemini-2.5-flash-lite" => Ok(Self::GoogleGemini25FlashLite),
4021 "google/gemini-2.5-flash-lite-preview-09-2025" => {
4022 Ok(Self::GoogleGemini25FlashLitePreview092025)
4023 }
4024 "google/gemini-2.5-pro" => Ok(Self::GoogleGemini25Pro),
4025 "google/gemini-2.5-pro-preview" => Ok(Self::GoogleGemini25ProPreview),
4026 "google/gemini-2.5-pro-preview-05-06" => {
4027 Ok(Self::GoogleGemini25ProPreview0506)
4028 }
4029 "google/gemini-3-flash-preview" => Ok(Self::GoogleGemini3FlashPreview),
4030 "google/gemini-3.1-flash-lite" => Ok(Self::GoogleGemini31FlashLite),
4031 "google/gemini-3.1-flash-lite-preview" => {
4032 Ok(Self::GoogleGemini31FlashLitePreview)
4033 }
4034 "google/gemini-3.1-pro-preview" => Ok(Self::GoogleGemini31ProPreview),
4035 "google/gemini-3.1-pro-preview-customtools" => {
4036 Ok(Self::GoogleGemini31ProPreviewCustomtools)
4037 }
4038 "google/gemini-3.5-flash" => Ok(Self::GoogleGemini35Flash),
4039 "google/gemma-3-12b-it" => Ok(Self::GoogleGemma312bIt),
4040 "google/gemma-3-27b-it" => Ok(Self::GoogleGemma327bIt),
4041 "google/gemma-4-26b-a4b-it" => Ok(Self::GoogleGemma426bA4bIt),
4042 "google/gemma-4-26b-a4b-it:free" => Ok(Self::GoogleGemma426bA4bItFree),
4043 "google/gemma-4-31b-it" => Ok(Self::GoogleGemma431bIt),
4044 "google/gemma-4-31b-it:free" => Ok(Self::GoogleGemma431bItFree),
4045 "ibm-granite/granite-4.1-8b" => Ok(Self::IbmGraniteGranite418b),
4046 "inception/mercury-2" => Ok(Self::InceptionMercury2),
4047 "inclusionai/ling-2.6-1t" => Ok(Self::InclusionaiLing261t),
4048 "inclusionai/ling-2.6-flash" => Ok(Self::InclusionaiLing26Flash),
4049 "inclusionai/ring-2.6-1t" => Ok(Self::InclusionaiRing261t),
4050 "kwaipilot/kat-coder-pro-v2" => Ok(Self::KwaipilotKatCoderProV2),
4051 "meta-llama/llama-3.1-70b-instruct" => Ok(Self::MetaLlamaLlama3170bInstruct),
4052 "meta-llama/llama-3.1-8b-instruct" => Ok(Self::MetaLlamaLlama318bInstruct),
4053 "meta-llama/llama-3.3-70b-instruct" => Ok(Self::MetaLlamaLlama3370bInstruct),
4054 "meta-llama/llama-3.3-70b-instruct:free" => {
4055 Ok(Self::MetaLlamaLlama3370bInstructFree)
4056 }
4057 "meta-llama/llama-4-scout" => Ok(Self::MetaLlamaLlama4Scout),
4058 "minimax/minimax-m1" => Ok(Self::MinimaxMinimaxM1),
4059 "minimax/minimax-m2" => Ok(Self::MinimaxMinimaxM2),
4060 "minimax/minimax-m2.1" => Ok(Self::MinimaxMinimaxM21),
4061 "minimax/minimax-m2.5" => Ok(Self::MinimaxMinimaxM25),
4062 "minimax/minimax-m2.5:free" => Ok(Self::MinimaxMinimaxM25Free),
4063 "minimax/minimax-m2.7" => Ok(Self::MinimaxMinimaxM27),
4064 "mistralai/codestral-2508" => Ok(Self::MistralaiCodestral2508),
4065 "mistralai/devstral-2512" => Ok(Self::MistralaiDevstral2512),
4066 "mistralai/devstral-medium" => Ok(Self::MistralaiDevstralMedium),
4067 "mistralai/devstral-small" => Ok(Self::MistralaiDevstralSmall),
4068 "mistralai/ministral-14b-2512" => Ok(Self::MistralaiMinistral14b2512),
4069 "mistralai/ministral-3b-2512" => Ok(Self::MistralaiMinistral3b2512),
4070 "mistralai/ministral-8b-2512" => Ok(Self::MistralaiMinistral8b2512),
4071 "mistralai/mistral-large" => Ok(Self::MistralaiMistralLarge),
4072 "mistralai/mistral-large-2407" => Ok(Self::MistralaiMistralLarge2407),
4073 "mistralai/mistral-large-2411" => Ok(Self::MistralaiMistralLarge2411),
4074 "mistralai/mistral-large-2512" => Ok(Self::MistralaiMistralLarge2512),
4075 "mistralai/mistral-medium-3" => Ok(Self::MistralaiMistralMedium3),
4076 "mistralai/mistral-medium-3-5" => Ok(Self::MistralaiMistralMedium35),
4077 "mistralai/mistral-medium-3.1" => Ok(Self::MistralaiMistralMedium31),
4078 "mistralai/mistral-nemo" => Ok(Self::MistralaiMistralNemo),
4079 "mistralai/mistral-saba" => Ok(Self::MistralaiMistralSaba),
4080 "mistralai/mistral-small-2603" => Ok(Self::MistralaiMistralSmall2603),
4081 "mistralai/mistral-small-3.2-24b-instruct" => {
4082 Ok(Self::MistralaiMistralSmall3224bInstruct)
4083 }
4084 "mistralai/mixtral-8x22b-instruct" => Ok(Self::MistralaiMixtral8x22bInstruct),
4085 "mistralai/pixtral-large-2411" => Ok(Self::MistralaiPixtralLarge2411),
4086 "mistralai/voxtral-small-24b-2507" => Ok(Self::MistralaiVoxtralSmall24b2507),
4087 "moonshotai/kimi-k2" => Ok(Self::MoonshotaiKimiK2),
4088 "moonshotai/kimi-k2-0905" => Ok(Self::MoonshotaiKimiK20905),
4089 "moonshotai/kimi-k2-thinking" => Ok(Self::MoonshotaiKimiK2Thinking),
4090 "moonshotai/kimi-k2.5" => Ok(Self::MoonshotaiKimiK25),
4091 "moonshotai/kimi-k2.6" => Ok(Self::MoonshotaiKimiK26),
4092 "nex-agi/deepseek-v3.1-nex-n1" => Ok(Self::NexAgiDeepseekV31NexN1),
4093 "nvidia/llama-3.3-nemotron-super-49b-v1.5" => {
4094 Ok(Self::NvidiaLlama33NemotronSuper49bV15)
4095 }
4096 "nvidia/nemotron-3-nano-30b-a3b" => Ok(Self::NvidiaNemotron3Nano30bA3b),
4097 "nvidia/nemotron-3-nano-30b-a3b:free" => {
4098 Ok(Self::NvidiaNemotron3Nano30bA3bFree)
4099 }
4100 "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free" => {
4101 Ok(Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree)
4102 }
4103 "nvidia/nemotron-3-super-120b-a12b" => Ok(Self::NvidiaNemotron3Super120bA12b),
4104 "nvidia/nemotron-3-super-120b-a12b:free" => {
4105 Ok(Self::NvidiaNemotron3Super120bA12bFree)
4106 }
4107 "nvidia/nemotron-nano-12b-v2-vl:free" => {
4108 Ok(Self::NvidiaNemotronNano12bV2VlFree)
4109 }
4110 "nvidia/nemotron-nano-9b-v2" => Ok(Self::NvidiaNemotronNano9bV2),
4111 "nvidia/nemotron-nano-9b-v2:free" => Ok(Self::NvidiaNemotronNano9bV2Free),
4112 "openai/gpt-3.5-turbo" => Ok(Self::OpenaiGpt35Turbo),
4113 "openai/gpt-3.5-turbo-0613" => Ok(Self::OpenaiGpt35Turbo0613),
4114 "openai/gpt-3.5-turbo-16k" => Ok(Self::OpenaiGpt35Turbo16k),
4115 "openai/gpt-4" => Ok(Self::OpenaiGpt4),
4116 "openai/gpt-4-0314" => Ok(Self::OpenaiGpt40314),
4117 "openai/gpt-4-1106-preview" => Ok(Self::OpenaiGpt41106Preview),
4118 "openai/gpt-4-turbo" => Ok(Self::OpenaiGpt4Turbo),
4119 "openai/gpt-4-turbo-preview" => Ok(Self::OpenaiGpt4TurboPreview),
4120 "openai/gpt-4.1" => Ok(Self::OpenaiGpt41),
4121 "openai/gpt-4.1-mini" => Ok(Self::OpenaiGpt41Mini),
4122 "openai/gpt-4.1-nano" => Ok(Self::OpenaiGpt41Nano),
4123 "openai/gpt-4o" => Ok(Self::OpenaiGpt4o),
4124 "openai/gpt-4o-2024-05-13" => Ok(Self::OpenaiGpt4o20240513),
4125 "openai/gpt-4o-2024-08-06" => Ok(Self::OpenaiGpt4o20240806),
4126 "openai/gpt-4o-2024-11-20" => Ok(Self::OpenaiGpt4o20241120),
4127 "openai/gpt-4o-audio-preview" => Ok(Self::OpenaiGpt4oAudioPreview),
4128 "openai/gpt-4o-mini" => Ok(Self::OpenaiGpt4oMini),
4129 "openai/gpt-4o-mini-2024-07-18" => Ok(Self::OpenaiGpt4oMini20240718),
4130 "openai/gpt-5" => Ok(Self::OpenaiGpt5),
4131 "openai/gpt-5-codex" => Ok(Self::OpenaiGpt5Codex),
4132 "openai/gpt-5-mini" => Ok(Self::OpenaiGpt5Mini),
4133 "openai/gpt-5-nano" => Ok(Self::OpenaiGpt5Nano),
4134 "openai/gpt-5-pro" => Ok(Self::OpenaiGpt5Pro),
4135 "openai/gpt-5.1" => Ok(Self::OpenaiGpt51),
4136 "openai/gpt-5.1-chat" => Ok(Self::OpenaiGpt51Chat),
4137 "openai/gpt-5.1-codex" => Ok(Self::OpenaiGpt51Codex),
4138 "openai/gpt-5.1-codex-max" => Ok(Self::OpenaiGpt51CodexMax),
4139 "openai/gpt-5.1-codex-mini" => Ok(Self::OpenaiGpt51CodexMini),
4140 "openai/gpt-5.2" => Ok(Self::OpenaiGpt52),
4141 "openai/gpt-5.2-chat" => Ok(Self::OpenaiGpt52Chat),
4142 "openai/gpt-5.2-codex" => Ok(Self::OpenaiGpt52Codex),
4143 "openai/gpt-5.2-pro" => Ok(Self::OpenaiGpt52Pro),
4144 "openai/gpt-5.3-chat" => Ok(Self::OpenaiGpt53Chat),
4145 "openai/gpt-5.3-codex" => Ok(Self::OpenaiGpt53Codex),
4146 "openai/gpt-5.4" => Ok(Self::OpenaiGpt54),
4147 "openai/gpt-5.4-mini" => Ok(Self::OpenaiGpt54Mini),
4148 "openai/gpt-5.4-nano" => Ok(Self::OpenaiGpt54Nano),
4149 "openai/gpt-5.4-pro" => Ok(Self::OpenaiGpt54Pro),
4150 "openai/gpt-5.5" => Ok(Self::OpenaiGpt55),
4151 "openai/gpt-5.5-pro" => Ok(Self::OpenaiGpt55Pro),
4152 "openai/gpt-audio" => Ok(Self::OpenaiGptAudio),
4153 "openai/gpt-audio-mini" => Ok(Self::OpenaiGptAudioMini),
4154 "openai/gpt-oss-120b" => Ok(Self::OpenaiGptOss120b),
4155 "openai/gpt-oss-120b:free" => Ok(Self::OpenaiGptOss120bFree),
4156 "openai/gpt-oss-20b" => Ok(Self::OpenaiGptOss20b),
4157 "openai/gpt-oss-20b:free" => Ok(Self::OpenaiGptOss20bFree),
4158 "openai/gpt-oss-safeguard-20b" => Ok(Self::OpenaiGptOssSafeguard20b),
4159 "openai/o1" => Ok(Self::OpenaiO1),
4160 "openai/o3" => Ok(Self::OpenaiO3),
4161 "openai/o3-deep-research" => Ok(Self::OpenaiO3DeepResearch),
4162 "openai/o3-mini" => Ok(Self::OpenaiO3Mini),
4163 "openai/o3-mini-high" => Ok(Self::OpenaiO3MiniHigh),
4164 "openai/o3-pro" => Ok(Self::OpenaiO3Pro),
4165 "openai/o4-mini" => Ok(Self::OpenaiO4Mini),
4166 "openai/o4-mini-deep-research" => Ok(Self::OpenaiO4MiniDeepResearch),
4167 "openai/o4-mini-high" => Ok(Self::OpenaiO4MiniHigh),
4168 "openrouter/auto" => Ok(Self::OpenrouterAuto),
4169 "openrouter/free" => Ok(Self::OpenrouterFree),
4170 "openrouter/owl-alpha" => Ok(Self::OpenrouterOwlAlpha),
4171 "poolside/laguna-m.1:free" => Ok(Self::PoolsideLagunaM1Free),
4172 "poolside/laguna-xs.2:free" => Ok(Self::PoolsideLagunaXs2Free),
4173 "prime-intellect/intellect-3" => Ok(Self::PrimeIntellectIntellect3),
4174 "qwen/qwen-2.5-72b-instruct" => Ok(Self::QwenQwen2572bInstruct),
4175 "qwen/qwen-2.5-7b-instruct" => Ok(Self::QwenQwen257bInstruct),
4176 "qwen/qwen-plus" => Ok(Self::QwenQwenPlus),
4177 "qwen/qwen-plus-2025-07-28" => Ok(Self::QwenQwenPlus20250728),
4178 "qwen/qwen-plus-2025-07-28:thinking" => {
4179 Ok(Self::QwenQwenPlus20250728Thinking)
4180 }
4181 "qwen/qwen3-14b" => Ok(Self::QwenQwen314b),
4182 "qwen/qwen3-235b-a22b" => Ok(Self::QwenQwen3235bA22b),
4183 "qwen/qwen3-235b-a22b-2507" => Ok(Self::QwenQwen3235bA22b2507),
4184 "qwen/qwen3-235b-a22b-thinking-2507" => {
4185 Ok(Self::QwenQwen3235bA22bThinking2507)
4186 }
4187 "qwen/qwen3-30b-a3b" => Ok(Self::QwenQwen330bA3b),
4188 "qwen/qwen3-30b-a3b-instruct-2507" => Ok(Self::QwenQwen330bA3bInstruct2507),
4189 "qwen/qwen3-30b-a3b-thinking-2507" => Ok(Self::QwenQwen330bA3bThinking2507),
4190 "qwen/qwen3-32b" => Ok(Self::QwenQwen332b),
4191 "qwen/qwen3-8b" => Ok(Self::QwenQwen38b),
4192 "qwen/qwen3-coder" => Ok(Self::QwenQwen3Coder),
4193 "qwen/qwen3-coder-30b-a3b-instruct" => Ok(Self::QwenQwen3Coder30bA3bInstruct),
4194 "qwen/qwen3-coder-flash" => Ok(Self::QwenQwen3CoderFlash),
4195 "qwen/qwen3-coder-next" => Ok(Self::QwenQwen3CoderNext),
4196 "qwen/qwen3-coder-plus" => Ok(Self::QwenQwen3CoderPlus),
4197 "qwen/qwen3-coder:free" => Ok(Self::QwenQwen3CoderFree),
4198 "qwen/qwen3-max" => Ok(Self::QwenQwen3Max),
4199 "qwen/qwen3-max-thinking" => Ok(Self::QwenQwen3MaxThinking),
4200 "qwen/qwen3-next-80b-a3b-instruct" => Ok(Self::QwenQwen3Next80bA3bInstruct),
4201 "qwen/qwen3-next-80b-a3b-instruct:free" => {
4202 Ok(Self::QwenQwen3Next80bA3bInstructFree)
4203 }
4204 "qwen/qwen3-next-80b-a3b-thinking" => Ok(Self::QwenQwen3Next80bA3bThinking),
4205 "qwen/qwen3-vl-235b-a22b-instruct" => Ok(Self::QwenQwen3Vl235bA22bInstruct),
4206 "qwen/qwen3-vl-235b-a22b-thinking" => Ok(Self::QwenQwen3Vl235bA22bThinking),
4207 "qwen/qwen3-vl-30b-a3b-instruct" => Ok(Self::QwenQwen3Vl30bA3bInstruct),
4208 "qwen/qwen3-vl-30b-a3b-thinking" => Ok(Self::QwenQwen3Vl30bA3bThinking),
4209 "qwen/qwen3-vl-32b-instruct" => Ok(Self::QwenQwen3Vl32bInstruct),
4210 "qwen/qwen3-vl-8b-instruct" => Ok(Self::QwenQwen3Vl8bInstruct),
4211 "qwen/qwen3-vl-8b-thinking" => Ok(Self::QwenQwen3Vl8bThinking),
4212 "qwen/qwen3.5-122b-a10b" => Ok(Self::QwenQwen35122bA10b),
4213 "qwen/qwen3.5-27b" => Ok(Self::QwenQwen3527b),
4214 "qwen/qwen3.5-35b-a3b" => Ok(Self::QwenQwen3535bA3b),
4215 "qwen/qwen3.5-397b-a17b" => Ok(Self::QwenQwen35397bA17b),
4216 "qwen/qwen3.5-9b" => Ok(Self::QwenQwen359b),
4217 "qwen/qwen3.5-flash-02-23" => Ok(Self::QwenQwen35Flash0223),
4218 "qwen/qwen3.5-plus-02-15" => Ok(Self::QwenQwen35Plus0215),
4219 "qwen/qwen3.5-plus-20260420" => Ok(Self::QwenQwen35Plus20260420),
4220 "qwen/qwen3.6-27b" => Ok(Self::QwenQwen3627b),
4221 "qwen/qwen3.6-35b-a3b" => Ok(Self::QwenQwen3635bA3b),
4222 "qwen/qwen3.6-flash" => Ok(Self::QwenQwen36Flash),
4223 "qwen/qwen3.6-max-preview" => Ok(Self::QwenQwen36MaxPreview),
4224 "qwen/qwen3.6-plus" => Ok(Self::QwenQwen36Plus),
4225 "rekaai/reka-edge" => Ok(Self::RekaaiRekaEdge),
4226 "relace/relace-search" => Ok(Self::RelaceRelaceSearch),
4227 "sao10k/l3-euryale-70b" => Ok(Self::Sao10kL3Euryale70b),
4228 "sao10k/l3.1-euryale-70b" => Ok(Self::Sao10kL31Euryale70b),
4229 "stepfun/step-3.5-flash" => Ok(Self::StepfunStep35Flash),
4230 "tencent/hy3-preview" => Ok(Self::TencentHy3Preview),
4231 "thedrummer/rocinante-12b" => Ok(Self::ThedrummerRocinante12b),
4232 "thedrummer/unslopnemo-12b" => Ok(Self::ThedrummerUnslopnemo12b),
4233 "upstage/solar-pro-3" => Ok(Self::UpstageSolarPro3),
4234 "x-ai/grok-4.20" => Ok(Self::XAiGrok420),
4235 "x-ai/grok-4.3" => Ok(Self::XAiGrok43),
4236 "xiaomi/mimo-v2-flash" => Ok(Self::XiaomiMimoV2Flash),
4237 "xiaomi/mimo-v2-omni" => Ok(Self::XiaomiMimoV2Omni),
4238 "xiaomi/mimo-v2-pro" => Ok(Self::XiaomiMimoV2Pro),
4239 "xiaomi/mimo-v2.5" => Ok(Self::XiaomiMimoV25),
4240 "xiaomi/mimo-v2.5-pro" => Ok(Self::XiaomiMimoV25Pro),
4241 "z-ai/glm-4-32b" => Ok(Self::ZAiGlm432b),
4242 "z-ai/glm-4.5" => Ok(Self::ZAiGlm45),
4243 "z-ai/glm-4.5-air" => Ok(Self::ZAiGlm45Air),
4244 "z-ai/glm-4.5-air:free" => Ok(Self::ZAiGlm45AirFree),
4245 "z-ai/glm-4.5v" => Ok(Self::ZAiGlm45v),
4246 "z-ai/glm-4.6" => Ok(Self::ZAiGlm46),
4247 "z-ai/glm-4.6v" => Ok(Self::ZAiGlm46v),
4248 "z-ai/glm-4.7" => Ok(Self::ZAiGlm47),
4249 "z-ai/glm-4.7-flash" => Ok(Self::ZAiGlm47Flash),
4250 "z-ai/glm-5" => Ok(Self::ZAiGlm5),
4251 "z-ai/glm-5-turbo" => Ok(Self::ZAiGlm5Turbo),
4252 "z-ai/glm-5.1" => Ok(Self::ZAiGlm51),
4253 "z-ai/glm-5v-turbo" => Ok(Self::ZAiGlm5vTurbo),
4254 _ => Err(format!("Unknown openrouter model: '{s}'")),
4255 }
4256 }
4257}
4258impl ZAiModel {
4259 #[allow(clippy::too_many_lines)]
4260 fn model_id(self) -> &'static str {
4261 match self {
4262 Self::Glm45 => "glm-4.5",
4263 Self::Glm45Air => "glm-4.5-air",
4264 Self::Glm45Flash => "glm-4.5-flash",
4265 Self::Glm45v => "glm-4.5v",
4266 Self::Glm46 => "glm-4.6",
4267 Self::Glm46v => "glm-4.6v",
4268 Self::Glm47 => "glm-4.7",
4269 Self::Glm47Flash => "glm-4.7-flash",
4270 Self::Glm47Flashx => "glm-4.7-flashx",
4271 Self::Glm5 => "glm-5",
4272 Self::Glm5Turbo => "glm-5-turbo",
4273 Self::Glm51 => "glm-5.1",
4274 Self::Glm5vTurbo => "glm-5v-turbo",
4275 }
4276 }
4277 #[allow(clippy::too_many_lines)]
4278 fn display_name(self) -> &'static str {
4279 match self {
4280 Self::Glm45 => "GLM-4.5",
4281 Self::Glm45Air => "GLM-4.5-Air",
4282 Self::Glm45Flash => "GLM-4.5-Flash",
4283 Self::Glm45v => "GLM-4.5V",
4284 Self::Glm46 => "GLM-4.6",
4285 Self::Glm46v => "GLM-4.6V",
4286 Self::Glm47 => "GLM-4.7",
4287 Self::Glm47Flash => "GLM-4.7-Flash",
4288 Self::Glm47Flashx => "GLM-4.7-FlashX",
4289 Self::Glm5 => "GLM-5",
4290 Self::Glm5Turbo => "GLM-5-Turbo",
4291 Self::Glm51 => "GLM-5.1",
4292 Self::Glm5vTurbo => "GLM-5V-Turbo",
4293 }
4294 }
4295 #[allow(clippy::too_many_lines)]
4296 fn context_window(self) -> u32 {
4297 match self {
4298 Self::Glm45v => 64_000,
4299 Self::Glm46v => 128_000,
4300 Self::Glm45 | Self::Glm45Air | Self::Glm45Flash => 131_072,
4301 Self::Glm47Flash
4302 | Self::Glm47Flashx
4303 | Self::Glm5Turbo
4304 | Self::Glm51
4305 | Self::Glm5vTurbo => 200_000,
4306 Self::Glm46 | Self::Glm47 | Self::Glm5 => 204_800,
4307 }
4308 }
4309 #[allow(clippy::too_many_lines)]
4310 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
4311 match self {
4312 Self::Glm45
4313 | Self::Glm45Air
4314 | Self::Glm45Flash
4315 | Self::Glm45v
4316 | Self::Glm46
4317 | Self::Glm46v
4318 | Self::Glm47
4319 | Self::Glm47Flash
4320 | Self::Glm47Flashx
4321 | Self::Glm5
4322 | Self::Glm5Turbo
4323 | Self::Glm51
4324 | Self::Glm5vTurbo => {
4325 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
4326 }
4327 }
4328 }
4329 pub fn supports_reasoning(self) -> bool {
4330 !self.reasoning_levels().is_empty()
4331 }
4332 #[allow(clippy::too_many_lines)]
4333 pub fn supports_prompt_caching(self) -> bool {
4334 match self {
4335 Self::Glm45v | Self::Glm46v => false,
4336 Self::Glm45
4337 | Self::Glm45Air
4338 | Self::Glm45Flash
4339 | Self::Glm46
4340 | Self::Glm47
4341 | Self::Glm47Flash
4342 | Self::Glm47Flashx
4343 | Self::Glm5
4344 | Self::Glm5Turbo
4345 | Self::Glm51
4346 | Self::Glm5vTurbo => true,
4347 }
4348 }
4349 #[allow(clippy::too_many_lines)]
4350 pub fn supports_image(self) -> bool {
4351 match self {
4352 Self::Glm45
4353 | Self::Glm45Air
4354 | Self::Glm45Flash
4355 | Self::Glm46
4356 | Self::Glm47
4357 | Self::Glm47Flash
4358 | Self::Glm47Flashx
4359 | Self::Glm5
4360 | Self::Glm5Turbo
4361 | Self::Glm51 => false,
4362 Self::Glm45v | Self::Glm46v | Self::Glm5vTurbo => true,
4363 }
4364 }
4365 #[allow(clippy::too_many_lines)]
4366 pub fn supports_audio(self) -> bool {
4367 match self {
4368 Self::Glm45
4369 | Self::Glm45Air
4370 | Self::Glm45Flash
4371 | Self::Glm45v
4372 | Self::Glm46
4373 | Self::Glm46v
4374 | Self::Glm47
4375 | Self::Glm47Flash
4376 | Self::Glm47Flashx
4377 | Self::Glm5
4378 | Self::Glm5Turbo
4379 | Self::Glm51
4380 | Self::Glm5vTurbo => false,
4381 }
4382 }
4383 const ALL: &[ZAiModel] = &[
4384 Self::Glm45,
4385 Self::Glm45Air,
4386 Self::Glm45Flash,
4387 Self::Glm45v,
4388 Self::Glm46,
4389 Self::Glm46v,
4390 Self::Glm47,
4391 Self::Glm47Flash,
4392 Self::Glm47Flashx,
4393 Self::Glm5,
4394 Self::Glm5Turbo,
4395 Self::Glm51,
4396 Self::Glm5vTurbo,
4397 ];
4398}
4399impl std::str::FromStr for ZAiModel {
4400 type Err = String;
4401 #[allow(clippy::too_many_lines)]
4402 fn from_str(s: &str) -> Result<Self, Self::Err> {
4403 match s {
4404 "glm-4.5" => Ok(Self::Glm45),
4405 "glm-4.5-air" => Ok(Self::Glm45Air),
4406 "glm-4.5-flash" => Ok(Self::Glm45Flash),
4407 "glm-4.5v" => Ok(Self::Glm45v),
4408 "glm-4.6" => Ok(Self::Glm46),
4409 "glm-4.6v" => Ok(Self::Glm46v),
4410 "glm-4.7" => Ok(Self::Glm47),
4411 "glm-4.7-flash" => Ok(Self::Glm47Flash),
4412 "glm-4.7-flashx" => Ok(Self::Glm47Flashx),
4413 "glm-5" => Ok(Self::Glm5),
4414 "glm-5-turbo" => Ok(Self::Glm5Turbo),
4415 "glm-5.1" => Ok(Self::Glm51),
4416 "glm-5v-turbo" => Ok(Self::Glm5vTurbo),
4417 _ => Err(format!("Unknown zai model: '{s}'")),
4418 }
4419 }
4420}
4421impl BedrockFoundationModel {
4422 #[allow(clippy::too_many_lines)]
4423 fn model_id(self) -> &'static str {
4424 match self {
4425 Self::AmazonNova2LiteV10 => "amazon.nova-2-lite-v1:0",
4426 Self::AmazonNovaLiteV10 => "amazon.nova-lite-v1:0",
4427 Self::AmazonNovaMicroV10 => "amazon.nova-micro-v1:0",
4428 Self::AmazonNovaProV10 => "amazon.nova-pro-v1:0",
4429 Self::AnthropicClaudeHaiku4520251001V10 => {
4430 "anthropic.claude-haiku-4-5-20251001-v1:0"
4431 }
4432 Self::AnthropicClaudeOpus4120250805V10 => {
4433 "anthropic.claude-opus-4-1-20250805-v1:0"
4434 }
4435 Self::AnthropicClaudeOpus4520251101V10 => {
4436 "anthropic.claude-opus-4-5-20251101-v1:0"
4437 }
4438 Self::AnthropicClaudeOpus46V1 => "anthropic.claude-opus-4-6-v1",
4439 Self::AnthropicClaudeOpus47 => "anthropic.claude-opus-4-7",
4440 Self::AnthropicClaudeSonnet4520250929V10 => {
4441 "anthropic.claude-sonnet-4-5-20250929-v1:0"
4442 }
4443 Self::AnthropicClaudeSonnet46 => "anthropic.claude-sonnet-4-6",
4444 Self::AuAnthropicClaudeHaiku4520251001V10 => {
4445 "au.anthropic.claude-haiku-4-5-20251001-v1:0"
4446 }
4447 Self::AuAnthropicClaudeOpus46V1 => "au.anthropic.claude-opus-4-6-v1",
4448 Self::AuAnthropicClaudeSonnet4520250929V10 => {
4449 "au.anthropic.claude-sonnet-4-5-20250929-v1:0"
4450 }
4451 Self::AuAnthropicClaudeSonnet46 => "au.anthropic.claude-sonnet-4-6",
4452 Self::DeepseekR1V10 => "deepseek.r1-v1:0",
4453 Self::DeepseekV3V10 => "deepseek.v3-v1:0",
4454 Self::DeepseekV32 => "deepseek.v3.2",
4455 Self::EuAnthropicClaudeHaiku4520251001V10 => {
4456 "eu.anthropic.claude-haiku-4-5-20251001-v1:0"
4457 }
4458 Self::EuAnthropicClaudeOpus4520251101V10 => {
4459 "eu.anthropic.claude-opus-4-5-20251101-v1:0"
4460 }
4461 Self::EuAnthropicClaudeOpus46V1 => "eu.anthropic.claude-opus-4-6-v1",
4462 Self::EuAnthropicClaudeOpus47 => "eu.anthropic.claude-opus-4-7",
4463 Self::EuAnthropicClaudeSonnet4520250929V10 => {
4464 "eu.anthropic.claude-sonnet-4-5-20250929-v1:0"
4465 }
4466 Self::EuAnthropicClaudeSonnet46 => "eu.anthropic.claude-sonnet-4-6",
4467 Self::GlobalAnthropicClaudeHaiku4520251001V10 => {
4468 "global.anthropic.claude-haiku-4-5-20251001-v1:0"
4469 }
4470 Self::GlobalAnthropicClaudeOpus4520251101V10 => {
4471 "global.anthropic.claude-opus-4-5-20251101-v1:0"
4472 }
4473 Self::GlobalAnthropicClaudeOpus46V1 => "global.anthropic.claude-opus-4-6-v1",
4474 Self::GlobalAnthropicClaudeOpus47 => "global.anthropic.claude-opus-4-7",
4475 Self::GlobalAnthropicClaudeSonnet4520250929V10 => {
4476 "global.anthropic.claude-sonnet-4-5-20250929-v1:0"
4477 }
4478 Self::GlobalAnthropicClaudeSonnet46 => "global.anthropic.claude-sonnet-4-6",
4479 Self::GoogleGemma327bIt => "google.gemma-3-27b-it",
4480 Self::GoogleGemma34bIt => "google.gemma-3-4b-it",
4481 Self::JpAnthropicClaudeOpus47 => "jp.anthropic.claude-opus-4-7",
4482 Self::JpAnthropicClaudeSonnet4520250929V10 => {
4483 "jp.anthropic.claude-sonnet-4-5-20250929-v1:0"
4484 }
4485 Self::JpAnthropicClaudeSonnet46 => "jp.anthropic.claude-sonnet-4-6",
4486 Self::MetaLlama3170bInstructV10 => "meta.llama3-1-70b-instruct-v1:0",
4487 Self::MetaLlama318bInstructV10 => "meta.llama3-1-8b-instruct-v1:0",
4488 Self::MetaLlama3370bInstructV10 => "meta.llama3-3-70b-instruct-v1:0",
4489 Self::MetaLlama4Maverick17bInstructV10 => {
4490 "meta.llama4-maverick-17b-instruct-v1:0"
4491 }
4492 Self::MetaLlama4Scout17bInstructV10 => "meta.llama4-scout-17b-instruct-v1:0",
4493 Self::MinimaxMinimaxM2 => "minimax.minimax-m2",
4494 Self::MinimaxMinimaxM21 => "minimax.minimax-m2.1",
4495 Self::MinimaxMinimaxM25 => "minimax.minimax-m2.5",
4496 Self::MistralDevstral2123b => "mistral.devstral-2-123b",
4497 Self::MistralMagistralSmall2509 => "mistral.magistral-small-2509",
4498 Self::MistralMinistral314bInstruct => "mistral.ministral-3-14b-instruct",
4499 Self::MistralMinistral33bInstruct => "mistral.ministral-3-3b-instruct",
4500 Self::MistralMinistral38bInstruct => "mistral.ministral-3-8b-instruct",
4501 Self::MistralMistralLarge3675bInstruct => {
4502 "mistral.mistral-large-3-675b-instruct"
4503 }
4504 Self::MistralPixtralLarge2502V10 => "mistral.pixtral-large-2502-v1:0",
4505 Self::MistralVoxtralMini3b2507 => "mistral.voxtral-mini-3b-2507",
4506 Self::MistralVoxtralSmall24b2507 => "mistral.voxtral-small-24b-2507",
4507 Self::MoonshotKimiK2Thinking => "moonshot.kimi-k2-thinking",
4508 Self::MoonshotaiKimiK25 => "moonshotai.kimi-k2.5",
4509 Self::NvidiaNemotronNano12bV2 => "nvidia.nemotron-nano-12b-v2",
4510 Self::NvidiaNemotronNano330b => "nvidia.nemotron-nano-3-30b",
4511 Self::NvidiaNemotronNano9bV2 => "nvidia.nemotron-nano-9b-v2",
4512 Self::NvidiaNemotronSuper3120b => "nvidia.nemotron-super-3-120b",
4513 Self::OpenaiGptOss120b10 => "openai.gpt-oss-120b-1:0",
4514 Self::OpenaiGptOss20b10 => "openai.gpt-oss-20b-1:0",
4515 Self::OpenaiGptOssSafeguard120b => "openai.gpt-oss-safeguard-120b",
4516 Self::OpenaiGptOssSafeguard20b => "openai.gpt-oss-safeguard-20b",
4517 Self::QwenQwen3235bA22b2507V10 => "qwen.qwen3-235b-a22b-2507-v1:0",
4518 Self::QwenQwen332bV10 => "qwen.qwen3-32b-v1:0",
4519 Self::QwenQwen3Coder30bA3bV10 => "qwen.qwen3-coder-30b-a3b-v1:0",
4520 Self::QwenQwen3Coder480bA35bV10 => "qwen.qwen3-coder-480b-a35b-v1:0",
4521 Self::QwenQwen3CoderNext => "qwen.qwen3-coder-next",
4522 Self::QwenQwen3Next80bA3b => "qwen.qwen3-next-80b-a3b",
4523 Self::QwenQwen3Vl235bA22b => "qwen.qwen3-vl-235b-a22b",
4524 Self::UsAnthropicClaudeHaiku4520251001V10 => {
4525 "us.anthropic.claude-haiku-4-5-20251001-v1:0"
4526 }
4527 Self::UsAnthropicClaudeOpus4120250805V10 => {
4528 "us.anthropic.claude-opus-4-1-20250805-v1:0"
4529 }
4530 Self::UsAnthropicClaudeOpus4520251101V10 => {
4531 "us.anthropic.claude-opus-4-5-20251101-v1:0"
4532 }
4533 Self::UsAnthropicClaudeOpus46V1 => "us.anthropic.claude-opus-4-6-v1",
4534 Self::UsAnthropicClaudeOpus47 => "us.anthropic.claude-opus-4-7",
4535 Self::UsAnthropicClaudeSonnet4520250929V10 => {
4536 "us.anthropic.claude-sonnet-4-5-20250929-v1:0"
4537 }
4538 Self::UsAnthropicClaudeSonnet46 => "us.anthropic.claude-sonnet-4-6",
4539 Self::UsDeepseekR1V10 => "us.deepseek.r1-v1:0",
4540 Self::UsMetaLlama4Maverick17bInstructV10 => {
4541 "us.meta.llama4-maverick-17b-instruct-v1:0"
4542 }
4543 Self::UsMetaLlama4Scout17bInstructV10 => {
4544 "us.meta.llama4-scout-17b-instruct-v1:0"
4545 }
4546 Self::WriterPalmyraX4V10 => "writer.palmyra-x4-v1:0",
4547 Self::WriterPalmyraX5V10 => "writer.palmyra-x5-v1:0",
4548 Self::ZaiGlm47 => "zai.glm-4.7",
4549 Self::ZaiGlm47Flash => "zai.glm-4.7-flash",
4550 Self::ZaiGlm5 => "zai.glm-5",
4551 }
4552 }
4553 #[allow(clippy::too_many_lines)]
4554 fn display_name(self) -> &'static str {
4555 match self {
4556 Self::AuAnthropicClaudeOpus46V1 => "AU Anthropic Claude Opus 4.6",
4557 Self::AuAnthropicClaudeSonnet46 => "AU Anthropic Claude Sonnet 4.6",
4558 Self::AnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5",
4559 Self::AuAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (AU)",
4560 Self::EuAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (EU)",
4561 Self::GlobalAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (Global)",
4562 Self::UsAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (US)",
4563 Self::AnthropicClaudeOpus4120250805V10 => "Claude Opus 4.1",
4564 Self::UsAnthropicClaudeOpus4120250805V10 => "Claude Opus 4.1 (US)",
4565 Self::AnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5",
4566 Self::EuAnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5 (EU)",
4567 Self::GlobalAnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5 (Global)",
4568 Self::UsAnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5 (US)",
4569 Self::AnthropicClaudeOpus46V1 => "Claude Opus 4.6",
4570 Self::EuAnthropicClaudeOpus46V1 => "Claude Opus 4.6 (EU)",
4571 Self::GlobalAnthropicClaudeOpus46V1 => "Claude Opus 4.6 (Global)",
4572 Self::UsAnthropicClaudeOpus46V1 => "Claude Opus 4.6 (US)",
4573 Self::AnthropicClaudeOpus47 => "Claude Opus 4.7",
4574 Self::EuAnthropicClaudeOpus47 => "Claude Opus 4.7 (EU)",
4575 Self::GlobalAnthropicClaudeOpus47 => "Claude Opus 4.7 (Global)",
4576 Self::JpAnthropicClaudeOpus47 => "Claude Opus 4.7 (JP)",
4577 Self::UsAnthropicClaudeOpus47 => "Claude Opus 4.7 (US)",
4578 Self::AnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5",
4579 Self::AuAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (AU)",
4580 Self::EuAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (EU)",
4581 Self::GlobalAnthropicClaudeSonnet4520250929V10 => {
4582 "Claude Sonnet 4.5 (Global)"
4583 }
4584 Self::JpAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (JP)",
4585 Self::UsAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (US)",
4586 Self::AnthropicClaudeSonnet46 => "Claude Sonnet 4.6",
4587 Self::EuAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (EU)",
4588 Self::GlobalAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (Global)",
4589 Self::JpAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (JP)",
4590 Self::UsAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (US)",
4591 Self::DeepseekR1V10 => "DeepSeek-R1",
4592 Self::UsDeepseekR1V10 => "DeepSeek-R1 (US)",
4593 Self::DeepseekV3V10 => "DeepSeek-V3.1",
4594 Self::DeepseekV32 => "DeepSeek-V3.2",
4595 Self::MistralDevstral2123b => "Devstral 2 123B",
4596 Self::ZaiGlm47 => "GLM-4.7",
4597 Self::ZaiGlm47Flash => "GLM-4.7-Flash",
4598 Self::ZaiGlm5 => "GLM-5",
4599 Self::OpenaiGptOssSafeguard120b => "GPT OSS Safeguard 120B",
4600 Self::OpenaiGptOssSafeguard20b => "GPT OSS Safeguard 20B",
4601 Self::GoogleGemma34bIt => "Gemma 3 4B IT",
4602 Self::GoogleGemma327bIt => "Google Gemma 3 27B Instruct",
4603 Self::MoonshotKimiK2Thinking => "Kimi K2 Thinking",
4604 Self::MoonshotaiKimiK25 => "Kimi K2.5",
4605 Self::MetaLlama3170bInstructV10 => "Llama 3.1 70B Instruct",
4606 Self::MetaLlama318bInstructV10 => "Llama 3.1 8B Instruct",
4607 Self::MetaLlama3370bInstructV10 => "Llama 3.3 70B Instruct",
4608 Self::MetaLlama4Maverick17bInstructV10 => "Llama 4 Maverick 17B Instruct",
4609 Self::UsMetaLlama4Maverick17bInstructV10 => {
4610 "Llama 4 Maverick 17B Instruct (US)"
4611 }
4612 Self::MetaLlama4Scout17bInstructV10 => "Llama 4 Scout 17B Instruct",
4613 Self::UsMetaLlama4Scout17bInstructV10 => "Llama 4 Scout 17B Instruct (US)",
4614 Self::MistralMagistralSmall2509 => "Magistral Small 1.2",
4615 Self::MinimaxMinimaxM2 => "MiniMax M2",
4616 Self::MinimaxMinimaxM21 => "MiniMax M2.1",
4617 Self::MinimaxMinimaxM25 => "MiniMax M2.5",
4618 Self::MistralMinistral314bInstruct => "Ministral 14B 3.0",
4619 Self::MistralMinistral33bInstruct => "Ministral 3 3B",
4620 Self::MistralMinistral38bInstruct => "Ministral 3 8B",
4621 Self::MistralMistralLarge3675bInstruct => "Mistral Large 3",
4622 Self::NvidiaNemotronSuper3120b => "NVIDIA Nemotron 3 Super 120B A12B",
4623 Self::NvidiaNemotronNano12bV2 => "NVIDIA Nemotron Nano 12B v2 VL BF16",
4624 Self::NvidiaNemotronNano330b => "NVIDIA Nemotron Nano 3 30B",
4625 Self::NvidiaNemotronNano9bV2 => "NVIDIA Nemotron Nano 9B v2",
4626 Self::AmazonNova2LiteV10 => "Nova 2 Lite",
4627 Self::AmazonNovaLiteV10 => "Nova Lite",
4628 Self::AmazonNovaMicroV10 => "Nova Micro",
4629 Self::AmazonNovaProV10 => "Nova Pro",
4630 Self::WriterPalmyraX4V10 => "Palmyra X4",
4631 Self::WriterPalmyraX5V10 => "Palmyra X5",
4632 Self::MistralPixtralLarge2502V10 => "Pixtral Large (25.02)",
4633 Self::QwenQwen3Next80bA3b => "Qwen/Qwen3-Next-80B-A3B-Instruct",
4634 Self::QwenQwen3Vl235bA22b => "Qwen/Qwen3-VL-235B-A22B-Instruct",
4635 Self::QwenQwen3235bA22b2507V10 => "Qwen3 235B A22B 2507",
4636 Self::QwenQwen332bV10 => "Qwen3 32B (dense)",
4637 Self::QwenQwen3Coder30bA3bV10 => "Qwen3 Coder 30B A3B Instruct",
4638 Self::QwenQwen3Coder480bA35bV10 => "Qwen3 Coder 480B A35B Instruct",
4639 Self::QwenQwen3CoderNext => "Qwen3 Coder Next",
4640 Self::MistralVoxtralMini3b2507 => "Voxtral Mini 3B 2507",
4641 Self::MistralVoxtralSmall24b2507 => "Voxtral Small 24B 2507",
4642 Self::OpenaiGptOss120b10 => "gpt-oss-120b",
4643 Self::OpenaiGptOss20b10 => "gpt-oss-20b",
4644 }
4645 }
4646 #[allow(clippy::too_many_lines)]
4647 fn context_window(self) -> u32 {
4648 match self {
4649 Self::QwenQwen332bV10 => 16_384,
4650 Self::MistralVoxtralSmall24b2507 => 32_000,
4651 Self::WriterPalmyraX4V10 => 122_880,
4652 Self::AmazonNova2LiteV10
4653 | Self::AmazonNovaMicroV10
4654 | Self::DeepseekR1V10
4655 | Self::GoogleGemma34bIt
4656 | Self::MetaLlama3170bInstructV10
4657 | Self::MetaLlama318bInstructV10
4658 | Self::MetaLlama3370bInstructV10
4659 | Self::MistralMagistralSmall2509
4660 | Self::MistralMinistral314bInstruct
4661 | Self::MistralMinistral38bInstruct
4662 | Self::MistralPixtralLarge2502V10
4663 | Self::MistralVoxtralMini3b2507
4664 | Self::NvidiaNemotronNano12bV2
4665 | Self::NvidiaNemotronNano330b
4666 | Self::NvidiaNemotronNano9bV2
4667 | Self::OpenaiGptOss120b10
4668 | Self::OpenaiGptOss20b10
4669 | Self::OpenaiGptOssSafeguard120b
4670 | Self::OpenaiGptOssSafeguard20b
4671 | Self::UsDeepseekR1V10 => 128_000,
4672 Self::QwenQwen3Coder480bA35bV10 | Self::QwenQwen3CoderNext => 131_072,
4673 Self::DeepseekV3V10 | Self::DeepseekV32 => 163_840,
4674 Self::MinimaxMinimaxM25 => 196_608,
4675 Self::AnthropicClaudeHaiku4520251001V10
4676 | Self::AnthropicClaudeOpus4120250805V10
4677 | Self::AnthropicClaudeOpus4520251101V10
4678 | Self::AnthropicClaudeSonnet4520250929V10
4679 | Self::AuAnthropicClaudeHaiku4520251001V10
4680 | Self::AuAnthropicClaudeSonnet4520250929V10
4681 | Self::EuAnthropicClaudeHaiku4520251001V10
4682 | Self::EuAnthropicClaudeOpus4520251101V10
4683 | Self::EuAnthropicClaudeSonnet4520250929V10
4684 | Self::GlobalAnthropicClaudeHaiku4520251001V10
4685 | Self::GlobalAnthropicClaudeOpus4520251101V10
4686 | Self::GlobalAnthropicClaudeSonnet4520250929V10
4687 | Self::JpAnthropicClaudeSonnet4520250929V10
4688 | Self::UsAnthropicClaudeHaiku4520251001V10
4689 | Self::UsAnthropicClaudeOpus4120250805V10
4690 | Self::UsAnthropicClaudeOpus4520251101V10
4691 | Self::UsAnthropicClaudeSonnet4520250929V10
4692 | Self::ZaiGlm47Flash => 200_000,
4693 Self::GoogleGemma327bIt | Self::ZaiGlm5 => 202_752,
4694 Self::MinimaxMinimaxM2 => 204_608,
4695 Self::MinimaxMinimaxM21 | Self::ZaiGlm47 => 204_800,
4696 Self::MistralDevstral2123b
4697 | Self::MistralMinistral33bInstruct
4698 | Self::MistralMistralLarge3675bInstruct => 256_000,
4699 Self::QwenQwen3Next80bA3b | Self::QwenQwen3Vl235bA22b => 262_000,
4700 Self::MoonshotKimiK2Thinking | Self::MoonshotaiKimiK25 => 262_143,
4701 Self::NvidiaNemotronSuper3120b
4702 | Self::QwenQwen3235bA22b2507V10
4703 | Self::QwenQwen3Coder30bA3bV10 => 262_144,
4704 Self::AmazonNovaLiteV10 | Self::AmazonNovaProV10 => 300_000,
4705 Self::AnthropicClaudeOpus46V1
4706 | Self::AnthropicClaudeOpus47
4707 | Self::AnthropicClaudeSonnet46
4708 | Self::AuAnthropicClaudeOpus46V1
4709 | Self::AuAnthropicClaudeSonnet46
4710 | Self::EuAnthropicClaudeOpus46V1
4711 | Self::EuAnthropicClaudeOpus47
4712 | Self::EuAnthropicClaudeSonnet46
4713 | Self::GlobalAnthropicClaudeOpus46V1
4714 | Self::GlobalAnthropicClaudeOpus47
4715 | Self::GlobalAnthropicClaudeSonnet46
4716 | Self::JpAnthropicClaudeOpus47
4717 | Self::JpAnthropicClaudeSonnet46
4718 | Self::MetaLlama4Maverick17bInstructV10
4719 | Self::UsAnthropicClaudeOpus46V1
4720 | Self::UsAnthropicClaudeOpus47
4721 | Self::UsAnthropicClaudeSonnet46
4722 | Self::UsMetaLlama4Maverick17bInstructV10 => 1_000_000,
4723 Self::WriterPalmyraX5V10 => 1_040_000,
4724 Self::MetaLlama4Scout17bInstructV10
4725 | Self::UsMetaLlama4Scout17bInstructV10 => 3_500_000,
4726 }
4727 }
4728 #[allow(clippy::too_many_lines)]
4729 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
4730 match self {
4731 Self::AmazonNova2LiteV10
4732 | Self::AmazonNovaLiteV10
4733 | Self::AmazonNovaMicroV10
4734 | Self::AmazonNovaProV10
4735 | Self::GoogleGemma327bIt
4736 | Self::GoogleGemma34bIt
4737 | Self::MetaLlama3170bInstructV10
4738 | Self::MetaLlama318bInstructV10
4739 | Self::MetaLlama3370bInstructV10
4740 | Self::MetaLlama4Maverick17bInstructV10
4741 | Self::MetaLlama4Scout17bInstructV10
4742 | Self::MistralDevstral2123b
4743 | Self::MistralMinistral314bInstruct
4744 | Self::MistralMinistral33bInstruct
4745 | Self::MistralMinistral38bInstruct
4746 | Self::MistralMistralLarge3675bInstruct
4747 | Self::MistralPixtralLarge2502V10
4748 | Self::MistralVoxtralMini3b2507
4749 | Self::MistralVoxtralSmall24b2507
4750 | Self::NvidiaNemotronNano12bV2
4751 | Self::NvidiaNemotronNano9bV2
4752 | Self::OpenaiGptOss120b10
4753 | Self::OpenaiGptOss20b10
4754 | Self::OpenaiGptOssSafeguard120b
4755 | Self::OpenaiGptOssSafeguard20b
4756 | Self::QwenQwen3235bA22b2507V10
4757 | Self::QwenQwen3Coder30bA3bV10
4758 | Self::QwenQwen3Coder480bA35bV10
4759 | Self::QwenQwen3Next80bA3b
4760 | Self::QwenQwen3Vl235bA22b
4761 | Self::UsMetaLlama4Maverick17bInstructV10
4762 | Self::UsMetaLlama4Scout17bInstructV10 => &[],
4763 Self::AnthropicClaudeHaiku4520251001V10
4764 | Self::AnthropicClaudeOpus4120250805V10
4765 | Self::AnthropicClaudeOpus4520251101V10
4766 | Self::AnthropicClaudeOpus46V1
4767 | Self::AnthropicClaudeOpus47
4768 | Self::AnthropicClaudeSonnet4520250929V10
4769 | Self::AnthropicClaudeSonnet46
4770 | Self::AuAnthropicClaudeHaiku4520251001V10
4771 | Self::AuAnthropicClaudeOpus46V1
4772 | Self::AuAnthropicClaudeSonnet4520250929V10
4773 | Self::AuAnthropicClaudeSonnet46
4774 | Self::DeepseekR1V10
4775 | Self::DeepseekV3V10
4776 | Self::DeepseekV32
4777 | Self::EuAnthropicClaudeHaiku4520251001V10
4778 | Self::EuAnthropicClaudeOpus4520251101V10
4779 | Self::EuAnthropicClaudeOpus46V1
4780 | Self::EuAnthropicClaudeOpus47
4781 | Self::EuAnthropicClaudeSonnet4520250929V10
4782 | Self::EuAnthropicClaudeSonnet46
4783 | Self::GlobalAnthropicClaudeHaiku4520251001V10
4784 | Self::GlobalAnthropicClaudeOpus4520251101V10
4785 | Self::GlobalAnthropicClaudeOpus46V1
4786 | Self::GlobalAnthropicClaudeOpus47
4787 | Self::GlobalAnthropicClaudeSonnet4520250929V10
4788 | Self::GlobalAnthropicClaudeSonnet46
4789 | Self::JpAnthropicClaudeOpus47
4790 | Self::JpAnthropicClaudeSonnet4520250929V10
4791 | Self::JpAnthropicClaudeSonnet46
4792 | Self::MinimaxMinimaxM2
4793 | Self::MinimaxMinimaxM21
4794 | Self::MinimaxMinimaxM25
4795 | Self::MistralMagistralSmall2509
4796 | Self::MoonshotKimiK2Thinking
4797 | Self::MoonshotaiKimiK25
4798 | Self::NvidiaNemotronNano330b
4799 | Self::NvidiaNemotronSuper3120b
4800 | Self::QwenQwen332bV10
4801 | Self::QwenQwen3CoderNext
4802 | Self::UsAnthropicClaudeHaiku4520251001V10
4803 | Self::UsAnthropicClaudeOpus4120250805V10
4804 | Self::UsAnthropicClaudeOpus4520251101V10
4805 | Self::UsAnthropicClaudeOpus46V1
4806 | Self::UsAnthropicClaudeOpus47
4807 | Self::UsAnthropicClaudeSonnet4520250929V10
4808 | Self::UsAnthropicClaudeSonnet46
4809 | Self::UsDeepseekR1V10
4810 | Self::WriterPalmyraX4V10
4811 | Self::WriterPalmyraX5V10
4812 | Self::ZaiGlm47
4813 | Self::ZaiGlm47Flash
4814 | Self::ZaiGlm5 => {
4815 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
4816 }
4817 }
4818 }
4819 pub fn supports_reasoning(self) -> bool {
4820 !self.reasoning_levels().is_empty()
4821 }
4822 #[allow(clippy::too_many_lines)]
4823 pub fn supports_prompt_caching(self) -> bool {
4824 match self {
4825 Self::AmazonNova2LiteV10
4826 | Self::DeepseekR1V10
4827 | Self::DeepseekV3V10
4828 | Self::DeepseekV32
4829 | Self::GoogleGemma327bIt
4830 | Self::GoogleGemma34bIt
4831 | Self::MetaLlama3170bInstructV10
4832 | Self::MetaLlama318bInstructV10
4833 | Self::MetaLlama3370bInstructV10
4834 | Self::MetaLlama4Maverick17bInstructV10
4835 | Self::MetaLlama4Scout17bInstructV10
4836 | Self::MinimaxMinimaxM2
4837 | Self::MinimaxMinimaxM21
4838 | Self::MinimaxMinimaxM25
4839 | Self::MistralDevstral2123b
4840 | Self::MistralMagistralSmall2509
4841 | Self::MistralMinistral314bInstruct
4842 | Self::MistralMinistral33bInstruct
4843 | Self::MistralMinistral38bInstruct
4844 | Self::MistralMistralLarge3675bInstruct
4845 | Self::MistralPixtralLarge2502V10
4846 | Self::MistralVoxtralMini3b2507
4847 | Self::MistralVoxtralSmall24b2507
4848 | Self::MoonshotKimiK2Thinking
4849 | Self::MoonshotaiKimiK25
4850 | Self::NvidiaNemotronNano12bV2
4851 | Self::NvidiaNemotronNano330b
4852 | Self::NvidiaNemotronNano9bV2
4853 | Self::NvidiaNemotronSuper3120b
4854 | Self::OpenaiGptOss120b10
4855 | Self::OpenaiGptOss20b10
4856 | Self::OpenaiGptOssSafeguard120b
4857 | Self::OpenaiGptOssSafeguard20b
4858 | Self::QwenQwen3235bA22b2507V10
4859 | Self::QwenQwen332bV10
4860 | Self::QwenQwen3Coder30bA3bV10
4861 | Self::QwenQwen3Coder480bA35bV10
4862 | Self::QwenQwen3CoderNext
4863 | Self::QwenQwen3Next80bA3b
4864 | Self::QwenQwen3Vl235bA22b
4865 | Self::UsDeepseekR1V10
4866 | Self::UsMetaLlama4Maverick17bInstructV10
4867 | Self::UsMetaLlama4Scout17bInstructV10
4868 | Self::WriterPalmyraX4V10
4869 | Self::WriterPalmyraX5V10
4870 | Self::ZaiGlm47
4871 | Self::ZaiGlm47Flash
4872 | Self::ZaiGlm5 => false,
4873 Self::AmazonNovaLiteV10
4874 | Self::AmazonNovaMicroV10
4875 | Self::AmazonNovaProV10
4876 | Self::AnthropicClaudeHaiku4520251001V10
4877 | Self::AnthropicClaudeOpus4120250805V10
4878 | Self::AnthropicClaudeOpus4520251101V10
4879 | Self::AnthropicClaudeOpus46V1
4880 | Self::AnthropicClaudeOpus47
4881 | Self::AnthropicClaudeSonnet4520250929V10
4882 | Self::AnthropicClaudeSonnet46
4883 | Self::AuAnthropicClaudeHaiku4520251001V10
4884 | Self::AuAnthropicClaudeOpus46V1
4885 | Self::AuAnthropicClaudeSonnet4520250929V10
4886 | Self::AuAnthropicClaudeSonnet46
4887 | Self::EuAnthropicClaudeHaiku4520251001V10
4888 | Self::EuAnthropicClaudeOpus4520251101V10
4889 | Self::EuAnthropicClaudeOpus46V1
4890 | Self::EuAnthropicClaudeOpus47
4891 | Self::EuAnthropicClaudeSonnet4520250929V10
4892 | Self::EuAnthropicClaudeSonnet46
4893 | Self::GlobalAnthropicClaudeHaiku4520251001V10
4894 | Self::GlobalAnthropicClaudeOpus4520251101V10
4895 | Self::GlobalAnthropicClaudeOpus46V1
4896 | Self::GlobalAnthropicClaudeOpus47
4897 | Self::GlobalAnthropicClaudeSonnet4520250929V10
4898 | Self::GlobalAnthropicClaudeSonnet46
4899 | Self::JpAnthropicClaudeOpus47
4900 | Self::JpAnthropicClaudeSonnet4520250929V10
4901 | Self::JpAnthropicClaudeSonnet46
4902 | Self::UsAnthropicClaudeHaiku4520251001V10
4903 | Self::UsAnthropicClaudeOpus4120250805V10
4904 | Self::UsAnthropicClaudeOpus4520251101V10
4905 | Self::UsAnthropicClaudeOpus46V1
4906 | Self::UsAnthropicClaudeOpus47
4907 | Self::UsAnthropicClaudeSonnet4520250929V10
4908 | Self::UsAnthropicClaudeSonnet46 => true,
4909 }
4910 }
4911 #[allow(clippy::too_many_lines)]
4912 pub fn supports_image(self) -> bool {
4913 match self {
4914 Self::AmazonNovaMicroV10
4915 | Self::DeepseekR1V10
4916 | Self::DeepseekV3V10
4917 | Self::DeepseekV32
4918 | Self::MetaLlama3170bInstructV10
4919 | Self::MetaLlama318bInstructV10
4920 | Self::MetaLlama3370bInstructV10
4921 | Self::MinimaxMinimaxM2
4922 | Self::MinimaxMinimaxM21
4923 | Self::MinimaxMinimaxM25
4924 | Self::MistralDevstral2123b
4925 | Self::MistralMinistral314bInstruct
4926 | Self::MistralMinistral38bInstruct
4927 | Self::MistralVoxtralMini3b2507
4928 | Self::MistralVoxtralSmall24b2507
4929 | Self::MoonshotKimiK2Thinking
4930 | Self::NvidiaNemotronNano330b
4931 | Self::NvidiaNemotronNano9bV2
4932 | Self::NvidiaNemotronSuper3120b
4933 | Self::OpenaiGptOss120b10
4934 | Self::OpenaiGptOss20b10
4935 | Self::OpenaiGptOssSafeguard120b
4936 | Self::OpenaiGptOssSafeguard20b
4937 | Self::QwenQwen3235bA22b2507V10
4938 | Self::QwenQwen332bV10
4939 | Self::QwenQwen3Coder30bA3bV10
4940 | Self::QwenQwen3Coder480bA35bV10
4941 | Self::QwenQwen3CoderNext
4942 | Self::QwenQwen3Next80bA3b
4943 | Self::UsDeepseekR1V10
4944 | Self::WriterPalmyraX4V10
4945 | Self::WriterPalmyraX5V10
4946 | Self::ZaiGlm47
4947 | Self::ZaiGlm47Flash
4948 | Self::ZaiGlm5 => false,
4949 Self::AmazonNova2LiteV10
4950 | Self::AmazonNovaLiteV10
4951 | Self::AmazonNovaProV10
4952 | Self::AnthropicClaudeHaiku4520251001V10
4953 | Self::AnthropicClaudeOpus4120250805V10
4954 | Self::AnthropicClaudeOpus4520251101V10
4955 | Self::AnthropicClaudeOpus46V1
4956 | Self::AnthropicClaudeOpus47
4957 | Self::AnthropicClaudeSonnet4520250929V10
4958 | Self::AnthropicClaudeSonnet46
4959 | Self::AuAnthropicClaudeHaiku4520251001V10
4960 | Self::AuAnthropicClaudeOpus46V1
4961 | Self::AuAnthropicClaudeSonnet4520250929V10
4962 | Self::AuAnthropicClaudeSonnet46
4963 | Self::EuAnthropicClaudeHaiku4520251001V10
4964 | Self::EuAnthropicClaudeOpus4520251101V10
4965 | Self::EuAnthropicClaudeOpus46V1
4966 | Self::EuAnthropicClaudeOpus47
4967 | Self::EuAnthropicClaudeSonnet4520250929V10
4968 | Self::EuAnthropicClaudeSonnet46
4969 | Self::GlobalAnthropicClaudeHaiku4520251001V10
4970 | Self::GlobalAnthropicClaudeOpus4520251101V10
4971 | Self::GlobalAnthropicClaudeOpus46V1
4972 | Self::GlobalAnthropicClaudeOpus47
4973 | Self::GlobalAnthropicClaudeSonnet4520250929V10
4974 | Self::GlobalAnthropicClaudeSonnet46
4975 | Self::GoogleGemma327bIt
4976 | Self::GoogleGemma34bIt
4977 | Self::JpAnthropicClaudeOpus47
4978 | Self::JpAnthropicClaudeSonnet4520250929V10
4979 | Self::JpAnthropicClaudeSonnet46
4980 | Self::MetaLlama4Maverick17bInstructV10
4981 | Self::MetaLlama4Scout17bInstructV10
4982 | Self::MistralMagistralSmall2509
4983 | Self::MistralMinistral33bInstruct
4984 | Self::MistralMistralLarge3675bInstruct
4985 | Self::MistralPixtralLarge2502V10
4986 | Self::MoonshotaiKimiK25
4987 | Self::NvidiaNemotronNano12bV2
4988 | Self::QwenQwen3Vl235bA22b
4989 | Self::UsAnthropicClaudeHaiku4520251001V10
4990 | Self::UsAnthropicClaudeOpus4120250805V10
4991 | Self::UsAnthropicClaudeOpus4520251101V10
4992 | Self::UsAnthropicClaudeOpus46V1
4993 | Self::UsAnthropicClaudeOpus47
4994 | Self::UsAnthropicClaudeSonnet4520250929V10
4995 | Self::UsAnthropicClaudeSonnet46
4996 | Self::UsMetaLlama4Maverick17bInstructV10
4997 | Self::UsMetaLlama4Scout17bInstructV10 => true,
4998 }
4999 }
5000 #[allow(clippy::too_many_lines)]
5001 pub fn supports_audio(self) -> bool {
5002 match self {
5003 Self::AmazonNova2LiteV10
5004 | Self::AmazonNovaLiteV10
5005 | Self::AmazonNovaMicroV10
5006 | Self::AmazonNovaProV10
5007 | Self::AnthropicClaudeHaiku4520251001V10
5008 | Self::AnthropicClaudeOpus4120250805V10
5009 | Self::AnthropicClaudeOpus4520251101V10
5010 | Self::AnthropicClaudeOpus46V1
5011 | Self::AnthropicClaudeOpus47
5012 | Self::AnthropicClaudeSonnet4520250929V10
5013 | Self::AnthropicClaudeSonnet46
5014 | Self::AuAnthropicClaudeHaiku4520251001V10
5015 | Self::AuAnthropicClaudeOpus46V1
5016 | Self::AuAnthropicClaudeSonnet4520250929V10
5017 | Self::AuAnthropicClaudeSonnet46
5018 | Self::DeepseekR1V10
5019 | Self::DeepseekV3V10
5020 | Self::DeepseekV32
5021 | Self::EuAnthropicClaudeHaiku4520251001V10
5022 | Self::EuAnthropicClaudeOpus4520251101V10
5023 | Self::EuAnthropicClaudeOpus46V1
5024 | Self::EuAnthropicClaudeOpus47
5025 | Self::EuAnthropicClaudeSonnet4520250929V10
5026 | Self::EuAnthropicClaudeSonnet46
5027 | Self::GlobalAnthropicClaudeHaiku4520251001V10
5028 | Self::GlobalAnthropicClaudeOpus4520251101V10
5029 | Self::GlobalAnthropicClaudeOpus46V1
5030 | Self::GlobalAnthropicClaudeOpus47
5031 | Self::GlobalAnthropicClaudeSonnet4520250929V10
5032 | Self::GlobalAnthropicClaudeSonnet46
5033 | Self::GoogleGemma327bIt
5034 | Self::GoogleGemma34bIt
5035 | Self::JpAnthropicClaudeOpus47
5036 | Self::JpAnthropicClaudeSonnet4520250929V10
5037 | Self::JpAnthropicClaudeSonnet46
5038 | Self::MetaLlama3170bInstructV10
5039 | Self::MetaLlama318bInstructV10
5040 | Self::MetaLlama3370bInstructV10
5041 | Self::MetaLlama4Maverick17bInstructV10
5042 | Self::MetaLlama4Scout17bInstructV10
5043 | Self::MinimaxMinimaxM2
5044 | Self::MinimaxMinimaxM21
5045 | Self::MinimaxMinimaxM25
5046 | Self::MistralDevstral2123b
5047 | Self::MistralMagistralSmall2509
5048 | Self::MistralMinistral314bInstruct
5049 | Self::MistralMinistral33bInstruct
5050 | Self::MistralMinistral38bInstruct
5051 | Self::MistralMistralLarge3675bInstruct
5052 | Self::MistralPixtralLarge2502V10
5053 | Self::MoonshotKimiK2Thinking
5054 | Self::MoonshotaiKimiK25
5055 | Self::NvidiaNemotronNano12bV2
5056 | Self::NvidiaNemotronNano330b
5057 | Self::NvidiaNemotronNano9bV2
5058 | Self::NvidiaNemotronSuper3120b
5059 | Self::OpenaiGptOss120b10
5060 | Self::OpenaiGptOss20b10
5061 | Self::OpenaiGptOssSafeguard120b
5062 | Self::OpenaiGptOssSafeguard20b
5063 | Self::QwenQwen3235bA22b2507V10
5064 | Self::QwenQwen332bV10
5065 | Self::QwenQwen3Coder30bA3bV10
5066 | Self::QwenQwen3Coder480bA35bV10
5067 | Self::QwenQwen3CoderNext
5068 | Self::QwenQwen3Next80bA3b
5069 | Self::QwenQwen3Vl235bA22b
5070 | Self::UsAnthropicClaudeHaiku4520251001V10
5071 | Self::UsAnthropicClaudeOpus4120250805V10
5072 | Self::UsAnthropicClaudeOpus4520251101V10
5073 | Self::UsAnthropicClaudeOpus46V1
5074 | Self::UsAnthropicClaudeOpus47
5075 | Self::UsAnthropicClaudeSonnet4520250929V10
5076 | Self::UsAnthropicClaudeSonnet46
5077 | Self::UsDeepseekR1V10
5078 | Self::UsMetaLlama4Maverick17bInstructV10
5079 | Self::UsMetaLlama4Scout17bInstructV10
5080 | Self::WriterPalmyraX4V10
5081 | Self::WriterPalmyraX5V10
5082 | Self::ZaiGlm47
5083 | Self::ZaiGlm47Flash
5084 | Self::ZaiGlm5 => false,
5085 Self::MistralVoxtralMini3b2507 | Self::MistralVoxtralSmall24b2507 => true,
5086 }
5087 }
5088 const ALL: &[BedrockFoundationModel] = &[
5089 Self::AmazonNova2LiteV10,
5090 Self::AmazonNovaLiteV10,
5091 Self::AmazonNovaMicroV10,
5092 Self::AmazonNovaProV10,
5093 Self::AnthropicClaudeHaiku4520251001V10,
5094 Self::AnthropicClaudeOpus4120250805V10,
5095 Self::AnthropicClaudeOpus4520251101V10,
5096 Self::AnthropicClaudeOpus46V1,
5097 Self::AnthropicClaudeOpus47,
5098 Self::AnthropicClaudeSonnet4520250929V10,
5099 Self::AnthropicClaudeSonnet46,
5100 Self::AuAnthropicClaudeHaiku4520251001V10,
5101 Self::AuAnthropicClaudeOpus46V1,
5102 Self::AuAnthropicClaudeSonnet4520250929V10,
5103 Self::AuAnthropicClaudeSonnet46,
5104 Self::DeepseekR1V10,
5105 Self::DeepseekV3V10,
5106 Self::DeepseekV32,
5107 Self::EuAnthropicClaudeHaiku4520251001V10,
5108 Self::EuAnthropicClaudeOpus4520251101V10,
5109 Self::EuAnthropicClaudeOpus46V1,
5110 Self::EuAnthropicClaudeOpus47,
5111 Self::EuAnthropicClaudeSonnet4520250929V10,
5112 Self::EuAnthropicClaudeSonnet46,
5113 Self::GlobalAnthropicClaudeHaiku4520251001V10,
5114 Self::GlobalAnthropicClaudeOpus4520251101V10,
5115 Self::GlobalAnthropicClaudeOpus46V1,
5116 Self::GlobalAnthropicClaudeOpus47,
5117 Self::GlobalAnthropicClaudeSonnet4520250929V10,
5118 Self::GlobalAnthropicClaudeSonnet46,
5119 Self::GoogleGemma327bIt,
5120 Self::GoogleGemma34bIt,
5121 Self::JpAnthropicClaudeOpus47,
5122 Self::JpAnthropicClaudeSonnet4520250929V10,
5123 Self::JpAnthropicClaudeSonnet46,
5124 Self::MetaLlama3170bInstructV10,
5125 Self::MetaLlama318bInstructV10,
5126 Self::MetaLlama3370bInstructV10,
5127 Self::MetaLlama4Maverick17bInstructV10,
5128 Self::MetaLlama4Scout17bInstructV10,
5129 Self::MinimaxMinimaxM2,
5130 Self::MinimaxMinimaxM21,
5131 Self::MinimaxMinimaxM25,
5132 Self::MistralDevstral2123b,
5133 Self::MistralMagistralSmall2509,
5134 Self::MistralMinistral314bInstruct,
5135 Self::MistralMinistral33bInstruct,
5136 Self::MistralMinistral38bInstruct,
5137 Self::MistralMistralLarge3675bInstruct,
5138 Self::MistralPixtralLarge2502V10,
5139 Self::MistralVoxtralMini3b2507,
5140 Self::MistralVoxtralSmall24b2507,
5141 Self::MoonshotKimiK2Thinking,
5142 Self::MoonshotaiKimiK25,
5143 Self::NvidiaNemotronNano12bV2,
5144 Self::NvidiaNemotronNano330b,
5145 Self::NvidiaNemotronNano9bV2,
5146 Self::NvidiaNemotronSuper3120b,
5147 Self::OpenaiGptOss120b10,
5148 Self::OpenaiGptOss20b10,
5149 Self::OpenaiGptOssSafeguard120b,
5150 Self::OpenaiGptOssSafeguard20b,
5151 Self::QwenQwen3235bA22b2507V10,
5152 Self::QwenQwen332bV10,
5153 Self::QwenQwen3Coder30bA3bV10,
5154 Self::QwenQwen3Coder480bA35bV10,
5155 Self::QwenQwen3CoderNext,
5156 Self::QwenQwen3Next80bA3b,
5157 Self::QwenQwen3Vl235bA22b,
5158 Self::UsAnthropicClaudeHaiku4520251001V10,
5159 Self::UsAnthropicClaudeOpus4120250805V10,
5160 Self::UsAnthropicClaudeOpus4520251101V10,
5161 Self::UsAnthropicClaudeOpus46V1,
5162 Self::UsAnthropicClaudeOpus47,
5163 Self::UsAnthropicClaudeSonnet4520250929V10,
5164 Self::UsAnthropicClaudeSonnet46,
5165 Self::UsDeepseekR1V10,
5166 Self::UsMetaLlama4Maverick17bInstructV10,
5167 Self::UsMetaLlama4Scout17bInstructV10,
5168 Self::WriterPalmyraX4V10,
5169 Self::WriterPalmyraX5V10,
5170 Self::ZaiGlm47,
5171 Self::ZaiGlm47Flash,
5172 Self::ZaiGlm5,
5173 ];
5174}
5175impl std::str::FromStr for BedrockFoundationModel {
5176 type Err = String;
5177 #[allow(clippy::too_many_lines)]
5178 fn from_str(s: &str) -> Result<Self, Self::Err> {
5179 match s {
5180 "amazon.nova-2-lite-v1:0" => Ok(Self::AmazonNova2LiteV10),
5181 "amazon.nova-lite-v1:0" => Ok(Self::AmazonNovaLiteV10),
5182 "amazon.nova-micro-v1:0" => Ok(Self::AmazonNovaMicroV10),
5183 "amazon.nova-pro-v1:0" => Ok(Self::AmazonNovaProV10),
5184 "anthropic.claude-haiku-4-5-20251001-v1:0" => {
5185 Ok(Self::AnthropicClaudeHaiku4520251001V10)
5186 }
5187 "anthropic.claude-opus-4-1-20250805-v1:0" => {
5188 Ok(Self::AnthropicClaudeOpus4120250805V10)
5189 }
5190 "anthropic.claude-opus-4-5-20251101-v1:0" => {
5191 Ok(Self::AnthropicClaudeOpus4520251101V10)
5192 }
5193 "anthropic.claude-opus-4-6-v1" => Ok(Self::AnthropicClaudeOpus46V1),
5194 "anthropic.claude-opus-4-7" => Ok(Self::AnthropicClaudeOpus47),
5195 "anthropic.claude-sonnet-4-5-20250929-v1:0" => {
5196 Ok(Self::AnthropicClaudeSonnet4520250929V10)
5197 }
5198 "anthropic.claude-sonnet-4-6" => Ok(Self::AnthropicClaudeSonnet46),
5199 "au.anthropic.claude-haiku-4-5-20251001-v1:0" => {
5200 Ok(Self::AuAnthropicClaudeHaiku4520251001V10)
5201 }
5202 "au.anthropic.claude-opus-4-6-v1" => Ok(Self::AuAnthropicClaudeOpus46V1),
5203 "au.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
5204 Ok(Self::AuAnthropicClaudeSonnet4520250929V10)
5205 }
5206 "au.anthropic.claude-sonnet-4-6" => Ok(Self::AuAnthropicClaudeSonnet46),
5207 "deepseek.r1-v1:0" => Ok(Self::DeepseekR1V10),
5208 "deepseek.v3-v1:0" => Ok(Self::DeepseekV3V10),
5209 "deepseek.v3.2" => Ok(Self::DeepseekV32),
5210 "eu.anthropic.claude-haiku-4-5-20251001-v1:0" => {
5211 Ok(Self::EuAnthropicClaudeHaiku4520251001V10)
5212 }
5213 "eu.anthropic.claude-opus-4-5-20251101-v1:0" => {
5214 Ok(Self::EuAnthropicClaudeOpus4520251101V10)
5215 }
5216 "eu.anthropic.claude-opus-4-6-v1" => Ok(Self::EuAnthropicClaudeOpus46V1),
5217 "eu.anthropic.claude-opus-4-7" => Ok(Self::EuAnthropicClaudeOpus47),
5218 "eu.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
5219 Ok(Self::EuAnthropicClaudeSonnet4520250929V10)
5220 }
5221 "eu.anthropic.claude-sonnet-4-6" => Ok(Self::EuAnthropicClaudeSonnet46),
5222 "global.anthropic.claude-haiku-4-5-20251001-v1:0" => {
5223 Ok(Self::GlobalAnthropicClaudeHaiku4520251001V10)
5224 }
5225 "global.anthropic.claude-opus-4-5-20251101-v1:0" => {
5226 Ok(Self::GlobalAnthropicClaudeOpus4520251101V10)
5227 }
5228 "global.anthropic.claude-opus-4-6-v1" => {
5229 Ok(Self::GlobalAnthropicClaudeOpus46V1)
5230 }
5231 "global.anthropic.claude-opus-4-7" => Ok(Self::GlobalAnthropicClaudeOpus47),
5232 "global.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
5233 Ok(Self::GlobalAnthropicClaudeSonnet4520250929V10)
5234 }
5235 "global.anthropic.claude-sonnet-4-6" => {
5236 Ok(Self::GlobalAnthropicClaudeSonnet46)
5237 }
5238 "google.gemma-3-27b-it" => Ok(Self::GoogleGemma327bIt),
5239 "google.gemma-3-4b-it" => Ok(Self::GoogleGemma34bIt),
5240 "jp.anthropic.claude-opus-4-7" => Ok(Self::JpAnthropicClaudeOpus47),
5241 "jp.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
5242 Ok(Self::JpAnthropicClaudeSonnet4520250929V10)
5243 }
5244 "jp.anthropic.claude-sonnet-4-6" => Ok(Self::JpAnthropicClaudeSonnet46),
5245 "meta.llama3-1-70b-instruct-v1:0" => Ok(Self::MetaLlama3170bInstructV10),
5246 "meta.llama3-1-8b-instruct-v1:0" => Ok(Self::MetaLlama318bInstructV10),
5247 "meta.llama3-3-70b-instruct-v1:0" => Ok(Self::MetaLlama3370bInstructV10),
5248 "meta.llama4-maverick-17b-instruct-v1:0" => {
5249 Ok(Self::MetaLlama4Maverick17bInstructV10)
5250 }
5251 "meta.llama4-scout-17b-instruct-v1:0" => {
5252 Ok(Self::MetaLlama4Scout17bInstructV10)
5253 }
5254 "minimax.minimax-m2" => Ok(Self::MinimaxMinimaxM2),
5255 "minimax.minimax-m2.1" => Ok(Self::MinimaxMinimaxM21),
5256 "minimax.minimax-m2.5" => Ok(Self::MinimaxMinimaxM25),
5257 "mistral.devstral-2-123b" => Ok(Self::MistralDevstral2123b),
5258 "mistral.magistral-small-2509" => Ok(Self::MistralMagistralSmall2509),
5259 "mistral.ministral-3-14b-instruct" => Ok(Self::MistralMinistral314bInstruct),
5260 "mistral.ministral-3-3b-instruct" => Ok(Self::MistralMinistral33bInstruct),
5261 "mistral.ministral-3-8b-instruct" => Ok(Self::MistralMinistral38bInstruct),
5262 "mistral.mistral-large-3-675b-instruct" => {
5263 Ok(Self::MistralMistralLarge3675bInstruct)
5264 }
5265 "mistral.pixtral-large-2502-v1:0" => Ok(Self::MistralPixtralLarge2502V10),
5266 "mistral.voxtral-mini-3b-2507" => Ok(Self::MistralVoxtralMini3b2507),
5267 "mistral.voxtral-small-24b-2507" => Ok(Self::MistralVoxtralSmall24b2507),
5268 "moonshot.kimi-k2-thinking" => Ok(Self::MoonshotKimiK2Thinking),
5269 "moonshotai.kimi-k2.5" => Ok(Self::MoonshotaiKimiK25),
5270 "nvidia.nemotron-nano-12b-v2" => Ok(Self::NvidiaNemotronNano12bV2),
5271 "nvidia.nemotron-nano-3-30b" => Ok(Self::NvidiaNemotronNano330b),
5272 "nvidia.nemotron-nano-9b-v2" => Ok(Self::NvidiaNemotronNano9bV2),
5273 "nvidia.nemotron-super-3-120b" => Ok(Self::NvidiaNemotronSuper3120b),
5274 "openai.gpt-oss-120b-1:0" => Ok(Self::OpenaiGptOss120b10),
5275 "openai.gpt-oss-20b-1:0" => Ok(Self::OpenaiGptOss20b10),
5276 "openai.gpt-oss-safeguard-120b" => Ok(Self::OpenaiGptOssSafeguard120b),
5277 "openai.gpt-oss-safeguard-20b" => Ok(Self::OpenaiGptOssSafeguard20b),
5278 "qwen.qwen3-235b-a22b-2507-v1:0" => Ok(Self::QwenQwen3235bA22b2507V10),
5279 "qwen.qwen3-32b-v1:0" => Ok(Self::QwenQwen332bV10),
5280 "qwen.qwen3-coder-30b-a3b-v1:0" => Ok(Self::QwenQwen3Coder30bA3bV10),
5281 "qwen.qwen3-coder-480b-a35b-v1:0" => Ok(Self::QwenQwen3Coder480bA35bV10),
5282 "qwen.qwen3-coder-next" => Ok(Self::QwenQwen3CoderNext),
5283 "qwen.qwen3-next-80b-a3b" => Ok(Self::QwenQwen3Next80bA3b),
5284 "qwen.qwen3-vl-235b-a22b" => Ok(Self::QwenQwen3Vl235bA22b),
5285 "us.anthropic.claude-haiku-4-5-20251001-v1:0" => {
5286 Ok(Self::UsAnthropicClaudeHaiku4520251001V10)
5287 }
5288 "us.anthropic.claude-opus-4-1-20250805-v1:0" => {
5289 Ok(Self::UsAnthropicClaudeOpus4120250805V10)
5290 }
5291 "us.anthropic.claude-opus-4-5-20251101-v1:0" => {
5292 Ok(Self::UsAnthropicClaudeOpus4520251101V10)
5293 }
5294 "us.anthropic.claude-opus-4-6-v1" => Ok(Self::UsAnthropicClaudeOpus46V1),
5295 "us.anthropic.claude-opus-4-7" => Ok(Self::UsAnthropicClaudeOpus47),
5296 "us.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
5297 Ok(Self::UsAnthropicClaudeSonnet4520250929V10)
5298 }
5299 "us.anthropic.claude-sonnet-4-6" => Ok(Self::UsAnthropicClaudeSonnet46),
5300 "us.deepseek.r1-v1:0" => Ok(Self::UsDeepseekR1V10),
5301 "us.meta.llama4-maverick-17b-instruct-v1:0" => {
5302 Ok(Self::UsMetaLlama4Maverick17bInstructV10)
5303 }
5304 "us.meta.llama4-scout-17b-instruct-v1:0" => {
5305 Ok(Self::UsMetaLlama4Scout17bInstructV10)
5306 }
5307 "writer.palmyra-x4-v1:0" => Ok(Self::WriterPalmyraX4V10),
5308 "writer.palmyra-x5-v1:0" => Ok(Self::WriterPalmyraX5V10),
5309 "zai.glm-4.7" => Ok(Self::ZaiGlm47),
5310 "zai.glm-4.7-flash" => Ok(Self::ZaiGlm47Flash),
5311 "zai.glm-5" => Ok(Self::ZaiGlm5),
5312 _ => Err(format!("Unknown bedrock model: '{s}'")),
5313 }
5314 }
5315}
5316#[derive(Debug, Clone, PartialEq, Eq, Hash)]
5318pub enum LlmModel {
5319 Anthropic(AnthropicModel),
5320 Codex(CodexModel),
5321 DeepSeek(DeepSeekModel),
5322 Gemini(GeminiModel),
5323 Moonshot(MoonshotModel),
5324 Openai(OpenaiModel),
5325 OpenRouter(OpenRouterModel),
5326 ZAi(ZAiModel),
5327 Bedrock(BedrockModel),
5328 Ollama(String),
5329 LlamaCpp(String),
5330}
5331impl From<AnthropicModel> for LlmModel {
5332 fn from(m: AnthropicModel) -> Self {
5333 LlmModel::Anthropic(m)
5334 }
5335}
5336impl From<CodexModel> for LlmModel {
5337 fn from(m: CodexModel) -> Self {
5338 LlmModel::Codex(m)
5339 }
5340}
5341impl From<DeepSeekModel> for LlmModel {
5342 fn from(m: DeepSeekModel) -> Self {
5343 LlmModel::DeepSeek(m)
5344 }
5345}
5346impl From<GeminiModel> for LlmModel {
5347 fn from(m: GeminiModel) -> Self {
5348 LlmModel::Gemini(m)
5349 }
5350}
5351impl From<MoonshotModel> for LlmModel {
5352 fn from(m: MoonshotModel) -> Self {
5353 LlmModel::Moonshot(m)
5354 }
5355}
5356impl From<OpenaiModel> for LlmModel {
5357 fn from(m: OpenaiModel) -> Self {
5358 LlmModel::Openai(m)
5359 }
5360}
5361impl From<OpenRouterModel> for LlmModel {
5362 fn from(m: OpenRouterModel) -> Self {
5363 LlmModel::OpenRouter(m)
5364 }
5365}
5366impl From<ZAiModel> for LlmModel {
5367 fn from(m: ZAiModel) -> Self {
5368 LlmModel::ZAi(m)
5369 }
5370}
5371impl From<BedrockModel> for LlmModel {
5372 fn from(m: BedrockModel) -> Self {
5373 LlmModel::Bedrock(m)
5374 }
5375}
5376impl LlmModel {
5377 pub fn model_id(&self) -> Cow<'static, str> {
5379 match self {
5380 Self::Anthropic(m) => Cow::Borrowed(m.model_id()),
5381 Self::Codex(m) => Cow::Borrowed(m.model_id()),
5382 Self::DeepSeek(m) => Cow::Borrowed(m.model_id()),
5383 Self::Gemini(m) => Cow::Borrowed(m.model_id()),
5384 Self::Moonshot(m) => Cow::Borrowed(m.model_id()),
5385 Self::Openai(m) => Cow::Borrowed(m.model_id()),
5386 Self::OpenRouter(m) => Cow::Borrowed(m.model_id()),
5387 Self::ZAi(m) => Cow::Borrowed(m.model_id()),
5388 Self::Bedrock(m) => m.model_id(),
5389 Self::Ollama(s) | Self::LlamaCpp(s) => Cow::Owned(s.clone()),
5390 }
5391 }
5392 pub fn display_name(&self) -> Cow<'static, str> {
5394 match self {
5395 Self::Anthropic(m) => Cow::Borrowed(m.display_name()),
5396 Self::Codex(m) => Cow::Borrowed(m.display_name()),
5397 Self::DeepSeek(m) => Cow::Borrowed(m.display_name()),
5398 Self::Gemini(m) => Cow::Borrowed(m.display_name()),
5399 Self::Moonshot(m) => Cow::Borrowed(m.display_name()),
5400 Self::Openai(m) => Cow::Borrowed(m.display_name()),
5401 Self::OpenRouter(m) => Cow::Borrowed(m.display_name()),
5402 Self::ZAi(m) => Cow::Borrowed(m.display_name()),
5403 Self::Bedrock(m) => m.display_name(),
5404 Self::Ollama(s) => Cow::Owned(format!("Ollama {s}")),
5405 Self::LlamaCpp(s) => Cow::Owned(format!("LlamaCpp {s}")),
5406 }
5407 }
5408 pub fn provider(&self) -> &'static str {
5410 match self {
5411 Self::Anthropic(_) => "anthropic",
5412 Self::Codex(_) => "codex",
5413 Self::DeepSeek(_) => "deepseek",
5414 Self::Gemini(_) => "gemini",
5415 Self::Moonshot(_) => "moonshot",
5416 Self::Openai(_) => "openai",
5417 Self::OpenRouter(_) => "openrouter",
5418 Self::ZAi(_) => "zai",
5419 Self::Bedrock(_) => "bedrock",
5420 Self::Ollama(_) => "ollama",
5421 Self::LlamaCpp(_) => "llamacpp",
5422 }
5423 }
5424 pub fn provider_display_name(&self) -> &'static str {
5426 match self {
5427 Self::Anthropic(_) => "Anthropic",
5428 Self::Codex(_) => "Codex",
5429 Self::DeepSeek(_) => "DeepSeek",
5430 Self::Gemini(_) => "Gemini",
5431 Self::Moonshot(_) => "Moonshot",
5432 Self::Openai(_) => "OpenAI",
5433 Self::OpenRouter(_) => "OpenRouter",
5434 Self::ZAi(_) => "ZAI",
5435 Self::Bedrock(_) => "AWS Bedrock",
5436 Self::Ollama(_) => "Ollama",
5437 Self::LlamaCpp(_) => "LlamaCpp",
5438 }
5439 }
5440 pub fn context_window(&self) -> Option<u32> {
5442 match self {
5443 Self::Anthropic(m) => Some(m.context_window()),
5444 Self::Codex(m) => Some(m.context_window()),
5445 Self::DeepSeek(m) => Some(m.context_window()),
5446 Self::Gemini(m) => Some(m.context_window()),
5447 Self::Moonshot(m) => Some(m.context_window()),
5448 Self::Openai(m) => Some(m.context_window()),
5449 Self::OpenRouter(m) => Some(m.context_window()),
5450 Self::ZAi(m) => Some(m.context_window()),
5451 Self::Bedrock(m) => m.context_window(),
5452 Self::Ollama(_) | Self::LlamaCpp(_) => None,
5453 }
5454 }
5455 pub fn required_env_var(&self) -> Option<&'static str> {
5457 match self {
5458 Self::Anthropic(_) => Some("ANTHROPIC_API_KEY"),
5459 Self::DeepSeek(_) => Some("DEEPSEEK_API_KEY"),
5460 Self::Gemini(_) => Some("GEMINI_API_KEY"),
5461 Self::Moonshot(_) => Some("MOONSHOT_API_KEY"),
5462 Self::Openai(_) => Some("OPENAI_API_KEY"),
5463 Self::OpenRouter(_) => Some("OPENROUTER_API_KEY"),
5464 Self::ZAi(_) => Some("ZAI_API_KEY"),
5465 Self::Codex(_) | Self::Bedrock(_) | Self::Ollama(_) | Self::LlamaCpp(_) => {
5466 None
5467 }
5468 }
5469 }
5470 pub const ALL_REQUIRED_ENV_VARS: &[&str] = &[
5472 "ANTHROPIC_API_KEY",
5473 "DEEPSEEK_API_KEY",
5474 "GEMINI_API_KEY",
5475 "MOONSHOT_API_KEY",
5476 "OPENAI_API_KEY",
5477 "OPENROUTER_API_KEY",
5478 "ZAI_API_KEY",
5479 ];
5480 pub fn oauth_provider_id(&self) -> Option<&'static str> {
5482 match self {
5483 Self::Codex(_) => Some("codex"),
5484 Self::Anthropic(_)
5485 | Self::DeepSeek(_)
5486 | Self::Gemini(_)
5487 | Self::Moonshot(_)
5488 | Self::Openai(_)
5489 | Self::OpenRouter(_)
5490 | Self::ZAi(_)
5491 | Self::Bedrock(_)
5492 | Self::Ollama(_)
5493 | Self::LlamaCpp(_) => None,
5494 }
5495 }
5496 pub fn reasoning_levels(&self) -> &'static [ReasoningEffort] {
5498 match self {
5499 Self::Anthropic(m) => m.reasoning_levels(),
5500 Self::Codex(m) => m.reasoning_levels(),
5501 Self::DeepSeek(m) => m.reasoning_levels(),
5502 Self::Gemini(m) => m.reasoning_levels(),
5503 Self::Moonshot(m) => m.reasoning_levels(),
5504 Self::Openai(m) => m.reasoning_levels(),
5505 Self::OpenRouter(m) => m.reasoning_levels(),
5506 Self::ZAi(m) => m.reasoning_levels(),
5507 Self::Bedrock(m) => m.reasoning_levels(),
5508 Self::Ollama(_) | Self::LlamaCpp(_) => &[],
5509 }
5510 }
5511 pub fn supports_reasoning(&self) -> bool {
5513 !self.reasoning_levels().is_empty()
5514 }
5515 pub fn supports_prompt_caching(&self) -> bool {
5517 match self {
5518 Self::Anthropic(m) => m.supports_prompt_caching(),
5519 Self::Codex(m) => m.supports_prompt_caching(),
5520 Self::DeepSeek(m) => m.supports_prompt_caching(),
5521 Self::Gemini(m) => m.supports_prompt_caching(),
5522 Self::Moonshot(m) => m.supports_prompt_caching(),
5523 Self::Openai(m) => m.supports_prompt_caching(),
5524 Self::OpenRouter(m) => m.supports_prompt_caching(),
5525 Self::ZAi(m) => m.supports_prompt_caching(),
5526 Self::Bedrock(m) => m.supports_prompt_caching(),
5527 Self::Ollama(_) | Self::LlamaCpp(_) => false,
5528 }
5529 }
5530 pub fn supports_image(&self) -> bool {
5532 match self {
5533 Self::Anthropic(m) => m.supports_image(),
5534 Self::Codex(m) => m.supports_image(),
5535 Self::DeepSeek(m) => m.supports_image(),
5536 Self::Gemini(m) => m.supports_image(),
5537 Self::Moonshot(m) => m.supports_image(),
5538 Self::Openai(m) => m.supports_image(),
5539 Self::OpenRouter(m) => m.supports_image(),
5540 Self::ZAi(m) => m.supports_image(),
5541 Self::Bedrock(m) => m.supports_image(),
5542 Self::Ollama(_) | Self::LlamaCpp(_) => false,
5543 }
5544 }
5545 pub fn supports_audio(&self) -> bool {
5547 match self {
5548 Self::Anthropic(m) => m.supports_audio(),
5549 Self::Codex(m) => m.supports_audio(),
5550 Self::DeepSeek(m) => m.supports_audio(),
5551 Self::Gemini(m) => m.supports_audio(),
5552 Self::Moonshot(m) => m.supports_audio(),
5553 Self::Openai(m) => m.supports_audio(),
5554 Self::OpenRouter(m) => m.supports_audio(),
5555 Self::ZAi(m) => m.supports_audio(),
5556 Self::Bedrock(m) => m.supports_audio(),
5557 Self::Ollama(_) | Self::LlamaCpp(_) => false,
5558 }
5559 }
5560 pub fn all() -> &'static [LlmModel] {
5562 static ALL: LazyLock<Vec<LlmModel>> = LazyLock::new(|| {
5563 let mut v = Vec::new();
5564 v.extend(AnthropicModel::ALL.iter().copied().map(LlmModel::Anthropic));
5565 v.extend(CodexModel::ALL.iter().copied().map(LlmModel::Codex));
5566 v.extend(DeepSeekModel::ALL.iter().copied().map(LlmModel::DeepSeek));
5567 v.extend(GeminiModel::ALL.iter().copied().map(LlmModel::Gemini));
5568 v.extend(MoonshotModel::ALL.iter().copied().map(LlmModel::Moonshot));
5569 v.extend(OpenaiModel::ALL.iter().copied().map(LlmModel::Openai));
5570 v.extend(OpenRouterModel::ALL.iter().copied().map(LlmModel::OpenRouter));
5571 v.extend(ZAiModel::ALL.iter().copied().map(LlmModel::ZAi));
5572 v.extend(
5573 BedrockFoundationModel::ALL
5574 .iter()
5575 .copied()
5576 .map(BedrockModel::Foundation)
5577 .map(LlmModel::Bedrock),
5578 );
5579 v
5580 });
5581 &ALL
5582 }
5583}
5584impl std::fmt::Display for LlmModel {
5585 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5586 write!(f, "{}:{}", self.provider(), self.model_id())
5587 }
5588}
5589impl std::str::FromStr for LlmModel {
5590 type Err = String;
5591 fn from_str(s: &str) -> Result<Self, Self::Err> {
5593 let (provider_str, model_str) = s.split_once(':').unwrap_or((s, ""));
5594 match provider_str {
5595 "anthropic" => model_str.parse::<AnthropicModel>().map(Self::Anthropic),
5596 "codex" => model_str.parse::<CodexModel>().map(Self::Codex),
5597 "deepseek" => model_str.parse::<DeepSeekModel>().map(Self::DeepSeek),
5598 "gemini" => model_str.parse::<GeminiModel>().map(Self::Gemini),
5599 "moonshot" => model_str.parse::<MoonshotModel>().map(Self::Moonshot),
5600 "openai" => model_str.parse::<OpenaiModel>().map(Self::Openai),
5601 "openrouter" => model_str.parse::<OpenRouterModel>().map(Self::OpenRouter),
5602 "zai" => model_str.parse::<ZAiModel>().map(Self::ZAi),
5603 "bedrock" => model_str.parse::<BedrockModel>().map(Self::Bedrock),
5604 "ollama" => Ok(Self::Ollama(model_str.to_string())),
5605 "llamacpp" => Ok(Self::LlamaCpp(model_str.to_string())),
5606 _ => Err(format!("Unknown provider: '{provider_str}'")),
5607 }
5608 }
5609}