Skip to main content

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