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