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