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