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