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 AzureFoundry,
14 Codex,
15 DeepSeek,
16 Fireworks,
17 Gemini,
18 Moonshot,
19 Openai,
20 OpenRouter,
21 ZAi,
22 Bedrock,
23 Ollama,
24 LlamaCpp,
25}
26impl Provider {
27 pub const ALL: &[Provider] = &[
29 Self::Anthropic,
30 Self::AzureFoundry,
31 Self::Codex,
32 Self::DeepSeek,
33 Self::Fireworks,
34 Self::Gemini,
35 Self::Moonshot,
36 Self::Openai,
37 Self::OpenRouter,
38 Self::ZAi,
39 Self::Bedrock,
40 Self::Ollama,
41 Self::LlamaCpp,
42 ];
43 pub fn parser_name(self) -> &'static str {
45 match self {
46 Self::Anthropic => "anthropic",
47 Self::AzureFoundry => "azure-foundry",
48 Self::Codex => "codex",
49 Self::DeepSeek => "deepseek",
50 Self::Fireworks => "fireworks",
51 Self::Gemini => "gemini",
52 Self::Moonshot => "moonshot",
53 Self::Openai => "openai",
54 Self::OpenRouter => "openrouter",
55 Self::ZAi => "zai",
56 Self::Bedrock => "bedrock",
57 Self::Ollama => "ollama",
58 Self::LlamaCpp => "llamacpp",
59 }
60 }
61 #[allow(clippy::match_same_arms)]
63 pub fn genai_provider_name(self) -> &'static str {
64 match self {
65 Self::Anthropic => "anthropic",
66 Self::AzureFoundry => "azure.ai.openai",
67 Self::Codex => "openai",
68 Self::DeepSeek => "deepseek",
69 Self::Fireworks => "fireworks",
70 Self::Gemini => "gcp.gemini",
71 Self::Moonshot => "moonshot_ai",
72 Self::Openai => "openai",
73 Self::OpenRouter => "openrouter",
74 Self::ZAi => "zai",
75 Self::Bedrock => "aws.bedrock",
76 Self::Ollama => "ollama",
77 Self::LlamaCpp => "llama.cpp",
78 }
79 }
80 pub fn display_name(self) -> &'static str {
82 match self {
83 Self::Anthropic => "Anthropic",
84 Self::AzureFoundry => "Microsoft Foundry",
85 Self::Codex => "Codex",
86 Self::DeepSeek => "DeepSeek",
87 Self::Fireworks => "Fireworks AI",
88 Self::Gemini => "Gemini",
89 Self::Moonshot => "Moonshot",
90 Self::Openai => "OpenAI",
91 Self::OpenRouter => "OpenRouter",
92 Self::ZAi => "ZAI",
93 Self::Bedrock => "AWS Bedrock",
94 Self::Ollama => "Ollama",
95 Self::LlamaCpp => "LlamaCpp",
96 }
97 }
98 pub fn required_env_var(self) -> Option<&'static str> {
100 match self {
101 Self::Anthropic => Some("ANTHROPIC_API_KEY"),
102 Self::AzureFoundry => Some("AZURE_OPENAI_API_KEY"),
103 Self::DeepSeek => Some("DEEPSEEK_API_KEY"),
104 Self::Fireworks => Some("FIREWORKS_API_KEY"),
105 Self::Gemini => Some("GEMINI_API_KEY"),
106 Self::Moonshot => Some("MOONSHOT_API_KEY"),
107 Self::Openai => Some("OPENAI_API_KEY"),
108 Self::OpenRouter => Some("OPENROUTER_API_KEY"),
109 Self::ZAi => Some("ZAI_API_KEY"),
110 Self::Codex | Self::Bedrock | Self::Ollama | Self::LlamaCpp => None,
111 }
112 }
113 pub fn oauth_provider_id(self) -> Option<&'static str> {
115 match self {
116 Self::Codex => Some("codex"),
117 Self::Anthropic
118 | Self::AzureFoundry
119 | Self::DeepSeek
120 | Self::Fireworks
121 | Self::Gemini
122 | Self::Moonshot
123 | Self::Openai
124 | Self::OpenRouter
125 | Self::ZAi
126 | Self::Bedrock
127 | Self::Ollama
128 | Self::LlamaCpp => None,
129 }
130 }
131 pub fn is_local(self) -> bool {
134 match self {
135 Self::Ollama | Self::LlamaCpp => true,
136 Self::Anthropic
137 | Self::AzureFoundry
138 | Self::Codex
139 | Self::DeepSeek
140 | Self::Fireworks
141 | Self::Gemini
142 | Self::Moonshot
143 | Self::Openai
144 | Self::OpenRouter
145 | Self::ZAi
146 | Self::Bedrock => false,
147 }
148 }
149}
150impl std::fmt::Display for Provider {
151 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
152 f.write_str(self.parser_name())
153 }
154}
155impl std::str::FromStr for Provider {
156 type Err = String;
157 fn from_str(s: &str) -> Result<Self, Self::Err> {
158 match s {
159 "anthropic" => Ok(Self::Anthropic),
160 "azure-foundry" => Ok(Self::AzureFoundry),
161 "codex" => Ok(Self::Codex),
162 "deepseek" => Ok(Self::DeepSeek),
163 "fireworks" => Ok(Self::Fireworks),
164 "gemini" => Ok(Self::Gemini),
165 "moonshot" => Ok(Self::Moonshot),
166 "openai" => Ok(Self::Openai),
167 "openrouter" => Ok(Self::OpenRouter),
168 "zai" => Ok(Self::ZAi),
169 "bedrock" => Ok(Self::Bedrock),
170 "ollama" => Ok(Self::Ollama),
171 "llamacpp" => Ok(Self::LlamaCpp),
172 other => Err(format!("Unknown provider: '{other}'")),
173 }
174 }
175}
176#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
177pub enum AnthropicModel {
178 ClaudeFable5,
179 ClaudeHaiku45,
180 ClaudeHaiku4520251001,
181 ClaudeOpus41,
182 ClaudeOpus4120250805,
183 ClaudeOpus45,
184 ClaudeOpus4520251101,
185 ClaudeOpus46,
186 ClaudeOpus47,
187 ClaudeOpus48,
188 ClaudeOpus5,
189 ClaudeSonnet45,
190 ClaudeSonnet4520250929,
191 ClaudeSonnet46,
192 ClaudeSonnet5,
193}
194#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
195pub enum AzureFoundryModel {
196 ClaudeFable5,
197 ClaudeHaiku45,
198 ClaudeOpus41,
199 ClaudeOpus45,
200 ClaudeOpus46,
201 ClaudeOpus48,
202 ClaudeOpus5,
203 ClaudeSonnet45,
204 ClaudeSonnet46,
205 ClaudeSonnet5,
206 Codestral2501,
207 CodexMini,
208 CohereCommandA,
209 DeepseekV32,
210 Gpt4Turbo,
211 Gpt4TurboVision,
212 Gpt41,
213 Gpt41Mini,
214 Gpt41Nano,
215 Gpt4o,
216 Gpt4oMini,
217 Gpt5,
218 Gpt5Codex,
219 Gpt5Mini,
220 Gpt5Nano,
221 Gpt5Pro,
222 Gpt51,
223 Gpt51Codex,
224 Gpt51CodexMax,
225 Gpt51CodexMini,
226 Gpt52,
227 Gpt52Codex,
228 Gpt53Codex,
229 Gpt54,
230 Gpt54Mini,
231 Gpt54Nano,
232 Gpt54Pro,
233 Gpt55,
234 Gpt56Luna,
235 Gpt56Sol,
236 Gpt56Terra,
237 Grok41FastNonReasoning,
238 Grok41FastReasoning,
239 Grok420NonReasoning,
240 Grok420Reasoning,
241 KimiK25,
242 KimiK26,
243 Llama3370bInstruct,
244 Llama4Maverick17b128eInstructFp8,
245 Llama4Scout17b16eInstruct,
246 Ministral3b,
247 MistralMedium2505,
248 MistralSmall2503,
249 ModelRouter,
250 O1,
251 O3,
252 O3Mini,
253 O4Mini,
254 Phi4Mini,
255 Phi4MiniReasoning,
256}
257#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
258pub enum CodexModel {
259 Gpt52,
260 Gpt54,
261 Gpt54Mini,
262 Gpt55,
263 Gpt56Luna,
264 Gpt56Sol,
265 Gpt56Terra,
266}
267#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
268pub enum DeepSeekModel {
269 DeepseekChat,
270 DeepseekReasoner,
271 DeepseekV4Flash,
272 DeepseekV4Pro,
273}
274#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
275pub enum FireworksModel {
276 AccountsFireworksModelsDeepseekV4Flash,
277 AccountsFireworksModelsDeepseekV4Pro,
278 AccountsFireworksModelsGlm5p2,
279 AccountsFireworksModelsGptOss120b,
280 AccountsFireworksModelsGptOss20b,
281 AccountsFireworksModelsKimiK2p6,
282 AccountsFireworksModelsKimiK2p7Code,
283 AccountsFireworksModelsMinimaxM2p7,
284 AccountsFireworksModelsMinimaxM3,
285 AccountsFireworksModelsQwen3p7Plus,
286 AccountsFireworksRoutersGlm5p2Fast,
287 AccountsFireworksRoutersKimiK2p6Fast,
288 AccountsFireworksRoutersKimiK2p6Turbo,
289 AccountsFireworksRoutersKimiK2p7CodeFast,
290}
291#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
292pub enum GeminiModel {
293 DeepResearchMaxPreview042026,
294 DeepResearchPreview042026,
295 Gemini20Flash,
296 Gemini20FlashLite,
297 Gemini25ComputerUsePreview102025,
298 Gemini25Flash,
299 Gemini25FlashLite,
300 Gemini25Pro,
301 Gemini3FlashPreview,
302 Gemini3ProPreview,
303 Gemini31FlashLite,
304 Gemini31FlashLiteImage,
305 Gemini31FlashLitePreview,
306 Gemini31FlashLivePreview,
307 Gemini31ProPreview,
308 Gemini31ProPreviewCustomtools,
309 Gemini35Flash,
310 Gemini35FlashLite,
311 Gemini36Flash,
312 GeminiRoboticsEr16Preview,
313 Gemma426bA4bIt,
314 Gemma431bIt,
315}
316#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
317pub enum MoonshotModel {
318 KimiK20711Preview,
319 KimiK20905Preview,
320 KimiK2Thinking,
321 KimiK2ThinkingTurbo,
322 KimiK2TurboPreview,
323 KimiK25,
324 KimiK26,
325 KimiK27Code,
326 KimiK27CodeHighspeed,
327 KimiK3,
328}
329#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
330pub enum OpenaiModel {
331 Gpt4,
332 Gpt4Turbo,
333 Gpt41,
334 Gpt41Mini,
335 Gpt41Nano,
336 Gpt4o,
337 Gpt4o20240513,
338 Gpt4o20240806,
339 Gpt4o20241120,
340 Gpt4oMini,
341 Gpt5,
342 Gpt5Mini,
343 Gpt5Nano,
344 Gpt5Pro,
345 Gpt51,
346 Gpt52,
347 Gpt52Pro,
348 Gpt53Codex,
349 Gpt53CodexSpark,
350 Gpt54,
351 Gpt54Mini,
352 Gpt54Nano,
353 Gpt54Pro,
354 Gpt55,
355 Gpt55Pro,
356 Gpt56,
357 Gpt56Luna,
358 Gpt56Sol,
359 Gpt56Terra,
360 GptRealtime21,
361 O1,
362 O1Pro,
363 O3,
364 O3Mini,
365 O3Pro,
366 O4Mini,
367}
368#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
369pub enum OpenRouterModel {
370 Ai21JambaLarge17,
371 AionLabsAion20,
372 AionLabsAion30,
373 AionLabsAion30Mini,
374 AmazonNova2LiteV1,
375 AmazonNovaLiteV1,
376 AmazonNovaMicroV1,
377 AmazonNovaPremierV1,
378 AmazonNovaProV1,
379 AnthropicClaude3Haiku,
380 AnthropicClaudeFable5,
381 AnthropicClaudeHaiku45,
382 AnthropicClaudeOpus4,
383 AnthropicClaudeOpus41,
384 AnthropicClaudeOpus45,
385 AnthropicClaudeOpus46,
386 AnthropicClaudeOpus47,
387 AnthropicClaudeOpus47Fast,
388 AnthropicClaudeOpus48,
389 AnthropicClaudeOpus48Fast,
390 AnthropicClaudeOpus5,
391 AnthropicClaudeOpus5Fast,
392 AnthropicClaudeSonnet4,
393 AnthropicClaudeSonnet45,
394 AnthropicClaudeSonnet46,
395 AnthropicClaudeSonnet5,
396 ArceeAiTrinityLargeThinking,
397 ArceeAiVirtuosoLarge,
398 BytedanceSeedSeed16,
399 BytedanceSeedSeed16Flash,
400 BytedanceSeedSeed20Lite,
401 BytedanceSeedSeed20Mini,
402 CohereCommandR082024,
403 CohereCommandRPlus082024,
404 CohereNorthMiniCodeFree,
405 DeepseekDeepseekChat,
406 DeepseekDeepseekChatV30324,
407 DeepseekDeepseekChatV31,
408 DeepseekDeepseekR1,
409 DeepseekDeepseekR10528,
410 DeepseekDeepseekV31Terminus,
411 DeepseekDeepseekV32,
412 DeepseekDeepseekV32Exp,
413 DeepseekDeepseekV4Flash,
414 DeepseekDeepseekV4Pro,
415 GoogleGemini25Flash,
416 GoogleGemini25FlashLite,
417 GoogleGemini25Pro,
418 GoogleGemini25ProPreview,
419 GoogleGemini25ProPreview0506,
420 GoogleGemini3FlashPreview,
421 GoogleGemini3ProImage,
422 GoogleGemini31FlashLite,
423 GoogleGemini31FlashLitePreview,
424 GoogleGemini31ProPreview,
425 GoogleGemini31ProPreviewCustomtools,
426 GoogleGemini35Flash,
427 GoogleGemini35FlashLite,
428 GoogleGemini36Flash,
429 GoogleGemma312bIt,
430 GoogleGemma327bIt,
431 GoogleGemma426bA4bIt,
432 GoogleGemma426bA4bItFree,
433 GoogleGemma431bIt,
434 GoogleGemma431bItFree,
435 IbmGraniteGranite418b,
436 InceptionMercury2,
437 InclusionaiLing261t,
438 InclusionaiLing26Flash,
439 InclusionaiLing30FlashFree,
440 InclusionaiRing261t,
441 KwaipilotKatCoderAirV25,
442 KwaipilotKatCoderProV2,
443 KwaipilotKatCoderProV25,
444 MeituanLongcat20,
445 MetaLlamaLlama3170bInstruct,
446 MetaLlamaLlama318bInstruct,
447 MetaLlamaLlama3370bInstruct,
448 MetaLlamaLlama4Maverick,
449 MetaLlamaLlama4Scout,
450 MetaMuseSpark11,
451 MinimaxMinimaxM1,
452 MinimaxMinimaxM2,
453 MinimaxMinimaxM21,
454 MinimaxMinimaxM25,
455 MinimaxMinimaxM27,
456 MinimaxMinimaxM3,
457 MistralaiCodestral2508,
458 MistralaiDevstral2512,
459 MistralaiMinistral14b2512,
460 MistralaiMinistral3b2512,
461 MistralaiMinistral8b2512,
462 MistralaiMistralLarge,
463 MistralaiMistralLarge2407,
464 MistralaiMistralLarge2512,
465 MistralaiMistralMedium3,
466 MistralaiMistralMedium35,
467 MistralaiMistralMedium31,
468 MistralaiMistralNemo,
469 MistralaiMistralSaba,
470 MistralaiMistralSmall2603,
471 MistralaiMistralSmall3224bInstruct,
472 MistralaiMixtral8x22bInstruct,
473 MistralaiVoxtralSmall24b2507,
474 MoonshotaiKimiK2,
475 MoonshotaiKimiK20905,
476 MoonshotaiKimiK2Thinking,
477 MoonshotaiKimiK25,
478 MoonshotaiKimiK26,
479 MoonshotaiKimiK27Code,
480 MoonshotaiKimiK3,
481 NexAgiNexN2Mini,
482 NexAgiNexN2Pro,
483 NvidiaNemotron3Nano30bA3b,
484 NvidiaNemotron3Nano30bA3bFree,
485 NvidiaNemotron3NanoOmni30bA3bReasoningFree,
486 NvidiaNemotron3Super120bA12b,
487 NvidiaNemotron3Super120bA12bFree,
488 NvidiaNemotron3Ultra550bA55b,
489 NvidiaNemotron3Ultra550bA55bFree,
490 NvidiaNemotronNano12bV2VlFree,
491 NvidiaNemotronNano9bV2Free,
492 OpenaiGpt35Turbo,
493 OpenaiGpt35Turbo0613,
494 OpenaiGpt35Turbo16k,
495 OpenaiGpt4,
496 OpenaiGpt4Turbo,
497 OpenaiGpt4TurboPreview,
498 OpenaiGpt41,
499 OpenaiGpt41Mini,
500 OpenaiGpt41Nano,
501 OpenaiGpt4o,
502 OpenaiGpt4o20240513,
503 OpenaiGpt4o20240806,
504 OpenaiGpt4o20241120,
505 OpenaiGpt4oMini,
506 OpenaiGpt4oMini20240718,
507 OpenaiGpt5,
508 OpenaiGpt5Codex,
509 OpenaiGpt5Mini,
510 OpenaiGpt5Nano,
511 OpenaiGpt5Pro,
512 OpenaiGpt51,
513 OpenaiGpt51Chat,
514 OpenaiGpt51Codex,
515 OpenaiGpt51CodexMax,
516 OpenaiGpt51CodexMini,
517 OpenaiGpt52,
518 OpenaiGpt52Chat,
519 OpenaiGpt52Codex,
520 OpenaiGpt52Pro,
521 OpenaiGpt53Chat,
522 OpenaiGpt53Codex,
523 OpenaiGpt54,
524 OpenaiGpt54Mini,
525 OpenaiGpt54Nano,
526 OpenaiGpt54Pro,
527 OpenaiGpt55,
528 OpenaiGpt55Pro,
529 OpenaiGpt56Luna,
530 OpenaiGpt56LunaPro,
531 OpenaiGpt56Sol,
532 OpenaiGpt56SolPro,
533 OpenaiGpt56Terra,
534 OpenaiGpt56TerraPro,
535 OpenaiGptAudio,
536 OpenaiGptAudioMini,
537 OpenaiGptOss120b,
538 OpenaiGptOss20b,
539 OpenaiGptOss20bFree,
540 OpenaiGptOssSafeguard20b,
541 OpenaiO1,
542 OpenaiO3,
543 OpenaiO3DeepResearch,
544 OpenaiO3Mini,
545 OpenaiO3MiniHigh,
546 OpenaiO3Pro,
547 OpenaiO4Mini,
548 OpenaiO4MiniDeepResearch,
549 OpenaiO4MiniHigh,
550 OpenrouterAuto,
551 OpenrouterFree,
552 PoolsideLagunaM1,
553 PoolsideLagunaM1Free,
554 PoolsideLagunaS21,
555 PoolsideLagunaS21Free,
556 PoolsideLagunaXs21,
557 PoolsideLagunaXs21Free,
558 QwenQwen2572bInstruct,
559 QwenQwen257bInstruct,
560 QwenQwenPlus,
561 QwenQwenPlus20250728,
562 QwenQwenPlus20250728Thinking,
563 QwenQwen314b,
564 QwenQwen3235bA22b,
565 QwenQwen3235bA22b2507,
566 QwenQwen3235bA22bThinking2507,
567 QwenQwen330bA3b,
568 QwenQwen330bA3bInstruct2507,
569 QwenQwen330bA3bThinking2507,
570 QwenQwen332b,
571 QwenQwen38b,
572 QwenQwen3Coder,
573 QwenQwen3Coder30bA3bInstruct,
574 QwenQwen3CoderFlash,
575 QwenQwen3CoderNext,
576 QwenQwen3CoderPlus,
577 QwenQwen3Max,
578 QwenQwen3MaxThinking,
579 QwenQwen3Next80bA3bInstruct,
580 QwenQwen3Next80bA3bThinking,
581 QwenQwen3Vl235bA22bInstruct,
582 QwenQwen3Vl235bA22bThinking,
583 QwenQwen3Vl30bA3bInstruct,
584 QwenQwen3Vl30bA3bThinking,
585 QwenQwen3Vl32bInstruct,
586 QwenQwen3Vl8bInstruct,
587 QwenQwen3Vl8bThinking,
588 QwenQwen35122bA10b,
589 QwenQwen3527b,
590 QwenQwen3535bA3b,
591 QwenQwen35397bA17b,
592 QwenQwen359b,
593 QwenQwen35Flash0223,
594 QwenQwen35Plus0215,
595 QwenQwen35Plus20260420,
596 QwenQwen3627b,
597 QwenQwen3635bA3b,
598 QwenQwen36Flash,
599 QwenQwen36MaxPreview,
600 QwenQwen36Plus,
601 QwenQwen37Max,
602 QwenQwen37Plus,
603 RekaaiRekaEdge,
604 RelaceRelaceSearch,
605 SakanaFuguUltra,
606 Sao10kL31Euryale70b,
607 StepfunStep35Flash,
608 StepfunStep37Flash,
609 TencentHy3,
610 TencentHy3Preview,
611 ThedrummerUnslopnemo12b,
612 ThinkingmachinesInkling,
613 UpstageSolarPro3,
614 XAiGrok420,
615 XAiGrok43,
616 XAiGrok45,
617 XAiGrokBuild01,
618 XiaomiMimoV25,
619 XiaomiMimoV25Pro,
620 ZAiGlm45,
621 ZAiGlm45Air,
622 ZAiGlm45v,
623 ZAiGlm46,
624 ZAiGlm46v,
625 ZAiGlm47,
626 ZAiGlm47Flash,
627 ZAiGlm5,
628 ZAiGlm5Turbo,
629 ZAiGlm51,
630 ZAiGlm52,
631 ZAiGlm5vTurbo,
632}
633#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
634pub enum ZAiModel {
635 Glm45,
636 Glm45Air,
637 Glm45Flash,
638 Glm45v,
639 Glm46,
640 Glm46v,
641 Glm47,
642 Glm47Flash,
643 Glm47Flashx,
644 Glm5,
645 Glm5Turbo,
646 Glm51,
647 Glm52,
648 Glm5vTurbo,
649}
650#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
651pub enum BedrockFoundationModel {
652 AmazonNova2LiteV10,
653 AmazonNovaLiteV10,
654 AmazonNovaMicroV10,
655 AmazonNovaProV10,
656 AnthropicClaudeFable5,
657 AnthropicClaudeHaiku4520251001V10,
658 AnthropicClaudeOpus4120250805V10,
659 AnthropicClaudeOpus4520251101V10,
660 AnthropicClaudeOpus46V1,
661 AnthropicClaudeOpus47,
662 AnthropicClaudeOpus48,
663 AnthropicClaudeOpus5,
664 AnthropicClaudeSonnet4520250929V10,
665 AnthropicClaudeSonnet46,
666 AnthropicClaudeSonnet5,
667 AuAnthropicClaudeHaiku4520251001V10,
668 AuAnthropicClaudeOpus46V1,
669 AuAnthropicClaudeOpus48,
670 AuAnthropicClaudeOpus5,
671 AuAnthropicClaudeSonnet4520250929V10,
672 AuAnthropicClaudeSonnet46,
673 AuAnthropicClaudeSonnet5,
674 DeepseekR1V10,
675 DeepseekV3V10,
676 DeepseekV32,
677 EuAnthropicClaudeFable5,
678 EuAnthropicClaudeHaiku4520251001V10,
679 EuAnthropicClaudeOpus4520251101V10,
680 EuAnthropicClaudeOpus46V1,
681 EuAnthropicClaudeOpus47,
682 EuAnthropicClaudeOpus48,
683 EuAnthropicClaudeOpus5,
684 EuAnthropicClaudeSonnet4520250929V10,
685 EuAnthropicClaudeSonnet46,
686 EuAnthropicClaudeSonnet5,
687 GlobalAnthropicClaudeFable5,
688 GlobalAnthropicClaudeHaiku4520251001V10,
689 GlobalAnthropicClaudeOpus4520251101V10,
690 GlobalAnthropicClaudeOpus46V1,
691 GlobalAnthropicClaudeOpus47,
692 GlobalAnthropicClaudeOpus48,
693 GlobalAnthropicClaudeOpus5,
694 GlobalAnthropicClaudeSonnet4520250929V10,
695 GlobalAnthropicClaudeSonnet46,
696 GlobalAnthropicClaudeSonnet5,
697 GoogleGemma327bIt,
698 GoogleGemma34bIt,
699 JpAnthropicClaudeHaiku4520251001V10,
700 JpAnthropicClaudeOpus47,
701 JpAnthropicClaudeOpus48,
702 JpAnthropicClaudeOpus5,
703 JpAnthropicClaudeSonnet4520250929V10,
704 JpAnthropicClaudeSonnet46,
705 JpAnthropicClaudeSonnet5,
706 MetaLlama3170bInstructV10,
707 MetaLlama318bInstructV10,
708 MetaLlama3370bInstructV10,
709 MetaLlama4Maverick17bInstructV10,
710 MetaLlama4Scout17bInstructV10,
711 MinimaxMinimaxM2,
712 MinimaxMinimaxM21,
713 MinimaxMinimaxM25,
714 MistralDevstral2123b,
715 MistralMagistralSmall2509,
716 MistralMinistral314bInstruct,
717 MistralMinistral33bInstruct,
718 MistralMinistral38bInstruct,
719 MistralMistralLarge3675bInstruct,
720 MistralPixtralLarge2502V10,
721 MistralVoxtralMini3b2507,
722 MistralVoxtralSmall24b2507,
723 MoonshotKimiK2Thinking,
724 MoonshotaiKimiK25,
725 NvidiaNemotronNano12bV2,
726 NvidiaNemotronNano330b,
727 NvidiaNemotronNano9bV2,
728 NvidiaNemotronSuper3120b,
729 OpenaiGpt54,
730 OpenaiGpt55,
731 OpenaiGpt56Luna,
732 OpenaiGpt56Sol,
733 OpenaiGpt56Terra,
734 OpenaiGptOss120b,
735 OpenaiGptOss120b10,
736 OpenaiGptOss20b,
737 OpenaiGptOss20b10,
738 OpenaiGptOssSafeguard120b,
739 OpenaiGptOssSafeguard20b,
740 QwenQwen3235bA22b2507V10,
741 QwenQwen332bV10,
742 QwenQwen3Coder30bA3bV10,
743 QwenQwen3Coder480bA35bV10,
744 QwenQwen3CoderNext,
745 QwenQwen3Next80bA3b,
746 QwenQwen3Vl235bA22b,
747 UsAnthropicClaudeFable5,
748 UsAnthropicClaudeHaiku4520251001V10,
749 UsAnthropicClaudeOpus4120250805V10,
750 UsAnthropicClaudeOpus4520251101V10,
751 UsAnthropicClaudeOpus46V1,
752 UsAnthropicClaudeOpus47,
753 UsAnthropicClaudeOpus48,
754 UsAnthropicClaudeOpus5,
755 UsAnthropicClaudeSonnet4520250929V10,
756 UsAnthropicClaudeSonnet46,
757 UsAnthropicClaudeSonnet5,
758 UsDeepseekR1V10,
759 UsMetaLlama4Maverick17bInstructV10,
760 UsMetaLlama4Scout17bInstructV10,
761 WriterPalmyraX4V10,
762 WriterPalmyraX5V10,
763 XaiGrok43,
764 ZaiGlm47,
765 ZaiGlm47Flash,
766 ZaiGlm5,
767}
768impl AnthropicModel {
769 #[allow(clippy::too_many_lines)]
770 fn model_id(self) -> &'static str {
771 match self {
772 Self::ClaudeFable5 => "claude-fable-5",
773 Self::ClaudeHaiku45 => "claude-haiku-4-5",
774 Self::ClaudeHaiku4520251001 => "claude-haiku-4-5-20251001",
775 Self::ClaudeOpus41 => "claude-opus-4-1",
776 Self::ClaudeOpus4120250805 => "claude-opus-4-1-20250805",
777 Self::ClaudeOpus45 => "claude-opus-4-5",
778 Self::ClaudeOpus4520251101 => "claude-opus-4-5-20251101",
779 Self::ClaudeOpus46 => "claude-opus-4-6",
780 Self::ClaudeOpus47 => "claude-opus-4-7",
781 Self::ClaudeOpus48 => "claude-opus-4-8",
782 Self::ClaudeOpus5 => "claude-opus-5",
783 Self::ClaudeSonnet45 => "claude-sonnet-4-5",
784 Self::ClaudeSonnet4520250929 => "claude-sonnet-4-5-20250929",
785 Self::ClaudeSonnet46 => "claude-sonnet-4-6",
786 Self::ClaudeSonnet5 => "claude-sonnet-5",
787 }
788 }
789 #[allow(clippy::too_many_lines)]
790 fn display_name(self) -> &'static str {
791 match self {
792 Self::ClaudeFable5 => "Claude Fable 5",
793 Self::ClaudeHaiku4520251001 => "Claude Haiku 4.5",
794 Self::ClaudeHaiku45 => "Claude Haiku 4.5 (latest)",
795 Self::ClaudeOpus4120250805 => "Claude Opus 4.1",
796 Self::ClaudeOpus41 => "Claude Opus 4.1 (latest)",
797 Self::ClaudeOpus4520251101 => "Claude Opus 4.5",
798 Self::ClaudeOpus45 => "Claude Opus 4.5 (latest)",
799 Self::ClaudeOpus46 => "Claude Opus 4.6",
800 Self::ClaudeOpus47 => "Claude Opus 4.7",
801 Self::ClaudeOpus48 => "Claude Opus 4.8",
802 Self::ClaudeOpus5 => "Claude Opus 5",
803 Self::ClaudeSonnet4520250929 => "Claude Sonnet 4.5",
804 Self::ClaudeSonnet45 => "Claude Sonnet 4.5 (latest)",
805 Self::ClaudeSonnet46 => "Claude Sonnet 4.6",
806 Self::ClaudeSonnet5 => "Claude Sonnet 5",
807 }
808 }
809 #[allow(clippy::too_many_lines)]
810 fn context_window(self) -> u32 {
811 match self {
812 Self::ClaudeHaiku45
813 | Self::ClaudeHaiku4520251001
814 | Self::ClaudeOpus41
815 | Self::ClaudeOpus4120250805
816 | Self::ClaudeOpus45
817 | Self::ClaudeOpus4520251101 => 200_000,
818 Self::ClaudeFable5
819 | Self::ClaudeOpus46
820 | Self::ClaudeOpus47
821 | Self::ClaudeOpus48
822 | Self::ClaudeOpus5
823 | Self::ClaudeSonnet45
824 | Self::ClaudeSonnet4520250929
825 | Self::ClaudeSonnet46
826 | Self::ClaudeSonnet5 => 1_000_000,
827 }
828 }
829 #[allow(clippy::too_many_lines)]
830 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
831 match self {
832 Self::ClaudeHaiku45
833 | Self::ClaudeHaiku4520251001
834 | Self::ClaudeOpus41
835 | Self::ClaudeOpus4120250805
836 | Self::ClaudeOpus45
837 | Self::ClaudeOpus4520251101
838 | Self::ClaudeSonnet45
839 | Self::ClaudeSonnet4520250929 => {
840 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
841 }
842 Self::ClaudeOpus46 | Self::ClaudeSonnet46 => {
843 &[
844 ReasoningEffort::Low,
845 ReasoningEffort::Medium,
846 ReasoningEffort::High,
847 ReasoningEffort::Max,
848 ]
849 }
850 Self::ClaudeFable5
851 | Self::ClaudeOpus47
852 | Self::ClaudeOpus48
853 | Self::ClaudeOpus5
854 | Self::ClaudeSonnet5 => {
855 &[
856 ReasoningEffort::Low,
857 ReasoningEffort::Medium,
858 ReasoningEffort::High,
859 ReasoningEffort::Xhigh,
860 ReasoningEffort::Max,
861 ]
862 }
863 }
864 }
865 pub fn supports_reasoning(self) -> bool {
866 !self.reasoning_levels().is_empty()
867 }
868 #[allow(clippy::too_many_lines)]
869 pub fn supports_prompt_caching(self) -> bool {
870 match self {
871 Self::ClaudeFable5
872 | Self::ClaudeHaiku45
873 | Self::ClaudeHaiku4520251001
874 | Self::ClaudeOpus41
875 | Self::ClaudeOpus4120250805
876 | Self::ClaudeOpus45
877 | Self::ClaudeOpus4520251101
878 | Self::ClaudeOpus46
879 | Self::ClaudeOpus47
880 | Self::ClaudeOpus48
881 | Self::ClaudeOpus5
882 | Self::ClaudeSonnet45
883 | Self::ClaudeSonnet4520250929
884 | Self::ClaudeSonnet46
885 | Self::ClaudeSonnet5 => true,
886 }
887 }
888 #[allow(clippy::too_many_lines)]
889 pub fn supports_image(self) -> bool {
890 match self {
891 Self::ClaudeFable5
892 | Self::ClaudeHaiku45
893 | Self::ClaudeHaiku4520251001
894 | Self::ClaudeOpus41
895 | Self::ClaudeOpus4120250805
896 | Self::ClaudeOpus45
897 | Self::ClaudeOpus4520251101
898 | Self::ClaudeOpus46
899 | Self::ClaudeOpus47
900 | Self::ClaudeOpus48
901 | Self::ClaudeOpus5
902 | Self::ClaudeSonnet45
903 | Self::ClaudeSonnet4520250929
904 | Self::ClaudeSonnet46
905 | Self::ClaudeSonnet5 => true,
906 }
907 }
908 #[allow(clippy::too_many_lines)]
909 pub fn supports_audio(self) -> bool {
910 match self {
911 Self::ClaudeFable5
912 | Self::ClaudeHaiku45
913 | Self::ClaudeHaiku4520251001
914 | Self::ClaudeOpus41
915 | Self::ClaudeOpus4120250805
916 | Self::ClaudeOpus45
917 | Self::ClaudeOpus4520251101
918 | Self::ClaudeOpus46
919 | Self::ClaudeOpus47
920 | Self::ClaudeOpus48
921 | Self::ClaudeOpus5
922 | Self::ClaudeSonnet45
923 | Self::ClaudeSonnet4520250929
924 | Self::ClaudeSonnet46
925 | Self::ClaudeSonnet5 => false,
926 }
927 }
928 #[allow(clippy::too_many_lines)]
929 pub fn transport(self) -> Option<ModelTransport> {
930 match self {
931 Self::ClaudeFable5
932 | Self::ClaudeHaiku45
933 | Self::ClaudeHaiku4520251001
934 | Self::ClaudeOpus41
935 | Self::ClaudeOpus4120250805
936 | Self::ClaudeOpus45
937 | Self::ClaudeOpus4520251101
938 | Self::ClaudeOpus46
939 | Self::ClaudeOpus47
940 | Self::ClaudeOpus48
941 | Self::ClaudeOpus5
942 | Self::ClaudeSonnet45
943 | Self::ClaudeSonnet4520250929
944 | Self::ClaudeSonnet46
945 | Self::ClaudeSonnet5 => None,
946 }
947 }
948 const ALL: &[AnthropicModel] = &[
949 Self::ClaudeFable5,
950 Self::ClaudeHaiku45,
951 Self::ClaudeHaiku4520251001,
952 Self::ClaudeOpus41,
953 Self::ClaudeOpus4120250805,
954 Self::ClaudeOpus45,
955 Self::ClaudeOpus4520251101,
956 Self::ClaudeOpus46,
957 Self::ClaudeOpus47,
958 Self::ClaudeOpus48,
959 Self::ClaudeOpus5,
960 Self::ClaudeSonnet45,
961 Self::ClaudeSonnet4520250929,
962 Self::ClaudeSonnet46,
963 Self::ClaudeSonnet5,
964 ];
965}
966impl std::str::FromStr for AnthropicModel {
967 type Err = String;
968 #[allow(clippy::too_many_lines)]
969 fn from_str(s: &str) -> Result<Self, Self::Err> {
970 match s {
971 "claude-fable-5" => Ok(Self::ClaudeFable5),
972 "claude-haiku-4-5" => Ok(Self::ClaudeHaiku45),
973 "claude-haiku-4-5-20251001" => Ok(Self::ClaudeHaiku4520251001),
974 "claude-opus-4-1" => Ok(Self::ClaudeOpus41),
975 "claude-opus-4-1-20250805" => Ok(Self::ClaudeOpus4120250805),
976 "claude-opus-4-5" => Ok(Self::ClaudeOpus45),
977 "claude-opus-4-5-20251101" => Ok(Self::ClaudeOpus4520251101),
978 "claude-opus-4-6" => Ok(Self::ClaudeOpus46),
979 "claude-opus-4-7" => Ok(Self::ClaudeOpus47),
980 "claude-opus-4-8" => Ok(Self::ClaudeOpus48),
981 "claude-opus-5" => Ok(Self::ClaudeOpus5),
982 "claude-sonnet-4-5" => Ok(Self::ClaudeSonnet45),
983 "claude-sonnet-4-5-20250929" => Ok(Self::ClaudeSonnet4520250929),
984 "claude-sonnet-4-6" => Ok(Self::ClaudeSonnet46),
985 "claude-sonnet-5" => Ok(Self::ClaudeSonnet5),
986 _ => Err(format!("Unknown anthropic model: '{s}'")),
987 }
988 }
989}
990impl AzureFoundryModel {
991 #[allow(clippy::too_many_lines)]
992 fn model_id(self) -> &'static str {
993 match self {
994 Self::ClaudeFable5 => "claude-fable-5",
995 Self::ClaudeHaiku45 => "claude-haiku-4-5",
996 Self::ClaudeOpus41 => "claude-opus-4-1",
997 Self::ClaudeOpus45 => "claude-opus-4-5",
998 Self::ClaudeOpus46 => "claude-opus-4-6",
999 Self::ClaudeOpus48 => "claude-opus-4-8",
1000 Self::ClaudeOpus5 => "claude-opus-5",
1001 Self::ClaudeSonnet45 => "claude-sonnet-4-5",
1002 Self::ClaudeSonnet46 => "claude-sonnet-4-6",
1003 Self::ClaudeSonnet5 => "claude-sonnet-5",
1004 Self::Codestral2501 => "codestral-2501",
1005 Self::CodexMini => "codex-mini",
1006 Self::CohereCommandA => "cohere-command-a",
1007 Self::DeepseekV32 => "deepseek-v3.2",
1008 Self::Gpt4Turbo => "gpt-4-turbo",
1009 Self::Gpt4TurboVision => "gpt-4-turbo-vision",
1010 Self::Gpt41 => "gpt-4.1",
1011 Self::Gpt41Mini => "gpt-4.1-mini",
1012 Self::Gpt41Nano => "gpt-4.1-nano",
1013 Self::Gpt4o => "gpt-4o",
1014 Self::Gpt4oMini => "gpt-4o-mini",
1015 Self::Gpt5 => "gpt-5",
1016 Self::Gpt5Codex => "gpt-5-codex",
1017 Self::Gpt5Mini => "gpt-5-mini",
1018 Self::Gpt5Nano => "gpt-5-nano",
1019 Self::Gpt5Pro => "gpt-5-pro",
1020 Self::Gpt51 => "gpt-5.1",
1021 Self::Gpt51Codex => "gpt-5.1-codex",
1022 Self::Gpt51CodexMax => "gpt-5.1-codex-max",
1023 Self::Gpt51CodexMini => "gpt-5.1-codex-mini",
1024 Self::Gpt52 => "gpt-5.2",
1025 Self::Gpt52Codex => "gpt-5.2-codex",
1026 Self::Gpt53Codex => "gpt-5.3-codex",
1027 Self::Gpt54 => "gpt-5.4",
1028 Self::Gpt54Mini => "gpt-5.4-mini",
1029 Self::Gpt54Nano => "gpt-5.4-nano",
1030 Self::Gpt54Pro => "gpt-5.4-pro",
1031 Self::Gpt55 => "gpt-5.5",
1032 Self::Gpt56Luna => "gpt-5.6-luna",
1033 Self::Gpt56Sol => "gpt-5.6-sol",
1034 Self::Gpt56Terra => "gpt-5.6-terra",
1035 Self::Grok41FastNonReasoning => "grok-4-1-fast-non-reasoning",
1036 Self::Grok41FastReasoning => "grok-4-1-fast-reasoning",
1037 Self::Grok420NonReasoning => "grok-4-20-non-reasoning",
1038 Self::Grok420Reasoning => "grok-4-20-reasoning",
1039 Self::KimiK25 => "kimi-k2.5",
1040 Self::KimiK26 => "kimi-k2.6",
1041 Self::Llama3370bInstruct => "llama-3.3-70b-instruct",
1042 Self::Llama4Maverick17b128eInstructFp8 => {
1043 "llama-4-maverick-17b-128e-instruct-fp8"
1044 }
1045 Self::Llama4Scout17b16eInstruct => "llama-4-scout-17b-16e-instruct",
1046 Self::Ministral3b => "ministral-3b",
1047 Self::MistralMedium2505 => "mistral-medium-2505",
1048 Self::MistralSmall2503 => "mistral-small-2503",
1049 Self::ModelRouter => "model-router",
1050 Self::O1 => "o1",
1051 Self::O3 => "o3",
1052 Self::O3Mini => "o3-mini",
1053 Self::O4Mini => "o4-mini",
1054 Self::Phi4Mini => "phi-4-mini",
1055 Self::Phi4MiniReasoning => "phi-4-mini-reasoning",
1056 }
1057 }
1058 #[allow(clippy::too_many_lines)]
1059 fn display_name(self) -> &'static str {
1060 match self {
1061 Self::ClaudeFable5 => "Claude Fable 5",
1062 Self::ClaudeHaiku45 => "Claude Haiku 4.5",
1063 Self::ClaudeOpus41 => "Claude Opus 4.1",
1064 Self::ClaudeOpus45 => "Claude Opus 4.5",
1065 Self::ClaudeOpus46 => "Claude Opus 4.6",
1066 Self::ClaudeOpus48 => "Claude Opus 4.8",
1067 Self::ClaudeOpus5 => "Claude Opus 5",
1068 Self::ClaudeSonnet45 => "Claude Sonnet 4.5",
1069 Self::ClaudeSonnet46 => "Claude Sonnet 4.6",
1070 Self::ClaudeSonnet5 => "Claude Sonnet 5",
1071 Self::Codestral2501 => "Codestral 25.01",
1072 Self::CodexMini => "Codex Mini",
1073 Self::CohereCommandA => "Command A",
1074 Self::DeepseekV32 => "DeepSeek-V3.2",
1075 Self::Gpt4Turbo => "GPT-4 Turbo",
1076 Self::Gpt4TurboVision => "GPT-4 Turbo Vision",
1077 Self::Gpt41 => "GPT-4.1",
1078 Self::Gpt41Mini => "GPT-4.1 mini",
1079 Self::Gpt41Nano => "GPT-4.1 nano",
1080 Self::Gpt4o => "GPT-4o",
1081 Self::Gpt4oMini => "GPT-4o mini",
1082 Self::Gpt5 => "GPT-5",
1083 Self::Gpt5Mini => "GPT-5 Mini",
1084 Self::Gpt5Nano => "GPT-5 Nano",
1085 Self::Gpt5Pro => "GPT-5 Pro",
1086 Self::Gpt5Codex => "GPT-5-Codex",
1087 Self::Gpt51 => "GPT-5.1",
1088 Self::Gpt51Codex => "GPT-5.1 Codex",
1089 Self::Gpt51CodexMax => "GPT-5.1 Codex Max",
1090 Self::Gpt51CodexMini => "GPT-5.1 Codex Mini",
1091 Self::Gpt52 => "GPT-5.2",
1092 Self::Gpt52Codex => "GPT-5.2 Codex",
1093 Self::Gpt53Codex => "GPT-5.3 Codex",
1094 Self::Gpt54 => "GPT-5.4",
1095 Self::Gpt54Mini => "GPT-5.4 Mini",
1096 Self::Gpt54Nano => "GPT-5.4 Nano",
1097 Self::Gpt54Pro => "GPT-5.4 Pro",
1098 Self::Gpt55 => "GPT-5.5",
1099 Self::Gpt56Luna => "GPT-5.6 Luna",
1100 Self::Gpt56Sol => "GPT-5.6 Sol",
1101 Self::Gpt56Terra => "GPT-5.6 Terra",
1102 Self::Grok41FastNonReasoning => "Grok 4.1 Fast (Non-Reasoning)",
1103 Self::Grok41FastReasoning => "Grok 4.1 Fast (Reasoning)",
1104 Self::Grok420NonReasoning => "Grok 4.20 (Non-Reasoning)",
1105 Self::Grok420Reasoning => "Grok 4.20 (Reasoning)",
1106 Self::KimiK25 => "Kimi K2.5",
1107 Self::KimiK26 => "Kimi K2.6",
1108 Self::Llama4Maverick17b128eInstructFp8 => {
1109 "Llama 4 Maverick 17B 128E Instruct FP8"
1110 }
1111 Self::Llama4Scout17b16eInstruct => "Llama 4 Scout 17B 16E Instruct",
1112 Self::Llama3370bInstruct => "Llama-3.3-70B-Instruct",
1113 Self::Ministral3b => "Ministral 3B",
1114 Self::MistralMedium2505 => "Mistral Medium 3",
1115 Self::MistralSmall2503 => "Mistral Small 3.1",
1116 Self::ModelRouter => "Model Router",
1117 Self::Phi4Mini => "Phi-4-mini",
1118 Self::Phi4MiniReasoning => "Phi-4-mini-reasoning",
1119 Self::O1 => "o1",
1120 Self::O3 => "o3",
1121 Self::O3Mini => "o3-mini",
1122 Self::O4Mini => "o4-mini",
1123 }
1124 }
1125 #[allow(clippy::too_many_lines)]
1126 fn context_window(self) -> u32 {
1127 match self {
1128 Self::DeepseekV32
1129 | Self::Gpt4Turbo
1130 | Self::Gpt4TurboVision
1131 | Self::Gpt4o
1132 | Self::Gpt4oMini
1133 | Self::Grok41FastNonReasoning
1134 | Self::Grok41FastReasoning
1135 | Self::Llama3370bInstruct
1136 | Self::Llama4Scout17b16eInstruct
1137 | Self::Ministral3b
1138 | Self::MistralMedium2505
1139 | Self::MistralSmall2503
1140 | Self::Phi4Mini
1141 | Self::Phi4MiniReasoning => 128_000,
1142 Self::CohereCommandA => 131_072,
1143 Self::ClaudeHaiku45
1144 | Self::ClaudeOpus41
1145 | Self::ClaudeOpus45
1146 | Self::ClaudeSonnet45
1147 | Self::CodexMini
1148 | Self::ModelRouter
1149 | Self::O1
1150 | Self::O3
1151 | Self::O3Mini
1152 | Self::O4Mini => 200_000,
1153 Self::Codestral2501 => 256_000,
1154 Self::Grok420NonReasoning | Self::Grok420Reasoning => 262_000,
1155 Self::KimiK25 | Self::KimiK26 => 262_144,
1156 Self::Gpt5
1157 | Self::Gpt5Codex
1158 | Self::Gpt5Mini
1159 | Self::Gpt5Nano
1160 | Self::Gpt5Pro
1161 | Self::Gpt51
1162 | Self::Gpt51Codex
1163 | Self::Gpt51CodexMax
1164 | Self::Gpt51CodexMini
1165 | Self::Gpt52
1166 | Self::Gpt52Codex
1167 | Self::Gpt53Codex
1168 | Self::Gpt54Mini
1169 | Self::Gpt54Nano => 400_000,
1170 Self::ClaudeFable5
1171 | Self::ClaudeOpus46
1172 | Self::ClaudeOpus48
1173 | Self::ClaudeOpus5
1174 | Self::ClaudeSonnet46
1175 | Self::ClaudeSonnet5
1176 | Self::Llama4Maverick17b128eInstructFp8 => 1_000_000,
1177 Self::Gpt41 | Self::Gpt41Mini | Self::Gpt41Nano => 1_047_576,
1178 Self::Gpt54
1179 | Self::Gpt54Pro
1180 | Self::Gpt55
1181 | Self::Gpt56Luna
1182 | Self::Gpt56Sol
1183 | Self::Gpt56Terra => 1_050_000,
1184 }
1185 }
1186 #[allow(clippy::too_many_lines)]
1187 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1188 match self {
1189 Self::Codestral2501
1190 | Self::Gpt4Turbo
1191 | Self::Gpt4TurboVision
1192 | Self::Gpt41
1193 | Self::Gpt41Mini
1194 | Self::Gpt41Nano
1195 | Self::Gpt4o
1196 | Self::Gpt4oMini
1197 | Self::Grok41FastNonReasoning
1198 | Self::Grok420NonReasoning
1199 | Self::Llama3370bInstruct
1200 | Self::Llama4Maverick17b128eInstructFp8
1201 | Self::Llama4Scout17b16eInstruct
1202 | Self::Ministral3b
1203 | Self::MistralMedium2505
1204 | Self::MistralSmall2503
1205 | Self::ModelRouter
1206 | Self::Phi4Mini => &[],
1207 Self::Gpt5Pro => &[ReasoningEffort::High],
1208 Self::ClaudeHaiku45
1209 | Self::ClaudeOpus41
1210 | Self::ClaudeOpus45
1211 | Self::ClaudeSonnet45
1212 | Self::CodexMini
1213 | Self::CohereCommandA
1214 | Self::DeepseekV32
1215 | Self::Gpt5Codex
1216 | Self::Gpt51
1217 | Self::Gpt51Codex
1218 | Self::Gpt51CodexMini
1219 | Self::Grok41FastReasoning
1220 | Self::Grok420Reasoning
1221 | Self::KimiK25
1222 | Self::KimiK26
1223 | Self::O1
1224 | Self::O3
1225 | Self::O3Mini
1226 | Self::O4Mini
1227 | Self::Phi4MiniReasoning => {
1228 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
1229 }
1230 Self::ClaudeOpus46 | Self::ClaudeSonnet46 => {
1231 &[
1232 ReasoningEffort::Low,
1233 ReasoningEffort::Medium,
1234 ReasoningEffort::High,
1235 ReasoningEffort::Max,
1236 ]
1237 }
1238 Self::Gpt51CodexMax
1239 | Self::Gpt52
1240 | Self::Gpt52Codex
1241 | Self::Gpt53Codex
1242 | Self::Gpt54
1243 | Self::Gpt54Mini
1244 | Self::Gpt54Nano
1245 | Self::Gpt55 => {
1246 &[
1247 ReasoningEffort::Low,
1248 ReasoningEffort::Medium,
1249 ReasoningEffort::High,
1250 ReasoningEffort::Xhigh,
1251 ]
1252 }
1253 Self::ClaudeFable5
1254 | Self::ClaudeOpus48
1255 | Self::ClaudeOpus5
1256 | Self::ClaudeSonnet5
1257 | Self::Gpt56Luna
1258 | Self::Gpt56Sol
1259 | Self::Gpt56Terra => {
1260 &[
1261 ReasoningEffort::Low,
1262 ReasoningEffort::Medium,
1263 ReasoningEffort::High,
1264 ReasoningEffort::Xhigh,
1265 ReasoningEffort::Max,
1266 ]
1267 }
1268 Self::Gpt54Pro => {
1269 &[ReasoningEffort::Medium, ReasoningEffort::High, ReasoningEffort::Xhigh]
1270 }
1271 Self::Gpt5 | Self::Gpt5Mini | Self::Gpt5Nano => {
1272 &[
1273 ReasoningEffort::Minimal,
1274 ReasoningEffort::Low,
1275 ReasoningEffort::Medium,
1276 ReasoningEffort::High,
1277 ]
1278 }
1279 }
1280 }
1281 pub fn supports_reasoning(self) -> bool {
1282 !self.reasoning_levels().is_empty()
1283 }
1284 #[allow(clippy::too_many_lines)]
1285 pub fn supports_prompt_caching(self) -> bool {
1286 match self {
1287 Self::Codestral2501
1288 | Self::CohereCommandA
1289 | Self::DeepseekV32
1290 | Self::Gpt4Turbo
1291 | Self::Gpt4TurboVision
1292 | Self::Gpt5Pro
1293 | Self::Gpt54Pro
1294 | Self::Grok420NonReasoning
1295 | Self::Grok420Reasoning
1296 | Self::KimiK25
1297 | Self::KimiK26
1298 | Self::Llama3370bInstruct
1299 | Self::Llama4Maverick17b128eInstructFp8
1300 | Self::Llama4Scout17b16eInstruct
1301 | Self::Ministral3b
1302 | Self::MistralMedium2505
1303 | Self::MistralSmall2503
1304 | Self::ModelRouter
1305 | Self::Phi4Mini
1306 | Self::Phi4MiniReasoning => false,
1307 Self::ClaudeFable5
1308 | Self::ClaudeHaiku45
1309 | Self::ClaudeOpus41
1310 | Self::ClaudeOpus45
1311 | Self::ClaudeOpus46
1312 | Self::ClaudeOpus48
1313 | Self::ClaudeOpus5
1314 | Self::ClaudeSonnet45
1315 | Self::ClaudeSonnet46
1316 | Self::ClaudeSonnet5
1317 | Self::CodexMini
1318 | Self::Gpt41
1319 | Self::Gpt41Mini
1320 | Self::Gpt41Nano
1321 | Self::Gpt4o
1322 | Self::Gpt4oMini
1323 | Self::Gpt5
1324 | Self::Gpt5Codex
1325 | Self::Gpt5Mini
1326 | Self::Gpt5Nano
1327 | Self::Gpt51
1328 | Self::Gpt51Codex
1329 | Self::Gpt51CodexMax
1330 | Self::Gpt51CodexMini
1331 | Self::Gpt52
1332 | Self::Gpt52Codex
1333 | Self::Gpt53Codex
1334 | Self::Gpt54
1335 | Self::Gpt54Mini
1336 | Self::Gpt54Nano
1337 | Self::Gpt55
1338 | Self::Gpt56Luna
1339 | Self::Gpt56Sol
1340 | Self::Gpt56Terra
1341 | Self::Grok41FastNonReasoning
1342 | Self::Grok41FastReasoning
1343 | Self::O1
1344 | Self::O3
1345 | Self::O3Mini
1346 | Self::O4Mini => true,
1347 }
1348 }
1349 #[allow(clippy::too_many_lines)]
1350 pub fn supports_image(self) -> bool {
1351 match self {
1352 Self::Codestral2501
1353 | Self::CodexMini
1354 | Self::CohereCommandA
1355 | Self::DeepseekV32
1356 | Self::Grok420NonReasoning
1357 | Self::Grok420Reasoning
1358 | Self::Llama3370bInstruct
1359 | Self::Ministral3b
1360 | Self::O3Mini
1361 | Self::Phi4Mini
1362 | Self::Phi4MiniReasoning => false,
1363 Self::ClaudeFable5
1364 | Self::ClaudeHaiku45
1365 | Self::ClaudeOpus41
1366 | Self::ClaudeOpus45
1367 | Self::ClaudeOpus46
1368 | Self::ClaudeOpus48
1369 | Self::ClaudeOpus5
1370 | Self::ClaudeSonnet45
1371 | Self::ClaudeSonnet46
1372 | Self::ClaudeSonnet5
1373 | Self::Gpt4Turbo
1374 | Self::Gpt4TurboVision
1375 | Self::Gpt41
1376 | Self::Gpt41Mini
1377 | Self::Gpt41Nano
1378 | Self::Gpt4o
1379 | Self::Gpt4oMini
1380 | Self::Gpt5
1381 | Self::Gpt5Codex
1382 | Self::Gpt5Mini
1383 | Self::Gpt5Nano
1384 | Self::Gpt5Pro
1385 | Self::Gpt51
1386 | Self::Gpt51Codex
1387 | Self::Gpt51CodexMax
1388 | Self::Gpt51CodexMini
1389 | Self::Gpt52
1390 | Self::Gpt52Codex
1391 | Self::Gpt53Codex
1392 | Self::Gpt54
1393 | Self::Gpt54Mini
1394 | Self::Gpt54Nano
1395 | Self::Gpt54Pro
1396 | Self::Gpt55
1397 | Self::Gpt56Luna
1398 | Self::Gpt56Sol
1399 | Self::Gpt56Terra
1400 | Self::Grok41FastNonReasoning
1401 | Self::Grok41FastReasoning
1402 | Self::KimiK25
1403 | Self::KimiK26
1404 | Self::Llama4Maverick17b128eInstructFp8
1405 | Self::Llama4Scout17b16eInstruct
1406 | Self::MistralMedium2505
1407 | Self::MistralSmall2503
1408 | Self::ModelRouter
1409 | Self::O1
1410 | Self::O3
1411 | Self::O4Mini => true,
1412 }
1413 }
1414 #[allow(clippy::too_many_lines)]
1415 pub fn supports_audio(self) -> bool {
1416 match self {
1417 Self::ClaudeFable5
1418 | Self::ClaudeHaiku45
1419 | Self::ClaudeOpus41
1420 | Self::ClaudeOpus45
1421 | Self::ClaudeOpus46
1422 | Self::ClaudeOpus48
1423 | Self::ClaudeOpus5
1424 | Self::ClaudeSonnet45
1425 | Self::ClaudeSonnet46
1426 | Self::ClaudeSonnet5
1427 | Self::Codestral2501
1428 | Self::CodexMini
1429 | Self::CohereCommandA
1430 | Self::DeepseekV32
1431 | Self::Gpt4Turbo
1432 | Self::Gpt4TurboVision
1433 | Self::Gpt41
1434 | Self::Gpt41Mini
1435 | Self::Gpt41Nano
1436 | Self::Gpt4o
1437 | Self::Gpt4oMini
1438 | Self::Gpt5
1439 | Self::Gpt5Codex
1440 | Self::Gpt5Mini
1441 | Self::Gpt5Nano
1442 | Self::Gpt5Pro
1443 | Self::Gpt51CodexMax
1444 | Self::Gpt51CodexMini
1445 | Self::Gpt52
1446 | Self::Gpt52Codex
1447 | Self::Gpt53Codex
1448 | Self::Gpt54
1449 | Self::Gpt54Mini
1450 | Self::Gpt54Nano
1451 | Self::Gpt54Pro
1452 | Self::Gpt55
1453 | Self::Gpt56Luna
1454 | Self::Gpt56Sol
1455 | Self::Gpt56Terra
1456 | Self::Grok41FastNonReasoning
1457 | Self::Grok41FastReasoning
1458 | Self::Grok420NonReasoning
1459 | Self::Grok420Reasoning
1460 | Self::KimiK25
1461 | Self::KimiK26
1462 | Self::Llama3370bInstruct
1463 | Self::Llama4Maverick17b128eInstructFp8
1464 | Self::Llama4Scout17b16eInstruct
1465 | Self::Ministral3b
1466 | Self::MistralMedium2505
1467 | Self::MistralSmall2503
1468 | Self::ModelRouter
1469 | Self::O1
1470 | Self::O3
1471 | Self::O3Mini
1472 | Self::O4Mini
1473 | Self::Phi4Mini
1474 | Self::Phi4MiniReasoning => false,
1475 Self::Gpt51 | Self::Gpt51Codex => true,
1476 }
1477 }
1478 #[allow(clippy::too_many_lines)]
1479 pub fn transport(self) -> Option<ModelTransport> {
1480 match self {
1481 Self::ClaudeFable5
1482 | Self::ClaudeHaiku45
1483 | Self::ClaudeOpus41
1484 | Self::ClaudeOpus45
1485 | Self::ClaudeOpus46
1486 | Self::ClaudeOpus48
1487 | Self::ClaudeOpus5
1488 | Self::ClaudeSonnet45
1489 | Self::ClaudeSonnet46
1490 | Self::ClaudeSonnet5
1491 | Self::Codestral2501
1492 | Self::CodexMini
1493 | Self::CohereCommandA
1494 | Self::DeepseekV32
1495 | Self::Gpt4Turbo
1496 | Self::Gpt4TurboVision
1497 | Self::Gpt41
1498 | Self::Gpt41Mini
1499 | Self::Gpt41Nano
1500 | Self::Gpt4o
1501 | Self::Gpt4oMini
1502 | Self::Gpt5
1503 | Self::Gpt5Codex
1504 | Self::Gpt5Mini
1505 | Self::Gpt5Nano
1506 | Self::Gpt5Pro
1507 | Self::Gpt51
1508 | Self::Gpt51Codex
1509 | Self::Gpt51CodexMax
1510 | Self::Gpt51CodexMini
1511 | Self::Gpt52
1512 | Self::Gpt52Codex
1513 | Self::Gpt53Codex
1514 | Self::Gpt54
1515 | Self::Gpt54Mini
1516 | Self::Gpt54Nano
1517 | Self::Gpt54Pro
1518 | Self::Gpt55
1519 | Self::Gpt56Luna
1520 | Self::Gpt56Sol
1521 | Self::Gpt56Terra
1522 | Self::Grok41FastNonReasoning
1523 | Self::Grok41FastReasoning
1524 | Self::Grok420NonReasoning
1525 | Self::Grok420Reasoning
1526 | Self::KimiK25
1527 | Self::KimiK26
1528 | Self::Llama3370bInstruct
1529 | Self::Llama4Maverick17b128eInstructFp8
1530 | Self::Llama4Scout17b16eInstruct
1531 | Self::Ministral3b
1532 | Self::MistralMedium2505
1533 | Self::MistralSmall2503
1534 | Self::ModelRouter
1535 | Self::O1
1536 | Self::O3
1537 | Self::O3Mini
1538 | Self::O4Mini
1539 | Self::Phi4Mini
1540 | Self::Phi4MiniReasoning => None,
1541 }
1542 }
1543 const ALL: &[AzureFoundryModel] = &[
1544 Self::ClaudeFable5,
1545 Self::ClaudeHaiku45,
1546 Self::ClaudeOpus41,
1547 Self::ClaudeOpus45,
1548 Self::ClaudeOpus46,
1549 Self::ClaudeOpus48,
1550 Self::ClaudeOpus5,
1551 Self::ClaudeSonnet45,
1552 Self::ClaudeSonnet46,
1553 Self::ClaudeSonnet5,
1554 Self::Codestral2501,
1555 Self::CodexMini,
1556 Self::CohereCommandA,
1557 Self::DeepseekV32,
1558 Self::Gpt4Turbo,
1559 Self::Gpt4TurboVision,
1560 Self::Gpt41,
1561 Self::Gpt41Mini,
1562 Self::Gpt41Nano,
1563 Self::Gpt4o,
1564 Self::Gpt4oMini,
1565 Self::Gpt5,
1566 Self::Gpt5Codex,
1567 Self::Gpt5Mini,
1568 Self::Gpt5Nano,
1569 Self::Gpt5Pro,
1570 Self::Gpt51,
1571 Self::Gpt51Codex,
1572 Self::Gpt51CodexMax,
1573 Self::Gpt51CodexMini,
1574 Self::Gpt52,
1575 Self::Gpt52Codex,
1576 Self::Gpt53Codex,
1577 Self::Gpt54,
1578 Self::Gpt54Mini,
1579 Self::Gpt54Nano,
1580 Self::Gpt54Pro,
1581 Self::Gpt55,
1582 Self::Gpt56Luna,
1583 Self::Gpt56Sol,
1584 Self::Gpt56Terra,
1585 Self::Grok41FastNonReasoning,
1586 Self::Grok41FastReasoning,
1587 Self::Grok420NonReasoning,
1588 Self::Grok420Reasoning,
1589 Self::KimiK25,
1590 Self::KimiK26,
1591 Self::Llama3370bInstruct,
1592 Self::Llama4Maverick17b128eInstructFp8,
1593 Self::Llama4Scout17b16eInstruct,
1594 Self::Ministral3b,
1595 Self::MistralMedium2505,
1596 Self::MistralSmall2503,
1597 Self::ModelRouter,
1598 Self::O1,
1599 Self::O3,
1600 Self::O3Mini,
1601 Self::O4Mini,
1602 Self::Phi4Mini,
1603 Self::Phi4MiniReasoning,
1604 ];
1605}
1606impl std::str::FromStr for AzureFoundryModel {
1607 type Err = String;
1608 #[allow(clippy::too_many_lines)]
1609 fn from_str(s: &str) -> Result<Self, Self::Err> {
1610 match s {
1611 "claude-fable-5" => Ok(Self::ClaudeFable5),
1612 "claude-haiku-4-5" => Ok(Self::ClaudeHaiku45),
1613 "claude-opus-4-1" => Ok(Self::ClaudeOpus41),
1614 "claude-opus-4-5" => Ok(Self::ClaudeOpus45),
1615 "claude-opus-4-6" => Ok(Self::ClaudeOpus46),
1616 "claude-opus-4-8" => Ok(Self::ClaudeOpus48),
1617 "claude-opus-5" => Ok(Self::ClaudeOpus5),
1618 "claude-sonnet-4-5" => Ok(Self::ClaudeSonnet45),
1619 "claude-sonnet-4-6" => Ok(Self::ClaudeSonnet46),
1620 "claude-sonnet-5" => Ok(Self::ClaudeSonnet5),
1621 "codestral-2501" => Ok(Self::Codestral2501),
1622 "codex-mini" => Ok(Self::CodexMini),
1623 "cohere-command-a" => Ok(Self::CohereCommandA),
1624 "deepseek-v3.2" => Ok(Self::DeepseekV32),
1625 "gpt-4-turbo" => Ok(Self::Gpt4Turbo),
1626 "gpt-4-turbo-vision" => Ok(Self::Gpt4TurboVision),
1627 "gpt-4.1" => Ok(Self::Gpt41),
1628 "gpt-4.1-mini" => Ok(Self::Gpt41Mini),
1629 "gpt-4.1-nano" => Ok(Self::Gpt41Nano),
1630 "gpt-4o" => Ok(Self::Gpt4o),
1631 "gpt-4o-mini" => Ok(Self::Gpt4oMini),
1632 "gpt-5" => Ok(Self::Gpt5),
1633 "gpt-5-codex" => Ok(Self::Gpt5Codex),
1634 "gpt-5-mini" => Ok(Self::Gpt5Mini),
1635 "gpt-5-nano" => Ok(Self::Gpt5Nano),
1636 "gpt-5-pro" => Ok(Self::Gpt5Pro),
1637 "gpt-5.1" => Ok(Self::Gpt51),
1638 "gpt-5.1-codex" => Ok(Self::Gpt51Codex),
1639 "gpt-5.1-codex-max" => Ok(Self::Gpt51CodexMax),
1640 "gpt-5.1-codex-mini" => Ok(Self::Gpt51CodexMini),
1641 "gpt-5.2" => Ok(Self::Gpt52),
1642 "gpt-5.2-codex" => Ok(Self::Gpt52Codex),
1643 "gpt-5.3-codex" => Ok(Self::Gpt53Codex),
1644 "gpt-5.4" => Ok(Self::Gpt54),
1645 "gpt-5.4-mini" => Ok(Self::Gpt54Mini),
1646 "gpt-5.4-nano" => Ok(Self::Gpt54Nano),
1647 "gpt-5.4-pro" => Ok(Self::Gpt54Pro),
1648 "gpt-5.5" => Ok(Self::Gpt55),
1649 "gpt-5.6-luna" => Ok(Self::Gpt56Luna),
1650 "gpt-5.6-sol" => Ok(Self::Gpt56Sol),
1651 "gpt-5.6-terra" => Ok(Self::Gpt56Terra),
1652 "grok-4-1-fast-non-reasoning" => Ok(Self::Grok41FastNonReasoning),
1653 "grok-4-1-fast-reasoning" => Ok(Self::Grok41FastReasoning),
1654 "grok-4-20-non-reasoning" => Ok(Self::Grok420NonReasoning),
1655 "grok-4-20-reasoning" => Ok(Self::Grok420Reasoning),
1656 "kimi-k2.5" => Ok(Self::KimiK25),
1657 "kimi-k2.6" => Ok(Self::KimiK26),
1658 "llama-3.3-70b-instruct" => Ok(Self::Llama3370bInstruct),
1659 "llama-4-maverick-17b-128e-instruct-fp8" => {
1660 Ok(Self::Llama4Maverick17b128eInstructFp8)
1661 }
1662 "llama-4-scout-17b-16e-instruct" => Ok(Self::Llama4Scout17b16eInstruct),
1663 "ministral-3b" => Ok(Self::Ministral3b),
1664 "mistral-medium-2505" => Ok(Self::MistralMedium2505),
1665 "mistral-small-2503" => Ok(Self::MistralSmall2503),
1666 "model-router" => Ok(Self::ModelRouter),
1667 "o1" => Ok(Self::O1),
1668 "o3" => Ok(Self::O3),
1669 "o3-mini" => Ok(Self::O3Mini),
1670 "o4-mini" => Ok(Self::O4Mini),
1671 "phi-4-mini" => Ok(Self::Phi4Mini),
1672 "phi-4-mini-reasoning" => Ok(Self::Phi4MiniReasoning),
1673 _ => Err(format!("Unknown azure-foundry model: '{s}'")),
1674 }
1675 }
1676}
1677impl CodexModel {
1678 #[allow(clippy::too_many_lines)]
1679 fn model_id(self) -> &'static str {
1680 match self {
1681 Self::Gpt52 => "gpt-5.2",
1682 Self::Gpt54 => "gpt-5.4",
1683 Self::Gpt54Mini => "gpt-5.4-mini",
1684 Self::Gpt55 => "gpt-5.5",
1685 Self::Gpt56Luna => "gpt-5.6-luna",
1686 Self::Gpt56Sol => "gpt-5.6-sol",
1687 Self::Gpt56Terra => "gpt-5.6-terra",
1688 }
1689 }
1690 #[allow(clippy::too_many_lines)]
1691 fn display_name(self) -> &'static str {
1692 match self {
1693 Self::Gpt52 => "GPT-5.2",
1694 Self::Gpt54 => "GPT-5.4",
1695 Self::Gpt54Mini => "GPT-5.4 mini",
1696 Self::Gpt55 => "GPT-5.5",
1697 Self::Gpt56Luna => "GPT-5.6 Luna",
1698 Self::Gpt56Sol => "GPT-5.6 Sol",
1699 Self::Gpt56Terra => "GPT-5.6 Terra",
1700 }
1701 }
1702 #[allow(clippy::too_many_lines)]
1703 fn context_window(self) -> u32 {
1704 match self {
1705 Self::Gpt52 | Self::Gpt54 | Self::Gpt54Mini | Self::Gpt55 => 272_000,
1706 Self::Gpt56Luna | Self::Gpt56Sol | Self::Gpt56Terra => 372_000,
1707 }
1708 }
1709 #[allow(clippy::too_many_lines)]
1710 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1711 match self {
1712 Self::Gpt52 | Self::Gpt54 | Self::Gpt54Mini | Self::Gpt55 => {
1713 &[
1714 ReasoningEffort::Low,
1715 ReasoningEffort::Medium,
1716 ReasoningEffort::High,
1717 ReasoningEffort::Xhigh,
1718 ]
1719 }
1720 Self::Gpt56Luna | Self::Gpt56Sol | Self::Gpt56Terra => {
1721 &[
1722 ReasoningEffort::Low,
1723 ReasoningEffort::Medium,
1724 ReasoningEffort::High,
1725 ReasoningEffort::Xhigh,
1726 ReasoningEffort::Max,
1727 ]
1728 }
1729 }
1730 }
1731 pub fn supports_reasoning(self) -> bool {
1732 !self.reasoning_levels().is_empty()
1733 }
1734 #[allow(clippy::too_many_lines)]
1735 pub fn supports_prompt_caching(self) -> bool {
1736 match self {
1737 Self::Gpt52
1738 | Self::Gpt54
1739 | Self::Gpt54Mini
1740 | Self::Gpt55
1741 | Self::Gpt56Luna
1742 | Self::Gpt56Sol
1743 | Self::Gpt56Terra => true,
1744 }
1745 }
1746 #[allow(clippy::too_many_lines)]
1747 pub fn supports_image(self) -> bool {
1748 match self {
1749 Self::Gpt52
1750 | Self::Gpt54
1751 | Self::Gpt54Mini
1752 | Self::Gpt55
1753 | Self::Gpt56Luna
1754 | Self::Gpt56Sol
1755 | Self::Gpt56Terra => true,
1756 }
1757 }
1758 #[allow(clippy::too_many_lines)]
1759 pub fn supports_audio(self) -> bool {
1760 match self {
1761 Self::Gpt52
1762 | Self::Gpt54
1763 | Self::Gpt54Mini
1764 | Self::Gpt55
1765 | Self::Gpt56Luna
1766 | Self::Gpt56Sol
1767 | Self::Gpt56Terra => false,
1768 }
1769 }
1770 #[allow(clippy::too_many_lines)]
1771 pub fn transport(self) -> Option<ModelTransport> {
1772 match self {
1773 Self::Gpt52
1774 | Self::Gpt54
1775 | Self::Gpt54Mini
1776 | Self::Gpt55
1777 | Self::Gpt56Luna
1778 | Self::Gpt56Sol
1779 | Self::Gpt56Terra => None,
1780 }
1781 }
1782 const ALL: &[CodexModel] = &[
1783 Self::Gpt52,
1784 Self::Gpt54,
1785 Self::Gpt54Mini,
1786 Self::Gpt55,
1787 Self::Gpt56Luna,
1788 Self::Gpt56Sol,
1789 Self::Gpt56Terra,
1790 ];
1791}
1792impl std::str::FromStr for CodexModel {
1793 type Err = String;
1794 #[allow(clippy::too_many_lines)]
1795 fn from_str(s: &str) -> Result<Self, Self::Err> {
1796 match s {
1797 "gpt-5.2" => Ok(Self::Gpt52),
1798 "gpt-5.4" => Ok(Self::Gpt54),
1799 "gpt-5.4-mini" => Ok(Self::Gpt54Mini),
1800 "gpt-5.5" => Ok(Self::Gpt55),
1801 "gpt-5.6-luna" => Ok(Self::Gpt56Luna),
1802 "gpt-5.6-sol" => Ok(Self::Gpt56Sol),
1803 "gpt-5.6-terra" => Ok(Self::Gpt56Terra),
1804 _ => Err(format!("Unknown codex model: '{s}'")),
1805 }
1806 }
1807}
1808impl DeepSeekModel {
1809 #[allow(clippy::too_many_lines)]
1810 fn model_id(self) -> &'static str {
1811 match self {
1812 Self::DeepseekChat => "deepseek-chat",
1813 Self::DeepseekReasoner => "deepseek-reasoner",
1814 Self::DeepseekV4Flash => "deepseek-v4-flash",
1815 Self::DeepseekV4Pro => "deepseek-v4-pro",
1816 }
1817 }
1818 #[allow(clippy::too_many_lines)]
1819 fn display_name(self) -> &'static str {
1820 match self {
1821 Self::DeepseekChat => "DeepSeek Chat",
1822 Self::DeepseekReasoner => "DeepSeek Reasoner",
1823 Self::DeepseekV4Flash => "DeepSeek V4 Flash",
1824 Self::DeepseekV4Pro => "DeepSeek V4 Pro",
1825 }
1826 }
1827 #[allow(clippy::too_many_lines)]
1828 fn context_window(self) -> u32 {
1829 match self {
1830 Self::DeepseekChat
1831 | Self::DeepseekReasoner
1832 | Self::DeepseekV4Flash
1833 | Self::DeepseekV4Pro => 1_000_000,
1834 }
1835 }
1836 #[allow(clippy::too_many_lines)]
1837 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1838 match self {
1839 Self::DeepseekChat => &[],
1840 Self::DeepseekV4Flash | Self::DeepseekV4Pro => {
1841 &[ReasoningEffort::High, ReasoningEffort::Max]
1842 }
1843 Self::DeepseekReasoner => {
1844 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
1845 }
1846 }
1847 }
1848 pub fn supports_reasoning(self) -> bool {
1849 !self.reasoning_levels().is_empty()
1850 }
1851 #[allow(clippy::too_many_lines)]
1852 pub fn supports_prompt_caching(self) -> bool {
1853 match self {
1854 Self::DeepseekChat
1855 | Self::DeepseekReasoner
1856 | Self::DeepseekV4Flash
1857 | Self::DeepseekV4Pro => true,
1858 }
1859 }
1860 #[allow(clippy::too_many_lines)]
1861 pub fn supports_image(self) -> bool {
1862 match self {
1863 Self::DeepseekChat
1864 | Self::DeepseekReasoner
1865 | Self::DeepseekV4Flash
1866 | Self::DeepseekV4Pro => false,
1867 }
1868 }
1869 #[allow(clippy::too_many_lines)]
1870 pub fn supports_audio(self) -> bool {
1871 match self {
1872 Self::DeepseekChat
1873 | Self::DeepseekReasoner
1874 | Self::DeepseekV4Flash
1875 | Self::DeepseekV4Pro => false,
1876 }
1877 }
1878 #[allow(clippy::too_many_lines)]
1879 pub fn transport(self) -> Option<ModelTransport> {
1880 match self {
1881 Self::DeepseekChat
1882 | Self::DeepseekReasoner
1883 | Self::DeepseekV4Flash
1884 | Self::DeepseekV4Pro => None,
1885 }
1886 }
1887 const ALL: &[DeepSeekModel] = &[
1888 Self::DeepseekChat,
1889 Self::DeepseekReasoner,
1890 Self::DeepseekV4Flash,
1891 Self::DeepseekV4Pro,
1892 ];
1893}
1894impl std::str::FromStr for DeepSeekModel {
1895 type Err = String;
1896 #[allow(clippy::too_many_lines)]
1897 fn from_str(s: &str) -> Result<Self, Self::Err> {
1898 match s {
1899 "deepseek-chat" => Ok(Self::DeepseekChat),
1900 "deepseek-reasoner" => Ok(Self::DeepseekReasoner),
1901 "deepseek-v4-flash" => Ok(Self::DeepseekV4Flash),
1902 "deepseek-v4-pro" => Ok(Self::DeepseekV4Pro),
1903 _ => Err(format!("Unknown deepseek model: '{s}'")),
1904 }
1905 }
1906}
1907impl FireworksModel {
1908 #[allow(clippy::too_many_lines)]
1909 fn model_id(self) -> &'static str {
1910 match self {
1911 Self::AccountsFireworksModelsDeepseekV4Flash => {
1912 "accounts/fireworks/models/deepseek-v4-flash"
1913 }
1914 Self::AccountsFireworksModelsDeepseekV4Pro => {
1915 "accounts/fireworks/models/deepseek-v4-pro"
1916 }
1917 Self::AccountsFireworksModelsGlm5p2 => "accounts/fireworks/models/glm-5p2",
1918 Self::AccountsFireworksModelsGptOss120b => {
1919 "accounts/fireworks/models/gpt-oss-120b"
1920 }
1921 Self::AccountsFireworksModelsGptOss20b => {
1922 "accounts/fireworks/models/gpt-oss-20b"
1923 }
1924 Self::AccountsFireworksModelsKimiK2p6 => {
1925 "accounts/fireworks/models/kimi-k2p6"
1926 }
1927 Self::AccountsFireworksModelsKimiK2p7Code => {
1928 "accounts/fireworks/models/kimi-k2p7-code"
1929 }
1930 Self::AccountsFireworksModelsMinimaxM2p7 => {
1931 "accounts/fireworks/models/minimax-m2p7"
1932 }
1933 Self::AccountsFireworksModelsMinimaxM3 => {
1934 "accounts/fireworks/models/minimax-m3"
1935 }
1936 Self::AccountsFireworksModelsQwen3p7Plus => {
1937 "accounts/fireworks/models/qwen3p7-plus"
1938 }
1939 Self::AccountsFireworksRoutersGlm5p2Fast => {
1940 "accounts/fireworks/routers/glm-5p2-fast"
1941 }
1942 Self::AccountsFireworksRoutersKimiK2p6Fast => {
1943 "accounts/fireworks/routers/kimi-k2p6-fast"
1944 }
1945 Self::AccountsFireworksRoutersKimiK2p6Turbo => {
1946 "accounts/fireworks/routers/kimi-k2p6-turbo"
1947 }
1948 Self::AccountsFireworksRoutersKimiK2p7CodeFast => {
1949 "accounts/fireworks/routers/kimi-k2p7-code-fast"
1950 }
1951 }
1952 }
1953 #[allow(clippy::too_many_lines)]
1954 fn display_name(self) -> &'static str {
1955 match self {
1956 Self::AccountsFireworksModelsDeepseekV4Flash => "DeepSeek V4 Flash",
1957 Self::AccountsFireworksModelsDeepseekV4Pro => "DeepSeek V4 Pro",
1958 Self::AccountsFireworksModelsGlm5p2 => "GLM 5.2",
1959 Self::AccountsFireworksRoutersGlm5p2Fast => "GLM 5.2 Fast",
1960 Self::AccountsFireworksModelsGptOss120b => "GPT OSS 120B",
1961 Self::AccountsFireworksModelsGptOss20b => "GPT OSS 20B",
1962 Self::AccountsFireworksModelsKimiK2p6 => "Kimi K2.6",
1963 Self::AccountsFireworksRoutersKimiK2p6Fast => "Kimi K2.6 Fast",
1964 Self::AccountsFireworksRoutersKimiK2p6Turbo => "Kimi K2.6 Turbo",
1965 Self::AccountsFireworksModelsKimiK2p7Code => "Kimi K2.7 Code",
1966 Self::AccountsFireworksRoutersKimiK2p7CodeFast => "Kimi K2.7 Code Fast",
1967 Self::AccountsFireworksModelsMinimaxM2p7 => "MiniMax-M2.7",
1968 Self::AccountsFireworksModelsMinimaxM3 => "MiniMax-M3",
1969 Self::AccountsFireworksModelsQwen3p7Plus => "Qwen 3.7 Plus",
1970 }
1971 }
1972 #[allow(clippy::too_many_lines)]
1973 fn context_window(self) -> u32 {
1974 match self {
1975 Self::AccountsFireworksModelsGptOss120b
1976 | Self::AccountsFireworksModelsGptOss20b => 131_072,
1977 Self::AccountsFireworksModelsMinimaxM2p7 => 196_608,
1978 Self::AccountsFireworksModelsKimiK2p6
1979 | Self::AccountsFireworksModelsKimiK2p7Code
1980 | Self::AccountsFireworksRoutersKimiK2p6Fast
1981 | Self::AccountsFireworksRoutersKimiK2p6Turbo
1982 | Self::AccountsFireworksRoutersKimiK2p7CodeFast => 262_000,
1983 Self::AccountsFireworksModelsQwen3p7Plus => 262_144,
1984 Self::AccountsFireworksModelsMinimaxM3 => 512_000,
1985 Self::AccountsFireworksModelsDeepseekV4Flash
1986 | Self::AccountsFireworksModelsDeepseekV4Pro => 1_000_000,
1987 Self::AccountsFireworksModelsGlm5p2
1988 | Self::AccountsFireworksRoutersGlm5p2Fast => 1_048_575,
1989 }
1990 }
1991 #[allow(clippy::too_many_lines)]
1992 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1993 match self {
1994 Self::AccountsFireworksModelsDeepseekV4Flash
1995 | Self::AccountsFireworksModelsDeepseekV4Pro
1996 | Self::AccountsFireworksModelsGlm5p2
1997 | Self::AccountsFireworksRoutersGlm5p2Fast => {
1998 &[ReasoningEffort::High, ReasoningEffort::Max]
1999 }
2000 Self::AccountsFireworksModelsGptOss120b
2001 | Self::AccountsFireworksModelsGptOss20b
2002 | Self::AccountsFireworksModelsKimiK2p6
2003 | Self::AccountsFireworksModelsKimiK2p7Code
2004 | Self::AccountsFireworksModelsMinimaxM2p7
2005 | Self::AccountsFireworksModelsMinimaxM3
2006 | Self::AccountsFireworksModelsQwen3p7Plus
2007 | Self::AccountsFireworksRoutersKimiK2p6Fast
2008 | Self::AccountsFireworksRoutersKimiK2p6Turbo
2009 | Self::AccountsFireworksRoutersKimiK2p7CodeFast => {
2010 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
2011 }
2012 }
2013 }
2014 pub fn supports_reasoning(self) -> bool {
2015 !self.reasoning_levels().is_empty()
2016 }
2017 #[allow(clippy::too_many_lines)]
2018 pub fn supports_prompt_caching(self) -> bool {
2019 match self {
2020 Self::AccountsFireworksModelsDeepseekV4Flash
2021 | Self::AccountsFireworksModelsDeepseekV4Pro
2022 | Self::AccountsFireworksModelsGlm5p2
2023 | Self::AccountsFireworksModelsGptOss120b
2024 | Self::AccountsFireworksModelsGptOss20b
2025 | Self::AccountsFireworksModelsKimiK2p6
2026 | Self::AccountsFireworksModelsKimiK2p7Code
2027 | Self::AccountsFireworksModelsMinimaxM2p7
2028 | Self::AccountsFireworksModelsMinimaxM3
2029 | Self::AccountsFireworksModelsQwen3p7Plus
2030 | Self::AccountsFireworksRoutersGlm5p2Fast
2031 | Self::AccountsFireworksRoutersKimiK2p6Fast
2032 | Self::AccountsFireworksRoutersKimiK2p6Turbo
2033 | Self::AccountsFireworksRoutersKimiK2p7CodeFast => true,
2034 }
2035 }
2036 #[allow(clippy::too_many_lines)]
2037 pub fn supports_image(self) -> bool {
2038 match self {
2039 Self::AccountsFireworksModelsDeepseekV4Flash
2040 | Self::AccountsFireworksModelsDeepseekV4Pro
2041 | Self::AccountsFireworksModelsGlm5p2
2042 | Self::AccountsFireworksModelsGptOss120b
2043 | Self::AccountsFireworksModelsGptOss20b
2044 | Self::AccountsFireworksModelsMinimaxM2p7
2045 | Self::AccountsFireworksRoutersGlm5p2Fast => false,
2046 Self::AccountsFireworksModelsKimiK2p6
2047 | Self::AccountsFireworksModelsKimiK2p7Code
2048 | Self::AccountsFireworksModelsMinimaxM3
2049 | Self::AccountsFireworksModelsQwen3p7Plus
2050 | Self::AccountsFireworksRoutersKimiK2p6Fast
2051 | Self::AccountsFireworksRoutersKimiK2p6Turbo
2052 | Self::AccountsFireworksRoutersKimiK2p7CodeFast => true,
2053 }
2054 }
2055 #[allow(clippy::too_many_lines)]
2056 pub fn supports_audio(self) -> bool {
2057 match self {
2058 Self::AccountsFireworksModelsDeepseekV4Flash
2059 | Self::AccountsFireworksModelsDeepseekV4Pro
2060 | Self::AccountsFireworksModelsGlm5p2
2061 | Self::AccountsFireworksModelsGptOss120b
2062 | Self::AccountsFireworksModelsGptOss20b
2063 | Self::AccountsFireworksModelsKimiK2p6
2064 | Self::AccountsFireworksModelsKimiK2p7Code
2065 | Self::AccountsFireworksModelsMinimaxM2p7
2066 | Self::AccountsFireworksModelsMinimaxM3
2067 | Self::AccountsFireworksModelsQwen3p7Plus
2068 | Self::AccountsFireworksRoutersGlm5p2Fast
2069 | Self::AccountsFireworksRoutersKimiK2p6Fast
2070 | Self::AccountsFireworksRoutersKimiK2p6Turbo
2071 | Self::AccountsFireworksRoutersKimiK2p7CodeFast => false,
2072 }
2073 }
2074 #[allow(clippy::too_many_lines)]
2075 pub fn transport(self) -> Option<ModelTransport> {
2076 match self {
2077 Self::AccountsFireworksModelsDeepseekV4Flash
2078 | Self::AccountsFireworksModelsDeepseekV4Pro
2079 | Self::AccountsFireworksModelsGlm5p2
2080 | Self::AccountsFireworksModelsGptOss120b
2081 | Self::AccountsFireworksModelsGptOss20b
2082 | Self::AccountsFireworksModelsKimiK2p6
2083 | Self::AccountsFireworksModelsKimiK2p7Code
2084 | Self::AccountsFireworksModelsMinimaxM2p7
2085 | Self::AccountsFireworksModelsMinimaxM3
2086 | Self::AccountsFireworksModelsQwen3p7Plus
2087 | Self::AccountsFireworksRoutersGlm5p2Fast
2088 | Self::AccountsFireworksRoutersKimiK2p6Fast
2089 | Self::AccountsFireworksRoutersKimiK2p6Turbo
2090 | Self::AccountsFireworksRoutersKimiK2p7CodeFast => None,
2091 }
2092 }
2093 const ALL: &[FireworksModel] = &[
2094 Self::AccountsFireworksModelsDeepseekV4Flash,
2095 Self::AccountsFireworksModelsDeepseekV4Pro,
2096 Self::AccountsFireworksModelsGlm5p2,
2097 Self::AccountsFireworksModelsGptOss120b,
2098 Self::AccountsFireworksModelsGptOss20b,
2099 Self::AccountsFireworksModelsKimiK2p6,
2100 Self::AccountsFireworksModelsKimiK2p7Code,
2101 Self::AccountsFireworksModelsMinimaxM2p7,
2102 Self::AccountsFireworksModelsMinimaxM3,
2103 Self::AccountsFireworksModelsQwen3p7Plus,
2104 Self::AccountsFireworksRoutersGlm5p2Fast,
2105 Self::AccountsFireworksRoutersKimiK2p6Fast,
2106 Self::AccountsFireworksRoutersKimiK2p6Turbo,
2107 Self::AccountsFireworksRoutersKimiK2p7CodeFast,
2108 ];
2109}
2110impl std::str::FromStr for FireworksModel {
2111 type Err = String;
2112 #[allow(clippy::too_many_lines)]
2113 fn from_str(s: &str) -> Result<Self, Self::Err> {
2114 match s {
2115 "accounts/fireworks/models/deepseek-v4-flash" => {
2116 Ok(Self::AccountsFireworksModelsDeepseekV4Flash)
2117 }
2118 "accounts/fireworks/models/deepseek-v4-pro" => {
2119 Ok(Self::AccountsFireworksModelsDeepseekV4Pro)
2120 }
2121 "accounts/fireworks/models/glm-5p2" => {
2122 Ok(Self::AccountsFireworksModelsGlm5p2)
2123 }
2124 "accounts/fireworks/models/gpt-oss-120b" => {
2125 Ok(Self::AccountsFireworksModelsGptOss120b)
2126 }
2127 "accounts/fireworks/models/gpt-oss-20b" => {
2128 Ok(Self::AccountsFireworksModelsGptOss20b)
2129 }
2130 "accounts/fireworks/models/kimi-k2p6" => {
2131 Ok(Self::AccountsFireworksModelsKimiK2p6)
2132 }
2133 "accounts/fireworks/models/kimi-k2p7-code" => {
2134 Ok(Self::AccountsFireworksModelsKimiK2p7Code)
2135 }
2136 "accounts/fireworks/models/minimax-m2p7" => {
2137 Ok(Self::AccountsFireworksModelsMinimaxM2p7)
2138 }
2139 "accounts/fireworks/models/minimax-m3" => {
2140 Ok(Self::AccountsFireworksModelsMinimaxM3)
2141 }
2142 "accounts/fireworks/models/qwen3p7-plus" => {
2143 Ok(Self::AccountsFireworksModelsQwen3p7Plus)
2144 }
2145 "accounts/fireworks/routers/glm-5p2-fast" => {
2146 Ok(Self::AccountsFireworksRoutersGlm5p2Fast)
2147 }
2148 "accounts/fireworks/routers/kimi-k2p6-fast" => {
2149 Ok(Self::AccountsFireworksRoutersKimiK2p6Fast)
2150 }
2151 "accounts/fireworks/routers/kimi-k2p6-turbo" => {
2152 Ok(Self::AccountsFireworksRoutersKimiK2p6Turbo)
2153 }
2154 "accounts/fireworks/routers/kimi-k2p7-code-fast" => {
2155 Ok(Self::AccountsFireworksRoutersKimiK2p7CodeFast)
2156 }
2157 _ => Err(format!("Unknown fireworks model: '{s}'")),
2158 }
2159 }
2160}
2161impl GeminiModel {
2162 #[allow(clippy::too_many_lines)]
2163 fn model_id(self) -> &'static str {
2164 match self {
2165 Self::DeepResearchMaxPreview042026 => "deep-research-max-preview-04-2026",
2166 Self::DeepResearchPreview042026 => "deep-research-preview-04-2026",
2167 Self::Gemini20Flash => "gemini-2.0-flash",
2168 Self::Gemini20FlashLite => "gemini-2.0-flash-lite",
2169 Self::Gemini25ComputerUsePreview102025 => {
2170 "gemini-2.5-computer-use-preview-10-2025"
2171 }
2172 Self::Gemini25Flash => "gemini-2.5-flash",
2173 Self::Gemini25FlashLite => "gemini-2.5-flash-lite",
2174 Self::Gemini25Pro => "gemini-2.5-pro",
2175 Self::Gemini3FlashPreview => "gemini-3-flash-preview",
2176 Self::Gemini3ProPreview => "gemini-3-pro-preview",
2177 Self::Gemini31FlashLite => "gemini-3.1-flash-lite",
2178 Self::Gemini31FlashLiteImage => "gemini-3.1-flash-lite-image",
2179 Self::Gemini31FlashLitePreview => "gemini-3.1-flash-lite-preview",
2180 Self::Gemini31FlashLivePreview => "gemini-3.1-flash-live-preview",
2181 Self::Gemini31ProPreview => "gemini-3.1-pro-preview",
2182 Self::Gemini31ProPreviewCustomtools => "gemini-3.1-pro-preview-customtools",
2183 Self::Gemini35Flash => "gemini-3.5-flash",
2184 Self::Gemini35FlashLite => "gemini-3.5-flash-lite",
2185 Self::Gemini36Flash => "gemini-3.6-flash",
2186 Self::GeminiRoboticsEr16Preview => "gemini-robotics-er-1.6-preview",
2187 Self::Gemma426bA4bIt => "gemma-4-26b-a4b-it",
2188 Self::Gemma431bIt => "gemma-4-31b-it",
2189 }
2190 }
2191 #[allow(clippy::too_many_lines)]
2192 fn display_name(self) -> &'static str {
2193 match self {
2194 Self::DeepResearchMaxPreview042026 => {
2195 "Deep Research Max Preview (Apr-21-2026)"
2196 }
2197 Self::DeepResearchPreview042026 => "Deep Research Preview (Apr-21-2026)",
2198 Self::Gemini20Flash => "Gemini 2.0 Flash",
2199 Self::Gemini20FlashLite => "Gemini 2.0 Flash-Lite",
2200 Self::Gemini25ComputerUsePreview102025 => {
2201 "Gemini 2.5 Computer Use Preview 10-2025"
2202 }
2203 Self::Gemini25Flash => "Gemini 2.5 Flash",
2204 Self::Gemini25FlashLite => "Gemini 2.5 Flash-Lite",
2205 Self::Gemini25Pro => "Gemini 2.5 Pro",
2206 Self::Gemini3FlashPreview => "Gemini 3 Flash Preview",
2207 Self::Gemini3ProPreview => "Gemini 3 Pro Preview",
2208 Self::Gemini31FlashLite => "Gemini 3.1 Flash Lite",
2209 Self::Gemini31FlashLitePreview => "Gemini 3.1 Flash Lite Preview",
2210 Self::Gemini31FlashLivePreview => "Gemini 3.1 Flash Live Preview",
2211 Self::Gemini31ProPreview => "Gemini 3.1 Pro Preview",
2212 Self::Gemini31ProPreviewCustomtools => "Gemini 3.1 Pro Preview Custom Tools",
2213 Self::Gemini35Flash => "Gemini 3.5 Flash",
2214 Self::Gemini35FlashLite => "Gemini 3.5 Flash Lite",
2215 Self::Gemini36Flash => "Gemini 3.6 Flash",
2216 Self::GeminiRoboticsEr16Preview => "Gemini Robotics-ER 1.6 Preview",
2217 Self::Gemma426bA4bIt => "Gemma 4 26B A4B IT",
2218 Self::Gemma431bIt => "Gemma 4 31B IT",
2219 Self::Gemini31FlashLiteImage => "Nano Banana 2 Lite",
2220 }
2221 }
2222 #[allow(clippy::too_many_lines)]
2223 fn context_window(self) -> u32 {
2224 match self {
2225 Self::Gemini31FlashLiteImage => 65_536,
2226 Self::DeepResearchMaxPreview042026
2227 | Self::DeepResearchPreview042026
2228 | Self::Gemini25ComputerUsePreview102025
2229 | Self::Gemini31FlashLivePreview
2230 | Self::GeminiRoboticsEr16Preview => 131_072,
2231 Self::Gemma426bA4bIt | Self::Gemma431bIt => 262_144,
2232 Self::Gemini20Flash
2233 | Self::Gemini20FlashLite
2234 | Self::Gemini25Flash
2235 | Self::Gemini25FlashLite
2236 | Self::Gemini25Pro
2237 | Self::Gemini3FlashPreview
2238 | Self::Gemini3ProPreview
2239 | Self::Gemini31FlashLite
2240 | Self::Gemini31FlashLitePreview
2241 | Self::Gemini31ProPreview
2242 | Self::Gemini31ProPreviewCustomtools
2243 | Self::Gemini35Flash
2244 | Self::Gemini35FlashLite
2245 | Self::Gemini36Flash => 1_048_576,
2246 }
2247 }
2248 #[allow(clippy::too_many_lines)]
2249 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
2250 match self {
2251 Self::Gemini20Flash | Self::Gemini20FlashLite => &[],
2252 Self::Gemini3ProPreview => &[ReasoningEffort::Low, ReasoningEffort::High],
2253 Self::DeepResearchMaxPreview042026
2254 | Self::DeepResearchPreview042026
2255 | Self::Gemini25ComputerUsePreview102025
2256 | Self::Gemini25Flash
2257 | Self::Gemini25FlashLite
2258 | Self::Gemini25Pro
2259 | Self::Gemini31ProPreview
2260 | Self::Gemini31ProPreviewCustomtools
2261 | Self::GeminiRoboticsEr16Preview
2262 | Self::Gemma426bA4bIt
2263 | Self::Gemma431bIt => {
2264 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
2265 }
2266 Self::Gemini31FlashLiteImage => {
2267 &[ReasoningEffort::Minimal, ReasoningEffort::High]
2268 }
2269 Self::Gemini3FlashPreview
2270 | Self::Gemini31FlashLite
2271 | Self::Gemini31FlashLitePreview
2272 | Self::Gemini31FlashLivePreview
2273 | Self::Gemini35Flash
2274 | Self::Gemini35FlashLite
2275 | Self::Gemini36Flash => {
2276 &[
2277 ReasoningEffort::Minimal,
2278 ReasoningEffort::Low,
2279 ReasoningEffort::Medium,
2280 ReasoningEffort::High,
2281 ]
2282 }
2283 }
2284 }
2285 pub fn supports_reasoning(self) -> bool {
2286 !self.reasoning_levels().is_empty()
2287 }
2288 #[allow(clippy::too_many_lines)]
2289 pub fn supports_prompt_caching(self) -> bool {
2290 match self {
2291 Self::Gemini20FlashLite
2292 | Self::Gemini25ComputerUsePreview102025
2293 | Self::Gemini31FlashLiteImage
2294 | Self::Gemini31FlashLivePreview
2295 | Self::GeminiRoboticsEr16Preview
2296 | Self::Gemma426bA4bIt
2297 | Self::Gemma431bIt => false,
2298 Self::DeepResearchMaxPreview042026
2299 | Self::DeepResearchPreview042026
2300 | Self::Gemini20Flash
2301 | Self::Gemini25Flash
2302 | Self::Gemini25FlashLite
2303 | Self::Gemini25Pro
2304 | Self::Gemini3FlashPreview
2305 | Self::Gemini3ProPreview
2306 | Self::Gemini31FlashLite
2307 | Self::Gemini31FlashLitePreview
2308 | Self::Gemini31ProPreview
2309 | Self::Gemini31ProPreviewCustomtools
2310 | Self::Gemini35Flash
2311 | Self::Gemini35FlashLite
2312 | Self::Gemini36Flash => true,
2313 }
2314 }
2315 #[allow(clippy::too_many_lines)]
2316 pub fn supports_image(self) -> bool {
2317 match self {
2318 Self::DeepResearchMaxPreview042026
2319 | Self::DeepResearchPreview042026
2320 | Self::Gemini20Flash
2321 | Self::Gemini20FlashLite
2322 | Self::Gemini25ComputerUsePreview102025
2323 | Self::Gemini25Flash
2324 | Self::Gemini25FlashLite
2325 | Self::Gemini25Pro
2326 | Self::Gemini3FlashPreview
2327 | Self::Gemini3ProPreview
2328 | Self::Gemini31FlashLite
2329 | Self::Gemini31FlashLiteImage
2330 | Self::Gemini31FlashLitePreview
2331 | Self::Gemini31FlashLivePreview
2332 | Self::Gemini31ProPreview
2333 | Self::Gemini31ProPreviewCustomtools
2334 | Self::Gemini35Flash
2335 | Self::Gemini35FlashLite
2336 | Self::Gemini36Flash
2337 | Self::GeminiRoboticsEr16Preview
2338 | Self::Gemma426bA4bIt
2339 | Self::Gemma431bIt => true,
2340 }
2341 }
2342 #[allow(clippy::too_many_lines)]
2343 pub fn supports_audio(self) -> bool {
2344 match self {
2345 Self::Gemini25ComputerUsePreview102025
2346 | Self::Gemini31FlashLiteImage
2347 | Self::Gemma426bA4bIt
2348 | Self::Gemma431bIt => false,
2349 Self::DeepResearchMaxPreview042026
2350 | Self::DeepResearchPreview042026
2351 | Self::Gemini20Flash
2352 | Self::Gemini20FlashLite
2353 | Self::Gemini25Flash
2354 | Self::Gemini25FlashLite
2355 | Self::Gemini25Pro
2356 | Self::Gemini3FlashPreview
2357 | Self::Gemini3ProPreview
2358 | Self::Gemini31FlashLite
2359 | Self::Gemini31FlashLitePreview
2360 | Self::Gemini31FlashLivePreview
2361 | Self::Gemini31ProPreview
2362 | Self::Gemini31ProPreviewCustomtools
2363 | Self::Gemini35Flash
2364 | Self::Gemini35FlashLite
2365 | Self::Gemini36Flash
2366 | Self::GeminiRoboticsEr16Preview => true,
2367 }
2368 }
2369 #[allow(clippy::too_many_lines)]
2370 pub fn transport(self) -> Option<ModelTransport> {
2371 match self {
2372 Self::DeepResearchMaxPreview042026
2373 | Self::DeepResearchPreview042026
2374 | Self::Gemini20Flash
2375 | Self::Gemini20FlashLite
2376 | Self::Gemini25ComputerUsePreview102025
2377 | Self::Gemini25Flash
2378 | Self::Gemini25FlashLite
2379 | Self::Gemini25Pro
2380 | Self::Gemini3FlashPreview
2381 | Self::Gemini3ProPreview
2382 | Self::Gemini31FlashLite
2383 | Self::Gemini31FlashLiteImage
2384 | Self::Gemini31FlashLitePreview
2385 | Self::Gemini31FlashLivePreview
2386 | Self::Gemini31ProPreview
2387 | Self::Gemini31ProPreviewCustomtools
2388 | Self::Gemini35Flash
2389 | Self::Gemini35FlashLite
2390 | Self::Gemini36Flash
2391 | Self::GeminiRoboticsEr16Preview
2392 | Self::Gemma426bA4bIt
2393 | Self::Gemma431bIt => None,
2394 }
2395 }
2396 const ALL: &[GeminiModel] = &[
2397 Self::DeepResearchMaxPreview042026,
2398 Self::DeepResearchPreview042026,
2399 Self::Gemini20Flash,
2400 Self::Gemini20FlashLite,
2401 Self::Gemini25ComputerUsePreview102025,
2402 Self::Gemini25Flash,
2403 Self::Gemini25FlashLite,
2404 Self::Gemini25Pro,
2405 Self::Gemini3FlashPreview,
2406 Self::Gemini3ProPreview,
2407 Self::Gemini31FlashLite,
2408 Self::Gemini31FlashLiteImage,
2409 Self::Gemini31FlashLitePreview,
2410 Self::Gemini31FlashLivePreview,
2411 Self::Gemini31ProPreview,
2412 Self::Gemini31ProPreviewCustomtools,
2413 Self::Gemini35Flash,
2414 Self::Gemini35FlashLite,
2415 Self::Gemini36Flash,
2416 Self::GeminiRoboticsEr16Preview,
2417 Self::Gemma426bA4bIt,
2418 Self::Gemma431bIt,
2419 ];
2420}
2421impl std::str::FromStr for GeminiModel {
2422 type Err = String;
2423 #[allow(clippy::too_many_lines)]
2424 fn from_str(s: &str) -> Result<Self, Self::Err> {
2425 match s {
2426 "deep-research-max-preview-04-2026" => Ok(Self::DeepResearchMaxPreview042026),
2427 "deep-research-preview-04-2026" => Ok(Self::DeepResearchPreview042026),
2428 "gemini-2.0-flash" => Ok(Self::Gemini20Flash),
2429 "gemini-2.0-flash-lite" => Ok(Self::Gemini20FlashLite),
2430 "gemini-2.5-computer-use-preview-10-2025" => {
2431 Ok(Self::Gemini25ComputerUsePreview102025)
2432 }
2433 "gemini-2.5-flash" => Ok(Self::Gemini25Flash),
2434 "gemini-2.5-flash-lite" => Ok(Self::Gemini25FlashLite),
2435 "gemini-2.5-pro" => Ok(Self::Gemini25Pro),
2436 "gemini-3-flash-preview" => Ok(Self::Gemini3FlashPreview),
2437 "gemini-3-pro-preview" => Ok(Self::Gemini3ProPreview),
2438 "gemini-3.1-flash-lite" => Ok(Self::Gemini31FlashLite),
2439 "gemini-3.1-flash-lite-image" => Ok(Self::Gemini31FlashLiteImage),
2440 "gemini-3.1-flash-lite-preview" => Ok(Self::Gemini31FlashLitePreview),
2441 "gemini-3.1-flash-live-preview" => Ok(Self::Gemini31FlashLivePreview),
2442 "gemini-3.1-pro-preview" => Ok(Self::Gemini31ProPreview),
2443 "gemini-3.1-pro-preview-customtools" => {
2444 Ok(Self::Gemini31ProPreviewCustomtools)
2445 }
2446 "gemini-3.5-flash" => Ok(Self::Gemini35Flash),
2447 "gemini-3.5-flash-lite" => Ok(Self::Gemini35FlashLite),
2448 "gemini-3.6-flash" => Ok(Self::Gemini36Flash),
2449 "gemini-robotics-er-1.6-preview" => Ok(Self::GeminiRoboticsEr16Preview),
2450 "gemma-4-26b-a4b-it" => Ok(Self::Gemma426bA4bIt),
2451 "gemma-4-31b-it" => Ok(Self::Gemma431bIt),
2452 _ => Err(format!("Unknown gemini model: '{s}'")),
2453 }
2454 }
2455}
2456impl MoonshotModel {
2457 #[allow(clippy::too_many_lines)]
2458 fn model_id(self) -> &'static str {
2459 match self {
2460 Self::KimiK20711Preview => "kimi-k2-0711-preview",
2461 Self::KimiK20905Preview => "kimi-k2-0905-preview",
2462 Self::KimiK2Thinking => "kimi-k2-thinking",
2463 Self::KimiK2ThinkingTurbo => "kimi-k2-thinking-turbo",
2464 Self::KimiK2TurboPreview => "kimi-k2-turbo-preview",
2465 Self::KimiK25 => "kimi-k2.5",
2466 Self::KimiK26 => "kimi-k2.6",
2467 Self::KimiK27Code => "kimi-k2.7-code",
2468 Self::KimiK27CodeHighspeed => "kimi-k2.7-code-highspeed",
2469 Self::KimiK3 => "kimi-k3",
2470 }
2471 }
2472 #[allow(clippy::too_many_lines)]
2473 fn display_name(self) -> &'static str {
2474 match self {
2475 Self::KimiK20711Preview => "Kimi K2 0711",
2476 Self::KimiK20905Preview => "Kimi K2 0905",
2477 Self::KimiK2Thinking => "Kimi K2 Thinking",
2478 Self::KimiK2ThinkingTurbo => "Kimi K2 Thinking Turbo",
2479 Self::KimiK2TurboPreview => "Kimi K2 Turbo",
2480 Self::KimiK25 => "Kimi K2.5",
2481 Self::KimiK26 => "Kimi K2.6",
2482 Self::KimiK27Code => "Kimi K2.7 Code",
2483 Self::KimiK27CodeHighspeed => "Kimi K2.7 Code HighSpeed",
2484 Self::KimiK3 => "Kimi K3",
2485 }
2486 }
2487 #[allow(clippy::too_many_lines)]
2488 fn context_window(self) -> u32 {
2489 match self {
2490 Self::KimiK20711Preview => 131_072,
2491 Self::KimiK20905Preview
2492 | Self::KimiK2Thinking
2493 | Self::KimiK2ThinkingTurbo
2494 | Self::KimiK2TurboPreview
2495 | Self::KimiK25
2496 | Self::KimiK26
2497 | Self::KimiK27Code
2498 | Self::KimiK27CodeHighspeed => 262_144,
2499 Self::KimiK3 => 1_048_576,
2500 }
2501 }
2502 #[allow(clippy::too_many_lines)]
2503 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
2504 match self {
2505 Self::KimiK20711Preview
2506 | Self::KimiK20905Preview
2507 | Self::KimiK2TurboPreview => &[],
2508 Self::KimiK3 => {
2509 &[ReasoningEffort::Low, ReasoningEffort::High, ReasoningEffort::Max]
2510 }
2511 Self::KimiK2Thinking
2512 | Self::KimiK2ThinkingTurbo
2513 | Self::KimiK25
2514 | Self::KimiK26
2515 | Self::KimiK27Code
2516 | Self::KimiK27CodeHighspeed => {
2517 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
2518 }
2519 }
2520 }
2521 pub fn supports_reasoning(self) -> bool {
2522 !self.reasoning_levels().is_empty()
2523 }
2524 #[allow(clippy::too_many_lines)]
2525 pub fn supports_prompt_caching(self) -> bool {
2526 match self {
2527 Self::KimiK20711Preview
2528 | Self::KimiK20905Preview
2529 | Self::KimiK2Thinking
2530 | Self::KimiK2ThinkingTurbo
2531 | Self::KimiK2TurboPreview
2532 | Self::KimiK25
2533 | Self::KimiK26
2534 | Self::KimiK27Code
2535 | Self::KimiK27CodeHighspeed
2536 | Self::KimiK3 => true,
2537 }
2538 }
2539 #[allow(clippy::too_many_lines)]
2540 pub fn supports_image(self) -> bool {
2541 match self {
2542 Self::KimiK20711Preview
2543 | Self::KimiK20905Preview
2544 | Self::KimiK2Thinking
2545 | Self::KimiK2ThinkingTurbo
2546 | Self::KimiK2TurboPreview => false,
2547 Self::KimiK25
2548 | Self::KimiK26
2549 | Self::KimiK27Code
2550 | Self::KimiK27CodeHighspeed
2551 | Self::KimiK3 => true,
2552 }
2553 }
2554 #[allow(clippy::too_many_lines)]
2555 pub fn supports_audio(self) -> bool {
2556 match self {
2557 Self::KimiK20711Preview
2558 | Self::KimiK20905Preview
2559 | Self::KimiK2Thinking
2560 | Self::KimiK2ThinkingTurbo
2561 | Self::KimiK2TurboPreview
2562 | Self::KimiK25
2563 | Self::KimiK26
2564 | Self::KimiK27Code
2565 | Self::KimiK27CodeHighspeed
2566 | Self::KimiK3 => false,
2567 }
2568 }
2569 #[allow(clippy::too_many_lines)]
2570 pub fn transport(self) -> Option<ModelTransport> {
2571 match self {
2572 Self::KimiK20711Preview
2573 | Self::KimiK20905Preview
2574 | Self::KimiK2Thinking
2575 | Self::KimiK2ThinkingTurbo
2576 | Self::KimiK2TurboPreview
2577 | Self::KimiK25
2578 | Self::KimiK26
2579 | Self::KimiK27Code
2580 | Self::KimiK27CodeHighspeed
2581 | Self::KimiK3 => None,
2582 }
2583 }
2584 const ALL: &[MoonshotModel] = &[
2585 Self::KimiK20711Preview,
2586 Self::KimiK20905Preview,
2587 Self::KimiK2Thinking,
2588 Self::KimiK2ThinkingTurbo,
2589 Self::KimiK2TurboPreview,
2590 Self::KimiK25,
2591 Self::KimiK26,
2592 Self::KimiK27Code,
2593 Self::KimiK27CodeHighspeed,
2594 Self::KimiK3,
2595 ];
2596}
2597impl std::str::FromStr for MoonshotModel {
2598 type Err = String;
2599 #[allow(clippy::too_many_lines)]
2600 fn from_str(s: &str) -> Result<Self, Self::Err> {
2601 match s {
2602 "kimi-k2-0711-preview" => Ok(Self::KimiK20711Preview),
2603 "kimi-k2-0905-preview" => Ok(Self::KimiK20905Preview),
2604 "kimi-k2-thinking" => Ok(Self::KimiK2Thinking),
2605 "kimi-k2-thinking-turbo" => Ok(Self::KimiK2ThinkingTurbo),
2606 "kimi-k2-turbo-preview" => Ok(Self::KimiK2TurboPreview),
2607 "kimi-k2.5" => Ok(Self::KimiK25),
2608 "kimi-k2.6" => Ok(Self::KimiK26),
2609 "kimi-k2.7-code" => Ok(Self::KimiK27Code),
2610 "kimi-k2.7-code-highspeed" => Ok(Self::KimiK27CodeHighspeed),
2611 "kimi-k3" => Ok(Self::KimiK3),
2612 _ => Err(format!("Unknown moonshot model: '{s}'")),
2613 }
2614 }
2615}
2616impl OpenaiModel {
2617 #[allow(clippy::too_many_lines)]
2618 fn model_id(self) -> &'static str {
2619 match self {
2620 Self::Gpt4 => "gpt-4",
2621 Self::Gpt4Turbo => "gpt-4-turbo",
2622 Self::Gpt41 => "gpt-4.1",
2623 Self::Gpt41Mini => "gpt-4.1-mini",
2624 Self::Gpt41Nano => "gpt-4.1-nano",
2625 Self::Gpt4o => "gpt-4o",
2626 Self::Gpt4o20240513 => "gpt-4o-2024-05-13",
2627 Self::Gpt4o20240806 => "gpt-4o-2024-08-06",
2628 Self::Gpt4o20241120 => "gpt-4o-2024-11-20",
2629 Self::Gpt4oMini => "gpt-4o-mini",
2630 Self::Gpt5 => "gpt-5",
2631 Self::Gpt5Mini => "gpt-5-mini",
2632 Self::Gpt5Nano => "gpt-5-nano",
2633 Self::Gpt5Pro => "gpt-5-pro",
2634 Self::Gpt51 => "gpt-5.1",
2635 Self::Gpt52 => "gpt-5.2",
2636 Self::Gpt52Pro => "gpt-5.2-pro",
2637 Self::Gpt53Codex => "gpt-5.3-codex",
2638 Self::Gpt53CodexSpark => "gpt-5.3-codex-spark",
2639 Self::Gpt54 => "gpt-5.4",
2640 Self::Gpt54Mini => "gpt-5.4-mini",
2641 Self::Gpt54Nano => "gpt-5.4-nano",
2642 Self::Gpt54Pro => "gpt-5.4-pro",
2643 Self::Gpt55 => "gpt-5.5",
2644 Self::Gpt55Pro => "gpt-5.5-pro",
2645 Self::Gpt56 => "gpt-5.6",
2646 Self::Gpt56Luna => "gpt-5.6-luna",
2647 Self::Gpt56Sol => "gpt-5.6-sol",
2648 Self::Gpt56Terra => "gpt-5.6-terra",
2649 Self::GptRealtime21 => "gpt-realtime-2.1",
2650 Self::O1 => "o1",
2651 Self::O1Pro => "o1-pro",
2652 Self::O3 => "o3",
2653 Self::O3Mini => "o3-mini",
2654 Self::O3Pro => "o3-pro",
2655 Self::O4Mini => "o4-mini",
2656 }
2657 }
2658 #[allow(clippy::too_many_lines)]
2659 fn display_name(self) -> &'static str {
2660 match self {
2661 Self::Gpt4 => "GPT-4",
2662 Self::Gpt4Turbo => "GPT-4 Turbo",
2663 Self::Gpt41 => "GPT-4.1",
2664 Self::Gpt41Mini => "GPT-4.1 mini",
2665 Self::Gpt41Nano => "GPT-4.1 nano",
2666 Self::Gpt4o => "GPT-4o",
2667 Self::Gpt4o20240513 => "GPT-4o (2024-05-13)",
2668 Self::Gpt4o20240806 => "GPT-4o (2024-08-06)",
2669 Self::Gpt4o20241120 => "GPT-4o (2024-11-20)",
2670 Self::Gpt4oMini => "GPT-4o mini",
2671 Self::Gpt5 => "GPT-5",
2672 Self::Gpt5Mini => "GPT-5 Mini",
2673 Self::Gpt5Nano => "GPT-5 Nano",
2674 Self::Gpt5Pro => "GPT-5 Pro",
2675 Self::Gpt51 => "GPT-5.1",
2676 Self::Gpt52 => "GPT-5.2",
2677 Self::Gpt52Pro => "GPT-5.2 Pro",
2678 Self::Gpt53Codex => "GPT-5.3 Codex",
2679 Self::Gpt53CodexSpark => "GPT-5.3 Codex Spark",
2680 Self::Gpt54 => "GPT-5.4",
2681 Self::Gpt54Pro => "GPT-5.4 Pro",
2682 Self::Gpt54Mini => "GPT-5.4 mini",
2683 Self::Gpt54Nano => "GPT-5.4 nano",
2684 Self::Gpt55 => "GPT-5.5",
2685 Self::Gpt55Pro => "GPT-5.5 Pro",
2686 Self::Gpt56 => "GPT-5.6",
2687 Self::Gpt56Luna => "GPT-5.6 Luna",
2688 Self::Gpt56Sol => "GPT-5.6 Sol",
2689 Self::Gpt56Terra => "GPT-5.6 Terra",
2690 Self::GptRealtime21 => "GPT-Realtime-2.1",
2691 Self::O1 => "o1",
2692 Self::O1Pro => "o1-pro",
2693 Self::O3 => "o3",
2694 Self::O3Mini => "o3-mini",
2695 Self::O3Pro => "o3-pro",
2696 Self::O4Mini => "o4-mini",
2697 }
2698 }
2699 #[allow(clippy::too_many_lines)]
2700 fn context_window(self) -> u32 {
2701 match self {
2702 Self::Gpt4 => 8192,
2703 Self::Gpt4Turbo
2704 | Self::Gpt4o
2705 | Self::Gpt4o20240513
2706 | Self::Gpt4o20240806
2707 | Self::Gpt4o20241120
2708 | Self::Gpt4oMini
2709 | Self::Gpt53CodexSpark
2710 | Self::GptRealtime21 => 128_000,
2711 Self::O1
2712 | Self::O1Pro
2713 | Self::O3
2714 | Self::O3Mini
2715 | Self::O3Pro
2716 | Self::O4Mini => 200_000,
2717 Self::Gpt5
2718 | Self::Gpt5Mini
2719 | Self::Gpt5Nano
2720 | Self::Gpt5Pro
2721 | Self::Gpt51
2722 | Self::Gpt52
2723 | Self::Gpt52Pro
2724 | Self::Gpt53Codex
2725 | Self::Gpt54Mini
2726 | Self::Gpt54Nano => 400_000,
2727 Self::Gpt41 | Self::Gpt41Mini | Self::Gpt41Nano => 1_047_576,
2728 Self::Gpt54
2729 | Self::Gpt54Pro
2730 | Self::Gpt55
2731 | Self::Gpt55Pro
2732 | Self::Gpt56
2733 | Self::Gpt56Luna
2734 | Self::Gpt56Sol
2735 | Self::Gpt56Terra => 1_050_000,
2736 }
2737 }
2738 #[allow(clippy::too_many_lines)]
2739 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
2740 match self {
2741 Self::Gpt4
2742 | Self::Gpt4Turbo
2743 | Self::Gpt41
2744 | Self::Gpt41Mini
2745 | Self::Gpt41Nano
2746 | Self::Gpt4o
2747 | Self::Gpt4o20240513
2748 | Self::Gpt4o20240806
2749 | Self::Gpt4o20241120
2750 | Self::Gpt4oMini => &[],
2751 Self::Gpt5Pro => &[ReasoningEffort::High],
2752 Self::Gpt51
2753 | Self::O1
2754 | Self::O1Pro
2755 | Self::O3
2756 | Self::O3Mini
2757 | Self::O3Pro
2758 | Self::O4Mini => {
2759 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
2760 }
2761 Self::Gpt52
2762 | Self::Gpt53Codex
2763 | Self::Gpt53CodexSpark
2764 | Self::Gpt54
2765 | Self::Gpt54Mini
2766 | Self::Gpt54Nano
2767 | Self::Gpt55 => {
2768 &[
2769 ReasoningEffort::Low,
2770 ReasoningEffort::Medium,
2771 ReasoningEffort::High,
2772 ReasoningEffort::Xhigh,
2773 ]
2774 }
2775 Self::Gpt56 | Self::Gpt56Luna | Self::Gpt56Sol | Self::Gpt56Terra => {
2776 &[
2777 ReasoningEffort::Low,
2778 ReasoningEffort::Medium,
2779 ReasoningEffort::High,
2780 ReasoningEffort::Xhigh,
2781 ReasoningEffort::Max,
2782 ]
2783 }
2784 Self::Gpt52Pro | Self::Gpt54Pro | Self::Gpt55Pro => {
2785 &[ReasoningEffort::Medium, ReasoningEffort::High, ReasoningEffort::Xhigh]
2786 }
2787 Self::Gpt5 | Self::Gpt5Mini | Self::Gpt5Nano => {
2788 &[
2789 ReasoningEffort::Minimal,
2790 ReasoningEffort::Low,
2791 ReasoningEffort::Medium,
2792 ReasoningEffort::High,
2793 ]
2794 }
2795 Self::GptRealtime21 => {
2796 &[
2797 ReasoningEffort::Minimal,
2798 ReasoningEffort::Low,
2799 ReasoningEffort::Medium,
2800 ReasoningEffort::High,
2801 ReasoningEffort::Xhigh,
2802 ]
2803 }
2804 }
2805 }
2806 pub fn supports_reasoning(self) -> bool {
2807 !self.reasoning_levels().is_empty()
2808 }
2809 #[allow(clippy::too_many_lines)]
2810 pub fn supports_prompt_caching(self) -> bool {
2811 match self {
2812 Self::Gpt4
2813 | Self::Gpt4Turbo
2814 | Self::Gpt4o20240513
2815 | Self::Gpt5Pro
2816 | Self::Gpt52Pro
2817 | Self::Gpt54Pro
2818 | Self::Gpt55Pro
2819 | Self::O1Pro
2820 | Self::O3Pro => false,
2821 Self::Gpt41
2822 | Self::Gpt41Mini
2823 | Self::Gpt41Nano
2824 | Self::Gpt4o
2825 | Self::Gpt4o20240806
2826 | Self::Gpt4o20241120
2827 | Self::Gpt4oMini
2828 | Self::Gpt5
2829 | Self::Gpt5Mini
2830 | Self::Gpt5Nano
2831 | Self::Gpt51
2832 | Self::Gpt52
2833 | Self::Gpt53Codex
2834 | Self::Gpt53CodexSpark
2835 | Self::Gpt54
2836 | Self::Gpt54Mini
2837 | Self::Gpt54Nano
2838 | Self::Gpt55
2839 | Self::Gpt56
2840 | Self::Gpt56Luna
2841 | Self::Gpt56Sol
2842 | Self::Gpt56Terra
2843 | Self::GptRealtime21
2844 | Self::O1
2845 | Self::O3
2846 | Self::O3Mini
2847 | Self::O4Mini => true,
2848 }
2849 }
2850 #[allow(clippy::too_many_lines)]
2851 pub fn supports_image(self) -> bool {
2852 match self {
2853 Self::Gpt4 | Self::O3Mini => false,
2854 Self::Gpt4Turbo
2855 | Self::Gpt41
2856 | Self::Gpt41Mini
2857 | Self::Gpt41Nano
2858 | Self::Gpt4o
2859 | Self::Gpt4o20240513
2860 | Self::Gpt4o20240806
2861 | Self::Gpt4o20241120
2862 | Self::Gpt4oMini
2863 | Self::Gpt5
2864 | Self::Gpt5Mini
2865 | Self::Gpt5Nano
2866 | Self::Gpt5Pro
2867 | Self::Gpt51
2868 | Self::Gpt52
2869 | Self::Gpt52Pro
2870 | Self::Gpt53Codex
2871 | Self::Gpt53CodexSpark
2872 | Self::Gpt54
2873 | Self::Gpt54Mini
2874 | Self::Gpt54Nano
2875 | Self::Gpt54Pro
2876 | Self::Gpt55
2877 | Self::Gpt55Pro
2878 | Self::Gpt56
2879 | Self::Gpt56Luna
2880 | Self::Gpt56Sol
2881 | Self::Gpt56Terra
2882 | Self::GptRealtime21
2883 | Self::O1
2884 | Self::O1Pro
2885 | Self::O3
2886 | Self::O3Pro
2887 | Self::O4Mini => true,
2888 }
2889 }
2890 #[allow(clippy::too_many_lines)]
2891 pub fn supports_audio(self) -> bool {
2892 match self {
2893 Self::Gpt4
2894 | Self::Gpt4Turbo
2895 | Self::Gpt41
2896 | Self::Gpt41Mini
2897 | Self::Gpt41Nano
2898 | Self::Gpt4o
2899 | Self::Gpt4o20240513
2900 | Self::Gpt4o20240806
2901 | Self::Gpt4o20241120
2902 | Self::Gpt4oMini
2903 | Self::Gpt5
2904 | Self::Gpt5Mini
2905 | Self::Gpt5Nano
2906 | Self::Gpt5Pro
2907 | Self::Gpt51
2908 | Self::Gpt52
2909 | Self::Gpt52Pro
2910 | Self::Gpt53Codex
2911 | Self::Gpt53CodexSpark
2912 | Self::Gpt54
2913 | Self::Gpt54Mini
2914 | Self::Gpt54Nano
2915 | Self::Gpt54Pro
2916 | Self::Gpt55
2917 | Self::Gpt55Pro
2918 | Self::Gpt56
2919 | Self::Gpt56Luna
2920 | Self::Gpt56Sol
2921 | Self::Gpt56Terra
2922 | Self::O1
2923 | Self::O1Pro
2924 | Self::O3
2925 | Self::O3Mini
2926 | Self::O3Pro
2927 | Self::O4Mini => false,
2928 Self::GptRealtime21 => true,
2929 }
2930 }
2931 #[allow(clippy::too_many_lines)]
2932 pub fn transport(self) -> Option<ModelTransport> {
2933 match self {
2934 Self::Gpt4
2935 | Self::Gpt4Turbo
2936 | Self::Gpt41
2937 | Self::Gpt41Mini
2938 | Self::Gpt41Nano
2939 | Self::Gpt4o
2940 | Self::Gpt4o20240513
2941 | Self::Gpt4o20240806
2942 | Self::Gpt4o20241120
2943 | Self::Gpt4oMini
2944 | Self::Gpt5
2945 | Self::Gpt5Mini
2946 | Self::Gpt5Nano
2947 | Self::Gpt5Pro
2948 | Self::Gpt51
2949 | Self::Gpt52
2950 | Self::Gpt52Pro
2951 | Self::Gpt53Codex
2952 | Self::Gpt53CodexSpark
2953 | Self::Gpt54
2954 | Self::Gpt54Mini
2955 | Self::Gpt54Nano
2956 | Self::Gpt54Pro
2957 | Self::Gpt55
2958 | Self::Gpt55Pro
2959 | Self::Gpt56
2960 | Self::Gpt56Luna
2961 | Self::Gpt56Sol
2962 | Self::Gpt56Terra
2963 | Self::GptRealtime21
2964 | Self::O1
2965 | Self::O1Pro
2966 | Self::O3
2967 | Self::O3Mini
2968 | Self::O3Pro
2969 | Self::O4Mini => None,
2970 }
2971 }
2972 const ALL: &[OpenaiModel] = &[
2973 Self::Gpt4,
2974 Self::Gpt4Turbo,
2975 Self::Gpt41,
2976 Self::Gpt41Mini,
2977 Self::Gpt41Nano,
2978 Self::Gpt4o,
2979 Self::Gpt4o20240513,
2980 Self::Gpt4o20240806,
2981 Self::Gpt4o20241120,
2982 Self::Gpt4oMini,
2983 Self::Gpt5,
2984 Self::Gpt5Mini,
2985 Self::Gpt5Nano,
2986 Self::Gpt5Pro,
2987 Self::Gpt51,
2988 Self::Gpt52,
2989 Self::Gpt52Pro,
2990 Self::Gpt53Codex,
2991 Self::Gpt53CodexSpark,
2992 Self::Gpt54,
2993 Self::Gpt54Mini,
2994 Self::Gpt54Nano,
2995 Self::Gpt54Pro,
2996 Self::Gpt55,
2997 Self::Gpt55Pro,
2998 Self::Gpt56,
2999 Self::Gpt56Luna,
3000 Self::Gpt56Sol,
3001 Self::Gpt56Terra,
3002 Self::GptRealtime21,
3003 Self::O1,
3004 Self::O1Pro,
3005 Self::O3,
3006 Self::O3Mini,
3007 Self::O3Pro,
3008 Self::O4Mini,
3009 ];
3010}
3011impl std::str::FromStr for OpenaiModel {
3012 type Err = String;
3013 #[allow(clippy::too_many_lines)]
3014 fn from_str(s: &str) -> Result<Self, Self::Err> {
3015 match s {
3016 "gpt-4" => Ok(Self::Gpt4),
3017 "gpt-4-turbo" => Ok(Self::Gpt4Turbo),
3018 "gpt-4.1" => Ok(Self::Gpt41),
3019 "gpt-4.1-mini" => Ok(Self::Gpt41Mini),
3020 "gpt-4.1-nano" => Ok(Self::Gpt41Nano),
3021 "gpt-4o" => Ok(Self::Gpt4o),
3022 "gpt-4o-2024-05-13" => Ok(Self::Gpt4o20240513),
3023 "gpt-4o-2024-08-06" => Ok(Self::Gpt4o20240806),
3024 "gpt-4o-2024-11-20" => Ok(Self::Gpt4o20241120),
3025 "gpt-4o-mini" => Ok(Self::Gpt4oMini),
3026 "gpt-5" => Ok(Self::Gpt5),
3027 "gpt-5-mini" => Ok(Self::Gpt5Mini),
3028 "gpt-5-nano" => Ok(Self::Gpt5Nano),
3029 "gpt-5-pro" => Ok(Self::Gpt5Pro),
3030 "gpt-5.1" => Ok(Self::Gpt51),
3031 "gpt-5.2" => Ok(Self::Gpt52),
3032 "gpt-5.2-pro" => Ok(Self::Gpt52Pro),
3033 "gpt-5.3-codex" => Ok(Self::Gpt53Codex),
3034 "gpt-5.3-codex-spark" => Ok(Self::Gpt53CodexSpark),
3035 "gpt-5.4" => Ok(Self::Gpt54),
3036 "gpt-5.4-mini" => Ok(Self::Gpt54Mini),
3037 "gpt-5.4-nano" => Ok(Self::Gpt54Nano),
3038 "gpt-5.4-pro" => Ok(Self::Gpt54Pro),
3039 "gpt-5.5" => Ok(Self::Gpt55),
3040 "gpt-5.5-pro" => Ok(Self::Gpt55Pro),
3041 "gpt-5.6" => Ok(Self::Gpt56),
3042 "gpt-5.6-luna" => Ok(Self::Gpt56Luna),
3043 "gpt-5.6-sol" => Ok(Self::Gpt56Sol),
3044 "gpt-5.6-terra" => Ok(Self::Gpt56Terra),
3045 "gpt-realtime-2.1" => Ok(Self::GptRealtime21),
3046 "o1" => Ok(Self::O1),
3047 "o1-pro" => Ok(Self::O1Pro),
3048 "o3" => Ok(Self::O3),
3049 "o3-mini" => Ok(Self::O3Mini),
3050 "o3-pro" => Ok(Self::O3Pro),
3051 "o4-mini" => Ok(Self::O4Mini),
3052 _ => Err(format!("Unknown openai model: '{s}'")),
3053 }
3054 }
3055}
3056impl OpenRouterModel {
3057 #[allow(clippy::too_many_lines)]
3058 fn model_id(self) -> &'static str {
3059 match self {
3060 Self::Ai21JambaLarge17 => "ai21/jamba-large-1.7",
3061 Self::AionLabsAion20 => "aion-labs/aion-2.0",
3062 Self::AionLabsAion30 => "aion-labs/aion-3.0",
3063 Self::AionLabsAion30Mini => "aion-labs/aion-3.0-mini",
3064 Self::AmazonNova2LiteV1 => "amazon/nova-2-lite-v1",
3065 Self::AmazonNovaLiteV1 => "amazon/nova-lite-v1",
3066 Self::AmazonNovaMicroV1 => "amazon/nova-micro-v1",
3067 Self::AmazonNovaPremierV1 => "amazon/nova-premier-v1",
3068 Self::AmazonNovaProV1 => "amazon/nova-pro-v1",
3069 Self::AnthropicClaude3Haiku => "anthropic/claude-3-haiku",
3070 Self::AnthropicClaudeFable5 => "anthropic/claude-fable-5",
3071 Self::AnthropicClaudeHaiku45 => "anthropic/claude-haiku-4.5",
3072 Self::AnthropicClaudeOpus4 => "anthropic/claude-opus-4",
3073 Self::AnthropicClaudeOpus41 => "anthropic/claude-opus-4.1",
3074 Self::AnthropicClaudeOpus45 => "anthropic/claude-opus-4.5",
3075 Self::AnthropicClaudeOpus46 => "anthropic/claude-opus-4.6",
3076 Self::AnthropicClaudeOpus47 => "anthropic/claude-opus-4.7",
3077 Self::AnthropicClaudeOpus47Fast => "anthropic/claude-opus-4.7-fast",
3078 Self::AnthropicClaudeOpus48 => "anthropic/claude-opus-4.8",
3079 Self::AnthropicClaudeOpus48Fast => "anthropic/claude-opus-4.8-fast",
3080 Self::AnthropicClaudeOpus5 => "anthropic/claude-opus-5",
3081 Self::AnthropicClaudeOpus5Fast => "anthropic/claude-opus-5-fast",
3082 Self::AnthropicClaudeSonnet4 => "anthropic/claude-sonnet-4",
3083 Self::AnthropicClaudeSonnet45 => "anthropic/claude-sonnet-4.5",
3084 Self::AnthropicClaudeSonnet46 => "anthropic/claude-sonnet-4.6",
3085 Self::AnthropicClaudeSonnet5 => "anthropic/claude-sonnet-5",
3086 Self::ArceeAiTrinityLargeThinking => "arcee-ai/trinity-large-thinking",
3087 Self::ArceeAiVirtuosoLarge => "arcee-ai/virtuoso-large",
3088 Self::BytedanceSeedSeed16 => "bytedance-seed/seed-1.6",
3089 Self::BytedanceSeedSeed16Flash => "bytedance-seed/seed-1.6-flash",
3090 Self::BytedanceSeedSeed20Lite => "bytedance-seed/seed-2.0-lite",
3091 Self::BytedanceSeedSeed20Mini => "bytedance-seed/seed-2.0-mini",
3092 Self::CohereCommandR082024 => "cohere/command-r-08-2024",
3093 Self::CohereCommandRPlus082024 => "cohere/command-r-plus-08-2024",
3094 Self::CohereNorthMiniCodeFree => "cohere/north-mini-code:free",
3095 Self::DeepseekDeepseekChat => "deepseek/deepseek-chat",
3096 Self::DeepseekDeepseekChatV30324 => "deepseek/deepseek-chat-v3-0324",
3097 Self::DeepseekDeepseekChatV31 => "deepseek/deepseek-chat-v3.1",
3098 Self::DeepseekDeepseekR1 => "deepseek/deepseek-r1",
3099 Self::DeepseekDeepseekR10528 => "deepseek/deepseek-r1-0528",
3100 Self::DeepseekDeepseekV31Terminus => "deepseek/deepseek-v3.1-terminus",
3101 Self::DeepseekDeepseekV32 => "deepseek/deepseek-v3.2",
3102 Self::DeepseekDeepseekV32Exp => "deepseek/deepseek-v3.2-exp",
3103 Self::DeepseekDeepseekV4Flash => "deepseek/deepseek-v4-flash",
3104 Self::DeepseekDeepseekV4Pro => "deepseek/deepseek-v4-pro",
3105 Self::GoogleGemini25Flash => "google/gemini-2.5-flash",
3106 Self::GoogleGemini25FlashLite => "google/gemini-2.5-flash-lite",
3107 Self::GoogleGemini25Pro => "google/gemini-2.5-pro",
3108 Self::GoogleGemini25ProPreview => "google/gemini-2.5-pro-preview",
3109 Self::GoogleGemini25ProPreview0506 => "google/gemini-2.5-pro-preview-05-06",
3110 Self::GoogleGemini3FlashPreview => "google/gemini-3-flash-preview",
3111 Self::GoogleGemini3ProImage => "google/gemini-3-pro-image",
3112 Self::GoogleGemini31FlashLite => "google/gemini-3.1-flash-lite",
3113 Self::GoogleGemini31FlashLitePreview => {
3114 "google/gemini-3.1-flash-lite-preview"
3115 }
3116 Self::GoogleGemini31ProPreview => "google/gemini-3.1-pro-preview",
3117 Self::GoogleGemini31ProPreviewCustomtools => {
3118 "google/gemini-3.1-pro-preview-customtools"
3119 }
3120 Self::GoogleGemini35Flash => "google/gemini-3.5-flash",
3121 Self::GoogleGemini35FlashLite => "google/gemini-3.5-flash-lite",
3122 Self::GoogleGemini36Flash => "google/gemini-3.6-flash",
3123 Self::GoogleGemma312bIt => "google/gemma-3-12b-it",
3124 Self::GoogleGemma327bIt => "google/gemma-3-27b-it",
3125 Self::GoogleGemma426bA4bIt => "google/gemma-4-26b-a4b-it",
3126 Self::GoogleGemma426bA4bItFree => "google/gemma-4-26b-a4b-it:free",
3127 Self::GoogleGemma431bIt => "google/gemma-4-31b-it",
3128 Self::GoogleGemma431bItFree => "google/gemma-4-31b-it:free",
3129 Self::IbmGraniteGranite418b => "ibm-granite/granite-4.1-8b",
3130 Self::InceptionMercury2 => "inception/mercury-2",
3131 Self::InclusionaiLing261t => "inclusionai/ling-2.6-1t",
3132 Self::InclusionaiLing26Flash => "inclusionai/ling-2.6-flash",
3133 Self::InclusionaiLing30FlashFree => "inclusionai/ling-3.0-flash:free",
3134 Self::InclusionaiRing261t => "inclusionai/ring-2.6-1t",
3135 Self::KwaipilotKatCoderAirV25 => "kwaipilot/kat-coder-air-v2.5",
3136 Self::KwaipilotKatCoderProV2 => "kwaipilot/kat-coder-pro-v2",
3137 Self::KwaipilotKatCoderProV25 => "kwaipilot/kat-coder-pro-v2.5",
3138 Self::MeituanLongcat20 => "meituan/longcat-2.0",
3139 Self::MetaLlamaLlama3170bInstruct => "meta-llama/llama-3.1-70b-instruct",
3140 Self::MetaLlamaLlama318bInstruct => "meta-llama/llama-3.1-8b-instruct",
3141 Self::MetaLlamaLlama3370bInstruct => "meta-llama/llama-3.3-70b-instruct",
3142 Self::MetaLlamaLlama4Maverick => "meta-llama/llama-4-maverick",
3143 Self::MetaLlamaLlama4Scout => "meta-llama/llama-4-scout",
3144 Self::MetaMuseSpark11 => "meta/muse-spark-1.1",
3145 Self::MinimaxMinimaxM1 => "minimax/minimax-m1",
3146 Self::MinimaxMinimaxM2 => "minimax/minimax-m2",
3147 Self::MinimaxMinimaxM21 => "minimax/minimax-m2.1",
3148 Self::MinimaxMinimaxM25 => "minimax/minimax-m2.5",
3149 Self::MinimaxMinimaxM27 => "minimax/minimax-m2.7",
3150 Self::MinimaxMinimaxM3 => "minimax/minimax-m3",
3151 Self::MistralaiCodestral2508 => "mistralai/codestral-2508",
3152 Self::MistralaiDevstral2512 => "mistralai/devstral-2512",
3153 Self::MistralaiMinistral14b2512 => "mistralai/ministral-14b-2512",
3154 Self::MistralaiMinistral3b2512 => "mistralai/ministral-3b-2512",
3155 Self::MistralaiMinistral8b2512 => "mistralai/ministral-8b-2512",
3156 Self::MistralaiMistralLarge => "mistralai/mistral-large",
3157 Self::MistralaiMistralLarge2407 => "mistralai/mistral-large-2407",
3158 Self::MistralaiMistralLarge2512 => "mistralai/mistral-large-2512",
3159 Self::MistralaiMistralMedium3 => "mistralai/mistral-medium-3",
3160 Self::MistralaiMistralMedium35 => "mistralai/mistral-medium-3-5",
3161 Self::MistralaiMistralMedium31 => "mistralai/mistral-medium-3.1",
3162 Self::MistralaiMistralNemo => "mistralai/mistral-nemo",
3163 Self::MistralaiMistralSaba => "mistralai/mistral-saba",
3164 Self::MistralaiMistralSmall2603 => "mistralai/mistral-small-2603",
3165 Self::MistralaiMistralSmall3224bInstruct => {
3166 "mistralai/mistral-small-3.2-24b-instruct"
3167 }
3168 Self::MistralaiMixtral8x22bInstruct => "mistralai/mixtral-8x22b-instruct",
3169 Self::MistralaiVoxtralSmall24b2507 => "mistralai/voxtral-small-24b-2507",
3170 Self::MoonshotaiKimiK2 => "moonshotai/kimi-k2",
3171 Self::MoonshotaiKimiK20905 => "moonshotai/kimi-k2-0905",
3172 Self::MoonshotaiKimiK2Thinking => "moonshotai/kimi-k2-thinking",
3173 Self::MoonshotaiKimiK25 => "moonshotai/kimi-k2.5",
3174 Self::MoonshotaiKimiK26 => "moonshotai/kimi-k2.6",
3175 Self::MoonshotaiKimiK27Code => "moonshotai/kimi-k2.7-code",
3176 Self::MoonshotaiKimiK3 => "moonshotai/kimi-k3",
3177 Self::NexAgiNexN2Mini => "nex-agi/nex-n2-mini",
3178 Self::NexAgiNexN2Pro => "nex-agi/nex-n2-pro",
3179 Self::NvidiaNemotron3Nano30bA3b => "nvidia/nemotron-3-nano-30b-a3b",
3180 Self::NvidiaNemotron3Nano30bA3bFree => "nvidia/nemotron-3-nano-30b-a3b:free",
3181 Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree => {
3182 "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free"
3183 }
3184 Self::NvidiaNemotron3Super120bA12b => "nvidia/nemotron-3-super-120b-a12b",
3185 Self::NvidiaNemotron3Super120bA12bFree => {
3186 "nvidia/nemotron-3-super-120b-a12b:free"
3187 }
3188 Self::NvidiaNemotron3Ultra550bA55b => "nvidia/nemotron-3-ultra-550b-a55b",
3189 Self::NvidiaNemotron3Ultra550bA55bFree => {
3190 "nvidia/nemotron-3-ultra-550b-a55b:free"
3191 }
3192 Self::NvidiaNemotronNano12bV2VlFree => "nvidia/nemotron-nano-12b-v2-vl:free",
3193 Self::NvidiaNemotronNano9bV2Free => "nvidia/nemotron-nano-9b-v2:free",
3194 Self::OpenaiGpt35Turbo => "openai/gpt-3.5-turbo",
3195 Self::OpenaiGpt35Turbo0613 => "openai/gpt-3.5-turbo-0613",
3196 Self::OpenaiGpt35Turbo16k => "openai/gpt-3.5-turbo-16k",
3197 Self::OpenaiGpt4 => "openai/gpt-4",
3198 Self::OpenaiGpt4Turbo => "openai/gpt-4-turbo",
3199 Self::OpenaiGpt4TurboPreview => "openai/gpt-4-turbo-preview",
3200 Self::OpenaiGpt41 => "openai/gpt-4.1",
3201 Self::OpenaiGpt41Mini => "openai/gpt-4.1-mini",
3202 Self::OpenaiGpt41Nano => "openai/gpt-4.1-nano",
3203 Self::OpenaiGpt4o => "openai/gpt-4o",
3204 Self::OpenaiGpt4o20240513 => "openai/gpt-4o-2024-05-13",
3205 Self::OpenaiGpt4o20240806 => "openai/gpt-4o-2024-08-06",
3206 Self::OpenaiGpt4o20241120 => "openai/gpt-4o-2024-11-20",
3207 Self::OpenaiGpt4oMini => "openai/gpt-4o-mini",
3208 Self::OpenaiGpt4oMini20240718 => "openai/gpt-4o-mini-2024-07-18",
3209 Self::OpenaiGpt5 => "openai/gpt-5",
3210 Self::OpenaiGpt5Codex => "openai/gpt-5-codex",
3211 Self::OpenaiGpt5Mini => "openai/gpt-5-mini",
3212 Self::OpenaiGpt5Nano => "openai/gpt-5-nano",
3213 Self::OpenaiGpt5Pro => "openai/gpt-5-pro",
3214 Self::OpenaiGpt51 => "openai/gpt-5.1",
3215 Self::OpenaiGpt51Chat => "openai/gpt-5.1-chat",
3216 Self::OpenaiGpt51Codex => "openai/gpt-5.1-codex",
3217 Self::OpenaiGpt51CodexMax => "openai/gpt-5.1-codex-max",
3218 Self::OpenaiGpt51CodexMini => "openai/gpt-5.1-codex-mini",
3219 Self::OpenaiGpt52 => "openai/gpt-5.2",
3220 Self::OpenaiGpt52Chat => "openai/gpt-5.2-chat",
3221 Self::OpenaiGpt52Codex => "openai/gpt-5.2-codex",
3222 Self::OpenaiGpt52Pro => "openai/gpt-5.2-pro",
3223 Self::OpenaiGpt53Chat => "openai/gpt-5.3-chat",
3224 Self::OpenaiGpt53Codex => "openai/gpt-5.3-codex",
3225 Self::OpenaiGpt54 => "openai/gpt-5.4",
3226 Self::OpenaiGpt54Mini => "openai/gpt-5.4-mini",
3227 Self::OpenaiGpt54Nano => "openai/gpt-5.4-nano",
3228 Self::OpenaiGpt54Pro => "openai/gpt-5.4-pro",
3229 Self::OpenaiGpt55 => "openai/gpt-5.5",
3230 Self::OpenaiGpt55Pro => "openai/gpt-5.5-pro",
3231 Self::OpenaiGpt56Luna => "openai/gpt-5.6-luna",
3232 Self::OpenaiGpt56LunaPro => "openai/gpt-5.6-luna-pro",
3233 Self::OpenaiGpt56Sol => "openai/gpt-5.6-sol",
3234 Self::OpenaiGpt56SolPro => "openai/gpt-5.6-sol-pro",
3235 Self::OpenaiGpt56Terra => "openai/gpt-5.6-terra",
3236 Self::OpenaiGpt56TerraPro => "openai/gpt-5.6-terra-pro",
3237 Self::OpenaiGptAudio => "openai/gpt-audio",
3238 Self::OpenaiGptAudioMini => "openai/gpt-audio-mini",
3239 Self::OpenaiGptOss120b => "openai/gpt-oss-120b",
3240 Self::OpenaiGptOss20b => "openai/gpt-oss-20b",
3241 Self::OpenaiGptOss20bFree => "openai/gpt-oss-20b:free",
3242 Self::OpenaiGptOssSafeguard20b => "openai/gpt-oss-safeguard-20b",
3243 Self::OpenaiO1 => "openai/o1",
3244 Self::OpenaiO3 => "openai/o3",
3245 Self::OpenaiO3DeepResearch => "openai/o3-deep-research",
3246 Self::OpenaiO3Mini => "openai/o3-mini",
3247 Self::OpenaiO3MiniHigh => "openai/o3-mini-high",
3248 Self::OpenaiO3Pro => "openai/o3-pro",
3249 Self::OpenaiO4Mini => "openai/o4-mini",
3250 Self::OpenaiO4MiniDeepResearch => "openai/o4-mini-deep-research",
3251 Self::OpenaiO4MiniHigh => "openai/o4-mini-high",
3252 Self::OpenrouterAuto => "openrouter/auto",
3253 Self::OpenrouterFree => "openrouter/free",
3254 Self::PoolsideLagunaM1 => "poolside/laguna-m.1",
3255 Self::PoolsideLagunaM1Free => "poolside/laguna-m.1:free",
3256 Self::PoolsideLagunaS21 => "poolside/laguna-s-2.1",
3257 Self::PoolsideLagunaS21Free => "poolside/laguna-s-2.1:free",
3258 Self::PoolsideLagunaXs21 => "poolside/laguna-xs-2.1",
3259 Self::PoolsideLagunaXs21Free => "poolside/laguna-xs-2.1:free",
3260 Self::QwenQwen2572bInstruct => "qwen/qwen-2.5-72b-instruct",
3261 Self::QwenQwen257bInstruct => "qwen/qwen-2.5-7b-instruct",
3262 Self::QwenQwenPlus => "qwen/qwen-plus",
3263 Self::QwenQwenPlus20250728 => "qwen/qwen-plus-2025-07-28",
3264 Self::QwenQwenPlus20250728Thinking => "qwen/qwen-plus-2025-07-28:thinking",
3265 Self::QwenQwen314b => "qwen/qwen3-14b",
3266 Self::QwenQwen3235bA22b => "qwen/qwen3-235b-a22b",
3267 Self::QwenQwen3235bA22b2507 => "qwen/qwen3-235b-a22b-2507",
3268 Self::QwenQwen3235bA22bThinking2507 => "qwen/qwen3-235b-a22b-thinking-2507",
3269 Self::QwenQwen330bA3b => "qwen/qwen3-30b-a3b",
3270 Self::QwenQwen330bA3bInstruct2507 => "qwen/qwen3-30b-a3b-instruct-2507",
3271 Self::QwenQwen330bA3bThinking2507 => "qwen/qwen3-30b-a3b-thinking-2507",
3272 Self::QwenQwen332b => "qwen/qwen3-32b",
3273 Self::QwenQwen38b => "qwen/qwen3-8b",
3274 Self::QwenQwen3Coder => "qwen/qwen3-coder",
3275 Self::QwenQwen3Coder30bA3bInstruct => "qwen/qwen3-coder-30b-a3b-instruct",
3276 Self::QwenQwen3CoderFlash => "qwen/qwen3-coder-flash",
3277 Self::QwenQwen3CoderNext => "qwen/qwen3-coder-next",
3278 Self::QwenQwen3CoderPlus => "qwen/qwen3-coder-plus",
3279 Self::QwenQwen3Max => "qwen/qwen3-max",
3280 Self::QwenQwen3MaxThinking => "qwen/qwen3-max-thinking",
3281 Self::QwenQwen3Next80bA3bInstruct => "qwen/qwen3-next-80b-a3b-instruct",
3282 Self::QwenQwen3Next80bA3bThinking => "qwen/qwen3-next-80b-a3b-thinking",
3283 Self::QwenQwen3Vl235bA22bInstruct => "qwen/qwen3-vl-235b-a22b-instruct",
3284 Self::QwenQwen3Vl235bA22bThinking => "qwen/qwen3-vl-235b-a22b-thinking",
3285 Self::QwenQwen3Vl30bA3bInstruct => "qwen/qwen3-vl-30b-a3b-instruct",
3286 Self::QwenQwen3Vl30bA3bThinking => "qwen/qwen3-vl-30b-a3b-thinking",
3287 Self::QwenQwen3Vl32bInstruct => "qwen/qwen3-vl-32b-instruct",
3288 Self::QwenQwen3Vl8bInstruct => "qwen/qwen3-vl-8b-instruct",
3289 Self::QwenQwen3Vl8bThinking => "qwen/qwen3-vl-8b-thinking",
3290 Self::QwenQwen35122bA10b => "qwen/qwen3.5-122b-a10b",
3291 Self::QwenQwen3527b => "qwen/qwen3.5-27b",
3292 Self::QwenQwen3535bA3b => "qwen/qwen3.5-35b-a3b",
3293 Self::QwenQwen35397bA17b => "qwen/qwen3.5-397b-a17b",
3294 Self::QwenQwen359b => "qwen/qwen3.5-9b",
3295 Self::QwenQwen35Flash0223 => "qwen/qwen3.5-flash-02-23",
3296 Self::QwenQwen35Plus0215 => "qwen/qwen3.5-plus-02-15",
3297 Self::QwenQwen35Plus20260420 => "qwen/qwen3.5-plus-20260420",
3298 Self::QwenQwen3627b => "qwen/qwen3.6-27b",
3299 Self::QwenQwen3635bA3b => "qwen/qwen3.6-35b-a3b",
3300 Self::QwenQwen36Flash => "qwen/qwen3.6-flash",
3301 Self::QwenQwen36MaxPreview => "qwen/qwen3.6-max-preview",
3302 Self::QwenQwen36Plus => "qwen/qwen3.6-plus",
3303 Self::QwenQwen37Max => "qwen/qwen3.7-max",
3304 Self::QwenQwen37Plus => "qwen/qwen3.7-plus",
3305 Self::RekaaiRekaEdge => "rekaai/reka-edge",
3306 Self::RelaceRelaceSearch => "relace/relace-search",
3307 Self::SakanaFuguUltra => "sakana/fugu-ultra",
3308 Self::Sao10kL31Euryale70b => "sao10k/l3.1-euryale-70b",
3309 Self::StepfunStep35Flash => "stepfun/step-3.5-flash",
3310 Self::StepfunStep37Flash => "stepfun/step-3.7-flash",
3311 Self::TencentHy3 => "tencent/hy3",
3312 Self::TencentHy3Preview => "tencent/hy3-preview",
3313 Self::ThedrummerUnslopnemo12b => "thedrummer/unslopnemo-12b",
3314 Self::ThinkingmachinesInkling => "thinkingmachines/inkling",
3315 Self::UpstageSolarPro3 => "upstage/solar-pro-3",
3316 Self::XAiGrok420 => "x-ai/grok-4.20",
3317 Self::XAiGrok43 => "x-ai/grok-4.3",
3318 Self::XAiGrok45 => "x-ai/grok-4.5",
3319 Self::XAiGrokBuild01 => "x-ai/grok-build-0.1",
3320 Self::XiaomiMimoV25 => "xiaomi/mimo-v2.5",
3321 Self::XiaomiMimoV25Pro => "xiaomi/mimo-v2.5-pro",
3322 Self::ZAiGlm45 => "z-ai/glm-4.5",
3323 Self::ZAiGlm45Air => "z-ai/glm-4.5-air",
3324 Self::ZAiGlm45v => "z-ai/glm-4.5v",
3325 Self::ZAiGlm46 => "z-ai/glm-4.6",
3326 Self::ZAiGlm46v => "z-ai/glm-4.6v",
3327 Self::ZAiGlm47 => "z-ai/glm-4.7",
3328 Self::ZAiGlm47Flash => "z-ai/glm-4.7-flash",
3329 Self::ZAiGlm5 => "z-ai/glm-5",
3330 Self::ZAiGlm5Turbo => "z-ai/glm-5-turbo",
3331 Self::ZAiGlm51 => "z-ai/glm-5.1",
3332 Self::ZAiGlm52 => "z-ai/glm-5.2",
3333 Self::ZAiGlm5vTurbo => "z-ai/glm-5v-turbo",
3334 }
3335 }
3336 #[allow(clippy::too_many_lines)]
3337 fn display_name(self) -> &'static str {
3338 match self {
3339 Self::AionLabsAion20 => "Aion-2.0",
3340 Self::AionLabsAion30 => "Aion-3.0",
3341 Self::AionLabsAion30Mini => "Aion-3.0-Mini",
3342 Self::OpenrouterAuto => "Auto Router",
3343 Self::AnthropicClaude3Haiku => "Claude 3 Haiku",
3344 Self::AnthropicClaudeFable5 => "Claude Fable 5",
3345 Self::AnthropicClaudeHaiku45 => "Claude Haiku 4.5 (latest)",
3346 Self::AnthropicClaudeOpus4 => "Claude Opus 4",
3347 Self::AnthropicClaudeOpus41 => "Claude Opus 4.1 (latest)",
3348 Self::AnthropicClaudeOpus45 => "Claude Opus 4.5 (latest)",
3349 Self::AnthropicClaudeOpus46 => "Claude Opus 4.6",
3350 Self::AnthropicClaudeOpus47 => "Claude Opus 4.7",
3351 Self::AnthropicClaudeOpus47Fast => "Claude Opus 4.7 (Fast)",
3352 Self::AnthropicClaudeOpus48 => "Claude Opus 4.8",
3353 Self::AnthropicClaudeOpus48Fast => "Claude Opus 4.8 (Fast)",
3354 Self::AnthropicClaudeOpus5 => "Claude Opus 5",
3355 Self::AnthropicClaudeOpus5Fast => "Claude Opus 5 (Fast)",
3356 Self::AnthropicClaudeSonnet4 => "Claude Sonnet 4",
3357 Self::AnthropicClaudeSonnet45 => "Claude Sonnet 4.5 (latest)",
3358 Self::AnthropicClaudeSonnet46 => "Claude Sonnet 4.6",
3359 Self::AnthropicClaudeSonnet5 => "Claude Sonnet 5",
3360 Self::MistralaiCodestral2508 => "Codestral 2508",
3361 Self::CohereCommandR082024 => "Command R",
3362 Self::CohereCommandRPlus082024 => "Command R+",
3363 Self::DeepseekDeepseekChat => "DeepSeek Chat",
3364 Self::DeepseekDeepseekChatV30324 => "DeepSeek V3 0324",
3365 Self::DeepseekDeepseekChatV31 => "DeepSeek V3.1",
3366 Self::DeepseekDeepseekV31Terminus => "DeepSeek V3.1 Terminus",
3367 Self::DeepseekDeepseekV32 => "DeepSeek V3.2",
3368 Self::DeepseekDeepseekV32Exp => "DeepSeek V3.2 Exp",
3369 Self::DeepseekDeepseekV4Flash => "DeepSeek V4 Flash",
3370 Self::DeepseekDeepseekV4Pro => "DeepSeek V4 Pro",
3371 Self::DeepseekDeepseekR1 => "DeepSeek-R1",
3372 Self::MistralaiDevstral2512 => "Devstral 2",
3373 Self::OpenrouterFree => "Free Models Router",
3374 Self::SakanaFuguUltra => "Fugu Ultra",
3375 Self::ZAiGlm45 => "GLM-4.5",
3376 Self::ZAiGlm45Air => "GLM-4.5-Air",
3377 Self::ZAiGlm45v => "GLM-4.5V",
3378 Self::ZAiGlm46 => "GLM-4.6",
3379 Self::ZAiGlm46v => "GLM-4.6V",
3380 Self::ZAiGlm47 => "GLM-4.7",
3381 Self::ZAiGlm47Flash => "GLM-4.7-Flash",
3382 Self::ZAiGlm5 => "GLM-5",
3383 Self::ZAiGlm5Turbo => "GLM-5-Turbo",
3384 Self::ZAiGlm51 => "GLM-5.1",
3385 Self::ZAiGlm52 => "GLM-5.2",
3386 Self::ZAiGlm5vTurbo => "GLM-5V-Turbo",
3387 Self::OpenaiGptAudio => "GPT Audio",
3388 Self::OpenaiGptAudioMini => "GPT Audio Mini",
3389 Self::OpenaiGptOss120b => "GPT OSS 120B",
3390 Self::OpenaiGptOss20b => "GPT OSS 20B",
3391 Self::OpenaiGpt35Turbo0613 => "GPT-3.5 Turbo (older v0613)",
3392 Self::OpenaiGpt35Turbo16k => "GPT-3.5 Turbo 16k",
3393 Self::OpenaiGpt35Turbo => "GPT-3.5-turbo",
3394 Self::OpenaiGpt4 => "GPT-4",
3395 Self::OpenaiGpt4Turbo => "GPT-4 Turbo",
3396 Self::OpenaiGpt4TurboPreview => "GPT-4 Turbo Preview",
3397 Self::OpenaiGpt41 => "GPT-4.1",
3398 Self::OpenaiGpt41Mini => "GPT-4.1 mini",
3399 Self::OpenaiGpt41Nano => "GPT-4.1 nano",
3400 Self::OpenaiGpt4o => "GPT-4o",
3401 Self::OpenaiGpt4o20240513 => "GPT-4o (2024-05-13)",
3402 Self::OpenaiGpt4o20240806 => "GPT-4o (2024-08-06)",
3403 Self::OpenaiGpt4o20241120 => "GPT-4o (2024-11-20)",
3404 Self::OpenaiGpt4oMini => "GPT-4o mini",
3405 Self::OpenaiGpt4oMini20240718 => "GPT-4o-mini (2024-07-18)",
3406 Self::OpenaiGpt5 => "GPT-5",
3407 Self::OpenaiGpt5Mini => "GPT-5 Mini",
3408 Self::OpenaiGpt5Nano => "GPT-5 Nano",
3409 Self::OpenaiGpt5Pro => "GPT-5 Pro",
3410 Self::OpenaiGpt5Codex => "GPT-5-Codex",
3411 Self::OpenaiGpt51 => "GPT-5.1",
3412 Self::OpenaiGpt51Chat => "GPT-5.1 Chat",
3413 Self::OpenaiGpt51Codex => "GPT-5.1 Codex",
3414 Self::OpenaiGpt51CodexMax => "GPT-5.1 Codex Max",
3415 Self::OpenaiGpt51CodexMini => "GPT-5.1 Codex mini",
3416 Self::OpenaiGpt52 => "GPT-5.2",
3417 Self::OpenaiGpt52Chat => "GPT-5.2 Chat",
3418 Self::OpenaiGpt52Codex => "GPT-5.2 Codex",
3419 Self::OpenaiGpt52Pro => "GPT-5.2 Pro",
3420 Self::OpenaiGpt53Chat => "GPT-5.3 Chat",
3421 Self::OpenaiGpt53Codex => "GPT-5.3 Codex",
3422 Self::OpenaiGpt54 => "GPT-5.4",
3423 Self::OpenaiGpt54Pro => "GPT-5.4 Pro",
3424 Self::OpenaiGpt54Mini => "GPT-5.4 mini",
3425 Self::OpenaiGpt54Nano => "GPT-5.4 nano",
3426 Self::OpenaiGpt55 => "GPT-5.5",
3427 Self::OpenaiGpt55Pro => "GPT-5.5 Pro",
3428 Self::OpenaiGpt56Luna => "GPT-5.6 Luna",
3429 Self::OpenaiGpt56LunaPro => "GPT-5.6 Luna Pro",
3430 Self::OpenaiGpt56Sol => "GPT-5.6 Sol",
3431 Self::OpenaiGpt56SolPro => "GPT-5.6 Sol Pro",
3432 Self::OpenaiGpt56Terra => "GPT-5.6 Terra",
3433 Self::OpenaiGpt56TerraPro => "GPT-5.6 Terra Pro",
3434 Self::GoogleGemini25Flash => "Gemini 2.5 Flash",
3435 Self::GoogleGemini25FlashLite => "Gemini 2.5 Flash-Lite",
3436 Self::GoogleGemini25Pro => "Gemini 2.5 Pro",
3437 Self::GoogleGemini25ProPreview0506 => "Gemini 2.5 Pro Preview 05-06",
3438 Self::GoogleGemini25ProPreview => "Gemini 2.5 Pro Preview 06-05",
3439 Self::GoogleGemini3FlashPreview => "Gemini 3 Flash Preview",
3440 Self::GoogleGemini31FlashLite => "Gemini 3.1 Flash Lite",
3441 Self::GoogleGemini31FlashLitePreview => "Gemini 3.1 Flash Lite Preview",
3442 Self::GoogleGemini31ProPreview => "Gemini 3.1 Pro Preview",
3443 Self::GoogleGemini31ProPreviewCustomtools => {
3444 "Gemini 3.1 Pro Preview Custom Tools"
3445 }
3446 Self::GoogleGemini35Flash => "Gemini 3.5 Flash",
3447 Self::GoogleGemini35FlashLite => "Gemini 3.5 Flash Lite",
3448 Self::GoogleGemini36Flash => "Gemini 3.6 Flash",
3449 Self::GoogleGemma312bIt => "Gemma 3 12B",
3450 Self::GoogleGemma327bIt => "Gemma 3 27B",
3451 Self::GoogleGemma426bA4bItFree => "Gemma 4 26B A4B (free)",
3452 Self::GoogleGemma426bA4bIt => "Gemma 4 26B A4B IT",
3453 Self::GoogleGemma431bItFree => "Gemma 4 31B (free)",
3454 Self::GoogleGemma431bIt => "Gemma 4 31B IT",
3455 Self::IbmGraniteGranite418b => "Granite 4.1 8B",
3456 Self::XAiGrok420 => "Grok 4.20",
3457 Self::XAiGrok43 => "Grok 4.3",
3458 Self::XAiGrok45 => "Grok 4.5",
3459 Self::XAiGrokBuild01 => "Grok Build 0.1",
3460 Self::TencentHy3 => "Hy3",
3461 Self::TencentHy3Preview => "Hy3 preview",
3462 Self::ThinkingmachinesInkling => "Inkling",
3463 Self::Ai21JambaLarge17 => "Jamba Large 1.7",
3464 Self::KwaipilotKatCoderAirV25 => "KAT-Coder-Air V2.5",
3465 Self::KwaipilotKatCoderProV2 => "KAT-Coder-Pro V2",
3466 Self::KwaipilotKatCoderProV25 => "KAT-Coder-Pro V2.5",
3467 Self::MoonshotaiKimiK2 => "Kimi K2 0711",
3468 Self::MoonshotaiKimiK20905 => "Kimi K2 0905",
3469 Self::MoonshotaiKimiK2Thinking => "Kimi K2 Thinking",
3470 Self::MoonshotaiKimiK25 => "Kimi K2.5",
3471 Self::MoonshotaiKimiK26 => "Kimi K2.6",
3472 Self::MoonshotaiKimiK27Code => "Kimi K2.7 Code",
3473 Self::MoonshotaiKimiK3 => "Kimi K3",
3474 Self::PoolsideLagunaM1 => "Laguna M.1",
3475 Self::PoolsideLagunaM1Free => "Laguna M.1 (free)",
3476 Self::PoolsideLagunaS21 => "Laguna S 2.1",
3477 Self::PoolsideLagunaS21Free => "Laguna S 2.1 (free)",
3478 Self::PoolsideLagunaXs21 => "Laguna XS 2.1",
3479 Self::PoolsideLagunaXs21Free => "Laguna XS 2.1 (free)",
3480 Self::InclusionaiLing261t => "Ling-2.6-1T",
3481 Self::InclusionaiLing26Flash => "Ling-2.6-flash",
3482 Self::InclusionaiLing30FlashFree => "Ling-3.0-flash (free)",
3483 Self::MetaLlamaLlama3170bInstruct => "Llama 3.1 70B Instruct",
3484 Self::MetaLlamaLlama318bInstruct => "Llama 3.1 8B Instruct",
3485 Self::Sao10kL31Euryale70b => "Llama 3.1 Euryale 70B v2.2",
3486 Self::MetaLlamaLlama4Maverick => "Llama 4 Maverick",
3487 Self::MetaLlamaLlama4Scout => "Llama 4 Scout",
3488 Self::MetaLlamaLlama3370bInstruct => "Llama-3.3-70B-Instruct",
3489 Self::MeituanLongcat20 => "LongCat 2.0",
3490 Self::InceptionMercury2 => "Mercury 2",
3491 Self::XiaomiMimoV25 => "MiMo-V2.5",
3492 Self::XiaomiMimoV25Pro => "MiMo-V2.5-Pro",
3493 Self::MinimaxMinimaxM1 => "MiniMax M1",
3494 Self::MinimaxMinimaxM2 => "MiniMax-M2",
3495 Self::MinimaxMinimaxM21 => "MiniMax-M2.1",
3496 Self::MinimaxMinimaxM25 => "MiniMax-M2.5",
3497 Self::MinimaxMinimaxM27 => "MiniMax-M2.7",
3498 Self::MinimaxMinimaxM3 => "MiniMax-M3",
3499 Self::MistralaiMinistral14b2512 => "Ministral 3 14B 2512",
3500 Self::MistralaiMinistral3b2512 => "Ministral 3 3B 2512",
3501 Self::MistralaiMinistral8b2512 => "Ministral 3 8B 2512",
3502 Self::MistralaiMistralLarge => "Mistral Large",
3503 Self::MistralaiMistralLarge2407 => "Mistral Large 2407",
3504 Self::MistralaiMistralLarge2512 => "Mistral Large 3",
3505 Self::MistralaiMistralMedium3 => "Mistral Medium 3",
3506 Self::MistralaiMistralMedium31 => "Mistral Medium 3.1",
3507 Self::MistralaiMistralMedium35 => "Mistral Medium 3.5",
3508 Self::MistralaiMistralNemo => "Mistral Nemo",
3509 Self::MistralaiMistralSmall3224bInstruct => "Mistral Small 3.2 24B",
3510 Self::MistralaiMistralSmall2603 => "Mistral Small 4",
3511 Self::MistralaiMixtral8x22bInstruct => "Mixtral 8x22B Instruct",
3512 Self::MetaMuseSpark11 => "Muse Spark 1.1",
3513 Self::GoogleGemini3ProImage => "Nano Banana Pro",
3514 Self::NvidiaNemotron3Nano30bA3b => "Nemotron 3 Nano 30B A3B",
3515 Self::NvidiaNemotron3Nano30bA3bFree => "Nemotron 3 Nano 30B A3B (free)",
3516 Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree => {
3517 "Nemotron 3 Nano Omni (free)"
3518 }
3519 Self::NvidiaNemotron3Super120bA12bFree => "Nemotron 3 Super (free)",
3520 Self::NvidiaNemotron3Super120bA12b => "Nemotron 3 Super 120B A12B",
3521 Self::NvidiaNemotron3Ultra550bA55bFree => "Nemotron 3 Ultra (free)",
3522 Self::NvidiaNemotron3Ultra550bA55b => "Nemotron 3 Ultra 550B A55B",
3523 Self::NvidiaNemotronNano12bV2VlFree => "Nemotron Nano 12B 2 VL (free)",
3524 Self::NvidiaNemotronNano9bV2Free => "Nemotron Nano 9B V2 (free)",
3525 Self::NexAgiNexN2Mini => "Nex-N2-Mini",
3526 Self::NexAgiNexN2Pro => "Nex-N2-Pro",
3527 Self::CohereNorthMiniCodeFree => "North Mini Code (free)",
3528 Self::AmazonNova2LiteV1 => "Nova 2 Lite",
3529 Self::AmazonNovaLiteV1 => "Nova Lite 1.0",
3530 Self::AmazonNovaMicroV1 => "Nova Micro 1.0",
3531 Self::AmazonNovaPremierV1 => "Nova Premier 1.0",
3532 Self::AmazonNovaProV1 => "Nova Pro 1.0",
3533 Self::QwenQwenPlus => "Qwen Plus",
3534 Self::QwenQwenPlus20250728 => "Qwen Plus 0728",
3535 Self::QwenQwenPlus20250728Thinking => "Qwen Plus 0728 (thinking)",
3536 Self::QwenQwen2572bInstruct => "Qwen2.5 72B Instruct",
3537 Self::QwenQwen257bInstruct => "Qwen2.5 7B Instruct",
3538 Self::QwenQwen314b => "Qwen3 14B",
3539 Self::QwenQwen3235bA22b2507 => "Qwen3 235B A22B Instruct 2507",
3540 Self::QwenQwen3235bA22bThinking2507 => "Qwen3 235B A22B Thinking 2507",
3541 Self::QwenQwen3235bA22b => "Qwen3 235B-A22B",
3542 Self::QwenQwen330bA3b => "Qwen3 30B A3B",
3543 Self::QwenQwen330bA3bInstruct2507 => "Qwen3 30B A3B Instruct 2507",
3544 Self::QwenQwen330bA3bThinking2507 => "Qwen3 30B A3B Thinking 2507",
3545 Self::QwenQwen332b => "Qwen3 32B",
3546 Self::QwenQwen38b => "Qwen3 8B",
3547 Self::QwenQwen3Coder => "Qwen3 Coder 480B A35B",
3548 Self::QwenQwen3CoderFlash => "Qwen3 Coder Flash",
3549 Self::QwenQwen3CoderNext => "Qwen3 Coder Next",
3550 Self::QwenQwen3CoderPlus => "Qwen3 Coder Plus",
3551 Self::QwenQwen3Max => "Qwen3 Max",
3552 Self::QwenQwen3MaxThinking => "Qwen3 Max Thinking",
3553 Self::QwenQwen3Vl235bA22bInstruct => "Qwen3 VL 235B A22B Instruct",
3554 Self::QwenQwen3Vl235bA22bThinking => "Qwen3 VL 235B A22B Thinking",
3555 Self::QwenQwen3Vl30bA3bInstruct => "Qwen3 VL 30B A3B Instruct",
3556 Self::QwenQwen3Vl30bA3bThinking => "Qwen3 VL 30B A3B Thinking",
3557 Self::QwenQwen3Vl32bInstruct => "Qwen3 VL 32B Instruct",
3558 Self::QwenQwen3Vl8bInstruct => "Qwen3 VL 8B Instruct",
3559 Self::QwenQwen3Vl8bThinking => "Qwen3 VL 8B Thinking",
3560 Self::QwenQwen3Coder30bA3bInstruct => "Qwen3-Coder 30B-A3B Instruct",
3561 Self::QwenQwen3Next80bA3bThinking => "Qwen3-Next 80B-A3B (Thinking)",
3562 Self::QwenQwen3Next80bA3bInstruct => "Qwen3-Next 80B-A3B Instruct",
3563 Self::QwenQwen35122bA10b => "Qwen3.5 122B-A10B",
3564 Self::QwenQwen3527b => "Qwen3.5 27B",
3565 Self::QwenQwen3535bA3b => "Qwen3.5 35B-A3B",
3566 Self::QwenQwen35397bA17b => "Qwen3.5 397B-A17B",
3567 Self::QwenQwen359b => "Qwen3.5 9B",
3568 Self::QwenQwen35Plus0215 => "Qwen3.5 Plus 2026-02-15",
3569 Self::QwenQwen35Plus20260420 => "Qwen3.5 Plus 2026-04-20",
3570 Self::QwenQwen35Flash0223 => "Qwen3.5-Flash",
3571 Self::QwenQwen3627b => "Qwen3.6 27B",
3572 Self::QwenQwen3635bA3b => "Qwen3.6 35B-A3B",
3573 Self::QwenQwen36Flash => "Qwen3.6 Flash",
3574 Self::QwenQwen36MaxPreview => "Qwen3.6 Max Preview",
3575 Self::QwenQwen36Plus => "Qwen3.6 Plus",
3576 Self::QwenQwen37Max => "Qwen3.7 Max",
3577 Self::QwenQwen37Plus => "Qwen3.7 Plus",
3578 Self::DeepseekDeepseekR10528 => "R1 0528",
3579 Self::RekaaiRekaEdge => "Reka Edge",
3580 Self::RelaceRelaceSearch => "Relace Search",
3581 Self::InclusionaiRing261t => "Ring-2.6-1T",
3582 Self::MistralaiMistralSaba => "Saba",
3583 Self::BytedanceSeedSeed16 => "Seed 1.6",
3584 Self::BytedanceSeedSeed16Flash => "Seed 1.6 Flash",
3585 Self::BytedanceSeedSeed20Lite => "Seed-2.0-Lite",
3586 Self::BytedanceSeedSeed20Mini => "Seed-2.0-Mini",
3587 Self::UpstageSolarPro3 => "Solar Pro 3",
3588 Self::StepfunStep35Flash => "Step 3.5 Flash",
3589 Self::StepfunStep37Flash => "Step 3.7 Flash",
3590 Self::ArceeAiTrinityLargeThinking => "Trinity Large Thinking",
3591 Self::ThedrummerUnslopnemo12b => "UnslopNemo 12B",
3592 Self::ArceeAiVirtuosoLarge => "Virtuoso Large",
3593 Self::MistralaiVoxtralSmall24b2507 => "Voxtral Small 24B 2507",
3594 Self::OpenaiGptOss20bFree => "gpt-oss-20b (free)",
3595 Self::OpenaiGptOssSafeguard20b => "gpt-oss-safeguard-20b",
3596 Self::OpenaiO1 => "o1",
3597 Self::OpenaiO3 => "o3",
3598 Self::OpenaiO3MiniHigh => "o3 Mini High",
3599 Self::OpenaiO3DeepResearch => "o3-deep-research",
3600 Self::OpenaiO3Mini => "o3-mini",
3601 Self::OpenaiO3Pro => "o3-pro",
3602 Self::OpenaiO4MiniHigh => "o4 Mini High",
3603 Self::OpenaiO4Mini => "o4-mini",
3604 Self::OpenaiO4MiniDeepResearch => "o4-mini-deep-research",
3605 }
3606 }
3607 #[allow(clippy::too_many_lines)]
3608 fn context_window(self) -> u32 {
3609 match self {
3610 Self::OpenaiGpt35Turbo0613 => 4095,
3611 Self::OpenaiGpt4 => 8191,
3612 Self::RekaaiRekaEdge => 16_384,
3613 Self::OpenaiGpt35Turbo | Self::OpenaiGpt35Turbo16k => 16_385,
3614 Self::MistralaiVoxtralSmall24b2507 => 32_000,
3615 Self::MistralaiMistralSaba
3616 | Self::QwenQwen2572bInstruct
3617 | Self::QwenQwen257bInstruct
3618 | Self::ThedrummerUnslopnemo12b => 32_768,
3619 Self::MistralaiMixtral8x22bInstruct | Self::ZAiGlm45v => 65_536,
3620 Self::QwenQwen330bA3bThinking2507 => 81_920,
3621 Self::AmazonNovaMicroV1
3622 | Self::CohereCommandR082024
3623 | Self::CohereCommandRPlus082024
3624 | Self::InceptionMercury2
3625 | Self::MistralaiMistralLarge
3626 | Self::NvidiaNemotronNano12bV2VlFree
3627 | Self::NvidiaNemotronNano9bV2Free
3628 | Self::OpenaiGpt4Turbo
3629 | Self::OpenaiGpt4TurboPreview
3630 | Self::OpenaiGpt4o
3631 | Self::OpenaiGpt4o20240513
3632 | Self::OpenaiGpt4o20240806
3633 | Self::OpenaiGpt4o20241120
3634 | Self::OpenaiGpt4oMini
3635 | Self::OpenaiGpt4oMini20240718
3636 | Self::OpenaiGpt51Chat
3637 | Self::OpenaiGpt52Chat
3638 | Self::OpenaiGpt53Chat
3639 | Self::OpenaiGptAudio
3640 | Self::OpenaiGptAudioMini
3641 | Self::UpstageSolarPro3 => 128_000,
3642 Self::AionLabsAion20
3643 | Self::AionLabsAion30
3644 | Self::AionLabsAion30Mini
3645 | Self::ArceeAiVirtuosoLarge
3646 | Self::GoogleGemini3ProImage
3647 | Self::GoogleGemma312bIt
3648 | Self::IbmGraniteGranite418b
3649 | Self::MetaLlamaLlama3170bInstruct
3650 | Self::MetaLlamaLlama318bInstruct
3651 | Self::MetaLlamaLlama3370bInstruct
3652 | Self::MistralaiMinistral3b2512
3653 | Self::MistralaiMistralLarge2407
3654 | Self::MistralaiMistralMedium3
3655 | Self::MistralaiMistralMedium31
3656 | Self::MistralaiMistralNemo
3657 | Self::MoonshotaiKimiK2
3658 | Self::OpenaiGptOss120b
3659 | Self::OpenaiGptOss20b
3660 | Self::OpenaiGptOss20bFree
3661 | Self::OpenaiGptOssSafeguard20b
3662 | Self::QwenQwen314b
3663 | Self::QwenQwen3235bA22b
3664 | Self::QwenQwen330bA3b
3665 | Self::QwenQwen332b
3666 | Self::QwenQwen38b
3667 | Self::QwenQwen3Vl235bA22bThinking
3668 | Self::QwenQwen3Vl32bInstruct
3669 | Self::QwenQwen3Vl8bThinking
3670 | Self::Sao10kL31Euryale70b
3671 | Self::ZAiGlm45
3672 | Self::ZAiGlm45Air
3673 | Self::ZAiGlm46v => 131_072,
3674 Self::DeepseekDeepseekChat
3675 | Self::DeepseekDeepseekChatV30324
3676 | Self::DeepseekDeepseekChatV31
3677 | Self::DeepseekDeepseekR1
3678 | Self::DeepseekDeepseekR10528
3679 | Self::DeepseekDeepseekV31Terminus
3680 | Self::DeepseekDeepseekV32
3681 | Self::DeepseekDeepseekV32Exp => 163_840,
3682 Self::AnthropicClaude3Haiku
3683 | Self::AnthropicClaudeHaiku45
3684 | Self::AnthropicClaudeOpus4
3685 | Self::AnthropicClaudeOpus41
3686 | Self::AnthropicClaudeOpus45
3687 | Self::OpenaiO1
3688 | Self::OpenaiO3
3689 | Self::OpenaiO3DeepResearch
3690 | Self::OpenaiO3Mini
3691 | Self::OpenaiO3MiniHigh
3692 | Self::OpenaiO3Pro
3693 | Self::OpenaiO4Mini
3694 | Self::OpenaiO4MiniDeepResearch
3695 | Self::OpenaiO4MiniHigh
3696 | Self::OpenrouterFree => 200_000,
3697 Self::ZAiGlm47Flash | Self::ZAiGlm5Turbo | Self::ZAiGlm5vTurbo => 202_752,
3698 Self::MinimaxMinimaxM2
3699 | Self::MinimaxMinimaxM21
3700 | Self::MinimaxMinimaxM25
3701 | Self::MinimaxMinimaxM27
3702 | Self::ZAiGlm46
3703 | Self::ZAiGlm47
3704 | Self::ZAiGlm5
3705 | Self::ZAiGlm51 => 204_800,
3706 Self::Ai21JambaLarge17
3707 | Self::CohereNorthMiniCodeFree
3708 | Self::KwaipilotKatCoderAirV25
3709 | Self::KwaipilotKatCoderProV25
3710 | Self::MistralaiCodestral2508
3711 | Self::MistralaiMistralSmall3224bInstruct
3712 | Self::NvidiaNemotron3Nano30bA3bFree
3713 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
3714 | Self::RelaceRelaceSearch
3715 | Self::XAiGrokBuild01 => 256_000,
3716 Self::ArceeAiTrinityLargeThinking
3717 | Self::BytedanceSeedSeed16
3718 | Self::BytedanceSeedSeed16Flash
3719 | Self::BytedanceSeedSeed20Lite
3720 | Self::BytedanceSeedSeed20Mini
3721 | Self::GoogleGemma327bIt
3722 | Self::GoogleGemma426bA4bIt
3723 | Self::GoogleGemma426bA4bItFree
3724 | Self::GoogleGemma431bIt
3725 | Self::GoogleGemma431bItFree
3726 | Self::InclusionaiLing261t
3727 | Self::InclusionaiLing26Flash
3728 | Self::InclusionaiLing30FlashFree
3729 | Self::InclusionaiRing261t
3730 | Self::KwaipilotKatCoderProV2
3731 | Self::MistralaiDevstral2512
3732 | Self::MistralaiMinistral14b2512
3733 | Self::MistralaiMinistral8b2512
3734 | Self::MistralaiMistralLarge2512
3735 | Self::MistralaiMistralMedium35
3736 | Self::MistralaiMistralSmall2603
3737 | Self::MoonshotaiKimiK20905
3738 | Self::MoonshotaiKimiK2Thinking
3739 | Self::MoonshotaiKimiK25
3740 | Self::MoonshotaiKimiK26
3741 | Self::MoonshotaiKimiK27Code
3742 | Self::NexAgiNexN2Mini
3743 | Self::NexAgiNexN2Pro
3744 | Self::NvidiaNemotron3Nano30bA3b
3745 | Self::NvidiaNemotron3Super120bA12bFree
3746 | Self::PoolsideLagunaM1
3747 | Self::PoolsideLagunaM1Free
3748 | Self::PoolsideLagunaS21Free
3749 | Self::PoolsideLagunaXs21
3750 | Self::PoolsideLagunaXs21Free
3751 | Self::QwenQwen3235bA22b2507
3752 | Self::QwenQwen3235bA22bThinking2507
3753 | Self::QwenQwen330bA3bInstruct2507
3754 | Self::QwenQwen3Coder
3755 | Self::QwenQwen3Coder30bA3bInstruct
3756 | Self::QwenQwen3CoderNext
3757 | Self::QwenQwen3Max
3758 | Self::QwenQwen3MaxThinking
3759 | Self::QwenQwen3Next80bA3bInstruct
3760 | Self::QwenQwen3Next80bA3bThinking
3761 | Self::QwenQwen3Vl235bA22bInstruct
3762 | Self::QwenQwen3Vl30bA3bInstruct
3763 | Self::QwenQwen3Vl30bA3bThinking
3764 | Self::QwenQwen3Vl8bInstruct
3765 | Self::QwenQwen35122bA10b
3766 | Self::QwenQwen3527b
3767 | Self::QwenQwen3535bA3b
3768 | Self::QwenQwen35397bA17b
3769 | Self::QwenQwen359b
3770 | Self::QwenQwen3627b
3771 | Self::QwenQwen3635bA3b
3772 | Self::QwenQwen36MaxPreview
3773 | Self::StepfunStep35Flash
3774 | Self::StepfunStep37Flash
3775 | Self::TencentHy3
3776 | Self::TencentHy3Preview => 262_144,
3777 Self::AmazonNovaLiteV1 | Self::AmazonNovaProV1 => 300_000,
3778 Self::OpenaiGpt5
3779 | Self::OpenaiGpt5Codex
3780 | Self::OpenaiGpt5Mini
3781 | Self::OpenaiGpt5Nano
3782 | Self::OpenaiGpt5Pro
3783 | Self::OpenaiGpt51
3784 | Self::OpenaiGpt51Codex
3785 | Self::OpenaiGpt51CodexMax
3786 | Self::OpenaiGpt51CodexMini
3787 | Self::OpenaiGpt52
3788 | Self::OpenaiGpt52Codex
3789 | Self::OpenaiGpt52Pro
3790 | Self::OpenaiGpt53Codex
3791 | Self::OpenaiGpt54Mini
3792 | Self::OpenaiGpt54Nano => 400_000,
3793 Self::XAiGrok45 => 500_000,
3794 Self::NvidiaNemotron3Ultra550bA55b => 512_288,
3795 Self::AmazonNova2LiteV1
3796 | Self::AmazonNovaPremierV1
3797 | Self::AnthropicClaudeFable5
3798 | Self::AnthropicClaudeOpus46
3799 | Self::AnthropicClaudeOpus47
3800 | Self::AnthropicClaudeOpus47Fast
3801 | Self::AnthropicClaudeOpus48
3802 | Self::AnthropicClaudeOpus48Fast
3803 | Self::AnthropicClaudeOpus5
3804 | Self::AnthropicClaudeOpus5Fast
3805 | Self::AnthropicClaudeSonnet4
3806 | Self::AnthropicClaudeSonnet45
3807 | Self::AnthropicClaudeSonnet46
3808 | Self::AnthropicClaudeSonnet5
3809 | Self::MinimaxMinimaxM1
3810 | Self::NvidiaNemotron3Super120bA12b
3811 | Self::NvidiaNemotron3Ultra550bA55bFree
3812 | Self::QwenQwenPlus
3813 | Self::QwenQwenPlus20250728
3814 | Self::QwenQwenPlus20250728Thinking
3815 | Self::QwenQwen3CoderFlash
3816 | Self::QwenQwen3CoderPlus
3817 | Self::QwenQwen35Flash0223
3818 | Self::QwenQwen35Plus0215
3819 | Self::QwenQwen35Plus20260420
3820 | Self::QwenQwen36Flash
3821 | Self::QwenQwen36Plus
3822 | Self::QwenQwen37Max
3823 | Self::QwenQwen37Plus
3824 | Self::SakanaFuguUltra
3825 | Self::XAiGrok43 => 1_000_000,
3826 Self::OpenaiGpt41 | Self::OpenaiGpt41Mini | Self::OpenaiGpt41Nano => {
3827 1_047_576
3828 }
3829 Self::DeepseekDeepseekV4Flash
3830 | Self::DeepseekDeepseekV4Pro
3831 | Self::GoogleGemini25Flash
3832 | Self::GoogleGemini25FlashLite
3833 | Self::GoogleGemini25Pro
3834 | Self::GoogleGemini25ProPreview
3835 | Self::GoogleGemini25ProPreview0506
3836 | Self::GoogleGemini3FlashPreview
3837 | Self::GoogleGemini31FlashLite
3838 | Self::GoogleGemini31FlashLitePreview
3839 | Self::GoogleGemini31ProPreview
3840 | Self::GoogleGemini31ProPreviewCustomtools
3841 | Self::GoogleGemini35Flash
3842 | Self::GoogleGemini35FlashLite
3843 | Self::GoogleGemini36Flash
3844 | Self::MetaLlamaLlama4Maverick
3845 | Self::MetaMuseSpark11
3846 | Self::MinimaxMinimaxM3
3847 | Self::MoonshotaiKimiK3
3848 | Self::PoolsideLagunaS21
3849 | Self::ThinkingmachinesInkling
3850 | Self::ZAiGlm52 => 1_048_576,
3851 Self::MeituanLongcat20 => 1_048_756,
3852 Self::OpenaiGpt54
3853 | Self::OpenaiGpt54Pro
3854 | Self::OpenaiGpt55
3855 | Self::OpenaiGpt55Pro
3856 | Self::OpenaiGpt56Luna
3857 | Self::OpenaiGpt56LunaPro
3858 | Self::OpenaiGpt56Sol
3859 | Self::OpenaiGpt56SolPro
3860 | Self::OpenaiGpt56Terra
3861 | Self::OpenaiGpt56TerraPro
3862 | Self::XiaomiMimoV25
3863 | Self::XiaomiMimoV25Pro => 1_050_000,
3864 Self::MetaLlamaLlama4Scout => 1_310_720,
3865 Self::OpenrouterAuto | Self::XAiGrok420 => 2_000_000,
3866 }
3867 }
3868 #[allow(clippy::too_many_lines)]
3869 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
3870 match self {
3871 Self::Ai21JambaLarge17
3872 | Self::AmazonNovaLiteV1
3873 | Self::AmazonNovaMicroV1
3874 | Self::AmazonNovaPremierV1
3875 | Self::AmazonNovaProV1
3876 | Self::AnthropicClaude3Haiku
3877 | Self::ArceeAiVirtuosoLarge
3878 | Self::CohereCommandR082024
3879 | Self::CohereCommandRPlus082024
3880 | Self::DeepseekDeepseekChat
3881 | Self::DeepseekDeepseekChatV30324
3882 | Self::GoogleGemma312bIt
3883 | Self::GoogleGemma327bIt
3884 | Self::IbmGraniteGranite418b
3885 | Self::InclusionaiLing261t
3886 | Self::InclusionaiLing26Flash
3887 | Self::KwaipilotKatCoderAirV25
3888 | Self::KwaipilotKatCoderProV2
3889 | Self::KwaipilotKatCoderProV25
3890 | Self::MetaLlamaLlama3170bInstruct
3891 | Self::MetaLlamaLlama318bInstruct
3892 | Self::MetaLlamaLlama3370bInstruct
3893 | Self::MetaLlamaLlama4Maverick
3894 | Self::MetaLlamaLlama4Scout
3895 | Self::MistralaiCodestral2508
3896 | Self::MistralaiDevstral2512
3897 | Self::MistralaiMinistral14b2512
3898 | Self::MistralaiMinistral3b2512
3899 | Self::MistralaiMinistral8b2512
3900 | Self::MistralaiMistralLarge
3901 | Self::MistralaiMistralLarge2407
3902 | Self::MistralaiMistralLarge2512
3903 | Self::MistralaiMistralMedium3
3904 | Self::MistralaiMistralMedium31
3905 | Self::MistralaiMistralNemo
3906 | Self::MistralaiMistralSaba
3907 | Self::MistralaiMistralSmall3224bInstruct
3908 | Self::MistralaiMixtral8x22bInstruct
3909 | Self::MistralaiVoxtralSmall24b2507
3910 | Self::MoonshotaiKimiK2
3911 | Self::MoonshotaiKimiK20905
3912 | Self::OpenaiGpt35Turbo
3913 | Self::OpenaiGpt35Turbo0613
3914 | Self::OpenaiGpt35Turbo16k
3915 | Self::OpenaiGpt4
3916 | Self::OpenaiGpt4Turbo
3917 | Self::OpenaiGpt4TurboPreview
3918 | Self::OpenaiGpt41
3919 | Self::OpenaiGpt41Mini
3920 | Self::OpenaiGpt41Nano
3921 | Self::OpenaiGpt4o
3922 | Self::OpenaiGpt4o20240513
3923 | Self::OpenaiGpt4o20240806
3924 | Self::OpenaiGpt4o20241120
3925 | Self::OpenaiGpt4oMini
3926 | Self::OpenaiGpt4oMini20240718
3927 | Self::OpenaiGpt51Chat
3928 | Self::OpenaiGpt52Chat
3929 | Self::OpenaiGpt53Chat
3930 | Self::OpenaiGptAudio
3931 | Self::OpenaiGptAudioMini
3932 | Self::QwenQwen2572bInstruct
3933 | Self::QwenQwen257bInstruct
3934 | Self::QwenQwenPlus
3935 | Self::QwenQwenPlus20250728
3936 | Self::QwenQwen3235bA22b2507
3937 | Self::QwenQwen330bA3bInstruct2507
3938 | Self::QwenQwen3Coder
3939 | Self::QwenQwen3Coder30bA3bInstruct
3940 | Self::QwenQwen3CoderFlash
3941 | Self::QwenQwen3CoderNext
3942 | Self::QwenQwen3CoderPlus
3943 | Self::QwenQwen3Max
3944 | Self::QwenQwen3Next80bA3bInstruct
3945 | Self::QwenQwen3Vl235bA22bInstruct
3946 | Self::QwenQwen3Vl30bA3bInstruct
3947 | Self::QwenQwen3Vl32bInstruct
3948 | Self::QwenQwen3Vl8bInstruct
3949 | Self::RekaaiRekaEdge
3950 | Self::RelaceRelaceSearch
3951 | Self::Sao10kL31Euryale70b
3952 | Self::ThedrummerUnslopnemo12b => &[],
3953 Self::MistralaiMistralMedium35
3954 | Self::MistralaiMistralSmall2603
3955 | Self::OpenaiGpt5Pro
3956 | Self::OpenaiO3MiniHigh
3957 | Self::OpenaiO4MiniHigh => &[ReasoningEffort::High],
3958 Self::DeepseekDeepseekV4Flash
3959 | Self::DeepseekDeepseekV4Pro
3960 | Self::InclusionaiRing261t
3961 | Self::ZAiGlm52 => &[ReasoningEffort::High, ReasoningEffort::Xhigh],
3962 Self::TencentHy3 | Self::TencentHy3Preview => {
3963 &[ReasoningEffort::Low, ReasoningEffort::High]
3964 }
3965 Self::MoonshotaiKimiK3 => {
3966 &[ReasoningEffort::Low, ReasoningEffort::High, ReasoningEffort::Max]
3967 }
3968 Self::NvidiaNemotron3Super120bA12b
3969 | Self::NvidiaNemotron3Super120bA12bFree => {
3970 &[ReasoningEffort::Low, ReasoningEffort::Medium]
3971 }
3972 Self::AionLabsAion20
3973 | Self::AionLabsAion30
3974 | Self::AionLabsAion30Mini
3975 | Self::AmazonNova2LiteV1
3976 | Self::AnthropicClaudeHaiku45
3977 | Self::AnthropicClaudeOpus4
3978 | Self::AnthropicClaudeOpus41
3979 | Self::AnthropicClaudeOpus45
3980 | Self::AnthropicClaudeSonnet4
3981 | Self::AnthropicClaudeSonnet45
3982 | Self::ArceeAiTrinityLargeThinking
3983 | Self::BytedanceSeedSeed16
3984 | Self::BytedanceSeedSeed16Flash
3985 | Self::CohereNorthMiniCodeFree
3986 | Self::DeepseekDeepseekChatV31
3987 | Self::DeepseekDeepseekR1
3988 | Self::DeepseekDeepseekR10528
3989 | Self::DeepseekDeepseekV31Terminus
3990 | Self::DeepseekDeepseekV32
3991 | Self::DeepseekDeepseekV32Exp
3992 | Self::GoogleGemini25Flash
3993 | Self::GoogleGemini25FlashLite
3994 | Self::GoogleGemini25Pro
3995 | Self::GoogleGemini25ProPreview
3996 | Self::GoogleGemini25ProPreview0506
3997 | Self::GoogleGemini3ProImage
3998 | Self::GoogleGemini31ProPreview
3999 | Self::GoogleGemini31ProPreviewCustomtools
4000 | Self::GoogleGemma426bA4bIt
4001 | Self::GoogleGemma426bA4bItFree
4002 | Self::GoogleGemma431bIt
4003 | Self::GoogleGemma431bItFree
4004 | Self::InceptionMercury2
4005 | Self::InclusionaiLing30FlashFree
4006 | Self::MeituanLongcat20
4007 | Self::MinimaxMinimaxM1
4008 | Self::MinimaxMinimaxM2
4009 | Self::MinimaxMinimaxM21
4010 | Self::MinimaxMinimaxM25
4011 | Self::MinimaxMinimaxM27
4012 | Self::MinimaxMinimaxM3
4013 | Self::MoonshotaiKimiK2Thinking
4014 | Self::MoonshotaiKimiK25
4015 | Self::MoonshotaiKimiK26
4016 | Self::MoonshotaiKimiK27Code
4017 | Self::NexAgiNexN2Mini
4018 | Self::NexAgiNexN2Pro
4019 | Self::NvidiaNemotron3Nano30bA3b
4020 | Self::NvidiaNemotron3Nano30bA3bFree
4021 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
4022 | Self::NvidiaNemotronNano12bV2VlFree
4023 | Self::NvidiaNemotronNano9bV2Free
4024 | Self::OpenaiGpt5Codex
4025 | Self::OpenaiGpt51
4026 | Self::OpenaiGpt51Codex
4027 | Self::OpenaiGpt51CodexMini
4028 | Self::OpenaiGptOss120b
4029 | Self::OpenaiGptOss20b
4030 | Self::OpenaiGptOss20bFree
4031 | Self::OpenaiGptOssSafeguard20b
4032 | Self::OpenaiO1
4033 | Self::OpenaiO3
4034 | Self::OpenaiO3DeepResearch
4035 | Self::OpenaiO3Mini
4036 | Self::OpenaiO3Pro
4037 | Self::OpenaiO4Mini
4038 | Self::OpenaiO4MiniDeepResearch
4039 | Self::OpenrouterAuto
4040 | Self::OpenrouterFree
4041 | Self::PoolsideLagunaM1
4042 | Self::PoolsideLagunaM1Free
4043 | Self::PoolsideLagunaS21
4044 | Self::PoolsideLagunaS21Free
4045 | Self::PoolsideLagunaXs21
4046 | Self::PoolsideLagunaXs21Free
4047 | Self::QwenQwenPlus20250728Thinking
4048 | Self::QwenQwen314b
4049 | Self::QwenQwen3235bA22b
4050 | Self::QwenQwen3235bA22bThinking2507
4051 | Self::QwenQwen330bA3b
4052 | Self::QwenQwen330bA3bThinking2507
4053 | Self::QwenQwen332b
4054 | Self::QwenQwen38b
4055 | Self::QwenQwen3MaxThinking
4056 | Self::QwenQwen3Next80bA3bThinking
4057 | Self::QwenQwen3Vl235bA22bThinking
4058 | Self::QwenQwen3Vl30bA3bThinking
4059 | Self::QwenQwen3Vl8bThinking
4060 | Self::QwenQwen35122bA10b
4061 | Self::QwenQwen3527b
4062 | Self::QwenQwen3535bA3b
4063 | Self::QwenQwen35397bA17b
4064 | Self::QwenQwen359b
4065 | Self::QwenQwen35Flash0223
4066 | Self::QwenQwen35Plus0215
4067 | Self::QwenQwen35Plus20260420
4068 | Self::QwenQwen3627b
4069 | Self::QwenQwen3635bA3b
4070 | Self::QwenQwen36Flash
4071 | Self::QwenQwen36MaxPreview
4072 | Self::QwenQwen36Plus
4073 | Self::QwenQwen37Max
4074 | Self::QwenQwen37Plus
4075 | Self::StepfunStep35Flash
4076 | Self::StepfunStep37Flash
4077 | Self::UpstageSolarPro3
4078 | Self::XAiGrok420
4079 | Self::XAiGrok43
4080 | Self::XAiGrok45
4081 | Self::XAiGrokBuild01
4082 | Self::XiaomiMimoV25
4083 | Self::XiaomiMimoV25Pro
4084 | Self::ZAiGlm45
4085 | Self::ZAiGlm45Air
4086 | Self::ZAiGlm45v
4087 | Self::ZAiGlm46
4088 | Self::ZAiGlm46v
4089 | Self::ZAiGlm47
4090 | Self::ZAiGlm47Flash
4091 | Self::ZAiGlm5
4092 | Self::ZAiGlm5Turbo
4093 | Self::ZAiGlm51
4094 | Self::ZAiGlm5vTurbo => {
4095 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
4096 }
4097 Self::AnthropicClaudeOpus46 | Self::AnthropicClaudeSonnet46 => {
4098 &[
4099 ReasoningEffort::Low,
4100 ReasoningEffort::Medium,
4101 ReasoningEffort::High,
4102 ReasoningEffort::Max,
4103 ]
4104 }
4105 Self::OpenaiGpt51CodexMax
4106 | Self::OpenaiGpt52
4107 | Self::OpenaiGpt52Codex
4108 | Self::OpenaiGpt53Codex
4109 | Self::OpenaiGpt54
4110 | Self::OpenaiGpt54Mini
4111 | Self::OpenaiGpt54Nano
4112 | Self::OpenaiGpt55 => {
4113 &[
4114 ReasoningEffort::Low,
4115 ReasoningEffort::Medium,
4116 ReasoningEffort::High,
4117 ReasoningEffort::Xhigh,
4118 ]
4119 }
4120 Self::AnthropicClaudeFable5
4121 | Self::AnthropicClaudeOpus47
4122 | Self::AnthropicClaudeOpus47Fast
4123 | Self::AnthropicClaudeOpus48
4124 | Self::AnthropicClaudeOpus48Fast
4125 | Self::AnthropicClaudeOpus5
4126 | Self::AnthropicClaudeOpus5Fast
4127 | Self::AnthropicClaudeSonnet5
4128 | Self::OpenaiGpt56Luna
4129 | Self::OpenaiGpt56LunaPro
4130 | Self::OpenaiGpt56Sol
4131 | Self::OpenaiGpt56SolPro
4132 | Self::OpenaiGpt56Terra
4133 | Self::OpenaiGpt56TerraPro => {
4134 &[
4135 ReasoningEffort::Low,
4136 ReasoningEffort::Medium,
4137 ReasoningEffort::High,
4138 ReasoningEffort::Xhigh,
4139 ReasoningEffort::Max,
4140 ]
4141 }
4142 Self::SakanaFuguUltra => {
4143 &[ReasoningEffort::Max, ReasoningEffort::Xhigh, ReasoningEffort::High]
4144 }
4145 Self::NvidiaNemotron3Ultra550bA55b
4146 | Self::NvidiaNemotron3Ultra550bA55bFree => {
4147 &[ReasoningEffort::Medium, ReasoningEffort::High]
4148 }
4149 Self::OpenaiGpt52Pro | Self::OpenaiGpt54Pro | Self::OpenaiGpt55Pro => {
4150 &[ReasoningEffort::Medium, ReasoningEffort::High, ReasoningEffort::Xhigh]
4151 }
4152 Self::BytedanceSeedSeed20Lite
4153 | Self::BytedanceSeedSeed20Mini
4154 | Self::GoogleGemini3FlashPreview
4155 | Self::GoogleGemini31FlashLite
4156 | Self::GoogleGemini31FlashLitePreview
4157 | Self::GoogleGemini35Flash
4158 | Self::GoogleGemini35FlashLite
4159 | Self::GoogleGemini36Flash
4160 | Self::OpenaiGpt5
4161 | Self::OpenaiGpt5Mini
4162 | Self::OpenaiGpt5Nano => {
4163 &[
4164 ReasoningEffort::Minimal,
4165 ReasoningEffort::Low,
4166 ReasoningEffort::Medium,
4167 ReasoningEffort::High,
4168 ]
4169 }
4170 Self::ThinkingmachinesInkling => {
4171 &[
4172 ReasoningEffort::Minimal,
4173 ReasoningEffort::Low,
4174 ReasoningEffort::Medium,
4175 ReasoningEffort::High,
4176 ReasoningEffort::Max,
4177 ]
4178 }
4179 Self::MetaMuseSpark11 => {
4180 &[
4181 ReasoningEffort::Minimal,
4182 ReasoningEffort::Low,
4183 ReasoningEffort::Medium,
4184 ReasoningEffort::High,
4185 ReasoningEffort::Xhigh,
4186 ]
4187 }
4188 }
4189 }
4190 pub fn supports_reasoning(self) -> bool {
4191 !self.reasoning_levels().is_empty()
4192 }
4193 #[allow(clippy::too_many_lines)]
4194 pub fn supports_prompt_caching(self) -> bool {
4195 match self {
4196 Self::Ai21JambaLarge17
4197 | Self::AmazonNova2LiteV1
4198 | Self::AmazonNovaLiteV1
4199 | Self::AmazonNovaMicroV1
4200 | Self::AmazonNovaProV1
4201 | Self::ArceeAiVirtuosoLarge
4202 | Self::BytedanceSeedSeed16
4203 | Self::BytedanceSeedSeed16Flash
4204 | Self::BytedanceSeedSeed20Lite
4205 | Self::BytedanceSeedSeed20Mini
4206 | Self::CohereCommandR082024
4207 | Self::CohereCommandRPlus082024
4208 | Self::CohereNorthMiniCodeFree
4209 | Self::DeepseekDeepseekChat
4210 | Self::DeepseekDeepseekR1
4211 | Self::DeepseekDeepseekV32Exp
4212 | Self::GoogleGemma312bIt
4213 | Self::GoogleGemma426bA4bItFree
4214 | Self::GoogleGemma431bIt
4215 | Self::GoogleGemma431bItFree
4216 | Self::InclusionaiLing30FlashFree
4217 | Self::MetaLlamaLlama3170bInstruct
4218 | Self::MetaLlamaLlama3370bInstruct
4219 | Self::MetaLlamaLlama4Maverick
4220 | Self::MetaLlamaLlama4Scout
4221 | Self::MinimaxMinimaxM1
4222 | Self::MinimaxMinimaxM2
4223 | Self::MistralaiMistralMedium35
4224 | Self::MistralaiMistralNemo
4225 | Self::MoonshotaiKimiK2
4226 | Self::MoonshotaiKimiK20905
4227 | Self::NvidiaNemotron3Nano30bA3b
4228 | Self::NvidiaNemotron3Nano30bA3bFree
4229 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
4230 | Self::NvidiaNemotron3Super120bA12b
4231 | Self::NvidiaNemotron3Super120bA12bFree
4232 | Self::NvidiaNemotron3Ultra550bA55bFree
4233 | Self::NvidiaNemotronNano12bV2VlFree
4234 | Self::NvidiaNemotronNano9bV2Free
4235 | Self::OpenaiGpt35Turbo
4236 | Self::OpenaiGpt35Turbo0613
4237 | Self::OpenaiGpt35Turbo16k
4238 | Self::OpenaiGpt4
4239 | Self::OpenaiGpt4Turbo
4240 | Self::OpenaiGpt4TurboPreview
4241 | Self::OpenaiGpt4o20240513
4242 | Self::OpenaiGpt5Pro
4243 | Self::OpenaiGpt52Pro
4244 | Self::OpenaiGpt54Pro
4245 | Self::OpenaiGpt55Pro
4246 | Self::OpenaiGptAudio
4247 | Self::OpenaiGptAudioMini
4248 | Self::OpenaiGptOss120b
4249 | Self::OpenaiGptOss20b
4250 | Self::OpenaiGptOss20bFree
4251 | Self::OpenaiO3Pro
4252 | Self::OpenrouterAuto
4253 | Self::OpenrouterFree
4254 | Self::PoolsideLagunaM1Free
4255 | Self::PoolsideLagunaS21Free
4256 | Self::PoolsideLagunaXs21Free
4257 | Self::QwenQwen2572bInstruct
4258 | Self::QwenQwen257bInstruct
4259 | Self::QwenQwenPlus20250728
4260 | Self::QwenQwen314b
4261 | Self::QwenQwen3235bA22b
4262 | Self::QwenQwen3235bA22b2507
4263 | Self::QwenQwen3235bA22bThinking2507
4264 | Self::QwenQwen330bA3b
4265 | Self::QwenQwen330bA3bInstruct2507
4266 | Self::QwenQwen330bA3bThinking2507
4267 | Self::QwenQwen332b
4268 | Self::QwenQwen38b
4269 | Self::QwenQwen3Coder30bA3bInstruct
4270 | Self::QwenQwen3MaxThinking
4271 | Self::QwenQwen3Next80bA3bThinking
4272 | Self::QwenQwen3Vl235bA22bThinking
4273 | Self::QwenQwen3Vl30bA3bInstruct
4274 | Self::QwenQwen3Vl30bA3bThinking
4275 | Self::QwenQwen3Vl32bInstruct
4276 | Self::QwenQwen3Vl8bInstruct
4277 | Self::QwenQwen3Vl8bThinking
4278 | Self::QwenQwen35122bA10b
4279 | Self::QwenQwen3527b
4280 | Self::QwenQwen3535bA3b
4281 | Self::QwenQwen35397bA17b
4282 | Self::QwenQwen359b
4283 | Self::QwenQwen35Flash0223
4284 | Self::QwenQwen35Plus0215
4285 | Self::QwenQwen3635bA3b
4286 | Self::RekaaiRekaEdge
4287 | Self::RelaceRelaceSearch
4288 | Self::Sao10kL31Euryale70b
4289 | Self::StepfunStep35Flash
4290 | Self::ThedrummerUnslopnemo12b => false,
4291 Self::AionLabsAion20
4292 | Self::AionLabsAion30
4293 | Self::AionLabsAion30Mini
4294 | Self::AmazonNovaPremierV1
4295 | Self::AnthropicClaude3Haiku
4296 | Self::AnthropicClaudeFable5
4297 | Self::AnthropicClaudeHaiku45
4298 | Self::AnthropicClaudeOpus4
4299 | Self::AnthropicClaudeOpus41
4300 | Self::AnthropicClaudeOpus45
4301 | Self::AnthropicClaudeOpus46
4302 | Self::AnthropicClaudeOpus47
4303 | Self::AnthropicClaudeOpus47Fast
4304 | Self::AnthropicClaudeOpus48
4305 | Self::AnthropicClaudeOpus48Fast
4306 | Self::AnthropicClaudeOpus5
4307 | Self::AnthropicClaudeOpus5Fast
4308 | Self::AnthropicClaudeSonnet4
4309 | Self::AnthropicClaudeSonnet45
4310 | Self::AnthropicClaudeSonnet46
4311 | Self::AnthropicClaudeSonnet5
4312 | Self::ArceeAiTrinityLargeThinking
4313 | Self::DeepseekDeepseekChatV30324
4314 | Self::DeepseekDeepseekChatV31
4315 | Self::DeepseekDeepseekR10528
4316 | Self::DeepseekDeepseekV31Terminus
4317 | Self::DeepseekDeepseekV32
4318 | Self::DeepseekDeepseekV4Flash
4319 | Self::DeepseekDeepseekV4Pro
4320 | Self::GoogleGemini25Flash
4321 | Self::GoogleGemini25FlashLite
4322 | Self::GoogleGemini25Pro
4323 | Self::GoogleGemini25ProPreview
4324 | Self::GoogleGemini25ProPreview0506
4325 | Self::GoogleGemini3FlashPreview
4326 | Self::GoogleGemini3ProImage
4327 | Self::GoogleGemini31FlashLite
4328 | Self::GoogleGemini31FlashLitePreview
4329 | Self::GoogleGemini31ProPreview
4330 | Self::GoogleGemini31ProPreviewCustomtools
4331 | Self::GoogleGemini35Flash
4332 | Self::GoogleGemini35FlashLite
4333 | Self::GoogleGemini36Flash
4334 | Self::GoogleGemma327bIt
4335 | Self::GoogleGemma426bA4bIt
4336 | Self::IbmGraniteGranite418b
4337 | Self::InceptionMercury2
4338 | Self::InclusionaiLing261t
4339 | Self::InclusionaiLing26Flash
4340 | Self::InclusionaiRing261t
4341 | Self::KwaipilotKatCoderAirV25
4342 | Self::KwaipilotKatCoderProV2
4343 | Self::KwaipilotKatCoderProV25
4344 | Self::MeituanLongcat20
4345 | Self::MetaLlamaLlama318bInstruct
4346 | Self::MetaMuseSpark11
4347 | Self::MinimaxMinimaxM21
4348 | Self::MinimaxMinimaxM25
4349 | Self::MinimaxMinimaxM27
4350 | Self::MinimaxMinimaxM3
4351 | Self::MistralaiCodestral2508
4352 | Self::MistralaiDevstral2512
4353 | Self::MistralaiMinistral14b2512
4354 | Self::MistralaiMinistral3b2512
4355 | Self::MistralaiMinistral8b2512
4356 | Self::MistralaiMistralLarge
4357 | Self::MistralaiMistralLarge2407
4358 | Self::MistralaiMistralLarge2512
4359 | Self::MistralaiMistralMedium3
4360 | Self::MistralaiMistralMedium31
4361 | Self::MistralaiMistralSaba
4362 | Self::MistralaiMistralSmall2603
4363 | Self::MistralaiMistralSmall3224bInstruct
4364 | Self::MistralaiMixtral8x22bInstruct
4365 | Self::MistralaiVoxtralSmall24b2507
4366 | Self::MoonshotaiKimiK2Thinking
4367 | Self::MoonshotaiKimiK25
4368 | Self::MoonshotaiKimiK26
4369 | Self::MoonshotaiKimiK27Code
4370 | Self::MoonshotaiKimiK3
4371 | Self::NexAgiNexN2Mini
4372 | Self::NexAgiNexN2Pro
4373 | Self::NvidiaNemotron3Ultra550bA55b
4374 | Self::OpenaiGpt41
4375 | Self::OpenaiGpt41Mini
4376 | Self::OpenaiGpt41Nano
4377 | Self::OpenaiGpt4o
4378 | Self::OpenaiGpt4o20240806
4379 | Self::OpenaiGpt4o20241120
4380 | Self::OpenaiGpt4oMini
4381 | Self::OpenaiGpt4oMini20240718
4382 | Self::OpenaiGpt5
4383 | Self::OpenaiGpt5Codex
4384 | Self::OpenaiGpt5Mini
4385 | Self::OpenaiGpt5Nano
4386 | Self::OpenaiGpt51
4387 | Self::OpenaiGpt51Chat
4388 | Self::OpenaiGpt51Codex
4389 | Self::OpenaiGpt51CodexMax
4390 | Self::OpenaiGpt51CodexMini
4391 | Self::OpenaiGpt52
4392 | Self::OpenaiGpt52Chat
4393 | Self::OpenaiGpt52Codex
4394 | Self::OpenaiGpt53Chat
4395 | Self::OpenaiGpt53Codex
4396 | Self::OpenaiGpt54
4397 | Self::OpenaiGpt54Mini
4398 | Self::OpenaiGpt54Nano
4399 | Self::OpenaiGpt55
4400 | Self::OpenaiGpt56Luna
4401 | Self::OpenaiGpt56LunaPro
4402 | Self::OpenaiGpt56Sol
4403 | Self::OpenaiGpt56SolPro
4404 | Self::OpenaiGpt56Terra
4405 | Self::OpenaiGpt56TerraPro
4406 | Self::OpenaiGptOssSafeguard20b
4407 | Self::OpenaiO1
4408 | Self::OpenaiO3
4409 | Self::OpenaiO3DeepResearch
4410 | Self::OpenaiO3Mini
4411 | Self::OpenaiO3MiniHigh
4412 | Self::OpenaiO4Mini
4413 | Self::OpenaiO4MiniDeepResearch
4414 | Self::OpenaiO4MiniHigh
4415 | Self::PoolsideLagunaM1
4416 | Self::PoolsideLagunaS21
4417 | Self::PoolsideLagunaXs21
4418 | Self::QwenQwenPlus
4419 | Self::QwenQwenPlus20250728Thinking
4420 | Self::QwenQwen3Coder
4421 | Self::QwenQwen3CoderFlash
4422 | Self::QwenQwen3CoderNext
4423 | Self::QwenQwen3CoderPlus
4424 | Self::QwenQwen3Max
4425 | Self::QwenQwen3Next80bA3bInstruct
4426 | Self::QwenQwen3Vl235bA22bInstruct
4427 | Self::QwenQwen35Plus20260420
4428 | Self::QwenQwen3627b
4429 | Self::QwenQwen36Flash
4430 | Self::QwenQwen36MaxPreview
4431 | Self::QwenQwen36Plus
4432 | Self::QwenQwen37Max
4433 | Self::QwenQwen37Plus
4434 | Self::SakanaFuguUltra
4435 | Self::StepfunStep37Flash
4436 | Self::TencentHy3
4437 | Self::TencentHy3Preview
4438 | Self::ThinkingmachinesInkling
4439 | Self::UpstageSolarPro3
4440 | Self::XAiGrok420
4441 | Self::XAiGrok43
4442 | Self::XAiGrok45
4443 | Self::XAiGrokBuild01
4444 | Self::XiaomiMimoV25
4445 | Self::XiaomiMimoV25Pro
4446 | Self::ZAiGlm45
4447 | Self::ZAiGlm45Air
4448 | Self::ZAiGlm45v
4449 | Self::ZAiGlm46
4450 | Self::ZAiGlm46v
4451 | Self::ZAiGlm47
4452 | Self::ZAiGlm47Flash
4453 | Self::ZAiGlm5
4454 | Self::ZAiGlm5Turbo
4455 | Self::ZAiGlm51
4456 | Self::ZAiGlm52
4457 | Self::ZAiGlm5vTurbo => true,
4458 }
4459 }
4460 #[allow(clippy::too_many_lines)]
4461 pub fn supports_image(self) -> bool {
4462 match self {
4463 Self::Ai21JambaLarge17
4464 | Self::AionLabsAion20
4465 | Self::AionLabsAion30
4466 | Self::AionLabsAion30Mini
4467 | Self::AmazonNovaMicroV1
4468 | Self::ArceeAiTrinityLargeThinking
4469 | Self::ArceeAiVirtuosoLarge
4470 | Self::CohereCommandR082024
4471 | Self::CohereCommandRPlus082024
4472 | Self::CohereNorthMiniCodeFree
4473 | Self::DeepseekDeepseekChat
4474 | Self::DeepseekDeepseekChatV30324
4475 | Self::DeepseekDeepseekChatV31
4476 | Self::DeepseekDeepseekR1
4477 | Self::DeepseekDeepseekR10528
4478 | Self::DeepseekDeepseekV31Terminus
4479 | Self::DeepseekDeepseekV32
4480 | Self::DeepseekDeepseekV32Exp
4481 | Self::DeepseekDeepseekV4Flash
4482 | Self::DeepseekDeepseekV4Pro
4483 | Self::IbmGraniteGranite418b
4484 | Self::InceptionMercury2
4485 | Self::InclusionaiLing261t
4486 | Self::InclusionaiLing26Flash
4487 | Self::InclusionaiLing30FlashFree
4488 | Self::InclusionaiRing261t
4489 | Self::KwaipilotKatCoderAirV25
4490 | Self::KwaipilotKatCoderProV2
4491 | Self::KwaipilotKatCoderProV25
4492 | Self::MeituanLongcat20
4493 | Self::MetaLlamaLlama3170bInstruct
4494 | Self::MetaLlamaLlama318bInstruct
4495 | Self::MetaLlamaLlama3370bInstruct
4496 | Self::MinimaxMinimaxM1
4497 | Self::MinimaxMinimaxM2
4498 | Self::MinimaxMinimaxM21
4499 | Self::MinimaxMinimaxM25
4500 | Self::MinimaxMinimaxM27
4501 | Self::MistralaiCodestral2508
4502 | Self::MistralaiDevstral2512
4503 | Self::MistralaiMistralLarge
4504 | Self::MistralaiMistralLarge2407
4505 | Self::MistralaiMistralNemo
4506 | Self::MistralaiMistralSaba
4507 | Self::MistralaiMixtral8x22bInstruct
4508 | Self::MistralaiVoxtralSmall24b2507
4509 | Self::MoonshotaiKimiK2
4510 | Self::MoonshotaiKimiK20905
4511 | Self::MoonshotaiKimiK2Thinking
4512 | Self::NvidiaNemotron3Nano30bA3b
4513 | Self::NvidiaNemotron3Nano30bA3bFree
4514 | Self::NvidiaNemotron3Super120bA12b
4515 | Self::NvidiaNemotron3Super120bA12bFree
4516 | Self::NvidiaNemotron3Ultra550bA55b
4517 | Self::NvidiaNemotron3Ultra550bA55bFree
4518 | Self::NvidiaNemotronNano9bV2Free
4519 | Self::OpenaiGpt35Turbo
4520 | Self::OpenaiGpt35Turbo0613
4521 | Self::OpenaiGpt35Turbo16k
4522 | Self::OpenaiGpt4
4523 | Self::OpenaiGpt4TurboPreview
4524 | Self::OpenaiGptAudio
4525 | Self::OpenaiGptAudioMini
4526 | Self::OpenaiGptOss120b
4527 | Self::OpenaiGptOss20b
4528 | Self::OpenaiGptOss20bFree
4529 | Self::OpenaiGptOssSafeguard20b
4530 | Self::OpenaiO3Mini
4531 | Self::OpenaiO3MiniHigh
4532 | Self::PoolsideLagunaM1
4533 | Self::PoolsideLagunaM1Free
4534 | Self::PoolsideLagunaS21
4535 | Self::PoolsideLagunaS21Free
4536 | Self::PoolsideLagunaXs21
4537 | Self::PoolsideLagunaXs21Free
4538 | Self::QwenQwen2572bInstruct
4539 | Self::QwenQwen257bInstruct
4540 | Self::QwenQwenPlus
4541 | Self::QwenQwenPlus20250728
4542 | Self::QwenQwenPlus20250728Thinking
4543 | Self::QwenQwen314b
4544 | Self::QwenQwen3235bA22b
4545 | Self::QwenQwen3235bA22b2507
4546 | Self::QwenQwen3235bA22bThinking2507
4547 | Self::QwenQwen330bA3b
4548 | Self::QwenQwen330bA3bInstruct2507
4549 | Self::QwenQwen330bA3bThinking2507
4550 | Self::QwenQwen332b
4551 | Self::QwenQwen38b
4552 | Self::QwenQwen3Coder
4553 | Self::QwenQwen3Coder30bA3bInstruct
4554 | Self::QwenQwen3CoderFlash
4555 | Self::QwenQwen3CoderNext
4556 | Self::QwenQwen3CoderPlus
4557 | Self::QwenQwen3Max
4558 | Self::QwenQwen3MaxThinking
4559 | Self::QwenQwen3Next80bA3bInstruct
4560 | Self::QwenQwen3Next80bA3bThinking
4561 | Self::QwenQwen36MaxPreview
4562 | Self::QwenQwen37Max
4563 | Self::RelaceRelaceSearch
4564 | Self::Sao10kL31Euryale70b
4565 | Self::StepfunStep35Flash
4566 | Self::TencentHy3
4567 | Self::TencentHy3Preview
4568 | Self::ThedrummerUnslopnemo12b
4569 | Self::UpstageSolarPro3
4570 | Self::XiaomiMimoV25Pro
4571 | Self::ZAiGlm45
4572 | Self::ZAiGlm45Air
4573 | Self::ZAiGlm46
4574 | Self::ZAiGlm47
4575 | Self::ZAiGlm47Flash
4576 | Self::ZAiGlm5
4577 | Self::ZAiGlm5Turbo
4578 | Self::ZAiGlm51
4579 | Self::ZAiGlm52 => false,
4580 Self::AmazonNova2LiteV1
4581 | Self::AmazonNovaLiteV1
4582 | Self::AmazonNovaPremierV1
4583 | Self::AmazonNovaProV1
4584 | Self::AnthropicClaude3Haiku
4585 | Self::AnthropicClaudeFable5
4586 | Self::AnthropicClaudeHaiku45
4587 | Self::AnthropicClaudeOpus4
4588 | Self::AnthropicClaudeOpus41
4589 | Self::AnthropicClaudeOpus45
4590 | Self::AnthropicClaudeOpus46
4591 | Self::AnthropicClaudeOpus47
4592 | Self::AnthropicClaudeOpus47Fast
4593 | Self::AnthropicClaudeOpus48
4594 | Self::AnthropicClaudeOpus48Fast
4595 | Self::AnthropicClaudeOpus5
4596 | Self::AnthropicClaudeOpus5Fast
4597 | Self::AnthropicClaudeSonnet4
4598 | Self::AnthropicClaudeSonnet45
4599 | Self::AnthropicClaudeSonnet46
4600 | Self::AnthropicClaudeSonnet5
4601 | Self::BytedanceSeedSeed16
4602 | Self::BytedanceSeedSeed16Flash
4603 | Self::BytedanceSeedSeed20Lite
4604 | Self::BytedanceSeedSeed20Mini
4605 | Self::GoogleGemini25Flash
4606 | Self::GoogleGemini25FlashLite
4607 | Self::GoogleGemini25Pro
4608 | Self::GoogleGemini25ProPreview
4609 | Self::GoogleGemini25ProPreview0506
4610 | Self::GoogleGemini3FlashPreview
4611 | Self::GoogleGemini3ProImage
4612 | Self::GoogleGemini31FlashLite
4613 | Self::GoogleGemini31FlashLitePreview
4614 | Self::GoogleGemini31ProPreview
4615 | Self::GoogleGemini31ProPreviewCustomtools
4616 | Self::GoogleGemini35Flash
4617 | Self::GoogleGemini35FlashLite
4618 | Self::GoogleGemini36Flash
4619 | Self::GoogleGemma312bIt
4620 | Self::GoogleGemma327bIt
4621 | Self::GoogleGemma426bA4bIt
4622 | Self::GoogleGemma426bA4bItFree
4623 | Self::GoogleGemma431bIt
4624 | Self::GoogleGemma431bItFree
4625 | Self::MetaLlamaLlama4Maverick
4626 | Self::MetaLlamaLlama4Scout
4627 | Self::MetaMuseSpark11
4628 | Self::MinimaxMinimaxM3
4629 | Self::MistralaiMinistral14b2512
4630 | Self::MistralaiMinistral3b2512
4631 | Self::MistralaiMinistral8b2512
4632 | Self::MistralaiMistralLarge2512
4633 | Self::MistralaiMistralMedium3
4634 | Self::MistralaiMistralMedium35
4635 | Self::MistralaiMistralMedium31
4636 | Self::MistralaiMistralSmall2603
4637 | Self::MistralaiMistralSmall3224bInstruct
4638 | Self::MoonshotaiKimiK25
4639 | Self::MoonshotaiKimiK26
4640 | Self::MoonshotaiKimiK27Code
4641 | Self::MoonshotaiKimiK3
4642 | Self::NexAgiNexN2Mini
4643 | Self::NexAgiNexN2Pro
4644 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
4645 | Self::NvidiaNemotronNano12bV2VlFree
4646 | Self::OpenaiGpt4Turbo
4647 | Self::OpenaiGpt41
4648 | Self::OpenaiGpt41Mini
4649 | Self::OpenaiGpt41Nano
4650 | Self::OpenaiGpt4o
4651 | Self::OpenaiGpt4o20240513
4652 | Self::OpenaiGpt4o20240806
4653 | Self::OpenaiGpt4o20241120
4654 | Self::OpenaiGpt4oMini
4655 | Self::OpenaiGpt4oMini20240718
4656 | Self::OpenaiGpt5
4657 | Self::OpenaiGpt5Codex
4658 | Self::OpenaiGpt5Mini
4659 | Self::OpenaiGpt5Nano
4660 | Self::OpenaiGpt5Pro
4661 | Self::OpenaiGpt51
4662 | Self::OpenaiGpt51Chat
4663 | Self::OpenaiGpt51Codex
4664 | Self::OpenaiGpt51CodexMax
4665 | Self::OpenaiGpt51CodexMini
4666 | Self::OpenaiGpt52
4667 | Self::OpenaiGpt52Chat
4668 | Self::OpenaiGpt52Codex
4669 | Self::OpenaiGpt52Pro
4670 | Self::OpenaiGpt53Chat
4671 | Self::OpenaiGpt53Codex
4672 | Self::OpenaiGpt54
4673 | Self::OpenaiGpt54Mini
4674 | Self::OpenaiGpt54Nano
4675 | Self::OpenaiGpt54Pro
4676 | Self::OpenaiGpt55
4677 | Self::OpenaiGpt55Pro
4678 | Self::OpenaiGpt56Luna
4679 | Self::OpenaiGpt56LunaPro
4680 | Self::OpenaiGpt56Sol
4681 | Self::OpenaiGpt56SolPro
4682 | Self::OpenaiGpt56Terra
4683 | Self::OpenaiGpt56TerraPro
4684 | Self::OpenaiO1
4685 | Self::OpenaiO3
4686 | Self::OpenaiO3DeepResearch
4687 | Self::OpenaiO3Pro
4688 | Self::OpenaiO4Mini
4689 | Self::OpenaiO4MiniDeepResearch
4690 | Self::OpenaiO4MiniHigh
4691 | Self::OpenrouterAuto
4692 | Self::OpenrouterFree
4693 | Self::QwenQwen3Vl235bA22bInstruct
4694 | Self::QwenQwen3Vl235bA22bThinking
4695 | Self::QwenQwen3Vl30bA3bInstruct
4696 | Self::QwenQwen3Vl30bA3bThinking
4697 | Self::QwenQwen3Vl32bInstruct
4698 | Self::QwenQwen3Vl8bInstruct
4699 | Self::QwenQwen3Vl8bThinking
4700 | Self::QwenQwen35122bA10b
4701 | Self::QwenQwen3527b
4702 | Self::QwenQwen3535bA3b
4703 | Self::QwenQwen35397bA17b
4704 | Self::QwenQwen359b
4705 | Self::QwenQwen35Flash0223
4706 | Self::QwenQwen35Plus0215
4707 | Self::QwenQwen35Plus20260420
4708 | Self::QwenQwen3627b
4709 | Self::QwenQwen3635bA3b
4710 | Self::QwenQwen36Flash
4711 | Self::QwenQwen36Plus
4712 | Self::QwenQwen37Plus
4713 | Self::RekaaiRekaEdge
4714 | Self::SakanaFuguUltra
4715 | Self::StepfunStep37Flash
4716 | Self::ThinkingmachinesInkling
4717 | Self::XAiGrok420
4718 | Self::XAiGrok43
4719 | Self::XAiGrok45
4720 | Self::XAiGrokBuild01
4721 | Self::XiaomiMimoV25
4722 | Self::ZAiGlm45v
4723 | Self::ZAiGlm46v
4724 | Self::ZAiGlm5vTurbo => true,
4725 }
4726 }
4727 #[allow(clippy::too_many_lines)]
4728 pub fn supports_audio(self) -> bool {
4729 match self {
4730 Self::Ai21JambaLarge17
4731 | Self::AionLabsAion20
4732 | Self::AionLabsAion30
4733 | Self::AionLabsAion30Mini
4734 | Self::AmazonNova2LiteV1
4735 | Self::AmazonNovaLiteV1
4736 | Self::AmazonNovaMicroV1
4737 | Self::AmazonNovaPremierV1
4738 | Self::AmazonNovaProV1
4739 | Self::AnthropicClaude3Haiku
4740 | Self::AnthropicClaudeFable5
4741 | Self::AnthropicClaudeHaiku45
4742 | Self::AnthropicClaudeOpus4
4743 | Self::AnthropicClaudeOpus41
4744 | Self::AnthropicClaudeOpus45
4745 | Self::AnthropicClaudeOpus46
4746 | Self::AnthropicClaudeOpus47
4747 | Self::AnthropicClaudeOpus47Fast
4748 | Self::AnthropicClaudeOpus48
4749 | Self::AnthropicClaudeOpus48Fast
4750 | Self::AnthropicClaudeOpus5
4751 | Self::AnthropicClaudeOpus5Fast
4752 | Self::AnthropicClaudeSonnet4
4753 | Self::AnthropicClaudeSonnet45
4754 | Self::AnthropicClaudeSonnet46
4755 | Self::AnthropicClaudeSonnet5
4756 | Self::ArceeAiTrinityLargeThinking
4757 | Self::ArceeAiVirtuosoLarge
4758 | Self::BytedanceSeedSeed16
4759 | Self::BytedanceSeedSeed16Flash
4760 | Self::BytedanceSeedSeed20Lite
4761 | Self::BytedanceSeedSeed20Mini
4762 | Self::CohereCommandR082024
4763 | Self::CohereCommandRPlus082024
4764 | Self::CohereNorthMiniCodeFree
4765 | Self::DeepseekDeepseekChat
4766 | Self::DeepseekDeepseekChatV30324
4767 | Self::DeepseekDeepseekChatV31
4768 | Self::DeepseekDeepseekR1
4769 | Self::DeepseekDeepseekR10528
4770 | Self::DeepseekDeepseekV31Terminus
4771 | Self::DeepseekDeepseekV32
4772 | Self::DeepseekDeepseekV32Exp
4773 | Self::DeepseekDeepseekV4Flash
4774 | Self::DeepseekDeepseekV4Pro
4775 | Self::GoogleGemini3ProImage
4776 | Self::GoogleGemma312bIt
4777 | Self::GoogleGemma327bIt
4778 | Self::GoogleGemma426bA4bIt
4779 | Self::GoogleGemma426bA4bItFree
4780 | Self::GoogleGemma431bIt
4781 | Self::GoogleGemma431bItFree
4782 | Self::IbmGraniteGranite418b
4783 | Self::InceptionMercury2
4784 | Self::InclusionaiLing261t
4785 | Self::InclusionaiLing26Flash
4786 | Self::InclusionaiLing30FlashFree
4787 | Self::InclusionaiRing261t
4788 | Self::KwaipilotKatCoderAirV25
4789 | Self::KwaipilotKatCoderProV2
4790 | Self::KwaipilotKatCoderProV25
4791 | Self::MeituanLongcat20
4792 | Self::MetaLlamaLlama3170bInstruct
4793 | Self::MetaLlamaLlama318bInstruct
4794 | Self::MetaLlamaLlama3370bInstruct
4795 | Self::MetaLlamaLlama4Maverick
4796 | Self::MetaLlamaLlama4Scout
4797 | Self::MinimaxMinimaxM1
4798 | Self::MinimaxMinimaxM2
4799 | Self::MinimaxMinimaxM21
4800 | Self::MinimaxMinimaxM25
4801 | Self::MinimaxMinimaxM27
4802 | Self::MinimaxMinimaxM3
4803 | Self::MistralaiCodestral2508
4804 | Self::MistralaiDevstral2512
4805 | Self::MistralaiMinistral14b2512
4806 | Self::MistralaiMinistral3b2512
4807 | Self::MistralaiMinistral8b2512
4808 | Self::MistralaiMistralLarge
4809 | Self::MistralaiMistralLarge2407
4810 | Self::MistralaiMistralLarge2512
4811 | Self::MistralaiMistralMedium3
4812 | Self::MistralaiMistralMedium35
4813 | Self::MistralaiMistralMedium31
4814 | Self::MistralaiMistralNemo
4815 | Self::MistralaiMistralSaba
4816 | Self::MistralaiMistralSmall2603
4817 | Self::MistralaiMistralSmall3224bInstruct
4818 | Self::MistralaiMixtral8x22bInstruct
4819 | Self::MoonshotaiKimiK2
4820 | Self::MoonshotaiKimiK20905
4821 | Self::MoonshotaiKimiK2Thinking
4822 | Self::MoonshotaiKimiK25
4823 | Self::MoonshotaiKimiK26
4824 | Self::MoonshotaiKimiK27Code
4825 | Self::MoonshotaiKimiK3
4826 | Self::NexAgiNexN2Mini
4827 | Self::NexAgiNexN2Pro
4828 | Self::NvidiaNemotron3Nano30bA3b
4829 | Self::NvidiaNemotron3Nano30bA3bFree
4830 | Self::NvidiaNemotron3Super120bA12b
4831 | Self::NvidiaNemotron3Super120bA12bFree
4832 | Self::NvidiaNemotron3Ultra550bA55b
4833 | Self::NvidiaNemotron3Ultra550bA55bFree
4834 | Self::NvidiaNemotronNano12bV2VlFree
4835 | Self::NvidiaNemotronNano9bV2Free
4836 | Self::OpenaiGpt35Turbo
4837 | Self::OpenaiGpt35Turbo0613
4838 | Self::OpenaiGpt35Turbo16k
4839 | Self::OpenaiGpt4
4840 | Self::OpenaiGpt4Turbo
4841 | Self::OpenaiGpt4TurboPreview
4842 | Self::OpenaiGpt41
4843 | Self::OpenaiGpt41Mini
4844 | Self::OpenaiGpt41Nano
4845 | Self::OpenaiGpt4o
4846 | Self::OpenaiGpt4o20240513
4847 | Self::OpenaiGpt4o20240806
4848 | Self::OpenaiGpt4o20241120
4849 | Self::OpenaiGpt4oMini
4850 | Self::OpenaiGpt4oMini20240718
4851 | Self::OpenaiGpt5
4852 | Self::OpenaiGpt5Codex
4853 | Self::OpenaiGpt5Mini
4854 | Self::OpenaiGpt5Nano
4855 | Self::OpenaiGpt5Pro
4856 | Self::OpenaiGpt51
4857 | Self::OpenaiGpt51Chat
4858 | Self::OpenaiGpt51Codex
4859 | Self::OpenaiGpt51CodexMax
4860 | Self::OpenaiGpt51CodexMini
4861 | Self::OpenaiGpt52
4862 | Self::OpenaiGpt52Chat
4863 | Self::OpenaiGpt52Codex
4864 | Self::OpenaiGpt52Pro
4865 | Self::OpenaiGpt53Chat
4866 | Self::OpenaiGpt53Codex
4867 | Self::OpenaiGpt54
4868 | Self::OpenaiGpt54Mini
4869 | Self::OpenaiGpt54Nano
4870 | Self::OpenaiGpt54Pro
4871 | Self::OpenaiGpt55
4872 | Self::OpenaiGpt55Pro
4873 | Self::OpenaiGpt56Luna
4874 | Self::OpenaiGpt56LunaPro
4875 | Self::OpenaiGpt56Sol
4876 | Self::OpenaiGpt56SolPro
4877 | Self::OpenaiGpt56Terra
4878 | Self::OpenaiGpt56TerraPro
4879 | Self::OpenaiGptOss120b
4880 | Self::OpenaiGptOss20b
4881 | Self::OpenaiGptOss20bFree
4882 | Self::OpenaiGptOssSafeguard20b
4883 | Self::OpenaiO1
4884 | Self::OpenaiO3
4885 | Self::OpenaiO3DeepResearch
4886 | Self::OpenaiO3Mini
4887 | Self::OpenaiO3MiniHigh
4888 | Self::OpenaiO3Pro
4889 | Self::OpenaiO4Mini
4890 | Self::OpenaiO4MiniDeepResearch
4891 | Self::OpenaiO4MiniHigh
4892 | Self::OpenrouterFree
4893 | Self::PoolsideLagunaM1
4894 | Self::PoolsideLagunaM1Free
4895 | Self::PoolsideLagunaS21
4896 | Self::PoolsideLagunaS21Free
4897 | Self::PoolsideLagunaXs21
4898 | Self::PoolsideLagunaXs21Free
4899 | Self::QwenQwen2572bInstruct
4900 | Self::QwenQwen257bInstruct
4901 | Self::QwenQwenPlus
4902 | Self::QwenQwenPlus20250728
4903 | Self::QwenQwenPlus20250728Thinking
4904 | Self::QwenQwen314b
4905 | Self::QwenQwen3235bA22b
4906 | Self::QwenQwen3235bA22b2507
4907 | Self::QwenQwen3235bA22bThinking2507
4908 | Self::QwenQwen330bA3b
4909 | Self::QwenQwen330bA3bInstruct2507
4910 | Self::QwenQwen330bA3bThinking2507
4911 | Self::QwenQwen332b
4912 | Self::QwenQwen38b
4913 | Self::QwenQwen3Coder
4914 | Self::QwenQwen3Coder30bA3bInstruct
4915 | Self::QwenQwen3CoderFlash
4916 | Self::QwenQwen3CoderNext
4917 | Self::QwenQwen3CoderPlus
4918 | Self::QwenQwen3Max
4919 | Self::QwenQwen3MaxThinking
4920 | Self::QwenQwen3Next80bA3bInstruct
4921 | Self::QwenQwen3Next80bA3bThinking
4922 | Self::QwenQwen3Vl235bA22bInstruct
4923 | Self::QwenQwen3Vl235bA22bThinking
4924 | Self::QwenQwen3Vl30bA3bInstruct
4925 | Self::QwenQwen3Vl30bA3bThinking
4926 | Self::QwenQwen3Vl32bInstruct
4927 | Self::QwenQwen3Vl8bInstruct
4928 | Self::QwenQwen3Vl8bThinking
4929 | Self::QwenQwen35122bA10b
4930 | Self::QwenQwen3527b
4931 | Self::QwenQwen3535bA3b
4932 | Self::QwenQwen35397bA17b
4933 | Self::QwenQwen359b
4934 | Self::QwenQwen35Flash0223
4935 | Self::QwenQwen35Plus0215
4936 | Self::QwenQwen35Plus20260420
4937 | Self::QwenQwen3627b
4938 | Self::QwenQwen3635bA3b
4939 | Self::QwenQwen36Flash
4940 | Self::QwenQwen36MaxPreview
4941 | Self::QwenQwen36Plus
4942 | Self::QwenQwen37Max
4943 | Self::QwenQwen37Plus
4944 | Self::RekaaiRekaEdge
4945 | Self::RelaceRelaceSearch
4946 | Self::SakanaFuguUltra
4947 | Self::Sao10kL31Euryale70b
4948 | Self::StepfunStep35Flash
4949 | Self::StepfunStep37Flash
4950 | Self::TencentHy3
4951 | Self::TencentHy3Preview
4952 | Self::ThedrummerUnslopnemo12b
4953 | Self::UpstageSolarPro3
4954 | Self::XAiGrok420
4955 | Self::XAiGrok43
4956 | Self::XAiGrok45
4957 | Self::XAiGrokBuild01
4958 | Self::XiaomiMimoV25Pro
4959 | Self::ZAiGlm45
4960 | Self::ZAiGlm45Air
4961 | Self::ZAiGlm45v
4962 | Self::ZAiGlm46
4963 | Self::ZAiGlm46v
4964 | Self::ZAiGlm47
4965 | Self::ZAiGlm47Flash
4966 | Self::ZAiGlm5
4967 | Self::ZAiGlm5Turbo
4968 | Self::ZAiGlm51
4969 | Self::ZAiGlm52
4970 | Self::ZAiGlm5vTurbo => false,
4971 Self::GoogleGemini25Flash
4972 | Self::GoogleGemini25FlashLite
4973 | Self::GoogleGemini25Pro
4974 | Self::GoogleGemini25ProPreview
4975 | Self::GoogleGemini25ProPreview0506
4976 | Self::GoogleGemini3FlashPreview
4977 | Self::GoogleGemini31FlashLite
4978 | Self::GoogleGemini31FlashLitePreview
4979 | Self::GoogleGemini31ProPreview
4980 | Self::GoogleGemini31ProPreviewCustomtools
4981 | Self::GoogleGemini35Flash
4982 | Self::GoogleGemini35FlashLite
4983 | Self::GoogleGemini36Flash
4984 | Self::MetaMuseSpark11
4985 | Self::MistralaiVoxtralSmall24b2507
4986 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
4987 | Self::OpenaiGptAudio
4988 | Self::OpenaiGptAudioMini
4989 | Self::OpenrouterAuto
4990 | Self::ThinkingmachinesInkling
4991 | Self::XiaomiMimoV25 => true,
4992 }
4993 }
4994 #[allow(clippy::too_many_lines)]
4995 pub fn transport(self) -> Option<ModelTransport> {
4996 match self {
4997 Self::Ai21JambaLarge17
4998 | Self::AionLabsAion20
4999 | Self::AionLabsAion30
5000 | Self::AionLabsAion30Mini
5001 | Self::AmazonNova2LiteV1
5002 | Self::AmazonNovaLiteV1
5003 | Self::AmazonNovaMicroV1
5004 | Self::AmazonNovaPremierV1
5005 | Self::AmazonNovaProV1
5006 | Self::AnthropicClaude3Haiku
5007 | Self::AnthropicClaudeFable5
5008 | Self::AnthropicClaudeHaiku45
5009 | Self::AnthropicClaudeOpus4
5010 | Self::AnthropicClaudeOpus41
5011 | Self::AnthropicClaudeOpus45
5012 | Self::AnthropicClaudeOpus46
5013 | Self::AnthropicClaudeOpus47
5014 | Self::AnthropicClaudeOpus47Fast
5015 | Self::AnthropicClaudeOpus48
5016 | Self::AnthropicClaudeOpus48Fast
5017 | Self::AnthropicClaudeOpus5
5018 | Self::AnthropicClaudeOpus5Fast
5019 | Self::AnthropicClaudeSonnet4
5020 | Self::AnthropicClaudeSonnet45
5021 | Self::AnthropicClaudeSonnet46
5022 | Self::AnthropicClaudeSonnet5
5023 | Self::ArceeAiTrinityLargeThinking
5024 | Self::ArceeAiVirtuosoLarge
5025 | Self::BytedanceSeedSeed16
5026 | Self::BytedanceSeedSeed16Flash
5027 | Self::BytedanceSeedSeed20Lite
5028 | Self::BytedanceSeedSeed20Mini
5029 | Self::CohereCommandR082024
5030 | Self::CohereCommandRPlus082024
5031 | Self::CohereNorthMiniCodeFree
5032 | Self::DeepseekDeepseekChat
5033 | Self::DeepseekDeepseekChatV30324
5034 | Self::DeepseekDeepseekChatV31
5035 | Self::DeepseekDeepseekR1
5036 | Self::DeepseekDeepseekR10528
5037 | Self::DeepseekDeepseekV31Terminus
5038 | Self::DeepseekDeepseekV32
5039 | Self::DeepseekDeepseekV32Exp
5040 | Self::DeepseekDeepseekV4Flash
5041 | Self::DeepseekDeepseekV4Pro
5042 | Self::GoogleGemini25Flash
5043 | Self::GoogleGemini25FlashLite
5044 | Self::GoogleGemini25Pro
5045 | Self::GoogleGemini25ProPreview
5046 | Self::GoogleGemini25ProPreview0506
5047 | Self::GoogleGemini3FlashPreview
5048 | Self::GoogleGemini3ProImage
5049 | Self::GoogleGemini31FlashLite
5050 | Self::GoogleGemini31FlashLitePreview
5051 | Self::GoogleGemini31ProPreview
5052 | Self::GoogleGemini31ProPreviewCustomtools
5053 | Self::GoogleGemini35Flash
5054 | Self::GoogleGemini35FlashLite
5055 | Self::GoogleGemini36Flash
5056 | Self::GoogleGemma312bIt
5057 | Self::GoogleGemma327bIt
5058 | Self::GoogleGemma426bA4bIt
5059 | Self::GoogleGemma426bA4bItFree
5060 | Self::GoogleGemma431bIt
5061 | Self::GoogleGemma431bItFree
5062 | Self::IbmGraniteGranite418b
5063 | Self::InceptionMercury2
5064 | Self::InclusionaiLing261t
5065 | Self::InclusionaiLing26Flash
5066 | Self::InclusionaiLing30FlashFree
5067 | Self::InclusionaiRing261t
5068 | Self::KwaipilotKatCoderAirV25
5069 | Self::KwaipilotKatCoderProV2
5070 | Self::KwaipilotKatCoderProV25
5071 | Self::MeituanLongcat20
5072 | Self::MetaLlamaLlama3170bInstruct
5073 | Self::MetaLlamaLlama318bInstruct
5074 | Self::MetaLlamaLlama3370bInstruct
5075 | Self::MetaLlamaLlama4Maverick
5076 | Self::MetaLlamaLlama4Scout
5077 | Self::MetaMuseSpark11
5078 | Self::MinimaxMinimaxM1
5079 | Self::MinimaxMinimaxM2
5080 | Self::MinimaxMinimaxM21
5081 | Self::MinimaxMinimaxM25
5082 | Self::MinimaxMinimaxM27
5083 | Self::MinimaxMinimaxM3
5084 | Self::MistralaiCodestral2508
5085 | Self::MistralaiDevstral2512
5086 | Self::MistralaiMinistral14b2512
5087 | Self::MistralaiMinistral3b2512
5088 | Self::MistralaiMinistral8b2512
5089 | Self::MistralaiMistralLarge
5090 | Self::MistralaiMistralLarge2407
5091 | Self::MistralaiMistralLarge2512
5092 | Self::MistralaiMistralMedium3
5093 | Self::MistralaiMistralMedium35
5094 | Self::MistralaiMistralMedium31
5095 | Self::MistralaiMistralNemo
5096 | Self::MistralaiMistralSaba
5097 | Self::MistralaiMistralSmall2603
5098 | Self::MistralaiMistralSmall3224bInstruct
5099 | Self::MistralaiMixtral8x22bInstruct
5100 | Self::MistralaiVoxtralSmall24b2507
5101 | Self::MoonshotaiKimiK2
5102 | Self::MoonshotaiKimiK20905
5103 | Self::MoonshotaiKimiK2Thinking
5104 | Self::MoonshotaiKimiK25
5105 | Self::MoonshotaiKimiK26
5106 | Self::MoonshotaiKimiK27Code
5107 | Self::MoonshotaiKimiK3
5108 | Self::NexAgiNexN2Mini
5109 | Self::NexAgiNexN2Pro
5110 | Self::NvidiaNemotron3Nano30bA3b
5111 | Self::NvidiaNemotron3Nano30bA3bFree
5112 | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
5113 | Self::NvidiaNemotron3Super120bA12b
5114 | Self::NvidiaNemotron3Super120bA12bFree
5115 | Self::NvidiaNemotron3Ultra550bA55b
5116 | Self::NvidiaNemotron3Ultra550bA55bFree
5117 | Self::NvidiaNemotronNano12bV2VlFree
5118 | Self::NvidiaNemotronNano9bV2Free
5119 | Self::OpenaiGpt35Turbo
5120 | Self::OpenaiGpt35Turbo0613
5121 | Self::OpenaiGpt35Turbo16k
5122 | Self::OpenaiGpt4
5123 | Self::OpenaiGpt4Turbo
5124 | Self::OpenaiGpt4TurboPreview
5125 | Self::OpenaiGpt41
5126 | Self::OpenaiGpt41Mini
5127 | Self::OpenaiGpt41Nano
5128 | Self::OpenaiGpt4o
5129 | Self::OpenaiGpt4o20240513
5130 | Self::OpenaiGpt4o20240806
5131 | Self::OpenaiGpt4o20241120
5132 | Self::OpenaiGpt4oMini
5133 | Self::OpenaiGpt4oMini20240718
5134 | Self::OpenaiGpt5
5135 | Self::OpenaiGpt5Codex
5136 | Self::OpenaiGpt5Mini
5137 | Self::OpenaiGpt5Nano
5138 | Self::OpenaiGpt5Pro
5139 | Self::OpenaiGpt51
5140 | Self::OpenaiGpt51Chat
5141 | Self::OpenaiGpt51Codex
5142 | Self::OpenaiGpt51CodexMax
5143 | Self::OpenaiGpt51CodexMini
5144 | Self::OpenaiGpt52
5145 | Self::OpenaiGpt52Chat
5146 | Self::OpenaiGpt52Codex
5147 | Self::OpenaiGpt52Pro
5148 | Self::OpenaiGpt53Chat
5149 | Self::OpenaiGpt53Codex
5150 | Self::OpenaiGpt54
5151 | Self::OpenaiGpt54Mini
5152 | Self::OpenaiGpt54Nano
5153 | Self::OpenaiGpt54Pro
5154 | Self::OpenaiGpt55
5155 | Self::OpenaiGpt55Pro
5156 | Self::OpenaiGpt56Luna
5157 | Self::OpenaiGpt56LunaPro
5158 | Self::OpenaiGpt56Sol
5159 | Self::OpenaiGpt56SolPro
5160 | Self::OpenaiGpt56Terra
5161 | Self::OpenaiGpt56TerraPro
5162 | Self::OpenaiGptAudio
5163 | Self::OpenaiGptAudioMini
5164 | Self::OpenaiGptOss120b
5165 | Self::OpenaiGptOss20b
5166 | Self::OpenaiGptOss20bFree
5167 | Self::OpenaiGptOssSafeguard20b
5168 | Self::OpenaiO1
5169 | Self::OpenaiO3
5170 | Self::OpenaiO3DeepResearch
5171 | Self::OpenaiO3Mini
5172 | Self::OpenaiO3MiniHigh
5173 | Self::OpenaiO3Pro
5174 | Self::OpenaiO4Mini
5175 | Self::OpenaiO4MiniDeepResearch
5176 | Self::OpenaiO4MiniHigh
5177 | Self::OpenrouterAuto
5178 | Self::OpenrouterFree
5179 | Self::PoolsideLagunaM1
5180 | Self::PoolsideLagunaM1Free
5181 | Self::PoolsideLagunaS21
5182 | Self::PoolsideLagunaS21Free
5183 | Self::PoolsideLagunaXs21
5184 | Self::PoolsideLagunaXs21Free
5185 | Self::QwenQwen2572bInstruct
5186 | Self::QwenQwen257bInstruct
5187 | Self::QwenQwenPlus
5188 | Self::QwenQwenPlus20250728
5189 | Self::QwenQwenPlus20250728Thinking
5190 | Self::QwenQwen314b
5191 | Self::QwenQwen3235bA22b
5192 | Self::QwenQwen3235bA22b2507
5193 | Self::QwenQwen3235bA22bThinking2507
5194 | Self::QwenQwen330bA3b
5195 | Self::QwenQwen330bA3bInstruct2507
5196 | Self::QwenQwen330bA3bThinking2507
5197 | Self::QwenQwen332b
5198 | Self::QwenQwen38b
5199 | Self::QwenQwen3Coder
5200 | Self::QwenQwen3Coder30bA3bInstruct
5201 | Self::QwenQwen3CoderFlash
5202 | Self::QwenQwen3CoderNext
5203 | Self::QwenQwen3CoderPlus
5204 | Self::QwenQwen3Max
5205 | Self::QwenQwen3MaxThinking
5206 | Self::QwenQwen3Next80bA3bInstruct
5207 | Self::QwenQwen3Next80bA3bThinking
5208 | Self::QwenQwen3Vl235bA22bInstruct
5209 | Self::QwenQwen3Vl235bA22bThinking
5210 | Self::QwenQwen3Vl30bA3bInstruct
5211 | Self::QwenQwen3Vl30bA3bThinking
5212 | Self::QwenQwen3Vl32bInstruct
5213 | Self::QwenQwen3Vl8bInstruct
5214 | Self::QwenQwen3Vl8bThinking
5215 | Self::QwenQwen35122bA10b
5216 | Self::QwenQwen3527b
5217 | Self::QwenQwen3535bA3b
5218 | Self::QwenQwen35397bA17b
5219 | Self::QwenQwen359b
5220 | Self::QwenQwen35Flash0223
5221 | Self::QwenQwen35Plus0215
5222 | Self::QwenQwen35Plus20260420
5223 | Self::QwenQwen3627b
5224 | Self::QwenQwen3635bA3b
5225 | Self::QwenQwen36Flash
5226 | Self::QwenQwen36MaxPreview
5227 | Self::QwenQwen36Plus
5228 | Self::QwenQwen37Max
5229 | Self::QwenQwen37Plus
5230 | Self::RekaaiRekaEdge
5231 | Self::RelaceRelaceSearch
5232 | Self::SakanaFuguUltra
5233 | Self::Sao10kL31Euryale70b
5234 | Self::StepfunStep35Flash
5235 | Self::StepfunStep37Flash
5236 | Self::TencentHy3
5237 | Self::TencentHy3Preview
5238 | Self::ThedrummerUnslopnemo12b
5239 | Self::ThinkingmachinesInkling
5240 | Self::UpstageSolarPro3
5241 | Self::XAiGrok420
5242 | Self::XAiGrok43
5243 | Self::XAiGrok45
5244 | Self::XAiGrokBuild01
5245 | Self::XiaomiMimoV25
5246 | Self::XiaomiMimoV25Pro
5247 | Self::ZAiGlm45
5248 | Self::ZAiGlm45Air
5249 | Self::ZAiGlm45v
5250 | Self::ZAiGlm46
5251 | Self::ZAiGlm46v
5252 | Self::ZAiGlm47
5253 | Self::ZAiGlm47Flash
5254 | Self::ZAiGlm5
5255 | Self::ZAiGlm5Turbo
5256 | Self::ZAiGlm51
5257 | Self::ZAiGlm52
5258 | Self::ZAiGlm5vTurbo => None,
5259 }
5260 }
5261 const ALL: &[OpenRouterModel] = &[
5262 Self::Ai21JambaLarge17,
5263 Self::AionLabsAion20,
5264 Self::AionLabsAion30,
5265 Self::AionLabsAion30Mini,
5266 Self::AmazonNova2LiteV1,
5267 Self::AmazonNovaLiteV1,
5268 Self::AmazonNovaMicroV1,
5269 Self::AmazonNovaPremierV1,
5270 Self::AmazonNovaProV1,
5271 Self::AnthropicClaude3Haiku,
5272 Self::AnthropicClaudeFable5,
5273 Self::AnthropicClaudeHaiku45,
5274 Self::AnthropicClaudeOpus4,
5275 Self::AnthropicClaudeOpus41,
5276 Self::AnthropicClaudeOpus45,
5277 Self::AnthropicClaudeOpus46,
5278 Self::AnthropicClaudeOpus47,
5279 Self::AnthropicClaudeOpus47Fast,
5280 Self::AnthropicClaudeOpus48,
5281 Self::AnthropicClaudeOpus48Fast,
5282 Self::AnthropicClaudeOpus5,
5283 Self::AnthropicClaudeOpus5Fast,
5284 Self::AnthropicClaudeSonnet4,
5285 Self::AnthropicClaudeSonnet45,
5286 Self::AnthropicClaudeSonnet46,
5287 Self::AnthropicClaudeSonnet5,
5288 Self::ArceeAiTrinityLargeThinking,
5289 Self::ArceeAiVirtuosoLarge,
5290 Self::BytedanceSeedSeed16,
5291 Self::BytedanceSeedSeed16Flash,
5292 Self::BytedanceSeedSeed20Lite,
5293 Self::BytedanceSeedSeed20Mini,
5294 Self::CohereCommandR082024,
5295 Self::CohereCommandRPlus082024,
5296 Self::CohereNorthMiniCodeFree,
5297 Self::DeepseekDeepseekChat,
5298 Self::DeepseekDeepseekChatV30324,
5299 Self::DeepseekDeepseekChatV31,
5300 Self::DeepseekDeepseekR1,
5301 Self::DeepseekDeepseekR10528,
5302 Self::DeepseekDeepseekV31Terminus,
5303 Self::DeepseekDeepseekV32,
5304 Self::DeepseekDeepseekV32Exp,
5305 Self::DeepseekDeepseekV4Flash,
5306 Self::DeepseekDeepseekV4Pro,
5307 Self::GoogleGemini25Flash,
5308 Self::GoogleGemini25FlashLite,
5309 Self::GoogleGemini25Pro,
5310 Self::GoogleGemini25ProPreview,
5311 Self::GoogleGemini25ProPreview0506,
5312 Self::GoogleGemini3FlashPreview,
5313 Self::GoogleGemini3ProImage,
5314 Self::GoogleGemini31FlashLite,
5315 Self::GoogleGemini31FlashLitePreview,
5316 Self::GoogleGemini31ProPreview,
5317 Self::GoogleGemini31ProPreviewCustomtools,
5318 Self::GoogleGemini35Flash,
5319 Self::GoogleGemini35FlashLite,
5320 Self::GoogleGemini36Flash,
5321 Self::GoogleGemma312bIt,
5322 Self::GoogleGemma327bIt,
5323 Self::GoogleGemma426bA4bIt,
5324 Self::GoogleGemma426bA4bItFree,
5325 Self::GoogleGemma431bIt,
5326 Self::GoogleGemma431bItFree,
5327 Self::IbmGraniteGranite418b,
5328 Self::InceptionMercury2,
5329 Self::InclusionaiLing261t,
5330 Self::InclusionaiLing26Flash,
5331 Self::InclusionaiLing30FlashFree,
5332 Self::InclusionaiRing261t,
5333 Self::KwaipilotKatCoderAirV25,
5334 Self::KwaipilotKatCoderProV2,
5335 Self::KwaipilotKatCoderProV25,
5336 Self::MeituanLongcat20,
5337 Self::MetaLlamaLlama3170bInstruct,
5338 Self::MetaLlamaLlama318bInstruct,
5339 Self::MetaLlamaLlama3370bInstruct,
5340 Self::MetaLlamaLlama4Maverick,
5341 Self::MetaLlamaLlama4Scout,
5342 Self::MetaMuseSpark11,
5343 Self::MinimaxMinimaxM1,
5344 Self::MinimaxMinimaxM2,
5345 Self::MinimaxMinimaxM21,
5346 Self::MinimaxMinimaxM25,
5347 Self::MinimaxMinimaxM27,
5348 Self::MinimaxMinimaxM3,
5349 Self::MistralaiCodestral2508,
5350 Self::MistralaiDevstral2512,
5351 Self::MistralaiMinistral14b2512,
5352 Self::MistralaiMinistral3b2512,
5353 Self::MistralaiMinistral8b2512,
5354 Self::MistralaiMistralLarge,
5355 Self::MistralaiMistralLarge2407,
5356 Self::MistralaiMistralLarge2512,
5357 Self::MistralaiMistralMedium3,
5358 Self::MistralaiMistralMedium35,
5359 Self::MistralaiMistralMedium31,
5360 Self::MistralaiMistralNemo,
5361 Self::MistralaiMistralSaba,
5362 Self::MistralaiMistralSmall2603,
5363 Self::MistralaiMistralSmall3224bInstruct,
5364 Self::MistralaiMixtral8x22bInstruct,
5365 Self::MistralaiVoxtralSmall24b2507,
5366 Self::MoonshotaiKimiK2,
5367 Self::MoonshotaiKimiK20905,
5368 Self::MoonshotaiKimiK2Thinking,
5369 Self::MoonshotaiKimiK25,
5370 Self::MoonshotaiKimiK26,
5371 Self::MoonshotaiKimiK27Code,
5372 Self::MoonshotaiKimiK3,
5373 Self::NexAgiNexN2Mini,
5374 Self::NexAgiNexN2Pro,
5375 Self::NvidiaNemotron3Nano30bA3b,
5376 Self::NvidiaNemotron3Nano30bA3bFree,
5377 Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree,
5378 Self::NvidiaNemotron3Super120bA12b,
5379 Self::NvidiaNemotron3Super120bA12bFree,
5380 Self::NvidiaNemotron3Ultra550bA55b,
5381 Self::NvidiaNemotron3Ultra550bA55bFree,
5382 Self::NvidiaNemotronNano12bV2VlFree,
5383 Self::NvidiaNemotronNano9bV2Free,
5384 Self::OpenaiGpt35Turbo,
5385 Self::OpenaiGpt35Turbo0613,
5386 Self::OpenaiGpt35Turbo16k,
5387 Self::OpenaiGpt4,
5388 Self::OpenaiGpt4Turbo,
5389 Self::OpenaiGpt4TurboPreview,
5390 Self::OpenaiGpt41,
5391 Self::OpenaiGpt41Mini,
5392 Self::OpenaiGpt41Nano,
5393 Self::OpenaiGpt4o,
5394 Self::OpenaiGpt4o20240513,
5395 Self::OpenaiGpt4o20240806,
5396 Self::OpenaiGpt4o20241120,
5397 Self::OpenaiGpt4oMini,
5398 Self::OpenaiGpt4oMini20240718,
5399 Self::OpenaiGpt5,
5400 Self::OpenaiGpt5Codex,
5401 Self::OpenaiGpt5Mini,
5402 Self::OpenaiGpt5Nano,
5403 Self::OpenaiGpt5Pro,
5404 Self::OpenaiGpt51,
5405 Self::OpenaiGpt51Chat,
5406 Self::OpenaiGpt51Codex,
5407 Self::OpenaiGpt51CodexMax,
5408 Self::OpenaiGpt51CodexMini,
5409 Self::OpenaiGpt52,
5410 Self::OpenaiGpt52Chat,
5411 Self::OpenaiGpt52Codex,
5412 Self::OpenaiGpt52Pro,
5413 Self::OpenaiGpt53Chat,
5414 Self::OpenaiGpt53Codex,
5415 Self::OpenaiGpt54,
5416 Self::OpenaiGpt54Mini,
5417 Self::OpenaiGpt54Nano,
5418 Self::OpenaiGpt54Pro,
5419 Self::OpenaiGpt55,
5420 Self::OpenaiGpt55Pro,
5421 Self::OpenaiGpt56Luna,
5422 Self::OpenaiGpt56LunaPro,
5423 Self::OpenaiGpt56Sol,
5424 Self::OpenaiGpt56SolPro,
5425 Self::OpenaiGpt56Terra,
5426 Self::OpenaiGpt56TerraPro,
5427 Self::OpenaiGptAudio,
5428 Self::OpenaiGptAudioMini,
5429 Self::OpenaiGptOss120b,
5430 Self::OpenaiGptOss20b,
5431 Self::OpenaiGptOss20bFree,
5432 Self::OpenaiGptOssSafeguard20b,
5433 Self::OpenaiO1,
5434 Self::OpenaiO3,
5435 Self::OpenaiO3DeepResearch,
5436 Self::OpenaiO3Mini,
5437 Self::OpenaiO3MiniHigh,
5438 Self::OpenaiO3Pro,
5439 Self::OpenaiO4Mini,
5440 Self::OpenaiO4MiniDeepResearch,
5441 Self::OpenaiO4MiniHigh,
5442 Self::OpenrouterAuto,
5443 Self::OpenrouterFree,
5444 Self::PoolsideLagunaM1,
5445 Self::PoolsideLagunaM1Free,
5446 Self::PoolsideLagunaS21,
5447 Self::PoolsideLagunaS21Free,
5448 Self::PoolsideLagunaXs21,
5449 Self::PoolsideLagunaXs21Free,
5450 Self::QwenQwen2572bInstruct,
5451 Self::QwenQwen257bInstruct,
5452 Self::QwenQwenPlus,
5453 Self::QwenQwenPlus20250728,
5454 Self::QwenQwenPlus20250728Thinking,
5455 Self::QwenQwen314b,
5456 Self::QwenQwen3235bA22b,
5457 Self::QwenQwen3235bA22b2507,
5458 Self::QwenQwen3235bA22bThinking2507,
5459 Self::QwenQwen330bA3b,
5460 Self::QwenQwen330bA3bInstruct2507,
5461 Self::QwenQwen330bA3bThinking2507,
5462 Self::QwenQwen332b,
5463 Self::QwenQwen38b,
5464 Self::QwenQwen3Coder,
5465 Self::QwenQwen3Coder30bA3bInstruct,
5466 Self::QwenQwen3CoderFlash,
5467 Self::QwenQwen3CoderNext,
5468 Self::QwenQwen3CoderPlus,
5469 Self::QwenQwen3Max,
5470 Self::QwenQwen3MaxThinking,
5471 Self::QwenQwen3Next80bA3bInstruct,
5472 Self::QwenQwen3Next80bA3bThinking,
5473 Self::QwenQwen3Vl235bA22bInstruct,
5474 Self::QwenQwen3Vl235bA22bThinking,
5475 Self::QwenQwen3Vl30bA3bInstruct,
5476 Self::QwenQwen3Vl30bA3bThinking,
5477 Self::QwenQwen3Vl32bInstruct,
5478 Self::QwenQwen3Vl8bInstruct,
5479 Self::QwenQwen3Vl8bThinking,
5480 Self::QwenQwen35122bA10b,
5481 Self::QwenQwen3527b,
5482 Self::QwenQwen3535bA3b,
5483 Self::QwenQwen35397bA17b,
5484 Self::QwenQwen359b,
5485 Self::QwenQwen35Flash0223,
5486 Self::QwenQwen35Plus0215,
5487 Self::QwenQwen35Plus20260420,
5488 Self::QwenQwen3627b,
5489 Self::QwenQwen3635bA3b,
5490 Self::QwenQwen36Flash,
5491 Self::QwenQwen36MaxPreview,
5492 Self::QwenQwen36Plus,
5493 Self::QwenQwen37Max,
5494 Self::QwenQwen37Plus,
5495 Self::RekaaiRekaEdge,
5496 Self::RelaceRelaceSearch,
5497 Self::SakanaFuguUltra,
5498 Self::Sao10kL31Euryale70b,
5499 Self::StepfunStep35Flash,
5500 Self::StepfunStep37Flash,
5501 Self::TencentHy3,
5502 Self::TencentHy3Preview,
5503 Self::ThedrummerUnslopnemo12b,
5504 Self::ThinkingmachinesInkling,
5505 Self::UpstageSolarPro3,
5506 Self::XAiGrok420,
5507 Self::XAiGrok43,
5508 Self::XAiGrok45,
5509 Self::XAiGrokBuild01,
5510 Self::XiaomiMimoV25,
5511 Self::XiaomiMimoV25Pro,
5512 Self::ZAiGlm45,
5513 Self::ZAiGlm45Air,
5514 Self::ZAiGlm45v,
5515 Self::ZAiGlm46,
5516 Self::ZAiGlm46v,
5517 Self::ZAiGlm47,
5518 Self::ZAiGlm47Flash,
5519 Self::ZAiGlm5,
5520 Self::ZAiGlm5Turbo,
5521 Self::ZAiGlm51,
5522 Self::ZAiGlm52,
5523 Self::ZAiGlm5vTurbo,
5524 ];
5525}
5526impl std::str::FromStr for OpenRouterModel {
5527 type Err = String;
5528 #[allow(clippy::too_many_lines)]
5529 fn from_str(s: &str) -> Result<Self, Self::Err> {
5530 match s {
5531 "ai21/jamba-large-1.7" => Ok(Self::Ai21JambaLarge17),
5532 "aion-labs/aion-2.0" => Ok(Self::AionLabsAion20),
5533 "aion-labs/aion-3.0" => Ok(Self::AionLabsAion30),
5534 "aion-labs/aion-3.0-mini" => Ok(Self::AionLabsAion30Mini),
5535 "amazon/nova-2-lite-v1" => Ok(Self::AmazonNova2LiteV1),
5536 "amazon/nova-lite-v1" => Ok(Self::AmazonNovaLiteV1),
5537 "amazon/nova-micro-v1" => Ok(Self::AmazonNovaMicroV1),
5538 "amazon/nova-premier-v1" => Ok(Self::AmazonNovaPremierV1),
5539 "amazon/nova-pro-v1" => Ok(Self::AmazonNovaProV1),
5540 "anthropic/claude-3-haiku" => Ok(Self::AnthropicClaude3Haiku),
5541 "anthropic/claude-fable-5" => Ok(Self::AnthropicClaudeFable5),
5542 "anthropic/claude-haiku-4.5" => Ok(Self::AnthropicClaudeHaiku45),
5543 "anthropic/claude-opus-4" => Ok(Self::AnthropicClaudeOpus4),
5544 "anthropic/claude-opus-4.1" => Ok(Self::AnthropicClaudeOpus41),
5545 "anthropic/claude-opus-4.5" => Ok(Self::AnthropicClaudeOpus45),
5546 "anthropic/claude-opus-4.6" => Ok(Self::AnthropicClaudeOpus46),
5547 "anthropic/claude-opus-4.7" => Ok(Self::AnthropicClaudeOpus47),
5548 "anthropic/claude-opus-4.7-fast" => Ok(Self::AnthropicClaudeOpus47Fast),
5549 "anthropic/claude-opus-4.8" => Ok(Self::AnthropicClaudeOpus48),
5550 "anthropic/claude-opus-4.8-fast" => Ok(Self::AnthropicClaudeOpus48Fast),
5551 "anthropic/claude-opus-5" => Ok(Self::AnthropicClaudeOpus5),
5552 "anthropic/claude-opus-5-fast" => Ok(Self::AnthropicClaudeOpus5Fast),
5553 "anthropic/claude-sonnet-4" => Ok(Self::AnthropicClaudeSonnet4),
5554 "anthropic/claude-sonnet-4.5" => Ok(Self::AnthropicClaudeSonnet45),
5555 "anthropic/claude-sonnet-4.6" => Ok(Self::AnthropicClaudeSonnet46),
5556 "anthropic/claude-sonnet-5" => Ok(Self::AnthropicClaudeSonnet5),
5557 "arcee-ai/trinity-large-thinking" => Ok(Self::ArceeAiTrinityLargeThinking),
5558 "arcee-ai/virtuoso-large" => Ok(Self::ArceeAiVirtuosoLarge),
5559 "bytedance-seed/seed-1.6" => Ok(Self::BytedanceSeedSeed16),
5560 "bytedance-seed/seed-1.6-flash" => Ok(Self::BytedanceSeedSeed16Flash),
5561 "bytedance-seed/seed-2.0-lite" => Ok(Self::BytedanceSeedSeed20Lite),
5562 "bytedance-seed/seed-2.0-mini" => Ok(Self::BytedanceSeedSeed20Mini),
5563 "cohere/command-r-08-2024" => Ok(Self::CohereCommandR082024),
5564 "cohere/command-r-plus-08-2024" => Ok(Self::CohereCommandRPlus082024),
5565 "cohere/north-mini-code:free" => Ok(Self::CohereNorthMiniCodeFree),
5566 "deepseek/deepseek-chat" => Ok(Self::DeepseekDeepseekChat),
5567 "deepseek/deepseek-chat-v3-0324" => Ok(Self::DeepseekDeepseekChatV30324),
5568 "deepseek/deepseek-chat-v3.1" => Ok(Self::DeepseekDeepseekChatV31),
5569 "deepseek/deepseek-r1" => Ok(Self::DeepseekDeepseekR1),
5570 "deepseek/deepseek-r1-0528" => Ok(Self::DeepseekDeepseekR10528),
5571 "deepseek/deepseek-v3.1-terminus" => Ok(Self::DeepseekDeepseekV31Terminus),
5572 "deepseek/deepseek-v3.2" => Ok(Self::DeepseekDeepseekV32),
5573 "deepseek/deepseek-v3.2-exp" => Ok(Self::DeepseekDeepseekV32Exp),
5574 "deepseek/deepseek-v4-flash" => Ok(Self::DeepseekDeepseekV4Flash),
5575 "deepseek/deepseek-v4-pro" => Ok(Self::DeepseekDeepseekV4Pro),
5576 "google/gemini-2.5-flash" => Ok(Self::GoogleGemini25Flash),
5577 "google/gemini-2.5-flash-lite" => Ok(Self::GoogleGemini25FlashLite),
5578 "google/gemini-2.5-pro" => Ok(Self::GoogleGemini25Pro),
5579 "google/gemini-2.5-pro-preview" => Ok(Self::GoogleGemini25ProPreview),
5580 "google/gemini-2.5-pro-preview-05-06" => {
5581 Ok(Self::GoogleGemini25ProPreview0506)
5582 }
5583 "google/gemini-3-flash-preview" => Ok(Self::GoogleGemini3FlashPreview),
5584 "google/gemini-3-pro-image" => Ok(Self::GoogleGemini3ProImage),
5585 "google/gemini-3.1-flash-lite" => Ok(Self::GoogleGemini31FlashLite),
5586 "google/gemini-3.1-flash-lite-preview" => {
5587 Ok(Self::GoogleGemini31FlashLitePreview)
5588 }
5589 "google/gemini-3.1-pro-preview" => Ok(Self::GoogleGemini31ProPreview),
5590 "google/gemini-3.1-pro-preview-customtools" => {
5591 Ok(Self::GoogleGemini31ProPreviewCustomtools)
5592 }
5593 "google/gemini-3.5-flash" => Ok(Self::GoogleGemini35Flash),
5594 "google/gemini-3.5-flash-lite" => Ok(Self::GoogleGemini35FlashLite),
5595 "google/gemini-3.6-flash" => Ok(Self::GoogleGemini36Flash),
5596 "google/gemma-3-12b-it" => Ok(Self::GoogleGemma312bIt),
5597 "google/gemma-3-27b-it" => Ok(Self::GoogleGemma327bIt),
5598 "google/gemma-4-26b-a4b-it" => Ok(Self::GoogleGemma426bA4bIt),
5599 "google/gemma-4-26b-a4b-it:free" => Ok(Self::GoogleGemma426bA4bItFree),
5600 "google/gemma-4-31b-it" => Ok(Self::GoogleGemma431bIt),
5601 "google/gemma-4-31b-it:free" => Ok(Self::GoogleGemma431bItFree),
5602 "ibm-granite/granite-4.1-8b" => Ok(Self::IbmGraniteGranite418b),
5603 "inception/mercury-2" => Ok(Self::InceptionMercury2),
5604 "inclusionai/ling-2.6-1t" => Ok(Self::InclusionaiLing261t),
5605 "inclusionai/ling-2.6-flash" => Ok(Self::InclusionaiLing26Flash),
5606 "inclusionai/ling-3.0-flash:free" => Ok(Self::InclusionaiLing30FlashFree),
5607 "inclusionai/ring-2.6-1t" => Ok(Self::InclusionaiRing261t),
5608 "kwaipilot/kat-coder-air-v2.5" => Ok(Self::KwaipilotKatCoderAirV25),
5609 "kwaipilot/kat-coder-pro-v2" => Ok(Self::KwaipilotKatCoderProV2),
5610 "kwaipilot/kat-coder-pro-v2.5" => Ok(Self::KwaipilotKatCoderProV25),
5611 "meituan/longcat-2.0" => Ok(Self::MeituanLongcat20),
5612 "meta-llama/llama-3.1-70b-instruct" => Ok(Self::MetaLlamaLlama3170bInstruct),
5613 "meta-llama/llama-3.1-8b-instruct" => Ok(Self::MetaLlamaLlama318bInstruct),
5614 "meta-llama/llama-3.3-70b-instruct" => Ok(Self::MetaLlamaLlama3370bInstruct),
5615 "meta-llama/llama-4-maverick" => Ok(Self::MetaLlamaLlama4Maverick),
5616 "meta-llama/llama-4-scout" => Ok(Self::MetaLlamaLlama4Scout),
5617 "meta/muse-spark-1.1" => Ok(Self::MetaMuseSpark11),
5618 "minimax/minimax-m1" => Ok(Self::MinimaxMinimaxM1),
5619 "minimax/minimax-m2" => Ok(Self::MinimaxMinimaxM2),
5620 "minimax/minimax-m2.1" => Ok(Self::MinimaxMinimaxM21),
5621 "minimax/minimax-m2.5" => Ok(Self::MinimaxMinimaxM25),
5622 "minimax/minimax-m2.7" => Ok(Self::MinimaxMinimaxM27),
5623 "minimax/minimax-m3" => Ok(Self::MinimaxMinimaxM3),
5624 "mistralai/codestral-2508" => Ok(Self::MistralaiCodestral2508),
5625 "mistralai/devstral-2512" => Ok(Self::MistralaiDevstral2512),
5626 "mistralai/ministral-14b-2512" => Ok(Self::MistralaiMinistral14b2512),
5627 "mistralai/ministral-3b-2512" => Ok(Self::MistralaiMinistral3b2512),
5628 "mistralai/ministral-8b-2512" => Ok(Self::MistralaiMinistral8b2512),
5629 "mistralai/mistral-large" => Ok(Self::MistralaiMistralLarge),
5630 "mistralai/mistral-large-2407" => Ok(Self::MistralaiMistralLarge2407),
5631 "mistralai/mistral-large-2512" => Ok(Self::MistralaiMistralLarge2512),
5632 "mistralai/mistral-medium-3" => Ok(Self::MistralaiMistralMedium3),
5633 "mistralai/mistral-medium-3-5" => Ok(Self::MistralaiMistralMedium35),
5634 "mistralai/mistral-medium-3.1" => Ok(Self::MistralaiMistralMedium31),
5635 "mistralai/mistral-nemo" => Ok(Self::MistralaiMistralNemo),
5636 "mistralai/mistral-saba" => Ok(Self::MistralaiMistralSaba),
5637 "mistralai/mistral-small-2603" => Ok(Self::MistralaiMistralSmall2603),
5638 "mistralai/mistral-small-3.2-24b-instruct" => {
5639 Ok(Self::MistralaiMistralSmall3224bInstruct)
5640 }
5641 "mistralai/mixtral-8x22b-instruct" => Ok(Self::MistralaiMixtral8x22bInstruct),
5642 "mistralai/voxtral-small-24b-2507" => Ok(Self::MistralaiVoxtralSmall24b2507),
5643 "moonshotai/kimi-k2" => Ok(Self::MoonshotaiKimiK2),
5644 "moonshotai/kimi-k2-0905" => Ok(Self::MoonshotaiKimiK20905),
5645 "moonshotai/kimi-k2-thinking" => Ok(Self::MoonshotaiKimiK2Thinking),
5646 "moonshotai/kimi-k2.5" => Ok(Self::MoonshotaiKimiK25),
5647 "moonshotai/kimi-k2.6" => Ok(Self::MoonshotaiKimiK26),
5648 "moonshotai/kimi-k2.7-code" => Ok(Self::MoonshotaiKimiK27Code),
5649 "moonshotai/kimi-k3" => Ok(Self::MoonshotaiKimiK3),
5650 "nex-agi/nex-n2-mini" => Ok(Self::NexAgiNexN2Mini),
5651 "nex-agi/nex-n2-pro" => Ok(Self::NexAgiNexN2Pro),
5652 "nvidia/nemotron-3-nano-30b-a3b" => Ok(Self::NvidiaNemotron3Nano30bA3b),
5653 "nvidia/nemotron-3-nano-30b-a3b:free" => {
5654 Ok(Self::NvidiaNemotron3Nano30bA3bFree)
5655 }
5656 "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free" => {
5657 Ok(Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree)
5658 }
5659 "nvidia/nemotron-3-super-120b-a12b" => Ok(Self::NvidiaNemotron3Super120bA12b),
5660 "nvidia/nemotron-3-super-120b-a12b:free" => {
5661 Ok(Self::NvidiaNemotron3Super120bA12bFree)
5662 }
5663 "nvidia/nemotron-3-ultra-550b-a55b" => Ok(Self::NvidiaNemotron3Ultra550bA55b),
5664 "nvidia/nemotron-3-ultra-550b-a55b:free" => {
5665 Ok(Self::NvidiaNemotron3Ultra550bA55bFree)
5666 }
5667 "nvidia/nemotron-nano-12b-v2-vl:free" => {
5668 Ok(Self::NvidiaNemotronNano12bV2VlFree)
5669 }
5670 "nvidia/nemotron-nano-9b-v2:free" => Ok(Self::NvidiaNemotronNano9bV2Free),
5671 "openai/gpt-3.5-turbo" => Ok(Self::OpenaiGpt35Turbo),
5672 "openai/gpt-3.5-turbo-0613" => Ok(Self::OpenaiGpt35Turbo0613),
5673 "openai/gpt-3.5-turbo-16k" => Ok(Self::OpenaiGpt35Turbo16k),
5674 "openai/gpt-4" => Ok(Self::OpenaiGpt4),
5675 "openai/gpt-4-turbo" => Ok(Self::OpenaiGpt4Turbo),
5676 "openai/gpt-4-turbo-preview" => Ok(Self::OpenaiGpt4TurboPreview),
5677 "openai/gpt-4.1" => Ok(Self::OpenaiGpt41),
5678 "openai/gpt-4.1-mini" => Ok(Self::OpenaiGpt41Mini),
5679 "openai/gpt-4.1-nano" => Ok(Self::OpenaiGpt41Nano),
5680 "openai/gpt-4o" => Ok(Self::OpenaiGpt4o),
5681 "openai/gpt-4o-2024-05-13" => Ok(Self::OpenaiGpt4o20240513),
5682 "openai/gpt-4o-2024-08-06" => Ok(Self::OpenaiGpt4o20240806),
5683 "openai/gpt-4o-2024-11-20" => Ok(Self::OpenaiGpt4o20241120),
5684 "openai/gpt-4o-mini" => Ok(Self::OpenaiGpt4oMini),
5685 "openai/gpt-4o-mini-2024-07-18" => Ok(Self::OpenaiGpt4oMini20240718),
5686 "openai/gpt-5" => Ok(Self::OpenaiGpt5),
5687 "openai/gpt-5-codex" => Ok(Self::OpenaiGpt5Codex),
5688 "openai/gpt-5-mini" => Ok(Self::OpenaiGpt5Mini),
5689 "openai/gpt-5-nano" => Ok(Self::OpenaiGpt5Nano),
5690 "openai/gpt-5-pro" => Ok(Self::OpenaiGpt5Pro),
5691 "openai/gpt-5.1" => Ok(Self::OpenaiGpt51),
5692 "openai/gpt-5.1-chat" => Ok(Self::OpenaiGpt51Chat),
5693 "openai/gpt-5.1-codex" => Ok(Self::OpenaiGpt51Codex),
5694 "openai/gpt-5.1-codex-max" => Ok(Self::OpenaiGpt51CodexMax),
5695 "openai/gpt-5.1-codex-mini" => Ok(Self::OpenaiGpt51CodexMini),
5696 "openai/gpt-5.2" => Ok(Self::OpenaiGpt52),
5697 "openai/gpt-5.2-chat" => Ok(Self::OpenaiGpt52Chat),
5698 "openai/gpt-5.2-codex" => Ok(Self::OpenaiGpt52Codex),
5699 "openai/gpt-5.2-pro" => Ok(Self::OpenaiGpt52Pro),
5700 "openai/gpt-5.3-chat" => Ok(Self::OpenaiGpt53Chat),
5701 "openai/gpt-5.3-codex" => Ok(Self::OpenaiGpt53Codex),
5702 "openai/gpt-5.4" => Ok(Self::OpenaiGpt54),
5703 "openai/gpt-5.4-mini" => Ok(Self::OpenaiGpt54Mini),
5704 "openai/gpt-5.4-nano" => Ok(Self::OpenaiGpt54Nano),
5705 "openai/gpt-5.4-pro" => Ok(Self::OpenaiGpt54Pro),
5706 "openai/gpt-5.5" => Ok(Self::OpenaiGpt55),
5707 "openai/gpt-5.5-pro" => Ok(Self::OpenaiGpt55Pro),
5708 "openai/gpt-5.6-luna" => Ok(Self::OpenaiGpt56Luna),
5709 "openai/gpt-5.6-luna-pro" => Ok(Self::OpenaiGpt56LunaPro),
5710 "openai/gpt-5.6-sol" => Ok(Self::OpenaiGpt56Sol),
5711 "openai/gpt-5.6-sol-pro" => Ok(Self::OpenaiGpt56SolPro),
5712 "openai/gpt-5.6-terra" => Ok(Self::OpenaiGpt56Terra),
5713 "openai/gpt-5.6-terra-pro" => Ok(Self::OpenaiGpt56TerraPro),
5714 "openai/gpt-audio" => Ok(Self::OpenaiGptAudio),
5715 "openai/gpt-audio-mini" => Ok(Self::OpenaiGptAudioMini),
5716 "openai/gpt-oss-120b" => Ok(Self::OpenaiGptOss120b),
5717 "openai/gpt-oss-20b" => Ok(Self::OpenaiGptOss20b),
5718 "openai/gpt-oss-20b:free" => Ok(Self::OpenaiGptOss20bFree),
5719 "openai/gpt-oss-safeguard-20b" => Ok(Self::OpenaiGptOssSafeguard20b),
5720 "openai/o1" => Ok(Self::OpenaiO1),
5721 "openai/o3" => Ok(Self::OpenaiO3),
5722 "openai/o3-deep-research" => Ok(Self::OpenaiO3DeepResearch),
5723 "openai/o3-mini" => Ok(Self::OpenaiO3Mini),
5724 "openai/o3-mini-high" => Ok(Self::OpenaiO3MiniHigh),
5725 "openai/o3-pro" => Ok(Self::OpenaiO3Pro),
5726 "openai/o4-mini" => Ok(Self::OpenaiO4Mini),
5727 "openai/o4-mini-deep-research" => Ok(Self::OpenaiO4MiniDeepResearch),
5728 "openai/o4-mini-high" => Ok(Self::OpenaiO4MiniHigh),
5729 "openrouter/auto" => Ok(Self::OpenrouterAuto),
5730 "openrouter/free" => Ok(Self::OpenrouterFree),
5731 "poolside/laguna-m.1" => Ok(Self::PoolsideLagunaM1),
5732 "poolside/laguna-m.1:free" => Ok(Self::PoolsideLagunaM1Free),
5733 "poolside/laguna-s-2.1" => Ok(Self::PoolsideLagunaS21),
5734 "poolside/laguna-s-2.1:free" => Ok(Self::PoolsideLagunaS21Free),
5735 "poolside/laguna-xs-2.1" => Ok(Self::PoolsideLagunaXs21),
5736 "poolside/laguna-xs-2.1:free" => Ok(Self::PoolsideLagunaXs21Free),
5737 "qwen/qwen-2.5-72b-instruct" => Ok(Self::QwenQwen2572bInstruct),
5738 "qwen/qwen-2.5-7b-instruct" => Ok(Self::QwenQwen257bInstruct),
5739 "qwen/qwen-plus" => Ok(Self::QwenQwenPlus),
5740 "qwen/qwen-plus-2025-07-28" => Ok(Self::QwenQwenPlus20250728),
5741 "qwen/qwen-plus-2025-07-28:thinking" => {
5742 Ok(Self::QwenQwenPlus20250728Thinking)
5743 }
5744 "qwen/qwen3-14b" => Ok(Self::QwenQwen314b),
5745 "qwen/qwen3-235b-a22b" => Ok(Self::QwenQwen3235bA22b),
5746 "qwen/qwen3-235b-a22b-2507" => Ok(Self::QwenQwen3235bA22b2507),
5747 "qwen/qwen3-235b-a22b-thinking-2507" => {
5748 Ok(Self::QwenQwen3235bA22bThinking2507)
5749 }
5750 "qwen/qwen3-30b-a3b" => Ok(Self::QwenQwen330bA3b),
5751 "qwen/qwen3-30b-a3b-instruct-2507" => Ok(Self::QwenQwen330bA3bInstruct2507),
5752 "qwen/qwen3-30b-a3b-thinking-2507" => Ok(Self::QwenQwen330bA3bThinking2507),
5753 "qwen/qwen3-32b" => Ok(Self::QwenQwen332b),
5754 "qwen/qwen3-8b" => Ok(Self::QwenQwen38b),
5755 "qwen/qwen3-coder" => Ok(Self::QwenQwen3Coder),
5756 "qwen/qwen3-coder-30b-a3b-instruct" => Ok(Self::QwenQwen3Coder30bA3bInstruct),
5757 "qwen/qwen3-coder-flash" => Ok(Self::QwenQwen3CoderFlash),
5758 "qwen/qwen3-coder-next" => Ok(Self::QwenQwen3CoderNext),
5759 "qwen/qwen3-coder-plus" => Ok(Self::QwenQwen3CoderPlus),
5760 "qwen/qwen3-max" => Ok(Self::QwenQwen3Max),
5761 "qwen/qwen3-max-thinking" => Ok(Self::QwenQwen3MaxThinking),
5762 "qwen/qwen3-next-80b-a3b-instruct" => Ok(Self::QwenQwen3Next80bA3bInstruct),
5763 "qwen/qwen3-next-80b-a3b-thinking" => Ok(Self::QwenQwen3Next80bA3bThinking),
5764 "qwen/qwen3-vl-235b-a22b-instruct" => Ok(Self::QwenQwen3Vl235bA22bInstruct),
5765 "qwen/qwen3-vl-235b-a22b-thinking" => Ok(Self::QwenQwen3Vl235bA22bThinking),
5766 "qwen/qwen3-vl-30b-a3b-instruct" => Ok(Self::QwenQwen3Vl30bA3bInstruct),
5767 "qwen/qwen3-vl-30b-a3b-thinking" => Ok(Self::QwenQwen3Vl30bA3bThinking),
5768 "qwen/qwen3-vl-32b-instruct" => Ok(Self::QwenQwen3Vl32bInstruct),
5769 "qwen/qwen3-vl-8b-instruct" => Ok(Self::QwenQwen3Vl8bInstruct),
5770 "qwen/qwen3-vl-8b-thinking" => Ok(Self::QwenQwen3Vl8bThinking),
5771 "qwen/qwen3.5-122b-a10b" => Ok(Self::QwenQwen35122bA10b),
5772 "qwen/qwen3.5-27b" => Ok(Self::QwenQwen3527b),
5773 "qwen/qwen3.5-35b-a3b" => Ok(Self::QwenQwen3535bA3b),
5774 "qwen/qwen3.5-397b-a17b" => Ok(Self::QwenQwen35397bA17b),
5775 "qwen/qwen3.5-9b" => Ok(Self::QwenQwen359b),
5776 "qwen/qwen3.5-flash-02-23" => Ok(Self::QwenQwen35Flash0223),
5777 "qwen/qwen3.5-plus-02-15" => Ok(Self::QwenQwen35Plus0215),
5778 "qwen/qwen3.5-plus-20260420" => Ok(Self::QwenQwen35Plus20260420),
5779 "qwen/qwen3.6-27b" => Ok(Self::QwenQwen3627b),
5780 "qwen/qwen3.6-35b-a3b" => Ok(Self::QwenQwen3635bA3b),
5781 "qwen/qwen3.6-flash" => Ok(Self::QwenQwen36Flash),
5782 "qwen/qwen3.6-max-preview" => Ok(Self::QwenQwen36MaxPreview),
5783 "qwen/qwen3.6-plus" => Ok(Self::QwenQwen36Plus),
5784 "qwen/qwen3.7-max" => Ok(Self::QwenQwen37Max),
5785 "qwen/qwen3.7-plus" => Ok(Self::QwenQwen37Plus),
5786 "rekaai/reka-edge" => Ok(Self::RekaaiRekaEdge),
5787 "relace/relace-search" => Ok(Self::RelaceRelaceSearch),
5788 "sakana/fugu-ultra" => Ok(Self::SakanaFuguUltra),
5789 "sao10k/l3.1-euryale-70b" => Ok(Self::Sao10kL31Euryale70b),
5790 "stepfun/step-3.5-flash" => Ok(Self::StepfunStep35Flash),
5791 "stepfun/step-3.7-flash" => Ok(Self::StepfunStep37Flash),
5792 "tencent/hy3" => Ok(Self::TencentHy3),
5793 "tencent/hy3-preview" => Ok(Self::TencentHy3Preview),
5794 "thedrummer/unslopnemo-12b" => Ok(Self::ThedrummerUnslopnemo12b),
5795 "thinkingmachines/inkling" => Ok(Self::ThinkingmachinesInkling),
5796 "upstage/solar-pro-3" => Ok(Self::UpstageSolarPro3),
5797 "x-ai/grok-4.20" => Ok(Self::XAiGrok420),
5798 "x-ai/grok-4.3" => Ok(Self::XAiGrok43),
5799 "x-ai/grok-4.5" => Ok(Self::XAiGrok45),
5800 "x-ai/grok-build-0.1" => Ok(Self::XAiGrokBuild01),
5801 "xiaomi/mimo-v2.5" => Ok(Self::XiaomiMimoV25),
5802 "xiaomi/mimo-v2.5-pro" => Ok(Self::XiaomiMimoV25Pro),
5803 "z-ai/glm-4.5" => Ok(Self::ZAiGlm45),
5804 "z-ai/glm-4.5-air" => Ok(Self::ZAiGlm45Air),
5805 "z-ai/glm-4.5v" => Ok(Self::ZAiGlm45v),
5806 "z-ai/glm-4.6" => Ok(Self::ZAiGlm46),
5807 "z-ai/glm-4.6v" => Ok(Self::ZAiGlm46v),
5808 "z-ai/glm-4.7" => Ok(Self::ZAiGlm47),
5809 "z-ai/glm-4.7-flash" => Ok(Self::ZAiGlm47Flash),
5810 "z-ai/glm-5" => Ok(Self::ZAiGlm5),
5811 "z-ai/glm-5-turbo" => Ok(Self::ZAiGlm5Turbo),
5812 "z-ai/glm-5.1" => Ok(Self::ZAiGlm51),
5813 "z-ai/glm-5.2" => Ok(Self::ZAiGlm52),
5814 "z-ai/glm-5v-turbo" => Ok(Self::ZAiGlm5vTurbo),
5815 _ => Err(format!("Unknown openrouter model: '{s}'")),
5816 }
5817 }
5818}
5819impl ZAiModel {
5820 #[allow(clippy::too_many_lines)]
5821 fn model_id(self) -> &'static str {
5822 match self {
5823 Self::Glm45 => "glm-4.5",
5824 Self::Glm45Air => "glm-4.5-air",
5825 Self::Glm45Flash => "glm-4.5-flash",
5826 Self::Glm45v => "glm-4.5v",
5827 Self::Glm46 => "glm-4.6",
5828 Self::Glm46v => "glm-4.6v",
5829 Self::Glm47 => "glm-4.7",
5830 Self::Glm47Flash => "glm-4.7-flash",
5831 Self::Glm47Flashx => "glm-4.7-flashx",
5832 Self::Glm5 => "glm-5",
5833 Self::Glm5Turbo => "glm-5-turbo",
5834 Self::Glm51 => "glm-5.1",
5835 Self::Glm52 => "glm-5.2",
5836 Self::Glm5vTurbo => "glm-5v-turbo",
5837 }
5838 }
5839 #[allow(clippy::too_many_lines)]
5840 fn display_name(self) -> &'static str {
5841 match self {
5842 Self::Glm45 => "GLM-4.5",
5843 Self::Glm45Air => "GLM-4.5-Air",
5844 Self::Glm45Flash => "GLM-4.5-Flash",
5845 Self::Glm45v => "GLM-4.5V",
5846 Self::Glm46 => "GLM-4.6",
5847 Self::Glm46v => "GLM-4.6V",
5848 Self::Glm47 => "GLM-4.7",
5849 Self::Glm47Flash => "GLM-4.7-Flash",
5850 Self::Glm47Flashx => "GLM-4.7-FlashX",
5851 Self::Glm5 => "GLM-5",
5852 Self::Glm5Turbo => "GLM-5-Turbo",
5853 Self::Glm51 => "GLM-5.1",
5854 Self::Glm52 => "GLM-5.2",
5855 Self::Glm5vTurbo => "GLM-5V-Turbo",
5856 }
5857 }
5858 #[allow(clippy::too_many_lines)]
5859 fn context_window(self) -> u32 {
5860 match self {
5861 Self::Glm45v => 64_000,
5862 Self::Glm46v => 128_000,
5863 Self::Glm45 | Self::Glm45Air | Self::Glm45Flash => 131_072,
5864 Self::Glm47Flash
5865 | Self::Glm47Flashx
5866 | Self::Glm5Turbo
5867 | Self::Glm51
5868 | Self::Glm5vTurbo => 200_000,
5869 Self::Glm46 | Self::Glm47 | Self::Glm5 => 204_800,
5870 Self::Glm52 => 1_000_000,
5871 }
5872 }
5873 #[allow(clippy::too_many_lines)]
5874 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
5875 match self {
5876 Self::Glm52 => &[ReasoningEffort::High, ReasoningEffort::Max],
5877 Self::Glm45
5878 | Self::Glm45Air
5879 | Self::Glm45Flash
5880 | Self::Glm45v
5881 | Self::Glm46
5882 | Self::Glm46v
5883 | Self::Glm47
5884 | Self::Glm47Flash
5885 | Self::Glm47Flashx
5886 | Self::Glm5
5887 | Self::Glm5Turbo
5888 | Self::Glm51
5889 | Self::Glm5vTurbo => {
5890 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
5891 }
5892 }
5893 }
5894 pub fn supports_reasoning(self) -> bool {
5895 !self.reasoning_levels().is_empty()
5896 }
5897 #[allow(clippy::too_many_lines)]
5898 pub fn supports_prompt_caching(self) -> bool {
5899 match self {
5900 Self::Glm45v | Self::Glm46v => false,
5901 Self::Glm45
5902 | Self::Glm45Air
5903 | Self::Glm45Flash
5904 | Self::Glm46
5905 | Self::Glm47
5906 | Self::Glm47Flash
5907 | Self::Glm47Flashx
5908 | Self::Glm5
5909 | Self::Glm5Turbo
5910 | Self::Glm51
5911 | Self::Glm52
5912 | Self::Glm5vTurbo => true,
5913 }
5914 }
5915 #[allow(clippy::too_many_lines)]
5916 pub fn supports_image(self) -> bool {
5917 match self {
5918 Self::Glm45
5919 | Self::Glm45Air
5920 | Self::Glm45Flash
5921 | Self::Glm46
5922 | Self::Glm47
5923 | Self::Glm47Flash
5924 | Self::Glm47Flashx
5925 | Self::Glm5
5926 | Self::Glm5Turbo
5927 | Self::Glm51
5928 | Self::Glm52 => false,
5929 Self::Glm45v | Self::Glm46v | Self::Glm5vTurbo => true,
5930 }
5931 }
5932 #[allow(clippy::too_many_lines)]
5933 pub fn supports_audio(self) -> bool {
5934 match self {
5935 Self::Glm45
5936 | Self::Glm45Air
5937 | Self::Glm45Flash
5938 | Self::Glm45v
5939 | Self::Glm46
5940 | Self::Glm46v
5941 | Self::Glm47
5942 | Self::Glm47Flash
5943 | Self::Glm47Flashx
5944 | Self::Glm5
5945 | Self::Glm5Turbo
5946 | Self::Glm51
5947 | Self::Glm52
5948 | Self::Glm5vTurbo => false,
5949 }
5950 }
5951 #[allow(clippy::too_many_lines)]
5952 pub fn transport(self) -> Option<ModelTransport> {
5953 match self {
5954 Self::Glm45
5955 | Self::Glm45Air
5956 | Self::Glm45Flash
5957 | Self::Glm45v
5958 | Self::Glm46
5959 | Self::Glm46v
5960 | Self::Glm47
5961 | Self::Glm47Flash
5962 | Self::Glm47Flashx
5963 | Self::Glm5
5964 | Self::Glm5Turbo
5965 | Self::Glm51
5966 | Self::Glm52
5967 | Self::Glm5vTurbo => None,
5968 }
5969 }
5970 const ALL: &[ZAiModel] = &[
5971 Self::Glm45,
5972 Self::Glm45Air,
5973 Self::Glm45Flash,
5974 Self::Glm45v,
5975 Self::Glm46,
5976 Self::Glm46v,
5977 Self::Glm47,
5978 Self::Glm47Flash,
5979 Self::Glm47Flashx,
5980 Self::Glm5,
5981 Self::Glm5Turbo,
5982 Self::Glm51,
5983 Self::Glm52,
5984 Self::Glm5vTurbo,
5985 ];
5986}
5987impl std::str::FromStr for ZAiModel {
5988 type Err = String;
5989 #[allow(clippy::too_many_lines)]
5990 fn from_str(s: &str) -> Result<Self, Self::Err> {
5991 match s {
5992 "glm-4.5" => Ok(Self::Glm45),
5993 "glm-4.5-air" => Ok(Self::Glm45Air),
5994 "glm-4.5-flash" => Ok(Self::Glm45Flash),
5995 "glm-4.5v" => Ok(Self::Glm45v),
5996 "glm-4.6" => Ok(Self::Glm46),
5997 "glm-4.6v" => Ok(Self::Glm46v),
5998 "glm-4.7" => Ok(Self::Glm47),
5999 "glm-4.7-flash" => Ok(Self::Glm47Flash),
6000 "glm-4.7-flashx" => Ok(Self::Glm47Flashx),
6001 "glm-5" => Ok(Self::Glm5),
6002 "glm-5-turbo" => Ok(Self::Glm5Turbo),
6003 "glm-5.1" => Ok(Self::Glm51),
6004 "glm-5.2" => Ok(Self::Glm52),
6005 "glm-5v-turbo" => Ok(Self::Glm5vTurbo),
6006 _ => Err(format!("Unknown zai model: '{s}'")),
6007 }
6008 }
6009}
6010impl BedrockFoundationModel {
6011 #[allow(clippy::too_many_lines)]
6012 fn model_id(self) -> &'static str {
6013 match self {
6014 Self::AmazonNova2LiteV10 => "amazon.nova-2-lite-v1:0",
6015 Self::AmazonNovaLiteV10 => "amazon.nova-lite-v1:0",
6016 Self::AmazonNovaMicroV10 => "amazon.nova-micro-v1:0",
6017 Self::AmazonNovaProV10 => "amazon.nova-pro-v1:0",
6018 Self::AnthropicClaudeFable5 => "anthropic.claude-fable-5",
6019 Self::AnthropicClaudeHaiku4520251001V10 => {
6020 "anthropic.claude-haiku-4-5-20251001-v1:0"
6021 }
6022 Self::AnthropicClaudeOpus4120250805V10 => {
6023 "anthropic.claude-opus-4-1-20250805-v1:0"
6024 }
6025 Self::AnthropicClaudeOpus4520251101V10 => {
6026 "anthropic.claude-opus-4-5-20251101-v1:0"
6027 }
6028 Self::AnthropicClaudeOpus46V1 => "anthropic.claude-opus-4-6-v1",
6029 Self::AnthropicClaudeOpus47 => "anthropic.claude-opus-4-7",
6030 Self::AnthropicClaudeOpus48 => "anthropic.claude-opus-4-8",
6031 Self::AnthropicClaudeOpus5 => "anthropic.claude-opus-5",
6032 Self::AnthropicClaudeSonnet4520250929V10 => {
6033 "anthropic.claude-sonnet-4-5-20250929-v1:0"
6034 }
6035 Self::AnthropicClaudeSonnet46 => "anthropic.claude-sonnet-4-6",
6036 Self::AnthropicClaudeSonnet5 => "anthropic.claude-sonnet-5",
6037 Self::AuAnthropicClaudeHaiku4520251001V10 => {
6038 "au.anthropic.claude-haiku-4-5-20251001-v1:0"
6039 }
6040 Self::AuAnthropicClaudeOpus46V1 => "au.anthropic.claude-opus-4-6-v1",
6041 Self::AuAnthropicClaudeOpus48 => "au.anthropic.claude-opus-4-8",
6042 Self::AuAnthropicClaudeOpus5 => "au.anthropic.claude-opus-5",
6043 Self::AuAnthropicClaudeSonnet4520250929V10 => {
6044 "au.anthropic.claude-sonnet-4-5-20250929-v1:0"
6045 }
6046 Self::AuAnthropicClaudeSonnet46 => "au.anthropic.claude-sonnet-4-6",
6047 Self::AuAnthropicClaudeSonnet5 => "au.anthropic.claude-sonnet-5",
6048 Self::DeepseekR1V10 => "deepseek.r1-v1:0",
6049 Self::DeepseekV3V10 => "deepseek.v3-v1:0",
6050 Self::DeepseekV32 => "deepseek.v3.2",
6051 Self::EuAnthropicClaudeFable5 => "eu.anthropic.claude-fable-5",
6052 Self::EuAnthropicClaudeHaiku4520251001V10 => {
6053 "eu.anthropic.claude-haiku-4-5-20251001-v1:0"
6054 }
6055 Self::EuAnthropicClaudeOpus4520251101V10 => {
6056 "eu.anthropic.claude-opus-4-5-20251101-v1:0"
6057 }
6058 Self::EuAnthropicClaudeOpus46V1 => "eu.anthropic.claude-opus-4-6-v1",
6059 Self::EuAnthropicClaudeOpus47 => "eu.anthropic.claude-opus-4-7",
6060 Self::EuAnthropicClaudeOpus48 => "eu.anthropic.claude-opus-4-8",
6061 Self::EuAnthropicClaudeOpus5 => "eu.anthropic.claude-opus-5",
6062 Self::EuAnthropicClaudeSonnet4520250929V10 => {
6063 "eu.anthropic.claude-sonnet-4-5-20250929-v1:0"
6064 }
6065 Self::EuAnthropicClaudeSonnet46 => "eu.anthropic.claude-sonnet-4-6",
6066 Self::EuAnthropicClaudeSonnet5 => "eu.anthropic.claude-sonnet-5",
6067 Self::GlobalAnthropicClaudeFable5 => "global.anthropic.claude-fable-5",
6068 Self::GlobalAnthropicClaudeHaiku4520251001V10 => {
6069 "global.anthropic.claude-haiku-4-5-20251001-v1:0"
6070 }
6071 Self::GlobalAnthropicClaudeOpus4520251101V10 => {
6072 "global.anthropic.claude-opus-4-5-20251101-v1:0"
6073 }
6074 Self::GlobalAnthropicClaudeOpus46V1 => "global.anthropic.claude-opus-4-6-v1",
6075 Self::GlobalAnthropicClaudeOpus47 => "global.anthropic.claude-opus-4-7",
6076 Self::GlobalAnthropicClaudeOpus48 => "global.anthropic.claude-opus-4-8",
6077 Self::GlobalAnthropicClaudeOpus5 => "global.anthropic.claude-opus-5",
6078 Self::GlobalAnthropicClaudeSonnet4520250929V10 => {
6079 "global.anthropic.claude-sonnet-4-5-20250929-v1:0"
6080 }
6081 Self::GlobalAnthropicClaudeSonnet46 => "global.anthropic.claude-sonnet-4-6",
6082 Self::GlobalAnthropicClaudeSonnet5 => "global.anthropic.claude-sonnet-5",
6083 Self::GoogleGemma327bIt => "google.gemma-3-27b-it",
6084 Self::GoogleGemma34bIt => "google.gemma-3-4b-it",
6085 Self::JpAnthropicClaudeHaiku4520251001V10 => {
6086 "jp.anthropic.claude-haiku-4-5-20251001-v1:0"
6087 }
6088 Self::JpAnthropicClaudeOpus47 => "jp.anthropic.claude-opus-4-7",
6089 Self::JpAnthropicClaudeOpus48 => "jp.anthropic.claude-opus-4-8",
6090 Self::JpAnthropicClaudeOpus5 => "jp.anthropic.claude-opus-5",
6091 Self::JpAnthropicClaudeSonnet4520250929V10 => {
6092 "jp.anthropic.claude-sonnet-4-5-20250929-v1:0"
6093 }
6094 Self::JpAnthropicClaudeSonnet46 => "jp.anthropic.claude-sonnet-4-6",
6095 Self::JpAnthropicClaudeSonnet5 => "jp.anthropic.claude-sonnet-5",
6096 Self::MetaLlama3170bInstructV10 => "meta.llama3-1-70b-instruct-v1:0",
6097 Self::MetaLlama318bInstructV10 => "meta.llama3-1-8b-instruct-v1:0",
6098 Self::MetaLlama3370bInstructV10 => "meta.llama3-3-70b-instruct-v1:0",
6099 Self::MetaLlama4Maverick17bInstructV10 => {
6100 "meta.llama4-maverick-17b-instruct-v1:0"
6101 }
6102 Self::MetaLlama4Scout17bInstructV10 => "meta.llama4-scout-17b-instruct-v1:0",
6103 Self::MinimaxMinimaxM2 => "minimax.minimax-m2",
6104 Self::MinimaxMinimaxM21 => "minimax.minimax-m2.1",
6105 Self::MinimaxMinimaxM25 => "minimax.minimax-m2.5",
6106 Self::MistralDevstral2123b => "mistral.devstral-2-123b",
6107 Self::MistralMagistralSmall2509 => "mistral.magistral-small-2509",
6108 Self::MistralMinistral314bInstruct => "mistral.ministral-3-14b-instruct",
6109 Self::MistralMinistral33bInstruct => "mistral.ministral-3-3b-instruct",
6110 Self::MistralMinistral38bInstruct => "mistral.ministral-3-8b-instruct",
6111 Self::MistralMistralLarge3675bInstruct => {
6112 "mistral.mistral-large-3-675b-instruct"
6113 }
6114 Self::MistralPixtralLarge2502V10 => "mistral.pixtral-large-2502-v1:0",
6115 Self::MistralVoxtralMini3b2507 => "mistral.voxtral-mini-3b-2507",
6116 Self::MistralVoxtralSmall24b2507 => "mistral.voxtral-small-24b-2507",
6117 Self::MoonshotKimiK2Thinking => "moonshot.kimi-k2-thinking",
6118 Self::MoonshotaiKimiK25 => "moonshotai.kimi-k2.5",
6119 Self::NvidiaNemotronNano12bV2 => "nvidia.nemotron-nano-12b-v2",
6120 Self::NvidiaNemotronNano330b => "nvidia.nemotron-nano-3-30b",
6121 Self::NvidiaNemotronNano9bV2 => "nvidia.nemotron-nano-9b-v2",
6122 Self::NvidiaNemotronSuper3120b => "nvidia.nemotron-super-3-120b",
6123 Self::OpenaiGpt54 => "openai.gpt-5.4",
6124 Self::OpenaiGpt55 => "openai.gpt-5.5",
6125 Self::OpenaiGpt56Luna => "openai.gpt-5.6-luna",
6126 Self::OpenaiGpt56Sol => "openai.gpt-5.6-sol",
6127 Self::OpenaiGpt56Terra => "openai.gpt-5.6-terra",
6128 Self::OpenaiGptOss120b => "openai.gpt-oss-120b",
6129 Self::OpenaiGptOss120b10 => "openai.gpt-oss-120b-1:0",
6130 Self::OpenaiGptOss20b => "openai.gpt-oss-20b",
6131 Self::OpenaiGptOss20b10 => "openai.gpt-oss-20b-1:0",
6132 Self::OpenaiGptOssSafeguard120b => "openai.gpt-oss-safeguard-120b",
6133 Self::OpenaiGptOssSafeguard20b => "openai.gpt-oss-safeguard-20b",
6134 Self::QwenQwen3235bA22b2507V10 => "qwen.qwen3-235b-a22b-2507-v1:0",
6135 Self::QwenQwen332bV10 => "qwen.qwen3-32b-v1:0",
6136 Self::QwenQwen3Coder30bA3bV10 => "qwen.qwen3-coder-30b-a3b-v1:0",
6137 Self::QwenQwen3Coder480bA35bV10 => "qwen.qwen3-coder-480b-a35b-v1:0",
6138 Self::QwenQwen3CoderNext => "qwen.qwen3-coder-next",
6139 Self::QwenQwen3Next80bA3b => "qwen.qwen3-next-80b-a3b",
6140 Self::QwenQwen3Vl235bA22b => "qwen.qwen3-vl-235b-a22b",
6141 Self::UsAnthropicClaudeFable5 => "us.anthropic.claude-fable-5",
6142 Self::UsAnthropicClaudeHaiku4520251001V10 => {
6143 "us.anthropic.claude-haiku-4-5-20251001-v1:0"
6144 }
6145 Self::UsAnthropicClaudeOpus4120250805V10 => {
6146 "us.anthropic.claude-opus-4-1-20250805-v1:0"
6147 }
6148 Self::UsAnthropicClaudeOpus4520251101V10 => {
6149 "us.anthropic.claude-opus-4-5-20251101-v1:0"
6150 }
6151 Self::UsAnthropicClaudeOpus46V1 => "us.anthropic.claude-opus-4-6-v1",
6152 Self::UsAnthropicClaudeOpus47 => "us.anthropic.claude-opus-4-7",
6153 Self::UsAnthropicClaudeOpus48 => "us.anthropic.claude-opus-4-8",
6154 Self::UsAnthropicClaudeOpus5 => "us.anthropic.claude-opus-5",
6155 Self::UsAnthropicClaudeSonnet4520250929V10 => {
6156 "us.anthropic.claude-sonnet-4-5-20250929-v1:0"
6157 }
6158 Self::UsAnthropicClaudeSonnet46 => "us.anthropic.claude-sonnet-4-6",
6159 Self::UsAnthropicClaudeSonnet5 => "us.anthropic.claude-sonnet-5",
6160 Self::UsDeepseekR1V10 => "us.deepseek.r1-v1:0",
6161 Self::UsMetaLlama4Maverick17bInstructV10 => {
6162 "us.meta.llama4-maverick-17b-instruct-v1:0"
6163 }
6164 Self::UsMetaLlama4Scout17bInstructV10 => {
6165 "us.meta.llama4-scout-17b-instruct-v1:0"
6166 }
6167 Self::WriterPalmyraX4V10 => "writer.palmyra-x4-v1:0",
6168 Self::WriterPalmyraX5V10 => "writer.palmyra-x5-v1:0",
6169 Self::XaiGrok43 => "xai.grok-4.3",
6170 Self::ZaiGlm47 => "zai.glm-4.7",
6171 Self::ZaiGlm47Flash => "zai.glm-4.7-flash",
6172 Self::ZaiGlm5 => "zai.glm-5",
6173 }
6174 }
6175 #[allow(clippy::too_many_lines)]
6176 fn display_name(self) -> &'static str {
6177 match self {
6178 Self::AuAnthropicClaudeOpus46V1 => "AU Anthropic Claude Opus 4.6",
6179 Self::AuAnthropicClaudeSonnet46 => "AU Anthropic Claude Sonnet 4.6",
6180 Self::AnthropicClaudeFable5 => "Claude Fable 5",
6181 Self::EuAnthropicClaudeFable5 => "Claude Fable 5 (EU)",
6182 Self::GlobalAnthropicClaudeFable5 => "Claude Fable 5 (Global)",
6183 Self::UsAnthropicClaudeFable5 => "Claude Fable 5 (US)",
6184 Self::AnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5",
6185 Self::AuAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (AU)",
6186 Self::EuAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (EU)",
6187 Self::GlobalAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (Global)",
6188 Self::JpAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (JP)",
6189 Self::UsAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (US)",
6190 Self::AnthropicClaudeOpus4120250805V10 => "Claude Opus 4.1",
6191 Self::UsAnthropicClaudeOpus4120250805V10 => "Claude Opus 4.1 (US)",
6192 Self::AnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5",
6193 Self::EuAnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5 (EU)",
6194 Self::GlobalAnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5 (Global)",
6195 Self::UsAnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5 (US)",
6196 Self::AnthropicClaudeOpus46V1 => "Claude Opus 4.6",
6197 Self::EuAnthropicClaudeOpus46V1 => "Claude Opus 4.6 (EU)",
6198 Self::GlobalAnthropicClaudeOpus46V1 => "Claude Opus 4.6 (Global)",
6199 Self::UsAnthropicClaudeOpus46V1 => "Claude Opus 4.6 (US)",
6200 Self::AnthropicClaudeOpus47 => "Claude Opus 4.7",
6201 Self::EuAnthropicClaudeOpus47 => "Claude Opus 4.7 (EU)",
6202 Self::GlobalAnthropicClaudeOpus47 => "Claude Opus 4.7 (Global)",
6203 Self::JpAnthropicClaudeOpus47 => "Claude Opus 4.7 (JP)",
6204 Self::UsAnthropicClaudeOpus47 => "Claude Opus 4.7 (US)",
6205 Self::AnthropicClaudeOpus48 => "Claude Opus 4.8",
6206 Self::AuAnthropicClaudeOpus48 => "Claude Opus 4.8 (AU)",
6207 Self::EuAnthropicClaudeOpus48 => "Claude Opus 4.8 (EU)",
6208 Self::GlobalAnthropicClaudeOpus48 => "Claude Opus 4.8 (Global)",
6209 Self::JpAnthropicClaudeOpus48 => "Claude Opus 4.8 (JP)",
6210 Self::UsAnthropicClaudeOpus48 => "Claude Opus 4.8 (US)",
6211 Self::AnthropicClaudeOpus5 => "Claude Opus 5",
6212 Self::AuAnthropicClaudeOpus5 => "Claude Opus 5 (AU)",
6213 Self::EuAnthropicClaudeOpus5 => "Claude Opus 5 (EU)",
6214 Self::GlobalAnthropicClaudeOpus5 => "Claude Opus 5 (Global)",
6215 Self::JpAnthropicClaudeOpus5 => "Claude Opus 5 (JP)",
6216 Self::UsAnthropicClaudeOpus5 => "Claude Opus 5 (US)",
6217 Self::AnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5",
6218 Self::AuAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (AU)",
6219 Self::EuAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (EU)",
6220 Self::GlobalAnthropicClaudeSonnet4520250929V10 => {
6221 "Claude Sonnet 4.5 (Global)"
6222 }
6223 Self::JpAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (JP)",
6224 Self::UsAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (US)",
6225 Self::AnthropicClaudeSonnet46 => "Claude Sonnet 4.6",
6226 Self::EuAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (EU)",
6227 Self::GlobalAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (Global)",
6228 Self::JpAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (JP)",
6229 Self::UsAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (US)",
6230 Self::AnthropicClaudeSonnet5 => "Claude Sonnet 5",
6231 Self::AuAnthropicClaudeSonnet5 => "Claude Sonnet 5 (AU)",
6232 Self::EuAnthropicClaudeSonnet5 => "Claude Sonnet 5 (EU)",
6233 Self::GlobalAnthropicClaudeSonnet5 => "Claude Sonnet 5 (Global)",
6234 Self::JpAnthropicClaudeSonnet5 => "Claude Sonnet 5 (JP)",
6235 Self::UsAnthropicClaudeSonnet5 => "Claude Sonnet 5 (US)",
6236 Self::DeepseekR1V10 => "DeepSeek-R1",
6237 Self::UsDeepseekR1V10 => "DeepSeek-R1 (US)",
6238 Self::DeepseekV3V10 => "DeepSeek-V3.1",
6239 Self::DeepseekV32 => "DeepSeek-V3.2",
6240 Self::MistralDevstral2123b => "Devstral 2 123B",
6241 Self::ZaiGlm47 => "GLM-4.7",
6242 Self::ZaiGlm47Flash => "GLM-4.7-Flash",
6243 Self::ZaiGlm5 => "GLM-5",
6244 Self::OpenaiGptOssSafeguard120b => "GPT OSS Safeguard 120B",
6245 Self::OpenaiGptOssSafeguard20b => "GPT OSS Safeguard 20B",
6246 Self::OpenaiGpt54 => "GPT-5.4",
6247 Self::OpenaiGpt55 => "GPT-5.5",
6248 Self::OpenaiGpt56Luna => "GPT-5.6 Luna",
6249 Self::OpenaiGpt56Sol => "GPT-5.6 Sol",
6250 Self::OpenaiGpt56Terra => "GPT-5.6 Terra",
6251 Self::GoogleGemma34bIt => "Gemma 3 4B IT",
6252 Self::GoogleGemma327bIt => "Google Gemma 3 27B Instruct",
6253 Self::XaiGrok43 => "Grok 4.3",
6254 Self::MoonshotKimiK2Thinking => "Kimi K2 Thinking",
6255 Self::MoonshotaiKimiK25 => "Kimi K2.5",
6256 Self::MetaLlama3170bInstructV10 => "Llama 3.1 70B Instruct",
6257 Self::MetaLlama318bInstructV10 => "Llama 3.1 8B Instruct",
6258 Self::MetaLlama3370bInstructV10 => "Llama 3.3 70B Instruct",
6259 Self::MetaLlama4Maverick17bInstructV10 => "Llama 4 Maverick 17B Instruct",
6260 Self::UsMetaLlama4Maverick17bInstructV10 => {
6261 "Llama 4 Maverick 17B Instruct (US)"
6262 }
6263 Self::MetaLlama4Scout17bInstructV10 => "Llama 4 Scout 17B Instruct",
6264 Self::UsMetaLlama4Scout17bInstructV10 => "Llama 4 Scout 17B Instruct (US)",
6265 Self::MistralMagistralSmall2509 => "Magistral Small 1.2",
6266 Self::MinimaxMinimaxM2 => "MiniMax M2",
6267 Self::MinimaxMinimaxM21 => "MiniMax M2.1",
6268 Self::MinimaxMinimaxM25 => "MiniMax M2.5",
6269 Self::MistralMinistral314bInstruct => "Ministral 14B 3.0",
6270 Self::MistralMinistral33bInstruct => "Ministral 3 3B",
6271 Self::MistralMinistral38bInstruct => "Ministral 3 8B",
6272 Self::MistralMistralLarge3675bInstruct => "Mistral Large 3",
6273 Self::NvidiaNemotronSuper3120b => "NVIDIA Nemotron 3 Super 120B A12B",
6274 Self::NvidiaNemotronNano12bV2 => "NVIDIA Nemotron Nano 12B v2 VL BF16",
6275 Self::NvidiaNemotronNano330b => "NVIDIA Nemotron Nano 3 30B",
6276 Self::NvidiaNemotronNano9bV2 => "NVIDIA Nemotron Nano 9B v2",
6277 Self::AmazonNova2LiteV10 => "Nova 2 Lite",
6278 Self::AmazonNovaLiteV10 => "Nova Lite",
6279 Self::AmazonNovaMicroV10 => "Nova Micro",
6280 Self::AmazonNovaProV10 => "Nova Pro",
6281 Self::WriterPalmyraX4V10 => "Palmyra X4",
6282 Self::WriterPalmyraX5V10 => "Palmyra X5",
6283 Self::MistralPixtralLarge2502V10 => "Pixtral Large (25.02)",
6284 Self::QwenQwen3Next80bA3b => "Qwen/Qwen3-Next-80B-A3B-Instruct",
6285 Self::QwenQwen3Vl235bA22b => "Qwen/Qwen3-VL-235B-A22B-Instruct",
6286 Self::QwenQwen3235bA22b2507V10 => "Qwen3 235B A22B 2507",
6287 Self::QwenQwen332bV10 => "Qwen3 32B (dense)",
6288 Self::QwenQwen3Coder30bA3bV10 => "Qwen3 Coder 30B A3B Instruct",
6289 Self::QwenQwen3Coder480bA35bV10 => "Qwen3 Coder 480B A35B Instruct",
6290 Self::QwenQwen3CoderNext => "Qwen3 Coder Next",
6291 Self::MistralVoxtralMini3b2507 => "Voxtral Mini 3B 2507",
6292 Self::MistralVoxtralSmall24b2507 => "Voxtral Small 24B 2507",
6293 Self::OpenaiGptOss120b | Self::OpenaiGptOss120b10 => "gpt-oss-120b",
6294 Self::OpenaiGptOss20b | Self::OpenaiGptOss20b10 => "gpt-oss-20b",
6295 }
6296 }
6297 #[allow(clippy::too_many_lines)]
6298 fn context_window(self) -> u32 {
6299 match self {
6300 Self::QwenQwen332bV10 => 16_384,
6301 Self::MistralVoxtralSmall24b2507 => 32_000,
6302 Self::WriterPalmyraX4V10 => 122_880,
6303 Self::AmazonNova2LiteV10
6304 | Self::AmazonNovaMicroV10
6305 | Self::DeepseekR1V10
6306 | Self::GoogleGemma34bIt
6307 | Self::MetaLlama3170bInstructV10
6308 | Self::MetaLlama318bInstructV10
6309 | Self::MetaLlama3370bInstructV10
6310 | Self::MistralMagistralSmall2509
6311 | Self::MistralMinistral314bInstruct
6312 | Self::MistralMinistral38bInstruct
6313 | Self::MistralPixtralLarge2502V10
6314 | Self::MistralVoxtralMini3b2507
6315 | Self::NvidiaNemotronNano12bV2
6316 | Self::NvidiaNemotronNano330b
6317 | Self::NvidiaNemotronNano9bV2
6318 | Self::OpenaiGptOss120b
6319 | Self::OpenaiGptOss120b10
6320 | Self::OpenaiGptOss20b
6321 | Self::OpenaiGptOss20b10
6322 | Self::OpenaiGptOssSafeguard120b
6323 | Self::OpenaiGptOssSafeguard20b
6324 | Self::UsDeepseekR1V10 => 128_000,
6325 Self::QwenQwen3Coder480bA35bV10 | Self::QwenQwen3CoderNext => 131_072,
6326 Self::DeepseekV3V10 | Self::DeepseekV32 => 163_840,
6327 Self::MinimaxMinimaxM25 => 196_608,
6328 Self::AnthropicClaudeHaiku4520251001V10
6329 | Self::AnthropicClaudeOpus4120250805V10
6330 | Self::AnthropicClaudeOpus4520251101V10
6331 | Self::AnthropicClaudeSonnet4520250929V10
6332 | Self::AuAnthropicClaudeHaiku4520251001V10
6333 | Self::AuAnthropicClaudeSonnet4520250929V10
6334 | Self::EuAnthropicClaudeHaiku4520251001V10
6335 | Self::EuAnthropicClaudeOpus4520251101V10
6336 | Self::EuAnthropicClaudeSonnet4520250929V10
6337 | Self::GlobalAnthropicClaudeHaiku4520251001V10
6338 | Self::GlobalAnthropicClaudeOpus4520251101V10
6339 | Self::GlobalAnthropicClaudeSonnet4520250929V10
6340 | Self::JpAnthropicClaudeHaiku4520251001V10
6341 | Self::JpAnthropicClaudeSonnet4520250929V10
6342 | Self::UsAnthropicClaudeHaiku4520251001V10
6343 | Self::UsAnthropicClaudeOpus4120250805V10
6344 | Self::UsAnthropicClaudeOpus4520251101V10
6345 | Self::UsAnthropicClaudeSonnet4520250929V10
6346 | Self::ZaiGlm47Flash => 200_000,
6347 Self::GoogleGemma327bIt | Self::ZaiGlm5 => 202_752,
6348 Self::MinimaxMinimaxM2 => 204_608,
6349 Self::MinimaxMinimaxM21 | Self::ZaiGlm47 => 204_800,
6350 Self::MistralDevstral2123b
6351 | Self::MistralMinistral33bInstruct
6352 | Self::MistralMistralLarge3675bInstruct => 256_000,
6353 Self::QwenQwen3Next80bA3b | Self::QwenQwen3Vl235bA22b => 262_000,
6354 Self::MoonshotKimiK2Thinking | Self::MoonshotaiKimiK25 => 262_143,
6355 Self::NvidiaNemotronSuper3120b
6356 | Self::QwenQwen3235bA22b2507V10
6357 | Self::QwenQwen3Coder30bA3bV10 => 262_144,
6358 Self::OpenaiGpt54
6359 | Self::OpenaiGpt55
6360 | Self::OpenaiGpt56Luna
6361 | Self::OpenaiGpt56Sol
6362 | Self::OpenaiGpt56Terra => 272_000,
6363 Self::AmazonNovaLiteV10 | Self::AmazonNovaProV10 => 300_000,
6364 Self::AnthropicClaudeFable5
6365 | Self::AnthropicClaudeOpus46V1
6366 | Self::AnthropicClaudeOpus47
6367 | Self::AnthropicClaudeOpus48
6368 | Self::AnthropicClaudeOpus5
6369 | Self::AnthropicClaudeSonnet46
6370 | Self::AnthropicClaudeSonnet5
6371 | Self::AuAnthropicClaudeOpus46V1
6372 | Self::AuAnthropicClaudeOpus48
6373 | Self::AuAnthropicClaudeOpus5
6374 | Self::AuAnthropicClaudeSonnet46
6375 | Self::AuAnthropicClaudeSonnet5
6376 | Self::EuAnthropicClaudeFable5
6377 | Self::EuAnthropicClaudeOpus46V1
6378 | Self::EuAnthropicClaudeOpus47
6379 | Self::EuAnthropicClaudeOpus48
6380 | Self::EuAnthropicClaudeOpus5
6381 | Self::EuAnthropicClaudeSonnet46
6382 | Self::EuAnthropicClaudeSonnet5
6383 | Self::GlobalAnthropicClaudeFable5
6384 | Self::GlobalAnthropicClaudeOpus46V1
6385 | Self::GlobalAnthropicClaudeOpus47
6386 | Self::GlobalAnthropicClaudeOpus48
6387 | Self::GlobalAnthropicClaudeOpus5
6388 | Self::GlobalAnthropicClaudeSonnet46
6389 | Self::GlobalAnthropicClaudeSonnet5
6390 | Self::JpAnthropicClaudeOpus47
6391 | Self::JpAnthropicClaudeOpus48
6392 | Self::JpAnthropicClaudeOpus5
6393 | Self::JpAnthropicClaudeSonnet46
6394 | Self::JpAnthropicClaudeSonnet5
6395 | Self::MetaLlama4Maverick17bInstructV10
6396 | Self::UsAnthropicClaudeFable5
6397 | Self::UsAnthropicClaudeOpus46V1
6398 | Self::UsAnthropicClaudeOpus47
6399 | Self::UsAnthropicClaudeOpus48
6400 | Self::UsAnthropicClaudeOpus5
6401 | Self::UsAnthropicClaudeSonnet46
6402 | Self::UsAnthropicClaudeSonnet5
6403 | Self::UsMetaLlama4Maverick17bInstructV10
6404 | Self::XaiGrok43 => 1_000_000,
6405 Self::WriterPalmyraX5V10 => 1_040_000,
6406 Self::MetaLlama4Scout17bInstructV10
6407 | Self::UsMetaLlama4Scout17bInstructV10 => 3_500_000,
6408 }
6409 }
6410 #[allow(clippy::too_many_lines)]
6411 pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
6412 match self {
6413 Self::AmazonNovaLiteV10
6414 | Self::AmazonNovaMicroV10
6415 | Self::AmazonNovaProV10
6416 | Self::GoogleGemma327bIt
6417 | Self::GoogleGemma34bIt
6418 | Self::MetaLlama3170bInstructV10
6419 | Self::MetaLlama318bInstructV10
6420 | Self::MetaLlama3370bInstructV10
6421 | Self::MetaLlama4Maverick17bInstructV10
6422 | Self::MetaLlama4Scout17bInstructV10
6423 | Self::MistralDevstral2123b
6424 | Self::MistralMinistral314bInstruct
6425 | Self::MistralMinistral33bInstruct
6426 | Self::MistralMinistral38bInstruct
6427 | Self::MistralMistralLarge3675bInstruct
6428 | Self::MistralPixtralLarge2502V10
6429 | Self::MistralVoxtralMini3b2507
6430 | Self::MistralVoxtralSmall24b2507
6431 | Self::NvidiaNemotronNano12bV2
6432 | Self::NvidiaNemotronNano9bV2
6433 | Self::OpenaiGptOssSafeguard120b
6434 | Self::OpenaiGptOssSafeguard20b
6435 | Self::QwenQwen3235bA22b2507V10
6436 | Self::QwenQwen3Coder30bA3bV10
6437 | Self::QwenQwen3Coder480bA35bV10
6438 | Self::QwenQwen3Next80bA3b
6439 | Self::QwenQwen3Vl235bA22b
6440 | Self::UsMetaLlama4Maverick17bInstructV10
6441 | Self::UsMetaLlama4Scout17bInstructV10 => &[],
6442 Self::AmazonNova2LiteV10
6443 | Self::AnthropicClaudeHaiku4520251001V10
6444 | Self::AnthropicClaudeOpus4120250805V10
6445 | Self::AnthropicClaudeOpus4520251101V10
6446 | Self::AnthropicClaudeSonnet4520250929V10
6447 | Self::AuAnthropicClaudeHaiku4520251001V10
6448 | Self::AuAnthropicClaudeSonnet4520250929V10
6449 | Self::DeepseekR1V10
6450 | Self::DeepseekV3V10
6451 | Self::DeepseekV32
6452 | Self::EuAnthropicClaudeHaiku4520251001V10
6453 | Self::EuAnthropicClaudeOpus4520251101V10
6454 | Self::EuAnthropicClaudeSonnet4520250929V10
6455 | Self::GlobalAnthropicClaudeHaiku4520251001V10
6456 | Self::GlobalAnthropicClaudeOpus4520251101V10
6457 | Self::GlobalAnthropicClaudeSonnet4520250929V10
6458 | Self::JpAnthropicClaudeHaiku4520251001V10
6459 | Self::JpAnthropicClaudeSonnet4520250929V10
6460 | Self::MinimaxMinimaxM2
6461 | Self::MinimaxMinimaxM21
6462 | Self::MinimaxMinimaxM25
6463 | Self::MistralMagistralSmall2509
6464 | Self::MoonshotKimiK2Thinking
6465 | Self::MoonshotaiKimiK25
6466 | Self::NvidiaNemotronNano330b
6467 | Self::NvidiaNemotronSuper3120b
6468 | Self::OpenaiGptOss120b
6469 | Self::OpenaiGptOss120b10
6470 | Self::OpenaiGptOss20b
6471 | Self::OpenaiGptOss20b10
6472 | Self::QwenQwen332bV10
6473 | Self::QwenQwen3CoderNext
6474 | Self::UsAnthropicClaudeHaiku4520251001V10
6475 | Self::UsAnthropicClaudeOpus4120250805V10
6476 | Self::UsAnthropicClaudeOpus4520251101V10
6477 | Self::UsAnthropicClaudeSonnet4520250929V10
6478 | Self::UsDeepseekR1V10
6479 | Self::WriterPalmyraX4V10
6480 | Self::WriterPalmyraX5V10
6481 | Self::XaiGrok43
6482 | Self::ZaiGlm47
6483 | Self::ZaiGlm47Flash
6484 | Self::ZaiGlm5 => {
6485 &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
6486 }
6487 Self::AnthropicClaudeOpus46V1
6488 | Self::AnthropicClaudeSonnet46
6489 | Self::AuAnthropicClaudeOpus46V1
6490 | Self::AuAnthropicClaudeSonnet46
6491 | Self::EuAnthropicClaudeOpus46V1
6492 | Self::EuAnthropicClaudeSonnet46
6493 | Self::GlobalAnthropicClaudeOpus46V1
6494 | Self::GlobalAnthropicClaudeSonnet46
6495 | Self::JpAnthropicClaudeSonnet46
6496 | Self::UsAnthropicClaudeOpus46V1
6497 | Self::UsAnthropicClaudeSonnet46 => {
6498 &[
6499 ReasoningEffort::Low,
6500 ReasoningEffort::Medium,
6501 ReasoningEffort::High,
6502 ReasoningEffort::Max,
6503 ]
6504 }
6505 Self::OpenaiGpt54 | Self::OpenaiGpt55 => {
6506 &[
6507 ReasoningEffort::Low,
6508 ReasoningEffort::Medium,
6509 ReasoningEffort::High,
6510 ReasoningEffort::Xhigh,
6511 ]
6512 }
6513 Self::AnthropicClaudeFable5
6514 | Self::AnthropicClaudeOpus47
6515 | Self::AnthropicClaudeOpus48
6516 | Self::AnthropicClaudeOpus5
6517 | Self::AnthropicClaudeSonnet5
6518 | Self::AuAnthropicClaudeOpus48
6519 | Self::AuAnthropicClaudeOpus5
6520 | Self::AuAnthropicClaudeSonnet5
6521 | Self::EuAnthropicClaudeFable5
6522 | Self::EuAnthropicClaudeOpus47
6523 | Self::EuAnthropicClaudeOpus48
6524 | Self::EuAnthropicClaudeOpus5
6525 | Self::EuAnthropicClaudeSonnet5
6526 | Self::GlobalAnthropicClaudeFable5
6527 | Self::GlobalAnthropicClaudeOpus47
6528 | Self::GlobalAnthropicClaudeOpus48
6529 | Self::GlobalAnthropicClaudeOpus5
6530 | Self::GlobalAnthropicClaudeSonnet5
6531 | Self::JpAnthropicClaudeOpus47
6532 | Self::JpAnthropicClaudeOpus48
6533 | Self::JpAnthropicClaudeOpus5
6534 | Self::JpAnthropicClaudeSonnet5
6535 | Self::OpenaiGpt56Luna
6536 | Self::OpenaiGpt56Sol
6537 | Self::OpenaiGpt56Terra
6538 | Self::UsAnthropicClaudeFable5
6539 | Self::UsAnthropicClaudeOpus47
6540 | Self::UsAnthropicClaudeOpus48
6541 | Self::UsAnthropicClaudeOpus5
6542 | Self::UsAnthropicClaudeSonnet5 => {
6543 &[
6544 ReasoningEffort::Low,
6545 ReasoningEffort::Medium,
6546 ReasoningEffort::High,
6547 ReasoningEffort::Xhigh,
6548 ReasoningEffort::Max,
6549 ]
6550 }
6551 }
6552 }
6553 pub fn supports_reasoning(self) -> bool {
6554 !self.reasoning_levels().is_empty()
6555 }
6556 #[allow(clippy::too_many_lines)]
6557 pub fn supports_prompt_caching(self) -> bool {
6558 match self {
6559 Self::AmazonNova2LiteV10
6560 | Self::DeepseekR1V10
6561 | Self::DeepseekV3V10
6562 | Self::DeepseekV32
6563 | Self::GoogleGemma327bIt
6564 | Self::GoogleGemma34bIt
6565 | Self::MetaLlama3170bInstructV10
6566 | Self::MetaLlama318bInstructV10
6567 | Self::MetaLlama3370bInstructV10
6568 | Self::MetaLlama4Maverick17bInstructV10
6569 | Self::MetaLlama4Scout17bInstructV10
6570 | Self::MinimaxMinimaxM2
6571 | Self::MinimaxMinimaxM21
6572 | Self::MinimaxMinimaxM25
6573 | Self::MistralDevstral2123b
6574 | Self::MistralMagistralSmall2509
6575 | Self::MistralMinistral314bInstruct
6576 | Self::MistralMinistral33bInstruct
6577 | Self::MistralMinistral38bInstruct
6578 | Self::MistralMistralLarge3675bInstruct
6579 | Self::MistralPixtralLarge2502V10
6580 | Self::MistralVoxtralMini3b2507
6581 | Self::MistralVoxtralSmall24b2507
6582 | Self::MoonshotKimiK2Thinking
6583 | Self::MoonshotaiKimiK25
6584 | Self::NvidiaNemotronNano12bV2
6585 | Self::NvidiaNemotronNano330b
6586 | Self::NvidiaNemotronNano9bV2
6587 | Self::NvidiaNemotronSuper3120b
6588 | Self::OpenaiGptOss120b
6589 | Self::OpenaiGptOss120b10
6590 | Self::OpenaiGptOss20b
6591 | Self::OpenaiGptOss20b10
6592 | Self::OpenaiGptOssSafeguard120b
6593 | Self::OpenaiGptOssSafeguard20b
6594 | Self::QwenQwen3235bA22b2507V10
6595 | Self::QwenQwen332bV10
6596 | Self::QwenQwen3Coder30bA3bV10
6597 | Self::QwenQwen3Coder480bA35bV10
6598 | Self::QwenQwen3CoderNext
6599 | Self::QwenQwen3Next80bA3b
6600 | Self::QwenQwen3Vl235bA22b
6601 | Self::UsDeepseekR1V10
6602 | Self::UsMetaLlama4Maverick17bInstructV10
6603 | Self::UsMetaLlama4Scout17bInstructV10
6604 | Self::WriterPalmyraX4V10
6605 | Self::WriterPalmyraX5V10
6606 | Self::ZaiGlm47
6607 | Self::ZaiGlm47Flash
6608 | Self::ZaiGlm5 => false,
6609 Self::AmazonNovaLiteV10
6610 | Self::AmazonNovaMicroV10
6611 | Self::AmazonNovaProV10
6612 | Self::AnthropicClaudeFable5
6613 | Self::AnthropicClaudeHaiku4520251001V10
6614 | Self::AnthropicClaudeOpus4120250805V10
6615 | Self::AnthropicClaudeOpus4520251101V10
6616 | Self::AnthropicClaudeOpus46V1
6617 | Self::AnthropicClaudeOpus47
6618 | Self::AnthropicClaudeOpus48
6619 | Self::AnthropicClaudeOpus5
6620 | Self::AnthropicClaudeSonnet4520250929V10
6621 | Self::AnthropicClaudeSonnet46
6622 | Self::AnthropicClaudeSonnet5
6623 | Self::AuAnthropicClaudeHaiku4520251001V10
6624 | Self::AuAnthropicClaudeOpus46V1
6625 | Self::AuAnthropicClaudeOpus48
6626 | Self::AuAnthropicClaudeOpus5
6627 | Self::AuAnthropicClaudeSonnet4520250929V10
6628 | Self::AuAnthropicClaudeSonnet46
6629 | Self::AuAnthropicClaudeSonnet5
6630 | Self::EuAnthropicClaudeFable5
6631 | Self::EuAnthropicClaudeHaiku4520251001V10
6632 | Self::EuAnthropicClaudeOpus4520251101V10
6633 | Self::EuAnthropicClaudeOpus46V1
6634 | Self::EuAnthropicClaudeOpus47
6635 | Self::EuAnthropicClaudeOpus48
6636 | Self::EuAnthropicClaudeOpus5
6637 | Self::EuAnthropicClaudeSonnet4520250929V10
6638 | Self::EuAnthropicClaudeSonnet46
6639 | Self::EuAnthropicClaudeSonnet5
6640 | Self::GlobalAnthropicClaudeFable5
6641 | Self::GlobalAnthropicClaudeHaiku4520251001V10
6642 | Self::GlobalAnthropicClaudeOpus4520251101V10
6643 | Self::GlobalAnthropicClaudeOpus46V1
6644 | Self::GlobalAnthropicClaudeOpus47
6645 | Self::GlobalAnthropicClaudeOpus48
6646 | Self::GlobalAnthropicClaudeOpus5
6647 | Self::GlobalAnthropicClaudeSonnet4520250929V10
6648 | Self::GlobalAnthropicClaudeSonnet46
6649 | Self::GlobalAnthropicClaudeSonnet5
6650 | Self::JpAnthropicClaudeHaiku4520251001V10
6651 | Self::JpAnthropicClaudeOpus47
6652 | Self::JpAnthropicClaudeOpus48
6653 | Self::JpAnthropicClaudeOpus5
6654 | Self::JpAnthropicClaudeSonnet4520250929V10
6655 | Self::JpAnthropicClaudeSonnet46
6656 | Self::JpAnthropicClaudeSonnet5
6657 | Self::OpenaiGpt54
6658 | Self::OpenaiGpt55
6659 | Self::OpenaiGpt56Luna
6660 | Self::OpenaiGpt56Sol
6661 | Self::OpenaiGpt56Terra
6662 | Self::UsAnthropicClaudeFable5
6663 | Self::UsAnthropicClaudeHaiku4520251001V10
6664 | Self::UsAnthropicClaudeOpus4120250805V10
6665 | Self::UsAnthropicClaudeOpus4520251101V10
6666 | Self::UsAnthropicClaudeOpus46V1
6667 | Self::UsAnthropicClaudeOpus47
6668 | Self::UsAnthropicClaudeOpus48
6669 | Self::UsAnthropicClaudeOpus5
6670 | Self::UsAnthropicClaudeSonnet4520250929V10
6671 | Self::UsAnthropicClaudeSonnet46
6672 | Self::UsAnthropicClaudeSonnet5
6673 | Self::XaiGrok43 => true,
6674 }
6675 }
6676 #[allow(clippy::too_many_lines)]
6677 pub fn supports_image(self) -> bool {
6678 match self {
6679 Self::AmazonNovaMicroV10
6680 | Self::DeepseekR1V10
6681 | Self::DeepseekV3V10
6682 | Self::DeepseekV32
6683 | Self::MetaLlama3170bInstructV10
6684 | Self::MetaLlama318bInstructV10
6685 | Self::MetaLlama3370bInstructV10
6686 | Self::MinimaxMinimaxM2
6687 | Self::MinimaxMinimaxM21
6688 | Self::MinimaxMinimaxM25
6689 | Self::MistralDevstral2123b
6690 | Self::MistralMinistral314bInstruct
6691 | Self::MistralMinistral38bInstruct
6692 | Self::MistralVoxtralMini3b2507
6693 | Self::MistralVoxtralSmall24b2507
6694 | Self::MoonshotKimiK2Thinking
6695 | Self::NvidiaNemotronNano330b
6696 | Self::NvidiaNemotronNano9bV2
6697 | Self::NvidiaNemotronSuper3120b
6698 | Self::OpenaiGptOss120b
6699 | Self::OpenaiGptOss120b10
6700 | Self::OpenaiGptOss20b
6701 | Self::OpenaiGptOss20b10
6702 | Self::OpenaiGptOssSafeguard120b
6703 | Self::OpenaiGptOssSafeguard20b
6704 | Self::QwenQwen3235bA22b2507V10
6705 | Self::QwenQwen332bV10
6706 | Self::QwenQwen3Coder30bA3bV10
6707 | Self::QwenQwen3Coder480bA35bV10
6708 | Self::QwenQwen3CoderNext
6709 | Self::QwenQwen3Next80bA3b
6710 | Self::UsDeepseekR1V10
6711 | Self::WriterPalmyraX4V10
6712 | Self::WriterPalmyraX5V10
6713 | Self::ZaiGlm47
6714 | Self::ZaiGlm47Flash
6715 | Self::ZaiGlm5 => false,
6716 Self::AmazonNova2LiteV10
6717 | Self::AmazonNovaLiteV10
6718 | Self::AmazonNovaProV10
6719 | Self::AnthropicClaudeFable5
6720 | Self::AnthropicClaudeHaiku4520251001V10
6721 | Self::AnthropicClaudeOpus4120250805V10
6722 | Self::AnthropicClaudeOpus4520251101V10
6723 | Self::AnthropicClaudeOpus46V1
6724 | Self::AnthropicClaudeOpus47
6725 | Self::AnthropicClaudeOpus48
6726 | Self::AnthropicClaudeOpus5
6727 | Self::AnthropicClaudeSonnet4520250929V10
6728 | Self::AnthropicClaudeSonnet46
6729 | Self::AnthropicClaudeSonnet5
6730 | Self::AuAnthropicClaudeHaiku4520251001V10
6731 | Self::AuAnthropicClaudeOpus46V1
6732 | Self::AuAnthropicClaudeOpus48
6733 | Self::AuAnthropicClaudeOpus5
6734 | Self::AuAnthropicClaudeSonnet4520250929V10
6735 | Self::AuAnthropicClaudeSonnet46
6736 | Self::AuAnthropicClaudeSonnet5
6737 | Self::EuAnthropicClaudeFable5
6738 | Self::EuAnthropicClaudeHaiku4520251001V10
6739 | Self::EuAnthropicClaudeOpus4520251101V10
6740 | Self::EuAnthropicClaudeOpus46V1
6741 | Self::EuAnthropicClaudeOpus47
6742 | Self::EuAnthropicClaudeOpus48
6743 | Self::EuAnthropicClaudeOpus5
6744 | Self::EuAnthropicClaudeSonnet4520250929V10
6745 | Self::EuAnthropicClaudeSonnet46
6746 | Self::EuAnthropicClaudeSonnet5
6747 | Self::GlobalAnthropicClaudeFable5
6748 | Self::GlobalAnthropicClaudeHaiku4520251001V10
6749 | Self::GlobalAnthropicClaudeOpus4520251101V10
6750 | Self::GlobalAnthropicClaudeOpus46V1
6751 | Self::GlobalAnthropicClaudeOpus47
6752 | Self::GlobalAnthropicClaudeOpus48
6753 | Self::GlobalAnthropicClaudeOpus5
6754 | Self::GlobalAnthropicClaudeSonnet4520250929V10
6755 | Self::GlobalAnthropicClaudeSonnet46
6756 | Self::GlobalAnthropicClaudeSonnet5
6757 | Self::GoogleGemma327bIt
6758 | Self::GoogleGemma34bIt
6759 | Self::JpAnthropicClaudeHaiku4520251001V10
6760 | Self::JpAnthropicClaudeOpus47
6761 | Self::JpAnthropicClaudeOpus48
6762 | Self::JpAnthropicClaudeOpus5
6763 | Self::JpAnthropicClaudeSonnet4520250929V10
6764 | Self::JpAnthropicClaudeSonnet46
6765 | Self::JpAnthropicClaudeSonnet5
6766 | Self::MetaLlama4Maverick17bInstructV10
6767 | Self::MetaLlama4Scout17bInstructV10
6768 | Self::MistralMagistralSmall2509
6769 | Self::MistralMinistral33bInstruct
6770 | Self::MistralMistralLarge3675bInstruct
6771 | Self::MistralPixtralLarge2502V10
6772 | Self::MoonshotaiKimiK25
6773 | Self::NvidiaNemotronNano12bV2
6774 | Self::OpenaiGpt54
6775 | Self::OpenaiGpt55
6776 | Self::OpenaiGpt56Luna
6777 | Self::OpenaiGpt56Sol
6778 | Self::OpenaiGpt56Terra
6779 | Self::QwenQwen3Vl235bA22b
6780 | Self::UsAnthropicClaudeFable5
6781 | Self::UsAnthropicClaudeHaiku4520251001V10
6782 | Self::UsAnthropicClaudeOpus4120250805V10
6783 | Self::UsAnthropicClaudeOpus4520251101V10
6784 | Self::UsAnthropicClaudeOpus46V1
6785 | Self::UsAnthropicClaudeOpus47
6786 | Self::UsAnthropicClaudeOpus48
6787 | Self::UsAnthropicClaudeOpus5
6788 | Self::UsAnthropicClaudeSonnet4520250929V10
6789 | Self::UsAnthropicClaudeSonnet46
6790 | Self::UsAnthropicClaudeSonnet5
6791 | Self::UsMetaLlama4Maverick17bInstructV10
6792 | Self::UsMetaLlama4Scout17bInstructV10
6793 | Self::XaiGrok43 => true,
6794 }
6795 }
6796 #[allow(clippy::too_many_lines)]
6797 pub fn supports_audio(self) -> bool {
6798 match self {
6799 Self::AmazonNova2LiteV10
6800 | Self::AmazonNovaLiteV10
6801 | Self::AmazonNovaMicroV10
6802 | Self::AmazonNovaProV10
6803 | Self::AnthropicClaudeFable5
6804 | Self::AnthropicClaudeHaiku4520251001V10
6805 | Self::AnthropicClaudeOpus4120250805V10
6806 | Self::AnthropicClaudeOpus4520251101V10
6807 | Self::AnthropicClaudeOpus46V1
6808 | Self::AnthropicClaudeOpus47
6809 | Self::AnthropicClaudeOpus48
6810 | Self::AnthropicClaudeOpus5
6811 | Self::AnthropicClaudeSonnet4520250929V10
6812 | Self::AnthropicClaudeSonnet46
6813 | Self::AnthropicClaudeSonnet5
6814 | Self::AuAnthropicClaudeHaiku4520251001V10
6815 | Self::AuAnthropicClaudeOpus46V1
6816 | Self::AuAnthropicClaudeOpus48
6817 | Self::AuAnthropicClaudeOpus5
6818 | Self::AuAnthropicClaudeSonnet4520250929V10
6819 | Self::AuAnthropicClaudeSonnet46
6820 | Self::AuAnthropicClaudeSonnet5
6821 | Self::DeepseekR1V10
6822 | Self::DeepseekV3V10
6823 | Self::DeepseekV32
6824 | Self::EuAnthropicClaudeFable5
6825 | Self::EuAnthropicClaudeHaiku4520251001V10
6826 | Self::EuAnthropicClaudeOpus4520251101V10
6827 | Self::EuAnthropicClaudeOpus46V1
6828 | Self::EuAnthropicClaudeOpus47
6829 | Self::EuAnthropicClaudeOpus48
6830 | Self::EuAnthropicClaudeOpus5
6831 | Self::EuAnthropicClaudeSonnet4520250929V10
6832 | Self::EuAnthropicClaudeSonnet46
6833 | Self::EuAnthropicClaudeSonnet5
6834 | Self::GlobalAnthropicClaudeFable5
6835 | Self::GlobalAnthropicClaudeHaiku4520251001V10
6836 | Self::GlobalAnthropicClaudeOpus4520251101V10
6837 | Self::GlobalAnthropicClaudeOpus46V1
6838 | Self::GlobalAnthropicClaudeOpus47
6839 | Self::GlobalAnthropicClaudeOpus48
6840 | Self::GlobalAnthropicClaudeOpus5
6841 | Self::GlobalAnthropicClaudeSonnet4520250929V10
6842 | Self::GlobalAnthropicClaudeSonnet46
6843 | Self::GlobalAnthropicClaudeSonnet5
6844 | Self::GoogleGemma327bIt
6845 | Self::GoogleGemma34bIt
6846 | Self::JpAnthropicClaudeHaiku4520251001V10
6847 | Self::JpAnthropicClaudeOpus47
6848 | Self::JpAnthropicClaudeOpus48
6849 | Self::JpAnthropicClaudeOpus5
6850 | Self::JpAnthropicClaudeSonnet4520250929V10
6851 | Self::JpAnthropicClaudeSonnet46
6852 | Self::JpAnthropicClaudeSonnet5
6853 | Self::MetaLlama3170bInstructV10
6854 | Self::MetaLlama318bInstructV10
6855 | Self::MetaLlama3370bInstructV10
6856 | Self::MetaLlama4Maverick17bInstructV10
6857 | Self::MetaLlama4Scout17bInstructV10
6858 | Self::MinimaxMinimaxM2
6859 | Self::MinimaxMinimaxM21
6860 | Self::MinimaxMinimaxM25
6861 | Self::MistralDevstral2123b
6862 | Self::MistralMagistralSmall2509
6863 | Self::MistralMinistral314bInstruct
6864 | Self::MistralMinistral33bInstruct
6865 | Self::MistralMinistral38bInstruct
6866 | Self::MistralMistralLarge3675bInstruct
6867 | Self::MistralPixtralLarge2502V10
6868 | Self::MoonshotKimiK2Thinking
6869 | Self::MoonshotaiKimiK25
6870 | Self::NvidiaNemotronNano12bV2
6871 | Self::NvidiaNemotronNano330b
6872 | Self::NvidiaNemotronNano9bV2
6873 | Self::NvidiaNemotronSuper3120b
6874 | Self::OpenaiGpt54
6875 | Self::OpenaiGpt55
6876 | Self::OpenaiGpt56Luna
6877 | Self::OpenaiGpt56Sol
6878 | Self::OpenaiGpt56Terra
6879 | Self::OpenaiGptOss120b
6880 | Self::OpenaiGptOss120b10
6881 | Self::OpenaiGptOss20b
6882 | Self::OpenaiGptOss20b10
6883 | Self::OpenaiGptOssSafeguard120b
6884 | Self::OpenaiGptOssSafeguard20b
6885 | Self::QwenQwen3235bA22b2507V10
6886 | Self::QwenQwen332bV10
6887 | Self::QwenQwen3Coder30bA3bV10
6888 | Self::QwenQwen3Coder480bA35bV10
6889 | Self::QwenQwen3CoderNext
6890 | Self::QwenQwen3Next80bA3b
6891 | Self::QwenQwen3Vl235bA22b
6892 | Self::UsAnthropicClaudeFable5
6893 | Self::UsAnthropicClaudeHaiku4520251001V10
6894 | Self::UsAnthropicClaudeOpus4120250805V10
6895 | Self::UsAnthropicClaudeOpus4520251101V10
6896 | Self::UsAnthropicClaudeOpus46V1
6897 | Self::UsAnthropicClaudeOpus47
6898 | Self::UsAnthropicClaudeOpus48
6899 | Self::UsAnthropicClaudeOpus5
6900 | Self::UsAnthropicClaudeSonnet4520250929V10
6901 | Self::UsAnthropicClaudeSonnet46
6902 | Self::UsAnthropicClaudeSonnet5
6903 | Self::UsDeepseekR1V10
6904 | Self::UsMetaLlama4Maverick17bInstructV10
6905 | Self::UsMetaLlama4Scout17bInstructV10
6906 | Self::WriterPalmyraX4V10
6907 | Self::WriterPalmyraX5V10
6908 | Self::XaiGrok43
6909 | Self::ZaiGlm47
6910 | Self::ZaiGlm47Flash
6911 | Self::ZaiGlm5 => false,
6912 Self::MistralVoxtralMini3b2507 | Self::MistralVoxtralSmall24b2507 => true,
6913 }
6914 }
6915 #[allow(clippy::too_many_lines)]
6916 pub fn transport(self) -> Option<ModelTransport> {
6917 match self {
6918 Self::AmazonNova2LiteV10
6919 | Self::AmazonNovaLiteV10
6920 | Self::AmazonNovaMicroV10
6921 | Self::AmazonNovaProV10
6922 | Self::AnthropicClaudeFable5
6923 | Self::AnthropicClaudeHaiku4520251001V10
6924 | Self::AnthropicClaudeOpus4120250805V10
6925 | Self::AnthropicClaudeOpus4520251101V10
6926 | Self::AnthropicClaudeOpus46V1
6927 | Self::AnthropicClaudeOpus47
6928 | Self::AnthropicClaudeOpus48
6929 | Self::AnthropicClaudeOpus5
6930 | Self::AnthropicClaudeSonnet4520250929V10
6931 | Self::AnthropicClaudeSonnet46
6932 | Self::AnthropicClaudeSonnet5
6933 | Self::AuAnthropicClaudeHaiku4520251001V10
6934 | Self::AuAnthropicClaudeOpus46V1
6935 | Self::AuAnthropicClaudeOpus48
6936 | Self::AuAnthropicClaudeOpus5
6937 | Self::AuAnthropicClaudeSonnet4520250929V10
6938 | Self::AuAnthropicClaudeSonnet46
6939 | Self::AuAnthropicClaudeSonnet5
6940 | Self::DeepseekR1V10
6941 | Self::DeepseekV3V10
6942 | Self::DeepseekV32
6943 | Self::EuAnthropicClaudeFable5
6944 | Self::EuAnthropicClaudeHaiku4520251001V10
6945 | Self::EuAnthropicClaudeOpus4520251101V10
6946 | Self::EuAnthropicClaudeOpus46V1
6947 | Self::EuAnthropicClaudeOpus47
6948 | Self::EuAnthropicClaudeOpus48
6949 | Self::EuAnthropicClaudeOpus5
6950 | Self::EuAnthropicClaudeSonnet4520250929V10
6951 | Self::EuAnthropicClaudeSonnet46
6952 | Self::EuAnthropicClaudeSonnet5
6953 | Self::GlobalAnthropicClaudeFable5
6954 | Self::GlobalAnthropicClaudeHaiku4520251001V10
6955 | Self::GlobalAnthropicClaudeOpus4520251101V10
6956 | Self::GlobalAnthropicClaudeOpus46V1
6957 | Self::GlobalAnthropicClaudeOpus47
6958 | Self::GlobalAnthropicClaudeOpus48
6959 | Self::GlobalAnthropicClaudeOpus5
6960 | Self::GlobalAnthropicClaudeSonnet4520250929V10
6961 | Self::GlobalAnthropicClaudeSonnet46
6962 | Self::GlobalAnthropicClaudeSonnet5
6963 | Self::GoogleGemma327bIt
6964 | Self::GoogleGemma34bIt
6965 | Self::JpAnthropicClaudeHaiku4520251001V10
6966 | Self::JpAnthropicClaudeOpus47
6967 | Self::JpAnthropicClaudeOpus48
6968 | Self::JpAnthropicClaudeOpus5
6969 | Self::JpAnthropicClaudeSonnet4520250929V10
6970 | Self::JpAnthropicClaudeSonnet46
6971 | Self::JpAnthropicClaudeSonnet5
6972 | Self::MetaLlama3170bInstructV10
6973 | Self::MetaLlama318bInstructV10
6974 | Self::MetaLlama3370bInstructV10
6975 | Self::MetaLlama4Maverick17bInstructV10
6976 | Self::MetaLlama4Scout17bInstructV10
6977 | Self::MinimaxMinimaxM2
6978 | Self::MinimaxMinimaxM21
6979 | Self::MinimaxMinimaxM25
6980 | Self::MistralDevstral2123b
6981 | Self::MistralMagistralSmall2509
6982 | Self::MistralMinistral314bInstruct
6983 | Self::MistralMinistral33bInstruct
6984 | Self::MistralMinistral38bInstruct
6985 | Self::MistralMistralLarge3675bInstruct
6986 | Self::MistralPixtralLarge2502V10
6987 | Self::MistralVoxtralMini3b2507
6988 | Self::MistralVoxtralSmall24b2507
6989 | Self::MoonshotKimiK2Thinking
6990 | Self::MoonshotaiKimiK25
6991 | Self::NvidiaNemotronNano12bV2
6992 | Self::NvidiaNemotronNano330b
6993 | Self::NvidiaNemotronNano9bV2
6994 | Self::NvidiaNemotronSuper3120b
6995 | Self::OpenaiGptOss120b10
6996 | Self::OpenaiGptOss20b10
6997 | Self::OpenaiGptOssSafeguard120b
6998 | Self::OpenaiGptOssSafeguard20b
6999 | Self::QwenQwen3235bA22b2507V10
7000 | Self::QwenQwen332bV10
7001 | Self::QwenQwen3Coder30bA3bV10
7002 | Self::QwenQwen3Coder480bA35bV10
7003 | Self::QwenQwen3CoderNext
7004 | Self::QwenQwen3Next80bA3b
7005 | Self::QwenQwen3Vl235bA22b
7006 | Self::UsAnthropicClaudeFable5
7007 | Self::UsAnthropicClaudeHaiku4520251001V10
7008 | Self::UsAnthropicClaudeOpus4120250805V10
7009 | Self::UsAnthropicClaudeOpus4520251101V10
7010 | Self::UsAnthropicClaudeOpus46V1
7011 | Self::UsAnthropicClaudeOpus47
7012 | Self::UsAnthropicClaudeOpus48
7013 | Self::UsAnthropicClaudeOpus5
7014 | Self::UsAnthropicClaudeSonnet4520250929V10
7015 | Self::UsAnthropicClaudeSonnet46
7016 | Self::UsAnthropicClaudeSonnet5
7017 | Self::UsDeepseekR1V10
7018 | Self::UsMetaLlama4Maverick17bInstructV10
7019 | Self::UsMetaLlama4Scout17bInstructV10
7020 | Self::WriterPalmyraX4V10
7021 | Self::WriterPalmyraX5V10
7022 | Self::ZaiGlm47
7023 | Self::ZaiGlm47Flash
7024 | Self::ZaiGlm5 => None,
7025 Self::OpenaiGpt54
7026 | Self::OpenaiGpt55
7027 | Self::OpenaiGpt56Luna
7028 | Self::OpenaiGpt56Sol
7029 | Self::OpenaiGpt56Terra
7030 | Self::XaiGrok43 => {
7031 Some(ModelTransport::OpenAiResponses {
7032 base_url_template: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1",
7033 })
7034 }
7035 Self::OpenaiGptOss120b | Self::OpenaiGptOss20b => {
7036 Some(ModelTransport::OpenAiResponses {
7037 base_url_template: "https://bedrock-mantle.${AWS_REGION}.api.aws/v1",
7038 })
7039 }
7040 }
7041 }
7042 const ALL: &[BedrockFoundationModel] = &[
7043 Self::AmazonNova2LiteV10,
7044 Self::AmazonNovaLiteV10,
7045 Self::AmazonNovaMicroV10,
7046 Self::AmazonNovaProV10,
7047 Self::AnthropicClaudeFable5,
7048 Self::AnthropicClaudeHaiku4520251001V10,
7049 Self::AnthropicClaudeOpus4120250805V10,
7050 Self::AnthropicClaudeOpus4520251101V10,
7051 Self::AnthropicClaudeOpus46V1,
7052 Self::AnthropicClaudeOpus47,
7053 Self::AnthropicClaudeOpus48,
7054 Self::AnthropicClaudeOpus5,
7055 Self::AnthropicClaudeSonnet4520250929V10,
7056 Self::AnthropicClaudeSonnet46,
7057 Self::AnthropicClaudeSonnet5,
7058 Self::AuAnthropicClaudeHaiku4520251001V10,
7059 Self::AuAnthropicClaudeOpus46V1,
7060 Self::AuAnthropicClaudeOpus48,
7061 Self::AuAnthropicClaudeOpus5,
7062 Self::AuAnthropicClaudeSonnet4520250929V10,
7063 Self::AuAnthropicClaudeSonnet46,
7064 Self::AuAnthropicClaudeSonnet5,
7065 Self::DeepseekR1V10,
7066 Self::DeepseekV3V10,
7067 Self::DeepseekV32,
7068 Self::EuAnthropicClaudeFable5,
7069 Self::EuAnthropicClaudeHaiku4520251001V10,
7070 Self::EuAnthropicClaudeOpus4520251101V10,
7071 Self::EuAnthropicClaudeOpus46V1,
7072 Self::EuAnthropicClaudeOpus47,
7073 Self::EuAnthropicClaudeOpus48,
7074 Self::EuAnthropicClaudeOpus5,
7075 Self::EuAnthropicClaudeSonnet4520250929V10,
7076 Self::EuAnthropicClaudeSonnet46,
7077 Self::EuAnthropicClaudeSonnet5,
7078 Self::GlobalAnthropicClaudeFable5,
7079 Self::GlobalAnthropicClaudeHaiku4520251001V10,
7080 Self::GlobalAnthropicClaudeOpus4520251101V10,
7081 Self::GlobalAnthropicClaudeOpus46V1,
7082 Self::GlobalAnthropicClaudeOpus47,
7083 Self::GlobalAnthropicClaudeOpus48,
7084 Self::GlobalAnthropicClaudeOpus5,
7085 Self::GlobalAnthropicClaudeSonnet4520250929V10,
7086 Self::GlobalAnthropicClaudeSonnet46,
7087 Self::GlobalAnthropicClaudeSonnet5,
7088 Self::GoogleGemma327bIt,
7089 Self::GoogleGemma34bIt,
7090 Self::JpAnthropicClaudeHaiku4520251001V10,
7091 Self::JpAnthropicClaudeOpus47,
7092 Self::JpAnthropicClaudeOpus48,
7093 Self::JpAnthropicClaudeOpus5,
7094 Self::JpAnthropicClaudeSonnet4520250929V10,
7095 Self::JpAnthropicClaudeSonnet46,
7096 Self::JpAnthropicClaudeSonnet5,
7097 Self::MetaLlama3170bInstructV10,
7098 Self::MetaLlama318bInstructV10,
7099 Self::MetaLlama3370bInstructV10,
7100 Self::MetaLlama4Maverick17bInstructV10,
7101 Self::MetaLlama4Scout17bInstructV10,
7102 Self::MinimaxMinimaxM2,
7103 Self::MinimaxMinimaxM21,
7104 Self::MinimaxMinimaxM25,
7105 Self::MistralDevstral2123b,
7106 Self::MistralMagistralSmall2509,
7107 Self::MistralMinistral314bInstruct,
7108 Self::MistralMinistral33bInstruct,
7109 Self::MistralMinistral38bInstruct,
7110 Self::MistralMistralLarge3675bInstruct,
7111 Self::MistralPixtralLarge2502V10,
7112 Self::MistralVoxtralMini3b2507,
7113 Self::MistralVoxtralSmall24b2507,
7114 Self::MoonshotKimiK2Thinking,
7115 Self::MoonshotaiKimiK25,
7116 Self::NvidiaNemotronNano12bV2,
7117 Self::NvidiaNemotronNano330b,
7118 Self::NvidiaNemotronNano9bV2,
7119 Self::NvidiaNemotronSuper3120b,
7120 Self::OpenaiGpt54,
7121 Self::OpenaiGpt55,
7122 Self::OpenaiGpt56Luna,
7123 Self::OpenaiGpt56Sol,
7124 Self::OpenaiGpt56Terra,
7125 Self::OpenaiGptOss120b,
7126 Self::OpenaiGptOss120b10,
7127 Self::OpenaiGptOss20b,
7128 Self::OpenaiGptOss20b10,
7129 Self::OpenaiGptOssSafeguard120b,
7130 Self::OpenaiGptOssSafeguard20b,
7131 Self::QwenQwen3235bA22b2507V10,
7132 Self::QwenQwen332bV10,
7133 Self::QwenQwen3Coder30bA3bV10,
7134 Self::QwenQwen3Coder480bA35bV10,
7135 Self::QwenQwen3CoderNext,
7136 Self::QwenQwen3Next80bA3b,
7137 Self::QwenQwen3Vl235bA22b,
7138 Self::UsAnthropicClaudeFable5,
7139 Self::UsAnthropicClaudeHaiku4520251001V10,
7140 Self::UsAnthropicClaudeOpus4120250805V10,
7141 Self::UsAnthropicClaudeOpus4520251101V10,
7142 Self::UsAnthropicClaudeOpus46V1,
7143 Self::UsAnthropicClaudeOpus47,
7144 Self::UsAnthropicClaudeOpus48,
7145 Self::UsAnthropicClaudeOpus5,
7146 Self::UsAnthropicClaudeSonnet4520250929V10,
7147 Self::UsAnthropicClaudeSonnet46,
7148 Self::UsAnthropicClaudeSonnet5,
7149 Self::UsDeepseekR1V10,
7150 Self::UsMetaLlama4Maverick17bInstructV10,
7151 Self::UsMetaLlama4Scout17bInstructV10,
7152 Self::WriterPalmyraX4V10,
7153 Self::WriterPalmyraX5V10,
7154 Self::XaiGrok43,
7155 Self::ZaiGlm47,
7156 Self::ZaiGlm47Flash,
7157 Self::ZaiGlm5,
7158 ];
7159}
7160impl std::str::FromStr for BedrockFoundationModel {
7161 type Err = String;
7162 #[allow(clippy::too_many_lines)]
7163 fn from_str(s: &str) -> Result<Self, Self::Err> {
7164 match s {
7165 "amazon.nova-2-lite-v1:0" => Ok(Self::AmazonNova2LiteV10),
7166 "amazon.nova-lite-v1:0" => Ok(Self::AmazonNovaLiteV10),
7167 "amazon.nova-micro-v1:0" => Ok(Self::AmazonNovaMicroV10),
7168 "amazon.nova-pro-v1:0" => Ok(Self::AmazonNovaProV10),
7169 "anthropic.claude-fable-5" => Ok(Self::AnthropicClaudeFable5),
7170 "anthropic.claude-haiku-4-5-20251001-v1:0" => {
7171 Ok(Self::AnthropicClaudeHaiku4520251001V10)
7172 }
7173 "anthropic.claude-opus-4-1-20250805-v1:0" => {
7174 Ok(Self::AnthropicClaudeOpus4120250805V10)
7175 }
7176 "anthropic.claude-opus-4-5-20251101-v1:0" => {
7177 Ok(Self::AnthropicClaudeOpus4520251101V10)
7178 }
7179 "anthropic.claude-opus-4-6-v1" => Ok(Self::AnthropicClaudeOpus46V1),
7180 "anthropic.claude-opus-4-7" => Ok(Self::AnthropicClaudeOpus47),
7181 "anthropic.claude-opus-4-8" => Ok(Self::AnthropicClaudeOpus48),
7182 "anthropic.claude-opus-5" => Ok(Self::AnthropicClaudeOpus5),
7183 "anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7184 Ok(Self::AnthropicClaudeSonnet4520250929V10)
7185 }
7186 "anthropic.claude-sonnet-4-6" => Ok(Self::AnthropicClaudeSonnet46),
7187 "anthropic.claude-sonnet-5" => Ok(Self::AnthropicClaudeSonnet5),
7188 "au.anthropic.claude-haiku-4-5-20251001-v1:0" => {
7189 Ok(Self::AuAnthropicClaudeHaiku4520251001V10)
7190 }
7191 "au.anthropic.claude-opus-4-6-v1" => Ok(Self::AuAnthropicClaudeOpus46V1),
7192 "au.anthropic.claude-opus-4-8" => Ok(Self::AuAnthropicClaudeOpus48),
7193 "au.anthropic.claude-opus-5" => Ok(Self::AuAnthropicClaudeOpus5),
7194 "au.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7195 Ok(Self::AuAnthropicClaudeSonnet4520250929V10)
7196 }
7197 "au.anthropic.claude-sonnet-4-6" => Ok(Self::AuAnthropicClaudeSonnet46),
7198 "au.anthropic.claude-sonnet-5" => Ok(Self::AuAnthropicClaudeSonnet5),
7199 "deepseek.r1-v1:0" => Ok(Self::DeepseekR1V10),
7200 "deepseek.v3-v1:0" => Ok(Self::DeepseekV3V10),
7201 "deepseek.v3.2" => Ok(Self::DeepseekV32),
7202 "eu.anthropic.claude-fable-5" => Ok(Self::EuAnthropicClaudeFable5),
7203 "eu.anthropic.claude-haiku-4-5-20251001-v1:0" => {
7204 Ok(Self::EuAnthropicClaudeHaiku4520251001V10)
7205 }
7206 "eu.anthropic.claude-opus-4-5-20251101-v1:0" => {
7207 Ok(Self::EuAnthropicClaudeOpus4520251101V10)
7208 }
7209 "eu.anthropic.claude-opus-4-6-v1" => Ok(Self::EuAnthropicClaudeOpus46V1),
7210 "eu.anthropic.claude-opus-4-7" => Ok(Self::EuAnthropicClaudeOpus47),
7211 "eu.anthropic.claude-opus-4-8" => Ok(Self::EuAnthropicClaudeOpus48),
7212 "eu.anthropic.claude-opus-5" => Ok(Self::EuAnthropicClaudeOpus5),
7213 "eu.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7214 Ok(Self::EuAnthropicClaudeSonnet4520250929V10)
7215 }
7216 "eu.anthropic.claude-sonnet-4-6" => Ok(Self::EuAnthropicClaudeSonnet46),
7217 "eu.anthropic.claude-sonnet-5" => Ok(Self::EuAnthropicClaudeSonnet5),
7218 "global.anthropic.claude-fable-5" => Ok(Self::GlobalAnthropicClaudeFable5),
7219 "global.anthropic.claude-haiku-4-5-20251001-v1:0" => {
7220 Ok(Self::GlobalAnthropicClaudeHaiku4520251001V10)
7221 }
7222 "global.anthropic.claude-opus-4-5-20251101-v1:0" => {
7223 Ok(Self::GlobalAnthropicClaudeOpus4520251101V10)
7224 }
7225 "global.anthropic.claude-opus-4-6-v1" => {
7226 Ok(Self::GlobalAnthropicClaudeOpus46V1)
7227 }
7228 "global.anthropic.claude-opus-4-7" => Ok(Self::GlobalAnthropicClaudeOpus47),
7229 "global.anthropic.claude-opus-4-8" => Ok(Self::GlobalAnthropicClaudeOpus48),
7230 "global.anthropic.claude-opus-5" => Ok(Self::GlobalAnthropicClaudeOpus5),
7231 "global.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7232 Ok(Self::GlobalAnthropicClaudeSonnet4520250929V10)
7233 }
7234 "global.anthropic.claude-sonnet-4-6" => {
7235 Ok(Self::GlobalAnthropicClaudeSonnet46)
7236 }
7237 "global.anthropic.claude-sonnet-5" => Ok(Self::GlobalAnthropicClaudeSonnet5),
7238 "google.gemma-3-27b-it" => Ok(Self::GoogleGemma327bIt),
7239 "google.gemma-3-4b-it" => Ok(Self::GoogleGemma34bIt),
7240 "jp.anthropic.claude-haiku-4-5-20251001-v1:0" => {
7241 Ok(Self::JpAnthropicClaudeHaiku4520251001V10)
7242 }
7243 "jp.anthropic.claude-opus-4-7" => Ok(Self::JpAnthropicClaudeOpus47),
7244 "jp.anthropic.claude-opus-4-8" => Ok(Self::JpAnthropicClaudeOpus48),
7245 "jp.anthropic.claude-opus-5" => Ok(Self::JpAnthropicClaudeOpus5),
7246 "jp.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7247 Ok(Self::JpAnthropicClaudeSonnet4520250929V10)
7248 }
7249 "jp.anthropic.claude-sonnet-4-6" => Ok(Self::JpAnthropicClaudeSonnet46),
7250 "jp.anthropic.claude-sonnet-5" => Ok(Self::JpAnthropicClaudeSonnet5),
7251 "meta.llama3-1-70b-instruct-v1:0" => Ok(Self::MetaLlama3170bInstructV10),
7252 "meta.llama3-1-8b-instruct-v1:0" => Ok(Self::MetaLlama318bInstructV10),
7253 "meta.llama3-3-70b-instruct-v1:0" => Ok(Self::MetaLlama3370bInstructV10),
7254 "meta.llama4-maverick-17b-instruct-v1:0" => {
7255 Ok(Self::MetaLlama4Maverick17bInstructV10)
7256 }
7257 "meta.llama4-scout-17b-instruct-v1:0" => {
7258 Ok(Self::MetaLlama4Scout17bInstructV10)
7259 }
7260 "minimax.minimax-m2" => Ok(Self::MinimaxMinimaxM2),
7261 "minimax.minimax-m2.1" => Ok(Self::MinimaxMinimaxM21),
7262 "minimax.minimax-m2.5" => Ok(Self::MinimaxMinimaxM25),
7263 "mistral.devstral-2-123b" => Ok(Self::MistralDevstral2123b),
7264 "mistral.magistral-small-2509" => Ok(Self::MistralMagistralSmall2509),
7265 "mistral.ministral-3-14b-instruct" => Ok(Self::MistralMinistral314bInstruct),
7266 "mistral.ministral-3-3b-instruct" => Ok(Self::MistralMinistral33bInstruct),
7267 "mistral.ministral-3-8b-instruct" => Ok(Self::MistralMinistral38bInstruct),
7268 "mistral.mistral-large-3-675b-instruct" => {
7269 Ok(Self::MistralMistralLarge3675bInstruct)
7270 }
7271 "mistral.pixtral-large-2502-v1:0" => Ok(Self::MistralPixtralLarge2502V10),
7272 "mistral.voxtral-mini-3b-2507" => Ok(Self::MistralVoxtralMini3b2507),
7273 "mistral.voxtral-small-24b-2507" => Ok(Self::MistralVoxtralSmall24b2507),
7274 "moonshot.kimi-k2-thinking" => Ok(Self::MoonshotKimiK2Thinking),
7275 "moonshotai.kimi-k2.5" => Ok(Self::MoonshotaiKimiK25),
7276 "nvidia.nemotron-nano-12b-v2" => Ok(Self::NvidiaNemotronNano12bV2),
7277 "nvidia.nemotron-nano-3-30b" => Ok(Self::NvidiaNemotronNano330b),
7278 "nvidia.nemotron-nano-9b-v2" => Ok(Self::NvidiaNemotronNano9bV2),
7279 "nvidia.nemotron-super-3-120b" => Ok(Self::NvidiaNemotronSuper3120b),
7280 "openai.gpt-5.4" => Ok(Self::OpenaiGpt54),
7281 "openai.gpt-5.5" => Ok(Self::OpenaiGpt55),
7282 "openai.gpt-5.6-luna" => Ok(Self::OpenaiGpt56Luna),
7283 "openai.gpt-5.6-sol" => Ok(Self::OpenaiGpt56Sol),
7284 "openai.gpt-5.6-terra" => Ok(Self::OpenaiGpt56Terra),
7285 "openai.gpt-oss-120b" => Ok(Self::OpenaiGptOss120b),
7286 "openai.gpt-oss-120b-1:0" => Ok(Self::OpenaiGptOss120b10),
7287 "openai.gpt-oss-20b" => Ok(Self::OpenaiGptOss20b),
7288 "openai.gpt-oss-20b-1:0" => Ok(Self::OpenaiGptOss20b10),
7289 "openai.gpt-oss-safeguard-120b" => Ok(Self::OpenaiGptOssSafeguard120b),
7290 "openai.gpt-oss-safeguard-20b" => Ok(Self::OpenaiGptOssSafeguard20b),
7291 "qwen.qwen3-235b-a22b-2507-v1:0" => Ok(Self::QwenQwen3235bA22b2507V10),
7292 "qwen.qwen3-32b-v1:0" => Ok(Self::QwenQwen332bV10),
7293 "qwen.qwen3-coder-30b-a3b-v1:0" => Ok(Self::QwenQwen3Coder30bA3bV10),
7294 "qwen.qwen3-coder-480b-a35b-v1:0" => Ok(Self::QwenQwen3Coder480bA35bV10),
7295 "qwen.qwen3-coder-next" => Ok(Self::QwenQwen3CoderNext),
7296 "qwen.qwen3-next-80b-a3b" => Ok(Self::QwenQwen3Next80bA3b),
7297 "qwen.qwen3-vl-235b-a22b" => Ok(Self::QwenQwen3Vl235bA22b),
7298 "us.anthropic.claude-fable-5" => Ok(Self::UsAnthropicClaudeFable5),
7299 "us.anthropic.claude-haiku-4-5-20251001-v1:0" => {
7300 Ok(Self::UsAnthropicClaudeHaiku4520251001V10)
7301 }
7302 "us.anthropic.claude-opus-4-1-20250805-v1:0" => {
7303 Ok(Self::UsAnthropicClaudeOpus4120250805V10)
7304 }
7305 "us.anthropic.claude-opus-4-5-20251101-v1:0" => {
7306 Ok(Self::UsAnthropicClaudeOpus4520251101V10)
7307 }
7308 "us.anthropic.claude-opus-4-6-v1" => Ok(Self::UsAnthropicClaudeOpus46V1),
7309 "us.anthropic.claude-opus-4-7" => Ok(Self::UsAnthropicClaudeOpus47),
7310 "us.anthropic.claude-opus-4-8" => Ok(Self::UsAnthropicClaudeOpus48),
7311 "us.anthropic.claude-opus-5" => Ok(Self::UsAnthropicClaudeOpus5),
7312 "us.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7313 Ok(Self::UsAnthropicClaudeSonnet4520250929V10)
7314 }
7315 "us.anthropic.claude-sonnet-4-6" => Ok(Self::UsAnthropicClaudeSonnet46),
7316 "us.anthropic.claude-sonnet-5" => Ok(Self::UsAnthropicClaudeSonnet5),
7317 "us.deepseek.r1-v1:0" => Ok(Self::UsDeepseekR1V10),
7318 "us.meta.llama4-maverick-17b-instruct-v1:0" => {
7319 Ok(Self::UsMetaLlama4Maverick17bInstructV10)
7320 }
7321 "us.meta.llama4-scout-17b-instruct-v1:0" => {
7322 Ok(Self::UsMetaLlama4Scout17bInstructV10)
7323 }
7324 "writer.palmyra-x4-v1:0" => Ok(Self::WriterPalmyraX4V10),
7325 "writer.palmyra-x5-v1:0" => Ok(Self::WriterPalmyraX5V10),
7326 "xai.grok-4.3" => Ok(Self::XaiGrok43),
7327 "zai.glm-4.7" => Ok(Self::ZaiGlm47),
7328 "zai.glm-4.7-flash" => Ok(Self::ZaiGlm47Flash),
7329 "zai.glm-5" => Ok(Self::ZaiGlm5),
7330 _ => Err(format!("Unknown bedrock model: '{s}'")),
7331 }
7332 }
7333}
7334#[derive(Debug, Clone, PartialEq, Eq, Hash)]
7336pub enum LlmModel {
7337 Anthropic(AnthropicModel),
7338 AzureFoundry(AzureFoundryModel),
7339 Codex(CodexModel),
7340 DeepSeek(DeepSeekModel),
7341 Fireworks(FireworksModel),
7342 Gemini(GeminiModel),
7343 Moonshot(MoonshotModel),
7344 Openai(OpenaiModel),
7345 OpenRouter(OpenRouterModel),
7346 ZAi(ZAiModel),
7347 Bedrock(BedrockModel),
7348 Ollama(String),
7349 LlamaCpp(String),
7350}
7351impl From<AnthropicModel> for LlmModel {
7352 fn from(m: AnthropicModel) -> Self {
7353 LlmModel::Anthropic(m)
7354 }
7355}
7356impl From<AzureFoundryModel> for LlmModel {
7357 fn from(m: AzureFoundryModel) -> Self {
7358 LlmModel::AzureFoundry(m)
7359 }
7360}
7361impl From<CodexModel> for LlmModel {
7362 fn from(m: CodexModel) -> Self {
7363 LlmModel::Codex(m)
7364 }
7365}
7366impl From<DeepSeekModel> for LlmModel {
7367 fn from(m: DeepSeekModel) -> Self {
7368 LlmModel::DeepSeek(m)
7369 }
7370}
7371impl From<FireworksModel> for LlmModel {
7372 fn from(m: FireworksModel) -> Self {
7373 LlmModel::Fireworks(m)
7374 }
7375}
7376impl From<GeminiModel> for LlmModel {
7377 fn from(m: GeminiModel) -> Self {
7378 LlmModel::Gemini(m)
7379 }
7380}
7381impl From<MoonshotModel> for LlmModel {
7382 fn from(m: MoonshotModel) -> Self {
7383 LlmModel::Moonshot(m)
7384 }
7385}
7386impl From<OpenaiModel> for LlmModel {
7387 fn from(m: OpenaiModel) -> Self {
7388 LlmModel::Openai(m)
7389 }
7390}
7391impl From<OpenRouterModel> for LlmModel {
7392 fn from(m: OpenRouterModel) -> Self {
7393 LlmModel::OpenRouter(m)
7394 }
7395}
7396impl From<ZAiModel> for LlmModel {
7397 fn from(m: ZAiModel) -> Self {
7398 LlmModel::ZAi(m)
7399 }
7400}
7401impl From<BedrockModel> for LlmModel {
7402 fn from(m: BedrockModel) -> Self {
7403 LlmModel::Bedrock(m)
7404 }
7405}
7406impl LlmModel {
7407 pub fn model_id(&self) -> Cow<'static, str> {
7409 match self {
7410 Self::Anthropic(m) => Cow::Borrowed(m.model_id()),
7411 Self::AzureFoundry(m) => Cow::Borrowed(m.model_id()),
7412 Self::Codex(m) => Cow::Borrowed(m.model_id()),
7413 Self::DeepSeek(m) => Cow::Borrowed(m.model_id()),
7414 Self::Fireworks(m) => Cow::Borrowed(m.model_id()),
7415 Self::Gemini(m) => Cow::Borrowed(m.model_id()),
7416 Self::Moonshot(m) => Cow::Borrowed(m.model_id()),
7417 Self::Openai(m) => Cow::Borrowed(m.model_id()),
7418 Self::OpenRouter(m) => Cow::Borrowed(m.model_id()),
7419 Self::ZAi(m) => Cow::Borrowed(m.model_id()),
7420 Self::Bedrock(m) => m.model_id(),
7421 Self::Ollama(s) | Self::LlamaCpp(s) => Cow::Owned(s.clone()),
7422 }
7423 }
7424 pub fn display_name(&self) -> Cow<'static, str> {
7426 match self {
7427 Self::Anthropic(m) => Cow::Borrowed(m.display_name()),
7428 Self::AzureFoundry(m) => Cow::Borrowed(m.display_name()),
7429 Self::Codex(m) => Cow::Borrowed(m.display_name()),
7430 Self::DeepSeek(m) => Cow::Borrowed(m.display_name()),
7431 Self::Fireworks(m) => Cow::Borrowed(m.display_name()),
7432 Self::Gemini(m) => Cow::Borrowed(m.display_name()),
7433 Self::Moonshot(m) => Cow::Borrowed(m.display_name()),
7434 Self::Openai(m) => Cow::Borrowed(m.display_name()),
7435 Self::OpenRouter(m) => Cow::Borrowed(m.display_name()),
7436 Self::ZAi(m) => Cow::Borrowed(m.display_name()),
7437 Self::Bedrock(m) => m.display_name(),
7438 Self::Ollama(s) => Cow::Owned(format!("Ollama {s}")),
7439 Self::LlamaCpp(s) => Cow::Owned(format!("LlamaCpp {s}")),
7440 }
7441 }
7442 pub fn provider(&self) -> &'static str {
7444 match self {
7445 Self::Anthropic(_) => "anthropic",
7446 Self::AzureFoundry(_) => "azure-foundry",
7447 Self::Codex(_) => "codex",
7448 Self::DeepSeek(_) => "deepseek",
7449 Self::Fireworks(_) => "fireworks",
7450 Self::Gemini(_) => "gemini",
7451 Self::Moonshot(_) => "moonshot",
7452 Self::Openai(_) => "openai",
7453 Self::OpenRouter(_) => "openrouter",
7454 Self::ZAi(_) => "zai",
7455 Self::Bedrock(_) => "bedrock",
7456 Self::Ollama(_) => "ollama",
7457 Self::LlamaCpp(_) => "llamacpp",
7458 }
7459 }
7460 pub fn provider_enum(&self) -> Provider {
7462 match self {
7463 Self::Anthropic(_) => Provider::Anthropic,
7464 Self::AzureFoundry(_) => Provider::AzureFoundry,
7465 Self::Codex(_) => Provider::Codex,
7466 Self::DeepSeek(_) => Provider::DeepSeek,
7467 Self::Fireworks(_) => Provider::Fireworks,
7468 Self::Gemini(_) => Provider::Gemini,
7469 Self::Moonshot(_) => Provider::Moonshot,
7470 Self::Openai(_) => Provider::Openai,
7471 Self::OpenRouter(_) => Provider::OpenRouter,
7472 Self::ZAi(_) => Provider::ZAi,
7473 Self::Bedrock(_) => Provider::Bedrock,
7474 Self::Ollama(_) => Provider::Ollama,
7475 Self::LlamaCpp(_) => Provider::LlamaCpp,
7476 }
7477 }
7478 pub fn provider_display_name(&self) -> &'static str {
7480 match self {
7481 Self::Anthropic(_) => "Anthropic",
7482 Self::AzureFoundry(_) => "Microsoft Foundry",
7483 Self::Codex(_) => "Codex",
7484 Self::DeepSeek(_) => "DeepSeek",
7485 Self::Fireworks(_) => "Fireworks AI",
7486 Self::Gemini(_) => "Gemini",
7487 Self::Moonshot(_) => "Moonshot",
7488 Self::Openai(_) => "OpenAI",
7489 Self::OpenRouter(_) => "OpenRouter",
7490 Self::ZAi(_) => "ZAI",
7491 Self::Bedrock(_) => "AWS Bedrock",
7492 Self::Ollama(_) => "Ollama",
7493 Self::LlamaCpp(_) => "LlamaCpp",
7494 }
7495 }
7496 pub fn context_window(&self) -> Option<u32> {
7498 match self {
7499 Self::Anthropic(m) => Some(m.context_window()),
7500 Self::AzureFoundry(m) => Some(m.context_window()),
7501 Self::Codex(m) => Some(m.context_window()),
7502 Self::DeepSeek(m) => Some(m.context_window()),
7503 Self::Fireworks(m) => Some(m.context_window()),
7504 Self::Gemini(m) => Some(m.context_window()),
7505 Self::Moonshot(m) => Some(m.context_window()),
7506 Self::Openai(m) => Some(m.context_window()),
7507 Self::OpenRouter(m) => Some(m.context_window()),
7508 Self::ZAi(m) => Some(m.context_window()),
7509 Self::Bedrock(m) => m.context_window(),
7510 Self::Ollama(_) | Self::LlamaCpp(_) => None,
7511 }
7512 }
7513 pub fn required_env_var(&self) -> Option<&'static str> {
7515 match self {
7516 Self::Anthropic(_) => Some("ANTHROPIC_API_KEY"),
7517 Self::AzureFoundry(_) => Some("AZURE_OPENAI_API_KEY"),
7518 Self::DeepSeek(_) => Some("DEEPSEEK_API_KEY"),
7519 Self::Fireworks(_) => Some("FIREWORKS_API_KEY"),
7520 Self::Gemini(_) => Some("GEMINI_API_KEY"),
7521 Self::Moonshot(_) => Some("MOONSHOT_API_KEY"),
7522 Self::Openai(_) => Some("OPENAI_API_KEY"),
7523 Self::OpenRouter(_) => Some("OPENROUTER_API_KEY"),
7524 Self::ZAi(_) => Some("ZAI_API_KEY"),
7525 Self::Codex(_) | Self::Bedrock(_) | Self::Ollama(_) | Self::LlamaCpp(_) => {
7526 None
7527 }
7528 }
7529 }
7530 pub const ALL_REQUIRED_ENV_VARS: &[&str] = &[
7532 "ANTHROPIC_API_KEY",
7533 "AZURE_OPENAI_API_KEY",
7534 "DEEPSEEK_API_KEY",
7535 "FIREWORKS_API_KEY",
7536 "GEMINI_API_KEY",
7537 "MOONSHOT_API_KEY",
7538 "OPENAI_API_KEY",
7539 "OPENROUTER_API_KEY",
7540 "ZAI_API_KEY",
7541 ];
7542 pub fn oauth_provider_id(&self) -> Option<&'static str> {
7544 match self {
7545 Self::Codex(_) => Some("codex"),
7546 Self::Anthropic(_)
7547 | Self::AzureFoundry(_)
7548 | Self::DeepSeek(_)
7549 | Self::Fireworks(_)
7550 | Self::Gemini(_)
7551 | Self::Moonshot(_)
7552 | Self::Openai(_)
7553 | Self::OpenRouter(_)
7554 | Self::ZAi(_)
7555 | Self::Bedrock(_)
7556 | Self::Ollama(_)
7557 | Self::LlamaCpp(_) => None,
7558 }
7559 }
7560 pub fn reasoning_levels(&self) -> &'static [ReasoningEffort] {
7562 match self {
7563 Self::Anthropic(m) => m.reasoning_levels(),
7564 Self::AzureFoundry(m) => m.reasoning_levels(),
7565 Self::Codex(m) => m.reasoning_levels(),
7566 Self::DeepSeek(m) => m.reasoning_levels(),
7567 Self::Fireworks(m) => m.reasoning_levels(),
7568 Self::Gemini(m) => m.reasoning_levels(),
7569 Self::Moonshot(m) => m.reasoning_levels(),
7570 Self::Openai(m) => m.reasoning_levels(),
7571 Self::OpenRouter(m) => m.reasoning_levels(),
7572 Self::ZAi(m) => m.reasoning_levels(),
7573 Self::Bedrock(m) => m.reasoning_levels(),
7574 Self::Ollama(_) | Self::LlamaCpp(_) => &[],
7575 }
7576 }
7577 pub fn supports_reasoning(&self) -> bool {
7579 !self.reasoning_levels().is_empty()
7580 }
7581 pub fn supports_prompt_caching(&self) -> bool {
7583 match self {
7584 Self::Anthropic(m) => m.supports_prompt_caching(),
7585 Self::AzureFoundry(m) => m.supports_prompt_caching(),
7586 Self::Codex(m) => m.supports_prompt_caching(),
7587 Self::DeepSeek(m) => m.supports_prompt_caching(),
7588 Self::Fireworks(m) => m.supports_prompt_caching(),
7589 Self::Gemini(m) => m.supports_prompt_caching(),
7590 Self::Moonshot(m) => m.supports_prompt_caching(),
7591 Self::Openai(m) => m.supports_prompt_caching(),
7592 Self::OpenRouter(m) => m.supports_prompt_caching(),
7593 Self::ZAi(m) => m.supports_prompt_caching(),
7594 Self::Bedrock(m) => m.supports_prompt_caching(),
7595 Self::Ollama(_) | Self::LlamaCpp(_) => false,
7596 }
7597 }
7598 pub fn supports_image(&self) -> bool {
7600 match self {
7601 Self::Anthropic(m) => m.supports_image(),
7602 Self::AzureFoundry(m) => m.supports_image(),
7603 Self::Codex(m) => m.supports_image(),
7604 Self::DeepSeek(m) => m.supports_image(),
7605 Self::Fireworks(m) => m.supports_image(),
7606 Self::Gemini(m) => m.supports_image(),
7607 Self::Moonshot(m) => m.supports_image(),
7608 Self::Openai(m) => m.supports_image(),
7609 Self::OpenRouter(m) => m.supports_image(),
7610 Self::ZAi(m) => m.supports_image(),
7611 Self::Bedrock(m) => m.supports_image(),
7612 Self::Ollama(_) | Self::LlamaCpp(_) => false,
7613 }
7614 }
7615 pub fn supports_audio(&self) -> bool {
7617 match self {
7618 Self::Anthropic(m) => m.supports_audio(),
7619 Self::AzureFoundry(m) => m.supports_audio(),
7620 Self::Codex(m) => m.supports_audio(),
7621 Self::DeepSeek(m) => m.supports_audio(),
7622 Self::Fireworks(m) => m.supports_audio(),
7623 Self::Gemini(m) => m.supports_audio(),
7624 Self::Moonshot(m) => m.supports_audio(),
7625 Self::Openai(m) => m.supports_audio(),
7626 Self::OpenRouter(m) => m.supports_audio(),
7627 Self::ZAi(m) => m.supports_audio(),
7628 Self::Bedrock(m) => m.supports_audio(),
7629 Self::Ollama(_) | Self::LlamaCpp(_) => false,
7630 }
7631 }
7632 pub fn transport(&self) -> Option<ModelTransport> {
7635 match self {
7636 Self::Anthropic(m) => m.transport(),
7637 Self::AzureFoundry(m) => m.transport(),
7638 Self::Codex(m) => m.transport(),
7639 Self::DeepSeek(m) => m.transport(),
7640 Self::Fireworks(m) => m.transport(),
7641 Self::Gemini(m) => m.transport(),
7642 Self::Moonshot(m) => m.transport(),
7643 Self::Openai(m) => m.transport(),
7644 Self::OpenRouter(m) => m.transport(),
7645 Self::ZAi(m) => m.transport(),
7646 Self::Bedrock(m) => m.transport(),
7647 Self::Ollama(_) | Self::LlamaCpp(_) => None,
7648 }
7649 }
7650 pub fn all() -> &'static [LlmModel] {
7652 static ALL: LazyLock<Vec<LlmModel>> = LazyLock::new(|| {
7653 let mut v = Vec::new();
7654 v.extend(AnthropicModel::ALL.iter().copied().map(LlmModel::Anthropic));
7655 v.extend(AzureFoundryModel::ALL.iter().copied().map(LlmModel::AzureFoundry));
7656 v.extend(CodexModel::ALL.iter().copied().map(LlmModel::Codex));
7657 v.extend(DeepSeekModel::ALL.iter().copied().map(LlmModel::DeepSeek));
7658 v.extend(FireworksModel::ALL.iter().copied().map(LlmModel::Fireworks));
7659 v.extend(GeminiModel::ALL.iter().copied().map(LlmModel::Gemini));
7660 v.extend(MoonshotModel::ALL.iter().copied().map(LlmModel::Moonshot));
7661 v.extend(OpenaiModel::ALL.iter().copied().map(LlmModel::Openai));
7662 v.extend(OpenRouterModel::ALL.iter().copied().map(LlmModel::OpenRouter));
7663 v.extend(ZAiModel::ALL.iter().copied().map(LlmModel::ZAi));
7664 v.extend(
7665 BedrockFoundationModel::ALL
7666 .iter()
7667 .copied()
7668 .map(BedrockModel::Foundation)
7669 .map(LlmModel::Bedrock),
7670 );
7671 v
7672 });
7673 &ALL
7674 }
7675}
7676impl std::fmt::Display for LlmModel {
7677 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7678 write!(f, "{}:{}", self.provider(), self.model_id())
7679 }
7680}
7681impl std::str::FromStr for LlmModel {
7682 type Err = String;
7683 fn from_str(s: &str) -> Result<Self, Self::Err> {
7685 let (provider_str, model_str) = s.split_once(':').unwrap_or((s, ""));
7686 match provider_str {
7687 "anthropic" => model_str.parse::<AnthropicModel>().map(Self::Anthropic),
7688 "azure-foundry" => {
7689 model_str.parse::<AzureFoundryModel>().map(Self::AzureFoundry)
7690 }
7691 "codex" => model_str.parse::<CodexModel>().map(Self::Codex),
7692 "deepseek" => model_str.parse::<DeepSeekModel>().map(Self::DeepSeek),
7693 "fireworks" => model_str.parse::<FireworksModel>().map(Self::Fireworks),
7694 "gemini" => model_str.parse::<GeminiModel>().map(Self::Gemini),
7695 "moonshot" => model_str.parse::<MoonshotModel>().map(Self::Moonshot),
7696 "openai" => model_str.parse::<OpenaiModel>().map(Self::Openai),
7697 "openrouter" => model_str.parse::<OpenRouterModel>().map(Self::OpenRouter),
7698 "zai" => model_str.parse::<ZAiModel>().map(Self::ZAi),
7699 "bedrock" => model_str.parse::<BedrockModel>().map(Self::Bedrock),
7700 "ollama" => Ok(Self::Ollama(model_str.to_string())),
7701 "llamacpp" => Ok(Self::LlamaCpp(model_str.to_string())),
7702 _ => Err(format!("Unknown provider: '{provider_str}'")),
7703 }
7704 }
7705}