Skip to main content

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