Skip to main content

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