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