Skip to main content

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