Skip to main content

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

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