Skip to main content

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

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