Skip to main content

llm/opt/rustwide/target/x86_64-unknown-linux-gnu/debug/build/aether-llm-13117fe0a0566be5/out/
generated.rs

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