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