Skip to main content

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