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