Skip to main content

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

1// Auto-generated from models.dev — do not edit manually
2// Regenerated automatically by build.rs
3
4use std::borrow::Cow;
5use std::sync::LazyLock;
6use crate::ReasoningEffort;
7/// Typed provider identifier — covers both catalog providers
8/// (`Anthropic`, `Codex`, …) and dynamic providers whose model name is
9/// user-supplied (`Ollama`, `LlamaCpp`).
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11pub enum Provider {
12    Anthropic,
13    AzureFoundry,
14    Codex,
15    DeepSeek,
16    Fireworks,
17    Gemini,
18    Moonshot,
19    Openai,
20    OpenRouter,
21    ZAi,
22    Bedrock,
23    Ollama,
24    LlamaCpp,
25}
26impl Provider {
27    /// All providers — catalog and dynamic — in declaration order.
28    pub const ALL: &[Provider] = &[
29        Self::Anthropic,
30        Self::AzureFoundry,
31        Self::Codex,
32        Self::DeepSeek,
33        Self::Fireworks,
34        Self::Gemini,
35        Self::Moonshot,
36        Self::Openai,
37        Self::OpenRouter,
38        Self::ZAi,
39        Self::Bedrock,
40        Self::Ollama,
41        Self::LlamaCpp,
42    ];
43    /// Parser name used in `provider:model` strings (e.g. `"anthropic"`).
44    pub fn parser_name(self) -> &'static str {
45        match self {
46            Self::Anthropic => "anthropic",
47            Self::AzureFoundry => "azure-foundry",
48            Self::Codex => "codex",
49            Self::DeepSeek => "deepseek",
50            Self::Fireworks => "fireworks",
51            Self::Gemini => "gemini",
52            Self::Moonshot => "moonshot",
53            Self::Openai => "openai",
54            Self::OpenRouter => "openrouter",
55            Self::ZAi => "zai",
56            Self::Bedrock => "bedrock",
57            Self::Ollama => "ollama",
58            Self::LlamaCpp => "llamacpp",
59        }
60    }
61    /// OpenTelemetry `GenAI` semantic-convention provider name.
62    #[allow(clippy::match_same_arms)]
63    pub fn genai_provider_name(self) -> &'static str {
64        match self {
65            Self::Anthropic => "anthropic",
66            Self::AzureFoundry => "azure.ai.openai",
67            Self::Codex => "openai",
68            Self::DeepSeek => "deepseek",
69            Self::Fireworks => "fireworks",
70            Self::Gemini => "gcp.gemini",
71            Self::Moonshot => "moonshot_ai",
72            Self::Openai => "openai",
73            Self::OpenRouter => "openrouter",
74            Self::ZAi => "zai",
75            Self::Bedrock => "aws.bedrock",
76            Self::Ollama => "ollama",
77            Self::LlamaCpp => "llama.cpp",
78        }
79    }
80    /// Human-readable provider name (e.g. `"AWS Bedrock"`).
81    pub fn display_name(self) -> &'static str {
82        match self {
83            Self::Anthropic => "Anthropic",
84            Self::AzureFoundry => "Microsoft Foundry",
85            Self::Codex => "Codex",
86            Self::DeepSeek => "DeepSeek",
87            Self::Fireworks => "Fireworks AI",
88            Self::Gemini => "Gemini",
89            Self::Moonshot => "Moonshot",
90            Self::Openai => "OpenAI",
91            Self::OpenRouter => "OpenRouter",
92            Self::ZAi => "ZAI",
93            Self::Bedrock => "AWS Bedrock",
94            Self::Ollama => "Ollama",
95            Self::LlamaCpp => "LlamaCpp",
96        }
97    }
98    /// API-key env var the provider requires, if any.
99    pub fn required_env_var(self) -> Option<&'static str> {
100        match self {
101            Self::Anthropic => Some("ANTHROPIC_API_KEY"),
102            Self::AzureFoundry => Some("AZURE_OPENAI_API_KEY"),
103            Self::DeepSeek => Some("DEEPSEEK_API_KEY"),
104            Self::Fireworks => Some("FIREWORKS_API_KEY"),
105            Self::Gemini => Some("GEMINI_API_KEY"),
106            Self::Moonshot => Some("MOONSHOT_API_KEY"),
107            Self::Openai => Some("OPENAI_API_KEY"),
108            Self::OpenRouter => Some("OPENROUTER_API_KEY"),
109            Self::ZAi => Some("ZAI_API_KEY"),
110            Self::Codex | Self::Bedrock | Self::Ollama | Self::LlamaCpp => None,
111        }
112    }
113    /// OAuth provider ID if this provider authenticates via OAuth.
114    pub fn oauth_provider_id(self) -> Option<&'static str> {
115        match self {
116            Self::Codex => Some("codex"),
117            Self::Anthropic
118            | Self::AzureFoundry
119            | Self::DeepSeek
120            | Self::Fireworks
121            | Self::Gemini
122            | Self::Moonshot
123            | Self::Openai
124            | Self::OpenRouter
125            | Self::ZAi
126            | Self::Bedrock
127            | Self::Ollama
128            | Self::LlamaCpp => None,
129        }
130    }
131    /// Local providers run models on the user's machine — there's no
132    /// remote API to call and no env var to satisfy.
133    pub fn is_local(self) -> bool {
134        match self {
135            Self::Ollama | Self::LlamaCpp => true,
136            Self::Anthropic
137            | Self::AzureFoundry
138            | Self::Codex
139            | Self::DeepSeek
140            | Self::Fireworks
141            | Self::Gemini
142            | Self::Moonshot
143            | Self::Openai
144            | Self::OpenRouter
145            | Self::ZAi
146            | Self::Bedrock => false,
147        }
148    }
149}
150impl std::fmt::Display for Provider {
151    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
152        f.write_str(self.parser_name())
153    }
154}
155impl std::str::FromStr for Provider {
156    type Err = String;
157    fn from_str(s: &str) -> Result<Self, Self::Err> {
158        match s {
159            "anthropic" => Ok(Self::Anthropic),
160            "azure-foundry" => Ok(Self::AzureFoundry),
161            "codex" => Ok(Self::Codex),
162            "deepseek" => Ok(Self::DeepSeek),
163            "fireworks" => Ok(Self::Fireworks),
164            "gemini" => Ok(Self::Gemini),
165            "moonshot" => Ok(Self::Moonshot),
166            "openai" => Ok(Self::Openai),
167            "openrouter" => Ok(Self::OpenRouter),
168            "zai" => Ok(Self::ZAi),
169            "bedrock" => Ok(Self::Bedrock),
170            "ollama" => Ok(Self::Ollama),
171            "llamacpp" => Ok(Self::LlamaCpp),
172            other => Err(format!("Unknown provider: '{other}'")),
173        }
174    }
175}
176#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
177pub enum AnthropicModel {
178    ClaudeFable5,
179    ClaudeHaiku45,
180    ClaudeHaiku4520251001,
181    ClaudeOpus41,
182    ClaudeOpus4120250805,
183    ClaudeOpus45,
184    ClaudeOpus4520251101,
185    ClaudeOpus46,
186    ClaudeOpus47,
187    ClaudeOpus48,
188    ClaudeOpus5,
189    ClaudeSonnet45,
190    ClaudeSonnet4520250929,
191    ClaudeSonnet46,
192    ClaudeSonnet5,
193}
194#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
195pub enum AzureFoundryModel {
196    ClaudeFable5,
197    ClaudeHaiku45,
198    ClaudeOpus41,
199    ClaudeOpus45,
200    ClaudeOpus46,
201    ClaudeOpus48,
202    ClaudeOpus5,
203    ClaudeSonnet45,
204    ClaudeSonnet46,
205    ClaudeSonnet5,
206    Codestral2501,
207    CodexMini,
208    CohereCommandA,
209    DeepseekV32,
210    Gpt4Turbo,
211    Gpt4TurboVision,
212    Gpt41,
213    Gpt41Mini,
214    Gpt41Nano,
215    Gpt4o,
216    Gpt4oMini,
217    Gpt5,
218    Gpt5Codex,
219    Gpt5Mini,
220    Gpt5Nano,
221    Gpt5Pro,
222    Gpt51,
223    Gpt51Codex,
224    Gpt51CodexMax,
225    Gpt51CodexMini,
226    Gpt52,
227    Gpt52Codex,
228    Gpt53Codex,
229    Gpt54,
230    Gpt54Mini,
231    Gpt54Nano,
232    Gpt54Pro,
233    Gpt55,
234    Gpt56Luna,
235    Gpt56Sol,
236    Gpt56Terra,
237    Grok41FastNonReasoning,
238    Grok41FastReasoning,
239    Grok420NonReasoning,
240    Grok420Reasoning,
241    KimiK25,
242    KimiK26,
243    Llama3370bInstruct,
244    Llama4Maverick17b128eInstructFp8,
245    Llama4Scout17b16eInstruct,
246    Ministral3b,
247    MistralMedium2505,
248    MistralSmall2503,
249    ModelRouter,
250    O1,
251    O3,
252    O3Mini,
253    O4Mini,
254    Phi4Mini,
255    Phi4MiniReasoning,
256}
257#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
258pub enum CodexModel {
259    Gpt52,
260    Gpt54,
261    Gpt54Mini,
262    Gpt55,
263    Gpt56Luna,
264    Gpt56Sol,
265    Gpt56Terra,
266}
267#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
268pub enum DeepSeekModel {
269    DeepseekChat,
270    DeepseekReasoner,
271    DeepseekV4Flash,
272    DeepseekV4Pro,
273}
274#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
275pub enum FireworksModel {
276    AccountsFireworksModelsDeepseekV4Flash,
277    AccountsFireworksModelsDeepseekV4Pro,
278    AccountsFireworksModelsGlm5p2,
279    AccountsFireworksModelsGptOss120b,
280    AccountsFireworksModelsGptOss20b,
281    AccountsFireworksModelsKimiK2p6,
282    AccountsFireworksModelsKimiK2p7Code,
283    AccountsFireworksModelsMinimaxM2p7,
284    AccountsFireworksModelsMinimaxM3,
285    AccountsFireworksModelsQwen3p7Plus,
286    AccountsFireworksRoutersGlm5p2Fast,
287    AccountsFireworksRoutersKimiK2p6Fast,
288    AccountsFireworksRoutersKimiK2p6Turbo,
289    AccountsFireworksRoutersKimiK2p7CodeFast,
290}
291#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
292pub enum GeminiModel {
293    DeepResearchMaxPreview042026,
294    DeepResearchPreview042026,
295    Gemini20Flash,
296    Gemini20FlashLite,
297    Gemini25ComputerUsePreview102025,
298    Gemini25Flash,
299    Gemini25FlashLite,
300    Gemini25Pro,
301    Gemini3FlashPreview,
302    Gemini3ProPreview,
303    Gemini31FlashLite,
304    Gemini31FlashLiteImage,
305    Gemini31FlashLitePreview,
306    Gemini31FlashLivePreview,
307    Gemini31ProPreview,
308    Gemini31ProPreviewCustomtools,
309    Gemini35Flash,
310    Gemini35FlashLite,
311    Gemini36Flash,
312    GeminiRoboticsEr16Preview,
313    Gemma426bA4bIt,
314    Gemma431bIt,
315}
316#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
317pub enum MoonshotModel {
318    KimiK20711Preview,
319    KimiK20905Preview,
320    KimiK2Thinking,
321    KimiK2ThinkingTurbo,
322    KimiK2TurboPreview,
323    KimiK25,
324    KimiK26,
325    KimiK27Code,
326    KimiK27CodeHighspeed,
327    KimiK3,
328}
329#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
330pub enum OpenaiModel {
331    Gpt4,
332    Gpt4Turbo,
333    Gpt41,
334    Gpt41Mini,
335    Gpt41Nano,
336    Gpt4o,
337    Gpt4o20240513,
338    Gpt4o20240806,
339    Gpt4o20241120,
340    Gpt4oMini,
341    Gpt5,
342    Gpt5Mini,
343    Gpt5Nano,
344    Gpt5Pro,
345    Gpt51,
346    Gpt52,
347    Gpt52Pro,
348    Gpt53Codex,
349    Gpt53CodexSpark,
350    Gpt54,
351    Gpt54Mini,
352    Gpt54Nano,
353    Gpt54Pro,
354    Gpt55,
355    Gpt55Pro,
356    Gpt56,
357    Gpt56Luna,
358    Gpt56Sol,
359    Gpt56Terra,
360    GptRealtime21,
361    O1,
362    O1Pro,
363    O3,
364    O3Mini,
365    O3Pro,
366    O4Mini,
367}
368#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
369pub enum OpenRouterModel {
370    Ai21JambaLarge17,
371    AionLabsAion20,
372    AionLabsAion30,
373    AionLabsAion30Mini,
374    AmazonNova2LiteV1,
375    AmazonNovaLiteV1,
376    AmazonNovaMicroV1,
377    AmazonNovaPremierV1,
378    AmazonNovaProV1,
379    AnthropicClaude3Haiku,
380    AnthropicClaudeFable5,
381    AnthropicClaudeHaiku45,
382    AnthropicClaudeOpus4,
383    AnthropicClaudeOpus41,
384    AnthropicClaudeOpus45,
385    AnthropicClaudeOpus46,
386    AnthropicClaudeOpus47,
387    AnthropicClaudeOpus47Fast,
388    AnthropicClaudeOpus48,
389    AnthropicClaudeOpus48Fast,
390    AnthropicClaudeOpus5,
391    AnthropicClaudeOpus5Fast,
392    AnthropicClaudeSonnet4,
393    AnthropicClaudeSonnet45,
394    AnthropicClaudeSonnet46,
395    AnthropicClaudeSonnet5,
396    ArceeAiTrinityLargeThinking,
397    ArceeAiVirtuosoLarge,
398    BytedanceSeedSeed16,
399    BytedanceSeedSeed16Flash,
400    BytedanceSeedSeed20Lite,
401    BytedanceSeedSeed20Mini,
402    CohereCommandR082024,
403    CohereCommandRPlus082024,
404    CohereNorthMiniCodeFree,
405    DeepseekDeepseekChat,
406    DeepseekDeepseekChatV30324,
407    DeepseekDeepseekChatV31,
408    DeepseekDeepseekR1,
409    DeepseekDeepseekR10528,
410    DeepseekDeepseekV31Terminus,
411    DeepseekDeepseekV32,
412    DeepseekDeepseekV32Exp,
413    DeepseekDeepseekV4Flash,
414    DeepseekDeepseekV4Pro,
415    GoogleGemini25Flash,
416    GoogleGemini25FlashLite,
417    GoogleGemini25Pro,
418    GoogleGemini25ProPreview,
419    GoogleGemini25ProPreview0506,
420    GoogleGemini3FlashPreview,
421    GoogleGemini3ProImage,
422    GoogleGemini31FlashLite,
423    GoogleGemini31FlashLitePreview,
424    GoogleGemini31ProPreview,
425    GoogleGemini31ProPreviewCustomtools,
426    GoogleGemini35Flash,
427    GoogleGemini35FlashLite,
428    GoogleGemini36Flash,
429    GoogleGemma312bIt,
430    GoogleGemma327bIt,
431    GoogleGemma426bA4bIt,
432    GoogleGemma426bA4bItFree,
433    GoogleGemma431bIt,
434    GoogleGemma431bItFree,
435    IbmGraniteGranite418b,
436    InceptionMercury2,
437    InclusionaiLing261t,
438    InclusionaiLing26Flash,
439    InclusionaiLing30FlashFree,
440    InclusionaiRing261t,
441    KwaipilotKatCoderAirV25,
442    KwaipilotKatCoderProV2,
443    KwaipilotKatCoderProV25,
444    MeituanLongcat20,
445    MetaLlamaLlama3170bInstruct,
446    MetaLlamaLlama318bInstruct,
447    MetaLlamaLlama3370bInstruct,
448    MetaLlamaLlama4Maverick,
449    MetaLlamaLlama4Scout,
450    MetaMuseSpark11,
451    MinimaxMinimaxM1,
452    MinimaxMinimaxM2,
453    MinimaxMinimaxM21,
454    MinimaxMinimaxM25,
455    MinimaxMinimaxM27,
456    MinimaxMinimaxM3,
457    MistralaiCodestral2508,
458    MistralaiDevstral2512,
459    MistralaiMinistral14b2512,
460    MistralaiMinistral3b2512,
461    MistralaiMinistral8b2512,
462    MistralaiMistralLarge,
463    MistralaiMistralLarge2407,
464    MistralaiMistralLarge2512,
465    MistralaiMistralMedium3,
466    MistralaiMistralMedium35,
467    MistralaiMistralMedium31,
468    MistralaiMistralNemo,
469    MistralaiMistralSaba,
470    MistralaiMistralSmall2603,
471    MistralaiMistralSmall3224bInstruct,
472    MistralaiMixtral8x22bInstruct,
473    MistralaiVoxtralSmall24b2507,
474    MoonshotaiKimiK2,
475    MoonshotaiKimiK20905,
476    MoonshotaiKimiK2Thinking,
477    MoonshotaiKimiK25,
478    MoonshotaiKimiK26,
479    MoonshotaiKimiK27Code,
480    MoonshotaiKimiK3,
481    NexAgiNexN2Mini,
482    NexAgiNexN2Pro,
483    NvidiaNemotron3Nano30bA3b,
484    NvidiaNemotron3Nano30bA3bFree,
485    NvidiaNemotron3NanoOmni30bA3bReasoningFree,
486    NvidiaNemotron3Super120bA12b,
487    NvidiaNemotron3Super120bA12bFree,
488    NvidiaNemotron3Ultra550bA55b,
489    NvidiaNemotron3Ultra550bA55bFree,
490    NvidiaNemotronNano12bV2VlFree,
491    NvidiaNemotronNano9bV2Free,
492    OpenaiGpt35Turbo,
493    OpenaiGpt35Turbo0613,
494    OpenaiGpt35Turbo16k,
495    OpenaiGpt4,
496    OpenaiGpt4Turbo,
497    OpenaiGpt4TurboPreview,
498    OpenaiGpt41,
499    OpenaiGpt41Mini,
500    OpenaiGpt41Nano,
501    OpenaiGpt4o,
502    OpenaiGpt4o20240513,
503    OpenaiGpt4o20240806,
504    OpenaiGpt4o20241120,
505    OpenaiGpt4oMini,
506    OpenaiGpt4oMini20240718,
507    OpenaiGpt5,
508    OpenaiGpt5Codex,
509    OpenaiGpt5Mini,
510    OpenaiGpt5Nano,
511    OpenaiGpt5Pro,
512    OpenaiGpt51,
513    OpenaiGpt51Chat,
514    OpenaiGpt51Codex,
515    OpenaiGpt51CodexMax,
516    OpenaiGpt51CodexMini,
517    OpenaiGpt52,
518    OpenaiGpt52Chat,
519    OpenaiGpt52Codex,
520    OpenaiGpt52Pro,
521    OpenaiGpt53Chat,
522    OpenaiGpt53Codex,
523    OpenaiGpt54,
524    OpenaiGpt54Mini,
525    OpenaiGpt54Nano,
526    OpenaiGpt54Pro,
527    OpenaiGpt55,
528    OpenaiGpt55Pro,
529    OpenaiGpt56Luna,
530    OpenaiGpt56LunaPro,
531    OpenaiGpt56Sol,
532    OpenaiGpt56SolPro,
533    OpenaiGpt56Terra,
534    OpenaiGpt56TerraPro,
535    OpenaiGptAudio,
536    OpenaiGptAudioMini,
537    OpenaiGptOss120b,
538    OpenaiGptOss20b,
539    OpenaiGptOss20bFree,
540    OpenaiGptOssSafeguard20b,
541    OpenaiO1,
542    OpenaiO3,
543    OpenaiO3DeepResearch,
544    OpenaiO3Mini,
545    OpenaiO3MiniHigh,
546    OpenaiO3Pro,
547    OpenaiO4Mini,
548    OpenaiO4MiniDeepResearch,
549    OpenaiO4MiniHigh,
550    OpenrouterAuto,
551    OpenrouterFree,
552    PoolsideLagunaM1,
553    PoolsideLagunaM1Free,
554    PoolsideLagunaS21,
555    PoolsideLagunaS21Free,
556    PoolsideLagunaXs21,
557    PoolsideLagunaXs21Free,
558    QwenQwen2572bInstruct,
559    QwenQwen257bInstruct,
560    QwenQwenPlus,
561    QwenQwenPlus20250728,
562    QwenQwenPlus20250728Thinking,
563    QwenQwen314b,
564    QwenQwen3235bA22b,
565    QwenQwen3235bA22b2507,
566    QwenQwen3235bA22bThinking2507,
567    QwenQwen330bA3b,
568    QwenQwen330bA3bInstruct2507,
569    QwenQwen330bA3bThinking2507,
570    QwenQwen332b,
571    QwenQwen38b,
572    QwenQwen3Coder,
573    QwenQwen3Coder30bA3bInstruct,
574    QwenQwen3CoderFlash,
575    QwenQwen3CoderNext,
576    QwenQwen3CoderPlus,
577    QwenQwen3Max,
578    QwenQwen3MaxThinking,
579    QwenQwen3Next80bA3bInstruct,
580    QwenQwen3Next80bA3bThinking,
581    QwenQwen3Vl235bA22bInstruct,
582    QwenQwen3Vl235bA22bThinking,
583    QwenQwen3Vl30bA3bInstruct,
584    QwenQwen3Vl30bA3bThinking,
585    QwenQwen3Vl32bInstruct,
586    QwenQwen3Vl8bInstruct,
587    QwenQwen3Vl8bThinking,
588    QwenQwen35122bA10b,
589    QwenQwen3527b,
590    QwenQwen3535bA3b,
591    QwenQwen35397bA17b,
592    QwenQwen359b,
593    QwenQwen35Flash0223,
594    QwenQwen35Plus0215,
595    QwenQwen35Plus20260420,
596    QwenQwen3627b,
597    QwenQwen3635bA3b,
598    QwenQwen36Flash,
599    QwenQwen36MaxPreview,
600    QwenQwen36Plus,
601    QwenQwen37Max,
602    QwenQwen37Plus,
603    RekaaiRekaEdge,
604    RelaceRelaceSearch,
605    SakanaFuguUltra,
606    Sao10kL31Euryale70b,
607    StepfunStep35Flash,
608    StepfunStep37Flash,
609    TencentHy3,
610    TencentHy3Preview,
611    ThedrummerUnslopnemo12b,
612    ThinkingmachinesInkling,
613    UpstageSolarPro3,
614    XAiGrok420,
615    XAiGrok43,
616    XAiGrok45,
617    XAiGrokBuild01,
618    XiaomiMimoV25,
619    XiaomiMimoV25Pro,
620    ZAiGlm45,
621    ZAiGlm45Air,
622    ZAiGlm45v,
623    ZAiGlm46,
624    ZAiGlm46v,
625    ZAiGlm47,
626    ZAiGlm47Flash,
627    ZAiGlm5,
628    ZAiGlm5Turbo,
629    ZAiGlm51,
630    ZAiGlm52,
631    ZAiGlm5vTurbo,
632}
633#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
634pub enum ZAiModel {
635    Glm45,
636    Glm45Air,
637    Glm45Flash,
638    Glm45v,
639    Glm46,
640    Glm46v,
641    Glm47,
642    Glm47Flash,
643    Glm47Flashx,
644    Glm5,
645    Glm5Turbo,
646    Glm51,
647    Glm52,
648    Glm5vTurbo,
649}
650#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
651pub enum BedrockFoundationModel {
652    AmazonNova2LiteV10,
653    AmazonNovaLiteV10,
654    AmazonNovaMicroV10,
655    AmazonNovaProV10,
656    AnthropicClaudeFable5,
657    AnthropicClaudeHaiku4520251001V10,
658    AnthropicClaudeOpus4120250805V10,
659    AnthropicClaudeOpus4520251101V10,
660    AnthropicClaudeOpus46V1,
661    AnthropicClaudeOpus47,
662    AnthropicClaudeOpus48,
663    AnthropicClaudeOpus5,
664    AnthropicClaudeSonnet4520250929V10,
665    AnthropicClaudeSonnet46,
666    AnthropicClaudeSonnet5,
667    AuAnthropicClaudeHaiku4520251001V10,
668    AuAnthropicClaudeOpus46V1,
669    AuAnthropicClaudeOpus48,
670    AuAnthropicClaudeOpus5,
671    AuAnthropicClaudeSonnet4520250929V10,
672    AuAnthropicClaudeSonnet46,
673    AuAnthropicClaudeSonnet5,
674    DeepseekR1V10,
675    DeepseekV3V10,
676    DeepseekV32,
677    EuAnthropicClaudeFable5,
678    EuAnthropicClaudeHaiku4520251001V10,
679    EuAnthropicClaudeOpus4520251101V10,
680    EuAnthropicClaudeOpus46V1,
681    EuAnthropicClaudeOpus47,
682    EuAnthropicClaudeOpus48,
683    EuAnthropicClaudeOpus5,
684    EuAnthropicClaudeSonnet4520250929V10,
685    EuAnthropicClaudeSonnet46,
686    EuAnthropicClaudeSonnet5,
687    GlobalAnthropicClaudeFable5,
688    GlobalAnthropicClaudeHaiku4520251001V10,
689    GlobalAnthropicClaudeOpus4520251101V10,
690    GlobalAnthropicClaudeOpus46V1,
691    GlobalAnthropicClaudeOpus47,
692    GlobalAnthropicClaudeOpus48,
693    GlobalAnthropicClaudeOpus5,
694    GlobalAnthropicClaudeSonnet4520250929V10,
695    GlobalAnthropicClaudeSonnet46,
696    GlobalAnthropicClaudeSonnet5,
697    GoogleGemma327bIt,
698    GoogleGemma34bIt,
699    JpAnthropicClaudeHaiku4520251001V10,
700    JpAnthropicClaudeOpus47,
701    JpAnthropicClaudeOpus48,
702    JpAnthropicClaudeOpus5,
703    JpAnthropicClaudeSonnet4520250929V10,
704    JpAnthropicClaudeSonnet46,
705    JpAnthropicClaudeSonnet5,
706    MetaLlama3170bInstructV10,
707    MetaLlama318bInstructV10,
708    MetaLlama3370bInstructV10,
709    MetaLlama4Maverick17bInstructV10,
710    MetaLlama4Scout17bInstructV10,
711    MinimaxMinimaxM2,
712    MinimaxMinimaxM21,
713    MinimaxMinimaxM25,
714    MistralDevstral2123b,
715    MistralMagistralSmall2509,
716    MistralMinistral314bInstruct,
717    MistralMinistral33bInstruct,
718    MistralMinistral38bInstruct,
719    MistralMistralLarge3675bInstruct,
720    MistralPixtralLarge2502V10,
721    MistralVoxtralMini3b2507,
722    MistralVoxtralSmall24b2507,
723    MoonshotKimiK2Thinking,
724    MoonshotaiKimiK25,
725    NvidiaNemotronNano12bV2,
726    NvidiaNemotronNano330b,
727    NvidiaNemotronNano9bV2,
728    NvidiaNemotronSuper3120b,
729    OpenaiGpt54,
730    OpenaiGpt55,
731    OpenaiGpt56Luna,
732    OpenaiGpt56Sol,
733    OpenaiGpt56Terra,
734    OpenaiGptOss120b,
735    OpenaiGptOss120b10,
736    OpenaiGptOss20b,
737    OpenaiGptOss20b10,
738    OpenaiGptOssSafeguard120b,
739    OpenaiGptOssSafeguard20b,
740    QwenQwen3235bA22b2507V10,
741    QwenQwen332bV10,
742    QwenQwen3Coder30bA3bV10,
743    QwenQwen3Coder480bA35bV10,
744    QwenQwen3CoderNext,
745    QwenQwen3Next80bA3b,
746    QwenQwen3Vl235bA22b,
747    UsAnthropicClaudeFable5,
748    UsAnthropicClaudeHaiku4520251001V10,
749    UsAnthropicClaudeOpus4120250805V10,
750    UsAnthropicClaudeOpus4520251101V10,
751    UsAnthropicClaudeOpus46V1,
752    UsAnthropicClaudeOpus47,
753    UsAnthropicClaudeOpus48,
754    UsAnthropicClaudeOpus5,
755    UsAnthropicClaudeSonnet4520250929V10,
756    UsAnthropicClaudeSonnet46,
757    UsAnthropicClaudeSonnet5,
758    UsDeepseekR1V10,
759    UsMetaLlama4Maverick17bInstructV10,
760    UsMetaLlama4Scout17bInstructV10,
761    WriterPalmyraX4V10,
762    WriterPalmyraX5V10,
763    XaiGrok43,
764    ZaiGlm47,
765    ZaiGlm47Flash,
766    ZaiGlm5,
767}
768impl AnthropicModel {
769    #[allow(clippy::too_many_lines)]
770    fn model_id(self) -> &'static str {
771        match self {
772            Self::ClaudeFable5 => "claude-fable-5",
773            Self::ClaudeHaiku45 => "claude-haiku-4-5",
774            Self::ClaudeHaiku4520251001 => "claude-haiku-4-5-20251001",
775            Self::ClaudeOpus41 => "claude-opus-4-1",
776            Self::ClaudeOpus4120250805 => "claude-opus-4-1-20250805",
777            Self::ClaudeOpus45 => "claude-opus-4-5",
778            Self::ClaudeOpus4520251101 => "claude-opus-4-5-20251101",
779            Self::ClaudeOpus46 => "claude-opus-4-6",
780            Self::ClaudeOpus47 => "claude-opus-4-7",
781            Self::ClaudeOpus48 => "claude-opus-4-8",
782            Self::ClaudeOpus5 => "claude-opus-5",
783            Self::ClaudeSonnet45 => "claude-sonnet-4-5",
784            Self::ClaudeSonnet4520250929 => "claude-sonnet-4-5-20250929",
785            Self::ClaudeSonnet46 => "claude-sonnet-4-6",
786            Self::ClaudeSonnet5 => "claude-sonnet-5",
787        }
788    }
789    #[allow(clippy::too_many_lines)]
790    fn display_name(self) -> &'static str {
791        match self {
792            Self::ClaudeFable5 => "Claude Fable 5",
793            Self::ClaudeHaiku4520251001 => "Claude Haiku 4.5",
794            Self::ClaudeHaiku45 => "Claude Haiku 4.5 (latest)",
795            Self::ClaudeOpus4120250805 => "Claude Opus 4.1",
796            Self::ClaudeOpus41 => "Claude Opus 4.1 (latest)",
797            Self::ClaudeOpus4520251101 => "Claude Opus 4.5",
798            Self::ClaudeOpus45 => "Claude Opus 4.5 (latest)",
799            Self::ClaudeOpus46 => "Claude Opus 4.6",
800            Self::ClaudeOpus47 => "Claude Opus 4.7",
801            Self::ClaudeOpus48 => "Claude Opus 4.8",
802            Self::ClaudeOpus5 => "Claude Opus 5",
803            Self::ClaudeSonnet4520250929 => "Claude Sonnet 4.5",
804            Self::ClaudeSonnet45 => "Claude Sonnet 4.5 (latest)",
805            Self::ClaudeSonnet46 => "Claude Sonnet 4.6",
806            Self::ClaudeSonnet5 => "Claude Sonnet 5",
807        }
808    }
809    #[allow(clippy::too_many_lines)]
810    fn context_window(self) -> u32 {
811        match self {
812            Self::ClaudeHaiku45
813            | Self::ClaudeHaiku4520251001
814            | Self::ClaudeOpus41
815            | Self::ClaudeOpus4120250805
816            | Self::ClaudeOpus45
817            | Self::ClaudeOpus4520251101 => 200_000,
818            Self::ClaudeFable5
819            | Self::ClaudeOpus46
820            | Self::ClaudeOpus47
821            | Self::ClaudeOpus48
822            | Self::ClaudeOpus5
823            | Self::ClaudeSonnet45
824            | Self::ClaudeSonnet4520250929
825            | Self::ClaudeSonnet46
826            | Self::ClaudeSonnet5 => 1_000_000,
827        }
828    }
829    #[allow(clippy::too_many_lines)]
830    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
831        match self {
832            Self::ClaudeHaiku45
833            | Self::ClaudeHaiku4520251001
834            | Self::ClaudeOpus41
835            | Self::ClaudeOpus4120250805
836            | Self::ClaudeOpus45
837            | Self::ClaudeOpus4520251101
838            | Self::ClaudeSonnet45
839            | Self::ClaudeSonnet4520250929 => {
840                &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
841            }
842            Self::ClaudeOpus46 | Self::ClaudeSonnet46 => {
843                &[
844                    ReasoningEffort::Low,
845                    ReasoningEffort::Medium,
846                    ReasoningEffort::High,
847                    ReasoningEffort::Max,
848                ]
849            }
850            Self::ClaudeFable5
851            | Self::ClaudeOpus47
852            | Self::ClaudeOpus48
853            | Self::ClaudeOpus5
854            | Self::ClaudeSonnet5 => {
855                &[
856                    ReasoningEffort::Low,
857                    ReasoningEffort::Medium,
858                    ReasoningEffort::High,
859                    ReasoningEffort::Xhigh,
860                    ReasoningEffort::Max,
861                ]
862            }
863        }
864    }
865    pub fn supports_reasoning(self) -> bool {
866        !self.reasoning_levels().is_empty()
867    }
868    #[allow(clippy::too_many_lines)]
869    pub fn supports_prompt_caching(self) -> bool {
870        match self {
871            Self::ClaudeFable5
872            | Self::ClaudeHaiku45
873            | Self::ClaudeHaiku4520251001
874            | Self::ClaudeOpus41
875            | Self::ClaudeOpus4120250805
876            | Self::ClaudeOpus45
877            | Self::ClaudeOpus4520251101
878            | Self::ClaudeOpus46
879            | Self::ClaudeOpus47
880            | Self::ClaudeOpus48
881            | Self::ClaudeOpus5
882            | Self::ClaudeSonnet45
883            | Self::ClaudeSonnet4520250929
884            | Self::ClaudeSonnet46
885            | Self::ClaudeSonnet5 => true,
886        }
887    }
888    #[allow(clippy::too_many_lines)]
889    pub fn supports_image(self) -> bool {
890        match self {
891            Self::ClaudeFable5
892            | Self::ClaudeHaiku45
893            | Self::ClaudeHaiku4520251001
894            | Self::ClaudeOpus41
895            | Self::ClaudeOpus4120250805
896            | Self::ClaudeOpus45
897            | Self::ClaudeOpus4520251101
898            | Self::ClaudeOpus46
899            | Self::ClaudeOpus47
900            | Self::ClaudeOpus48
901            | Self::ClaudeOpus5
902            | Self::ClaudeSonnet45
903            | Self::ClaudeSonnet4520250929
904            | Self::ClaudeSonnet46
905            | Self::ClaudeSonnet5 => true,
906        }
907    }
908    #[allow(clippy::too_many_lines)]
909    pub fn supports_audio(self) -> bool {
910        match self {
911            Self::ClaudeFable5
912            | Self::ClaudeHaiku45
913            | Self::ClaudeHaiku4520251001
914            | Self::ClaudeOpus41
915            | Self::ClaudeOpus4120250805
916            | Self::ClaudeOpus45
917            | Self::ClaudeOpus4520251101
918            | Self::ClaudeOpus46
919            | Self::ClaudeOpus47
920            | Self::ClaudeOpus48
921            | Self::ClaudeOpus5
922            | Self::ClaudeSonnet45
923            | Self::ClaudeSonnet4520250929
924            | Self::ClaudeSonnet46
925            | Self::ClaudeSonnet5 => false,
926        }
927    }
928    #[allow(clippy::too_many_lines)]
929    pub fn transport(self) -> Option<ModelTransport> {
930        match self {
931            Self::ClaudeFable5
932            | Self::ClaudeHaiku45
933            | Self::ClaudeHaiku4520251001
934            | Self::ClaudeOpus41
935            | Self::ClaudeOpus4120250805
936            | Self::ClaudeOpus45
937            | Self::ClaudeOpus4520251101
938            | Self::ClaudeOpus46
939            | Self::ClaudeOpus47
940            | Self::ClaudeOpus48
941            | Self::ClaudeOpus5
942            | Self::ClaudeSonnet45
943            | Self::ClaudeSonnet4520250929
944            | Self::ClaudeSonnet46
945            | Self::ClaudeSonnet5 => None,
946        }
947    }
948    const ALL: &[AnthropicModel] = &[
949        Self::ClaudeFable5,
950        Self::ClaudeHaiku45,
951        Self::ClaudeHaiku4520251001,
952        Self::ClaudeOpus41,
953        Self::ClaudeOpus4120250805,
954        Self::ClaudeOpus45,
955        Self::ClaudeOpus4520251101,
956        Self::ClaudeOpus46,
957        Self::ClaudeOpus47,
958        Self::ClaudeOpus48,
959        Self::ClaudeOpus5,
960        Self::ClaudeSonnet45,
961        Self::ClaudeSonnet4520250929,
962        Self::ClaudeSonnet46,
963        Self::ClaudeSonnet5,
964    ];
965}
966impl std::str::FromStr for AnthropicModel {
967    type Err = String;
968    #[allow(clippy::too_many_lines)]
969    fn from_str(s: &str) -> Result<Self, Self::Err> {
970        match s {
971            "claude-fable-5" => Ok(Self::ClaudeFable5),
972            "claude-haiku-4-5" => Ok(Self::ClaudeHaiku45),
973            "claude-haiku-4-5-20251001" => Ok(Self::ClaudeHaiku4520251001),
974            "claude-opus-4-1" => Ok(Self::ClaudeOpus41),
975            "claude-opus-4-1-20250805" => Ok(Self::ClaudeOpus4120250805),
976            "claude-opus-4-5" => Ok(Self::ClaudeOpus45),
977            "claude-opus-4-5-20251101" => Ok(Self::ClaudeOpus4520251101),
978            "claude-opus-4-6" => Ok(Self::ClaudeOpus46),
979            "claude-opus-4-7" => Ok(Self::ClaudeOpus47),
980            "claude-opus-4-8" => Ok(Self::ClaudeOpus48),
981            "claude-opus-5" => Ok(Self::ClaudeOpus5),
982            "claude-sonnet-4-5" => Ok(Self::ClaudeSonnet45),
983            "claude-sonnet-4-5-20250929" => Ok(Self::ClaudeSonnet4520250929),
984            "claude-sonnet-4-6" => Ok(Self::ClaudeSonnet46),
985            "claude-sonnet-5" => Ok(Self::ClaudeSonnet5),
986            _ => Err(format!("Unknown anthropic model: '{s}'")),
987        }
988    }
989}
990impl AzureFoundryModel {
991    #[allow(clippy::too_many_lines)]
992    fn model_id(self) -> &'static str {
993        match self {
994            Self::ClaudeFable5 => "claude-fable-5",
995            Self::ClaudeHaiku45 => "claude-haiku-4-5",
996            Self::ClaudeOpus41 => "claude-opus-4-1",
997            Self::ClaudeOpus45 => "claude-opus-4-5",
998            Self::ClaudeOpus46 => "claude-opus-4-6",
999            Self::ClaudeOpus48 => "claude-opus-4-8",
1000            Self::ClaudeOpus5 => "claude-opus-5",
1001            Self::ClaudeSonnet45 => "claude-sonnet-4-5",
1002            Self::ClaudeSonnet46 => "claude-sonnet-4-6",
1003            Self::ClaudeSonnet5 => "claude-sonnet-5",
1004            Self::Codestral2501 => "codestral-2501",
1005            Self::CodexMini => "codex-mini",
1006            Self::CohereCommandA => "cohere-command-a",
1007            Self::DeepseekV32 => "deepseek-v3.2",
1008            Self::Gpt4Turbo => "gpt-4-turbo",
1009            Self::Gpt4TurboVision => "gpt-4-turbo-vision",
1010            Self::Gpt41 => "gpt-4.1",
1011            Self::Gpt41Mini => "gpt-4.1-mini",
1012            Self::Gpt41Nano => "gpt-4.1-nano",
1013            Self::Gpt4o => "gpt-4o",
1014            Self::Gpt4oMini => "gpt-4o-mini",
1015            Self::Gpt5 => "gpt-5",
1016            Self::Gpt5Codex => "gpt-5-codex",
1017            Self::Gpt5Mini => "gpt-5-mini",
1018            Self::Gpt5Nano => "gpt-5-nano",
1019            Self::Gpt5Pro => "gpt-5-pro",
1020            Self::Gpt51 => "gpt-5.1",
1021            Self::Gpt51Codex => "gpt-5.1-codex",
1022            Self::Gpt51CodexMax => "gpt-5.1-codex-max",
1023            Self::Gpt51CodexMini => "gpt-5.1-codex-mini",
1024            Self::Gpt52 => "gpt-5.2",
1025            Self::Gpt52Codex => "gpt-5.2-codex",
1026            Self::Gpt53Codex => "gpt-5.3-codex",
1027            Self::Gpt54 => "gpt-5.4",
1028            Self::Gpt54Mini => "gpt-5.4-mini",
1029            Self::Gpt54Nano => "gpt-5.4-nano",
1030            Self::Gpt54Pro => "gpt-5.4-pro",
1031            Self::Gpt55 => "gpt-5.5",
1032            Self::Gpt56Luna => "gpt-5.6-luna",
1033            Self::Gpt56Sol => "gpt-5.6-sol",
1034            Self::Gpt56Terra => "gpt-5.6-terra",
1035            Self::Grok41FastNonReasoning => "grok-4-1-fast-non-reasoning",
1036            Self::Grok41FastReasoning => "grok-4-1-fast-reasoning",
1037            Self::Grok420NonReasoning => "grok-4-20-non-reasoning",
1038            Self::Grok420Reasoning => "grok-4-20-reasoning",
1039            Self::KimiK25 => "kimi-k2.5",
1040            Self::KimiK26 => "kimi-k2.6",
1041            Self::Llama3370bInstruct => "llama-3.3-70b-instruct",
1042            Self::Llama4Maverick17b128eInstructFp8 => {
1043                "llama-4-maverick-17b-128e-instruct-fp8"
1044            }
1045            Self::Llama4Scout17b16eInstruct => "llama-4-scout-17b-16e-instruct",
1046            Self::Ministral3b => "ministral-3b",
1047            Self::MistralMedium2505 => "mistral-medium-2505",
1048            Self::MistralSmall2503 => "mistral-small-2503",
1049            Self::ModelRouter => "model-router",
1050            Self::O1 => "o1",
1051            Self::O3 => "o3",
1052            Self::O3Mini => "o3-mini",
1053            Self::O4Mini => "o4-mini",
1054            Self::Phi4Mini => "phi-4-mini",
1055            Self::Phi4MiniReasoning => "phi-4-mini-reasoning",
1056        }
1057    }
1058    #[allow(clippy::too_many_lines)]
1059    fn display_name(self) -> &'static str {
1060        match self {
1061            Self::ClaudeFable5 => "Claude Fable 5",
1062            Self::ClaudeHaiku45 => "Claude Haiku 4.5",
1063            Self::ClaudeOpus41 => "Claude Opus 4.1",
1064            Self::ClaudeOpus45 => "Claude Opus 4.5",
1065            Self::ClaudeOpus46 => "Claude Opus 4.6",
1066            Self::ClaudeOpus48 => "Claude Opus 4.8",
1067            Self::ClaudeOpus5 => "Claude Opus 5",
1068            Self::ClaudeSonnet45 => "Claude Sonnet 4.5",
1069            Self::ClaudeSonnet46 => "Claude Sonnet 4.6",
1070            Self::ClaudeSonnet5 => "Claude Sonnet 5",
1071            Self::Codestral2501 => "Codestral 25.01",
1072            Self::CodexMini => "Codex Mini",
1073            Self::CohereCommandA => "Command A",
1074            Self::DeepseekV32 => "DeepSeek-V3.2",
1075            Self::Gpt4Turbo => "GPT-4 Turbo",
1076            Self::Gpt4TurboVision => "GPT-4 Turbo Vision",
1077            Self::Gpt41 => "GPT-4.1",
1078            Self::Gpt41Mini => "GPT-4.1 mini",
1079            Self::Gpt41Nano => "GPT-4.1 nano",
1080            Self::Gpt4o => "GPT-4o",
1081            Self::Gpt4oMini => "GPT-4o mini",
1082            Self::Gpt5 => "GPT-5",
1083            Self::Gpt5Mini => "GPT-5 Mini",
1084            Self::Gpt5Nano => "GPT-5 Nano",
1085            Self::Gpt5Pro => "GPT-5 Pro",
1086            Self::Gpt5Codex => "GPT-5-Codex",
1087            Self::Gpt51 => "GPT-5.1",
1088            Self::Gpt51Codex => "GPT-5.1 Codex",
1089            Self::Gpt51CodexMax => "GPT-5.1 Codex Max",
1090            Self::Gpt51CodexMini => "GPT-5.1 Codex Mini",
1091            Self::Gpt52 => "GPT-5.2",
1092            Self::Gpt52Codex => "GPT-5.2 Codex",
1093            Self::Gpt53Codex => "GPT-5.3 Codex",
1094            Self::Gpt54 => "GPT-5.4",
1095            Self::Gpt54Mini => "GPT-5.4 Mini",
1096            Self::Gpt54Nano => "GPT-5.4 Nano",
1097            Self::Gpt54Pro => "GPT-5.4 Pro",
1098            Self::Gpt55 => "GPT-5.5",
1099            Self::Gpt56Luna => "GPT-5.6 Luna",
1100            Self::Gpt56Sol => "GPT-5.6 Sol",
1101            Self::Gpt56Terra => "GPT-5.6 Terra",
1102            Self::Grok41FastNonReasoning => "Grok 4.1 Fast (Non-Reasoning)",
1103            Self::Grok41FastReasoning => "Grok 4.1 Fast (Reasoning)",
1104            Self::Grok420NonReasoning => "Grok 4.20 (Non-Reasoning)",
1105            Self::Grok420Reasoning => "Grok 4.20 (Reasoning)",
1106            Self::KimiK25 => "Kimi K2.5",
1107            Self::KimiK26 => "Kimi K2.6",
1108            Self::Llama4Maverick17b128eInstructFp8 => {
1109                "Llama 4 Maverick 17B 128E Instruct FP8"
1110            }
1111            Self::Llama4Scout17b16eInstruct => "Llama 4 Scout 17B 16E Instruct",
1112            Self::Llama3370bInstruct => "Llama-3.3-70B-Instruct",
1113            Self::Ministral3b => "Ministral 3B",
1114            Self::MistralMedium2505 => "Mistral Medium 3",
1115            Self::MistralSmall2503 => "Mistral Small 3.1",
1116            Self::ModelRouter => "Model Router",
1117            Self::Phi4Mini => "Phi-4-mini",
1118            Self::Phi4MiniReasoning => "Phi-4-mini-reasoning",
1119            Self::O1 => "o1",
1120            Self::O3 => "o3",
1121            Self::O3Mini => "o3-mini",
1122            Self::O4Mini => "o4-mini",
1123        }
1124    }
1125    #[allow(clippy::too_many_lines)]
1126    fn context_window(self) -> u32 {
1127        match self {
1128            Self::DeepseekV32
1129            | Self::Gpt4Turbo
1130            | Self::Gpt4TurboVision
1131            | Self::Gpt4o
1132            | Self::Gpt4oMini
1133            | Self::Grok41FastNonReasoning
1134            | Self::Grok41FastReasoning
1135            | Self::Llama3370bInstruct
1136            | Self::Llama4Scout17b16eInstruct
1137            | Self::Ministral3b
1138            | Self::MistralMedium2505
1139            | Self::MistralSmall2503
1140            | Self::Phi4Mini
1141            | Self::Phi4MiniReasoning => 128_000,
1142            Self::CohereCommandA => 131_072,
1143            Self::ClaudeHaiku45
1144            | Self::ClaudeOpus41
1145            | Self::ClaudeOpus45
1146            | Self::ClaudeSonnet45
1147            | Self::CodexMini
1148            | Self::ModelRouter
1149            | Self::O1
1150            | Self::O3
1151            | Self::O3Mini
1152            | Self::O4Mini => 200_000,
1153            Self::Codestral2501 => 256_000,
1154            Self::Grok420NonReasoning | Self::Grok420Reasoning => 262_000,
1155            Self::KimiK25 | Self::KimiK26 => 262_144,
1156            Self::Gpt5
1157            | Self::Gpt5Codex
1158            | Self::Gpt5Mini
1159            | Self::Gpt5Nano
1160            | Self::Gpt5Pro
1161            | Self::Gpt51
1162            | Self::Gpt51Codex
1163            | Self::Gpt51CodexMax
1164            | Self::Gpt51CodexMini
1165            | Self::Gpt52
1166            | Self::Gpt52Codex
1167            | Self::Gpt53Codex
1168            | Self::Gpt54Mini
1169            | Self::Gpt54Nano => 400_000,
1170            Self::ClaudeFable5
1171            | Self::ClaudeOpus46
1172            | Self::ClaudeOpus48
1173            | Self::ClaudeOpus5
1174            | Self::ClaudeSonnet46
1175            | Self::ClaudeSonnet5
1176            | Self::Llama4Maverick17b128eInstructFp8 => 1_000_000,
1177            Self::Gpt41 | Self::Gpt41Mini | Self::Gpt41Nano => 1_047_576,
1178            Self::Gpt54
1179            | Self::Gpt54Pro
1180            | Self::Gpt55
1181            | Self::Gpt56Luna
1182            | Self::Gpt56Sol
1183            | Self::Gpt56Terra => 1_050_000,
1184        }
1185    }
1186    #[allow(clippy::too_many_lines)]
1187    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1188        match self {
1189            Self::Codestral2501
1190            | Self::Gpt4Turbo
1191            | Self::Gpt4TurboVision
1192            | Self::Gpt41
1193            | Self::Gpt41Mini
1194            | Self::Gpt41Nano
1195            | Self::Gpt4o
1196            | Self::Gpt4oMini
1197            | Self::Grok41FastNonReasoning
1198            | Self::Grok420NonReasoning
1199            | Self::Llama3370bInstruct
1200            | Self::Llama4Maverick17b128eInstructFp8
1201            | Self::Llama4Scout17b16eInstruct
1202            | Self::Ministral3b
1203            | Self::MistralMedium2505
1204            | Self::MistralSmall2503
1205            | Self::ModelRouter
1206            | Self::Phi4Mini => &[],
1207            Self::Gpt5Pro => &[ReasoningEffort::High],
1208            Self::ClaudeHaiku45
1209            | Self::ClaudeOpus41
1210            | Self::ClaudeOpus45
1211            | Self::ClaudeSonnet45
1212            | Self::CodexMini
1213            | Self::CohereCommandA
1214            | Self::DeepseekV32
1215            | Self::Gpt5Codex
1216            | Self::Gpt51
1217            | Self::Gpt51Codex
1218            | Self::Gpt51CodexMini
1219            | Self::Grok41FastReasoning
1220            | Self::Grok420Reasoning
1221            | Self::KimiK25
1222            | Self::KimiK26
1223            | Self::O1
1224            | Self::O3
1225            | Self::O3Mini
1226            | Self::O4Mini
1227            | Self::Phi4MiniReasoning => {
1228                &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
1229            }
1230            Self::ClaudeOpus46 | Self::ClaudeSonnet46 => {
1231                &[
1232                    ReasoningEffort::Low,
1233                    ReasoningEffort::Medium,
1234                    ReasoningEffort::High,
1235                    ReasoningEffort::Max,
1236                ]
1237            }
1238            Self::Gpt51CodexMax
1239            | Self::Gpt52
1240            | Self::Gpt52Codex
1241            | Self::Gpt53Codex
1242            | Self::Gpt54
1243            | Self::Gpt54Mini
1244            | Self::Gpt54Nano
1245            | Self::Gpt55 => {
1246                &[
1247                    ReasoningEffort::Low,
1248                    ReasoningEffort::Medium,
1249                    ReasoningEffort::High,
1250                    ReasoningEffort::Xhigh,
1251                ]
1252            }
1253            Self::ClaudeFable5
1254            | Self::ClaudeOpus48
1255            | Self::ClaudeOpus5
1256            | Self::ClaudeSonnet5
1257            | Self::Gpt56Luna
1258            | Self::Gpt56Sol
1259            | Self::Gpt56Terra => {
1260                &[
1261                    ReasoningEffort::Low,
1262                    ReasoningEffort::Medium,
1263                    ReasoningEffort::High,
1264                    ReasoningEffort::Xhigh,
1265                    ReasoningEffort::Max,
1266                ]
1267            }
1268            Self::Gpt54Pro => {
1269                &[ReasoningEffort::Medium, ReasoningEffort::High, ReasoningEffort::Xhigh]
1270            }
1271            Self::Gpt5 | Self::Gpt5Mini | Self::Gpt5Nano => {
1272                &[
1273                    ReasoningEffort::Minimal,
1274                    ReasoningEffort::Low,
1275                    ReasoningEffort::Medium,
1276                    ReasoningEffort::High,
1277                ]
1278            }
1279        }
1280    }
1281    pub fn supports_reasoning(self) -> bool {
1282        !self.reasoning_levels().is_empty()
1283    }
1284    #[allow(clippy::too_many_lines)]
1285    pub fn supports_prompt_caching(self) -> bool {
1286        match self {
1287            Self::Codestral2501
1288            | Self::CohereCommandA
1289            | Self::DeepseekV32
1290            | Self::Gpt4Turbo
1291            | Self::Gpt4TurboVision
1292            | Self::Gpt5Pro
1293            | Self::Gpt54Pro
1294            | Self::Grok420NonReasoning
1295            | Self::Grok420Reasoning
1296            | Self::KimiK25
1297            | Self::KimiK26
1298            | Self::Llama3370bInstruct
1299            | Self::Llama4Maverick17b128eInstructFp8
1300            | Self::Llama4Scout17b16eInstruct
1301            | Self::Ministral3b
1302            | Self::MistralMedium2505
1303            | Self::MistralSmall2503
1304            | Self::ModelRouter
1305            | Self::Phi4Mini
1306            | Self::Phi4MiniReasoning => false,
1307            Self::ClaudeFable5
1308            | Self::ClaudeHaiku45
1309            | Self::ClaudeOpus41
1310            | Self::ClaudeOpus45
1311            | Self::ClaudeOpus46
1312            | Self::ClaudeOpus48
1313            | Self::ClaudeOpus5
1314            | Self::ClaudeSonnet45
1315            | Self::ClaudeSonnet46
1316            | Self::ClaudeSonnet5
1317            | Self::CodexMini
1318            | Self::Gpt41
1319            | Self::Gpt41Mini
1320            | Self::Gpt41Nano
1321            | Self::Gpt4o
1322            | Self::Gpt4oMini
1323            | Self::Gpt5
1324            | Self::Gpt5Codex
1325            | Self::Gpt5Mini
1326            | Self::Gpt5Nano
1327            | Self::Gpt51
1328            | Self::Gpt51Codex
1329            | Self::Gpt51CodexMax
1330            | Self::Gpt51CodexMini
1331            | Self::Gpt52
1332            | Self::Gpt52Codex
1333            | Self::Gpt53Codex
1334            | Self::Gpt54
1335            | Self::Gpt54Mini
1336            | Self::Gpt54Nano
1337            | Self::Gpt55
1338            | Self::Gpt56Luna
1339            | Self::Gpt56Sol
1340            | Self::Gpt56Terra
1341            | Self::Grok41FastNonReasoning
1342            | Self::Grok41FastReasoning
1343            | Self::O1
1344            | Self::O3
1345            | Self::O3Mini
1346            | Self::O4Mini => true,
1347        }
1348    }
1349    #[allow(clippy::too_many_lines)]
1350    pub fn supports_image(self) -> bool {
1351        match self {
1352            Self::Codestral2501
1353            | Self::CodexMini
1354            | Self::CohereCommandA
1355            | Self::DeepseekV32
1356            | Self::Grok420NonReasoning
1357            | Self::Grok420Reasoning
1358            | Self::Llama3370bInstruct
1359            | Self::Ministral3b
1360            | Self::O3Mini
1361            | Self::Phi4Mini
1362            | Self::Phi4MiniReasoning => false,
1363            Self::ClaudeFable5
1364            | Self::ClaudeHaiku45
1365            | Self::ClaudeOpus41
1366            | Self::ClaudeOpus45
1367            | Self::ClaudeOpus46
1368            | Self::ClaudeOpus48
1369            | Self::ClaudeOpus5
1370            | Self::ClaudeSonnet45
1371            | Self::ClaudeSonnet46
1372            | Self::ClaudeSonnet5
1373            | Self::Gpt4Turbo
1374            | Self::Gpt4TurboVision
1375            | Self::Gpt41
1376            | Self::Gpt41Mini
1377            | Self::Gpt41Nano
1378            | Self::Gpt4o
1379            | Self::Gpt4oMini
1380            | Self::Gpt5
1381            | Self::Gpt5Codex
1382            | Self::Gpt5Mini
1383            | Self::Gpt5Nano
1384            | Self::Gpt5Pro
1385            | Self::Gpt51
1386            | Self::Gpt51Codex
1387            | Self::Gpt51CodexMax
1388            | Self::Gpt51CodexMini
1389            | Self::Gpt52
1390            | Self::Gpt52Codex
1391            | Self::Gpt53Codex
1392            | Self::Gpt54
1393            | Self::Gpt54Mini
1394            | Self::Gpt54Nano
1395            | Self::Gpt54Pro
1396            | Self::Gpt55
1397            | Self::Gpt56Luna
1398            | Self::Gpt56Sol
1399            | Self::Gpt56Terra
1400            | Self::Grok41FastNonReasoning
1401            | Self::Grok41FastReasoning
1402            | Self::KimiK25
1403            | Self::KimiK26
1404            | Self::Llama4Maverick17b128eInstructFp8
1405            | Self::Llama4Scout17b16eInstruct
1406            | Self::MistralMedium2505
1407            | Self::MistralSmall2503
1408            | Self::ModelRouter
1409            | Self::O1
1410            | Self::O3
1411            | Self::O4Mini => true,
1412        }
1413    }
1414    #[allow(clippy::too_many_lines)]
1415    pub fn supports_audio(self) -> bool {
1416        match self {
1417            Self::ClaudeFable5
1418            | Self::ClaudeHaiku45
1419            | Self::ClaudeOpus41
1420            | Self::ClaudeOpus45
1421            | Self::ClaudeOpus46
1422            | Self::ClaudeOpus48
1423            | Self::ClaudeOpus5
1424            | Self::ClaudeSonnet45
1425            | Self::ClaudeSonnet46
1426            | Self::ClaudeSonnet5
1427            | Self::Codestral2501
1428            | Self::CodexMini
1429            | Self::CohereCommandA
1430            | Self::DeepseekV32
1431            | Self::Gpt4Turbo
1432            | Self::Gpt4TurboVision
1433            | Self::Gpt41
1434            | Self::Gpt41Mini
1435            | Self::Gpt41Nano
1436            | Self::Gpt4o
1437            | Self::Gpt4oMini
1438            | Self::Gpt5
1439            | Self::Gpt5Codex
1440            | Self::Gpt5Mini
1441            | Self::Gpt5Nano
1442            | Self::Gpt5Pro
1443            | Self::Gpt51CodexMax
1444            | Self::Gpt51CodexMini
1445            | Self::Gpt52
1446            | Self::Gpt52Codex
1447            | Self::Gpt53Codex
1448            | Self::Gpt54
1449            | Self::Gpt54Mini
1450            | Self::Gpt54Nano
1451            | Self::Gpt54Pro
1452            | Self::Gpt55
1453            | Self::Gpt56Luna
1454            | Self::Gpt56Sol
1455            | Self::Gpt56Terra
1456            | Self::Grok41FastNonReasoning
1457            | Self::Grok41FastReasoning
1458            | Self::Grok420NonReasoning
1459            | Self::Grok420Reasoning
1460            | Self::KimiK25
1461            | Self::KimiK26
1462            | Self::Llama3370bInstruct
1463            | Self::Llama4Maverick17b128eInstructFp8
1464            | Self::Llama4Scout17b16eInstruct
1465            | Self::Ministral3b
1466            | Self::MistralMedium2505
1467            | Self::MistralSmall2503
1468            | Self::ModelRouter
1469            | Self::O1
1470            | Self::O3
1471            | Self::O3Mini
1472            | Self::O4Mini
1473            | Self::Phi4Mini
1474            | Self::Phi4MiniReasoning => false,
1475            Self::Gpt51 | Self::Gpt51Codex => true,
1476        }
1477    }
1478    #[allow(clippy::too_many_lines)]
1479    pub fn transport(self) -> Option<ModelTransport> {
1480        match self {
1481            Self::ClaudeFable5
1482            | Self::ClaudeHaiku45
1483            | Self::ClaudeOpus41
1484            | Self::ClaudeOpus45
1485            | Self::ClaudeOpus46
1486            | Self::ClaudeOpus48
1487            | Self::ClaudeOpus5
1488            | Self::ClaudeSonnet45
1489            | Self::ClaudeSonnet46
1490            | Self::ClaudeSonnet5
1491            | Self::Codestral2501
1492            | Self::CodexMini
1493            | Self::CohereCommandA
1494            | Self::DeepseekV32
1495            | Self::Gpt4Turbo
1496            | Self::Gpt4TurboVision
1497            | Self::Gpt41
1498            | Self::Gpt41Mini
1499            | Self::Gpt41Nano
1500            | Self::Gpt4o
1501            | Self::Gpt4oMini
1502            | Self::Gpt5
1503            | Self::Gpt5Codex
1504            | Self::Gpt5Mini
1505            | Self::Gpt5Nano
1506            | Self::Gpt5Pro
1507            | Self::Gpt51
1508            | Self::Gpt51Codex
1509            | Self::Gpt51CodexMax
1510            | Self::Gpt51CodexMini
1511            | Self::Gpt52
1512            | Self::Gpt52Codex
1513            | Self::Gpt53Codex
1514            | Self::Gpt54
1515            | Self::Gpt54Mini
1516            | Self::Gpt54Nano
1517            | Self::Gpt54Pro
1518            | Self::Gpt55
1519            | Self::Gpt56Luna
1520            | Self::Gpt56Sol
1521            | Self::Gpt56Terra
1522            | Self::Grok41FastNonReasoning
1523            | Self::Grok41FastReasoning
1524            | Self::Grok420NonReasoning
1525            | Self::Grok420Reasoning
1526            | Self::KimiK25
1527            | Self::KimiK26
1528            | Self::Llama3370bInstruct
1529            | Self::Llama4Maverick17b128eInstructFp8
1530            | Self::Llama4Scout17b16eInstruct
1531            | Self::Ministral3b
1532            | Self::MistralMedium2505
1533            | Self::MistralSmall2503
1534            | Self::ModelRouter
1535            | Self::O1
1536            | Self::O3
1537            | Self::O3Mini
1538            | Self::O4Mini
1539            | Self::Phi4Mini
1540            | Self::Phi4MiniReasoning => None,
1541        }
1542    }
1543    const ALL: &[AzureFoundryModel] = &[
1544        Self::ClaudeFable5,
1545        Self::ClaudeHaiku45,
1546        Self::ClaudeOpus41,
1547        Self::ClaudeOpus45,
1548        Self::ClaudeOpus46,
1549        Self::ClaudeOpus48,
1550        Self::ClaudeOpus5,
1551        Self::ClaudeSonnet45,
1552        Self::ClaudeSonnet46,
1553        Self::ClaudeSonnet5,
1554        Self::Codestral2501,
1555        Self::CodexMini,
1556        Self::CohereCommandA,
1557        Self::DeepseekV32,
1558        Self::Gpt4Turbo,
1559        Self::Gpt4TurboVision,
1560        Self::Gpt41,
1561        Self::Gpt41Mini,
1562        Self::Gpt41Nano,
1563        Self::Gpt4o,
1564        Self::Gpt4oMini,
1565        Self::Gpt5,
1566        Self::Gpt5Codex,
1567        Self::Gpt5Mini,
1568        Self::Gpt5Nano,
1569        Self::Gpt5Pro,
1570        Self::Gpt51,
1571        Self::Gpt51Codex,
1572        Self::Gpt51CodexMax,
1573        Self::Gpt51CodexMini,
1574        Self::Gpt52,
1575        Self::Gpt52Codex,
1576        Self::Gpt53Codex,
1577        Self::Gpt54,
1578        Self::Gpt54Mini,
1579        Self::Gpt54Nano,
1580        Self::Gpt54Pro,
1581        Self::Gpt55,
1582        Self::Gpt56Luna,
1583        Self::Gpt56Sol,
1584        Self::Gpt56Terra,
1585        Self::Grok41FastNonReasoning,
1586        Self::Grok41FastReasoning,
1587        Self::Grok420NonReasoning,
1588        Self::Grok420Reasoning,
1589        Self::KimiK25,
1590        Self::KimiK26,
1591        Self::Llama3370bInstruct,
1592        Self::Llama4Maverick17b128eInstructFp8,
1593        Self::Llama4Scout17b16eInstruct,
1594        Self::Ministral3b,
1595        Self::MistralMedium2505,
1596        Self::MistralSmall2503,
1597        Self::ModelRouter,
1598        Self::O1,
1599        Self::O3,
1600        Self::O3Mini,
1601        Self::O4Mini,
1602        Self::Phi4Mini,
1603        Self::Phi4MiniReasoning,
1604    ];
1605}
1606impl std::str::FromStr for AzureFoundryModel {
1607    type Err = String;
1608    #[allow(clippy::too_many_lines)]
1609    fn from_str(s: &str) -> Result<Self, Self::Err> {
1610        match s {
1611            "claude-fable-5" => Ok(Self::ClaudeFable5),
1612            "claude-haiku-4-5" => Ok(Self::ClaudeHaiku45),
1613            "claude-opus-4-1" => Ok(Self::ClaudeOpus41),
1614            "claude-opus-4-5" => Ok(Self::ClaudeOpus45),
1615            "claude-opus-4-6" => Ok(Self::ClaudeOpus46),
1616            "claude-opus-4-8" => Ok(Self::ClaudeOpus48),
1617            "claude-opus-5" => Ok(Self::ClaudeOpus5),
1618            "claude-sonnet-4-5" => Ok(Self::ClaudeSonnet45),
1619            "claude-sonnet-4-6" => Ok(Self::ClaudeSonnet46),
1620            "claude-sonnet-5" => Ok(Self::ClaudeSonnet5),
1621            "codestral-2501" => Ok(Self::Codestral2501),
1622            "codex-mini" => Ok(Self::CodexMini),
1623            "cohere-command-a" => Ok(Self::CohereCommandA),
1624            "deepseek-v3.2" => Ok(Self::DeepseekV32),
1625            "gpt-4-turbo" => Ok(Self::Gpt4Turbo),
1626            "gpt-4-turbo-vision" => Ok(Self::Gpt4TurboVision),
1627            "gpt-4.1" => Ok(Self::Gpt41),
1628            "gpt-4.1-mini" => Ok(Self::Gpt41Mini),
1629            "gpt-4.1-nano" => Ok(Self::Gpt41Nano),
1630            "gpt-4o" => Ok(Self::Gpt4o),
1631            "gpt-4o-mini" => Ok(Self::Gpt4oMini),
1632            "gpt-5" => Ok(Self::Gpt5),
1633            "gpt-5-codex" => Ok(Self::Gpt5Codex),
1634            "gpt-5-mini" => Ok(Self::Gpt5Mini),
1635            "gpt-5-nano" => Ok(Self::Gpt5Nano),
1636            "gpt-5-pro" => Ok(Self::Gpt5Pro),
1637            "gpt-5.1" => Ok(Self::Gpt51),
1638            "gpt-5.1-codex" => Ok(Self::Gpt51Codex),
1639            "gpt-5.1-codex-max" => Ok(Self::Gpt51CodexMax),
1640            "gpt-5.1-codex-mini" => Ok(Self::Gpt51CodexMini),
1641            "gpt-5.2" => Ok(Self::Gpt52),
1642            "gpt-5.2-codex" => Ok(Self::Gpt52Codex),
1643            "gpt-5.3-codex" => Ok(Self::Gpt53Codex),
1644            "gpt-5.4" => Ok(Self::Gpt54),
1645            "gpt-5.4-mini" => Ok(Self::Gpt54Mini),
1646            "gpt-5.4-nano" => Ok(Self::Gpt54Nano),
1647            "gpt-5.4-pro" => Ok(Self::Gpt54Pro),
1648            "gpt-5.5" => Ok(Self::Gpt55),
1649            "gpt-5.6-luna" => Ok(Self::Gpt56Luna),
1650            "gpt-5.6-sol" => Ok(Self::Gpt56Sol),
1651            "gpt-5.6-terra" => Ok(Self::Gpt56Terra),
1652            "grok-4-1-fast-non-reasoning" => Ok(Self::Grok41FastNonReasoning),
1653            "grok-4-1-fast-reasoning" => Ok(Self::Grok41FastReasoning),
1654            "grok-4-20-non-reasoning" => Ok(Self::Grok420NonReasoning),
1655            "grok-4-20-reasoning" => Ok(Self::Grok420Reasoning),
1656            "kimi-k2.5" => Ok(Self::KimiK25),
1657            "kimi-k2.6" => Ok(Self::KimiK26),
1658            "llama-3.3-70b-instruct" => Ok(Self::Llama3370bInstruct),
1659            "llama-4-maverick-17b-128e-instruct-fp8" => {
1660                Ok(Self::Llama4Maverick17b128eInstructFp8)
1661            }
1662            "llama-4-scout-17b-16e-instruct" => Ok(Self::Llama4Scout17b16eInstruct),
1663            "ministral-3b" => Ok(Self::Ministral3b),
1664            "mistral-medium-2505" => Ok(Self::MistralMedium2505),
1665            "mistral-small-2503" => Ok(Self::MistralSmall2503),
1666            "model-router" => Ok(Self::ModelRouter),
1667            "o1" => Ok(Self::O1),
1668            "o3" => Ok(Self::O3),
1669            "o3-mini" => Ok(Self::O3Mini),
1670            "o4-mini" => Ok(Self::O4Mini),
1671            "phi-4-mini" => Ok(Self::Phi4Mini),
1672            "phi-4-mini-reasoning" => Ok(Self::Phi4MiniReasoning),
1673            _ => Err(format!("Unknown azure-foundry model: '{s}'")),
1674        }
1675    }
1676}
1677impl CodexModel {
1678    #[allow(clippy::too_many_lines)]
1679    fn model_id(self) -> &'static str {
1680        match self {
1681            Self::Gpt52 => "gpt-5.2",
1682            Self::Gpt54 => "gpt-5.4",
1683            Self::Gpt54Mini => "gpt-5.4-mini",
1684            Self::Gpt55 => "gpt-5.5",
1685            Self::Gpt56Luna => "gpt-5.6-luna",
1686            Self::Gpt56Sol => "gpt-5.6-sol",
1687            Self::Gpt56Terra => "gpt-5.6-terra",
1688        }
1689    }
1690    #[allow(clippy::too_many_lines)]
1691    fn display_name(self) -> &'static str {
1692        match self {
1693            Self::Gpt52 => "GPT-5.2",
1694            Self::Gpt54 => "GPT-5.4",
1695            Self::Gpt54Mini => "GPT-5.4 mini",
1696            Self::Gpt55 => "GPT-5.5",
1697            Self::Gpt56Luna => "GPT-5.6 Luna",
1698            Self::Gpt56Sol => "GPT-5.6 Sol",
1699            Self::Gpt56Terra => "GPT-5.6 Terra",
1700        }
1701    }
1702    #[allow(clippy::too_many_lines)]
1703    fn context_window(self) -> u32 {
1704        match self {
1705            Self::Gpt52 | Self::Gpt54 | Self::Gpt54Mini | Self::Gpt55 => 272_000,
1706            Self::Gpt56Luna | Self::Gpt56Sol | Self::Gpt56Terra => 372_000,
1707        }
1708    }
1709    #[allow(clippy::too_many_lines)]
1710    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1711        match self {
1712            Self::Gpt52 | Self::Gpt54 | Self::Gpt54Mini | Self::Gpt55 => {
1713                &[
1714                    ReasoningEffort::Low,
1715                    ReasoningEffort::Medium,
1716                    ReasoningEffort::High,
1717                    ReasoningEffort::Xhigh,
1718                ]
1719            }
1720            Self::Gpt56Luna | Self::Gpt56Sol | Self::Gpt56Terra => {
1721                &[
1722                    ReasoningEffort::Low,
1723                    ReasoningEffort::Medium,
1724                    ReasoningEffort::High,
1725                    ReasoningEffort::Xhigh,
1726                    ReasoningEffort::Max,
1727                ]
1728            }
1729        }
1730    }
1731    pub fn supports_reasoning(self) -> bool {
1732        !self.reasoning_levels().is_empty()
1733    }
1734    #[allow(clippy::too_many_lines)]
1735    pub fn supports_prompt_caching(self) -> bool {
1736        match self {
1737            Self::Gpt52
1738            | Self::Gpt54
1739            | Self::Gpt54Mini
1740            | Self::Gpt55
1741            | Self::Gpt56Luna
1742            | Self::Gpt56Sol
1743            | Self::Gpt56Terra => true,
1744        }
1745    }
1746    #[allow(clippy::too_many_lines)]
1747    pub fn supports_image(self) -> bool {
1748        match self {
1749            Self::Gpt52
1750            | Self::Gpt54
1751            | Self::Gpt54Mini
1752            | Self::Gpt55
1753            | Self::Gpt56Luna
1754            | Self::Gpt56Sol
1755            | Self::Gpt56Terra => true,
1756        }
1757    }
1758    #[allow(clippy::too_many_lines)]
1759    pub fn supports_audio(self) -> bool {
1760        match self {
1761            Self::Gpt52
1762            | Self::Gpt54
1763            | Self::Gpt54Mini
1764            | Self::Gpt55
1765            | Self::Gpt56Luna
1766            | Self::Gpt56Sol
1767            | Self::Gpt56Terra => false,
1768        }
1769    }
1770    #[allow(clippy::too_many_lines)]
1771    pub fn transport(self) -> Option<ModelTransport> {
1772        match self {
1773            Self::Gpt52
1774            | Self::Gpt54
1775            | Self::Gpt54Mini
1776            | Self::Gpt55
1777            | Self::Gpt56Luna
1778            | Self::Gpt56Sol
1779            | Self::Gpt56Terra => None,
1780        }
1781    }
1782    const ALL: &[CodexModel] = &[
1783        Self::Gpt52,
1784        Self::Gpt54,
1785        Self::Gpt54Mini,
1786        Self::Gpt55,
1787        Self::Gpt56Luna,
1788        Self::Gpt56Sol,
1789        Self::Gpt56Terra,
1790    ];
1791}
1792impl std::str::FromStr for CodexModel {
1793    type Err = String;
1794    #[allow(clippy::too_many_lines)]
1795    fn from_str(s: &str) -> Result<Self, Self::Err> {
1796        match s {
1797            "gpt-5.2" => Ok(Self::Gpt52),
1798            "gpt-5.4" => Ok(Self::Gpt54),
1799            "gpt-5.4-mini" => Ok(Self::Gpt54Mini),
1800            "gpt-5.5" => Ok(Self::Gpt55),
1801            "gpt-5.6-luna" => Ok(Self::Gpt56Luna),
1802            "gpt-5.6-sol" => Ok(Self::Gpt56Sol),
1803            "gpt-5.6-terra" => Ok(Self::Gpt56Terra),
1804            _ => Err(format!("Unknown codex model: '{s}'")),
1805        }
1806    }
1807}
1808impl DeepSeekModel {
1809    #[allow(clippy::too_many_lines)]
1810    fn model_id(self) -> &'static str {
1811        match self {
1812            Self::DeepseekChat => "deepseek-chat",
1813            Self::DeepseekReasoner => "deepseek-reasoner",
1814            Self::DeepseekV4Flash => "deepseek-v4-flash",
1815            Self::DeepseekV4Pro => "deepseek-v4-pro",
1816        }
1817    }
1818    #[allow(clippy::too_many_lines)]
1819    fn display_name(self) -> &'static str {
1820        match self {
1821            Self::DeepseekChat => "DeepSeek Chat",
1822            Self::DeepseekReasoner => "DeepSeek Reasoner",
1823            Self::DeepseekV4Flash => "DeepSeek V4 Flash",
1824            Self::DeepseekV4Pro => "DeepSeek V4 Pro",
1825        }
1826    }
1827    #[allow(clippy::too_many_lines)]
1828    fn context_window(self) -> u32 {
1829        match self {
1830            Self::DeepseekChat
1831            | Self::DeepseekReasoner
1832            | Self::DeepseekV4Flash
1833            | Self::DeepseekV4Pro => 1_000_000,
1834        }
1835    }
1836    #[allow(clippy::too_many_lines)]
1837    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1838        match self {
1839            Self::DeepseekChat => &[],
1840            Self::DeepseekV4Flash | Self::DeepseekV4Pro => {
1841                &[ReasoningEffort::High, ReasoningEffort::Max]
1842            }
1843            Self::DeepseekReasoner => {
1844                &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
1845            }
1846        }
1847    }
1848    pub fn supports_reasoning(self) -> bool {
1849        !self.reasoning_levels().is_empty()
1850    }
1851    #[allow(clippy::too_many_lines)]
1852    pub fn supports_prompt_caching(self) -> bool {
1853        match self {
1854            Self::DeepseekChat
1855            | Self::DeepseekReasoner
1856            | Self::DeepseekV4Flash
1857            | Self::DeepseekV4Pro => true,
1858        }
1859    }
1860    #[allow(clippy::too_many_lines)]
1861    pub fn supports_image(self) -> bool {
1862        match self {
1863            Self::DeepseekChat
1864            | Self::DeepseekReasoner
1865            | Self::DeepseekV4Flash
1866            | Self::DeepseekV4Pro => false,
1867        }
1868    }
1869    #[allow(clippy::too_many_lines)]
1870    pub fn supports_audio(self) -> bool {
1871        match self {
1872            Self::DeepseekChat
1873            | Self::DeepseekReasoner
1874            | Self::DeepseekV4Flash
1875            | Self::DeepseekV4Pro => false,
1876        }
1877    }
1878    #[allow(clippy::too_many_lines)]
1879    pub fn transport(self) -> Option<ModelTransport> {
1880        match self {
1881            Self::DeepseekChat
1882            | Self::DeepseekReasoner
1883            | Self::DeepseekV4Flash
1884            | Self::DeepseekV4Pro => None,
1885        }
1886    }
1887    const ALL: &[DeepSeekModel] = &[
1888        Self::DeepseekChat,
1889        Self::DeepseekReasoner,
1890        Self::DeepseekV4Flash,
1891        Self::DeepseekV4Pro,
1892    ];
1893}
1894impl std::str::FromStr for DeepSeekModel {
1895    type Err = String;
1896    #[allow(clippy::too_many_lines)]
1897    fn from_str(s: &str) -> Result<Self, Self::Err> {
1898        match s {
1899            "deepseek-chat" => Ok(Self::DeepseekChat),
1900            "deepseek-reasoner" => Ok(Self::DeepseekReasoner),
1901            "deepseek-v4-flash" => Ok(Self::DeepseekV4Flash),
1902            "deepseek-v4-pro" => Ok(Self::DeepseekV4Pro),
1903            _ => Err(format!("Unknown deepseek model: '{s}'")),
1904        }
1905    }
1906}
1907impl FireworksModel {
1908    #[allow(clippy::too_many_lines)]
1909    fn model_id(self) -> &'static str {
1910        match self {
1911            Self::AccountsFireworksModelsDeepseekV4Flash => {
1912                "accounts/fireworks/models/deepseek-v4-flash"
1913            }
1914            Self::AccountsFireworksModelsDeepseekV4Pro => {
1915                "accounts/fireworks/models/deepseek-v4-pro"
1916            }
1917            Self::AccountsFireworksModelsGlm5p2 => "accounts/fireworks/models/glm-5p2",
1918            Self::AccountsFireworksModelsGptOss120b => {
1919                "accounts/fireworks/models/gpt-oss-120b"
1920            }
1921            Self::AccountsFireworksModelsGptOss20b => {
1922                "accounts/fireworks/models/gpt-oss-20b"
1923            }
1924            Self::AccountsFireworksModelsKimiK2p6 => {
1925                "accounts/fireworks/models/kimi-k2p6"
1926            }
1927            Self::AccountsFireworksModelsKimiK2p7Code => {
1928                "accounts/fireworks/models/kimi-k2p7-code"
1929            }
1930            Self::AccountsFireworksModelsMinimaxM2p7 => {
1931                "accounts/fireworks/models/minimax-m2p7"
1932            }
1933            Self::AccountsFireworksModelsMinimaxM3 => {
1934                "accounts/fireworks/models/minimax-m3"
1935            }
1936            Self::AccountsFireworksModelsQwen3p7Plus => {
1937                "accounts/fireworks/models/qwen3p7-plus"
1938            }
1939            Self::AccountsFireworksRoutersGlm5p2Fast => {
1940                "accounts/fireworks/routers/glm-5p2-fast"
1941            }
1942            Self::AccountsFireworksRoutersKimiK2p6Fast => {
1943                "accounts/fireworks/routers/kimi-k2p6-fast"
1944            }
1945            Self::AccountsFireworksRoutersKimiK2p6Turbo => {
1946                "accounts/fireworks/routers/kimi-k2p6-turbo"
1947            }
1948            Self::AccountsFireworksRoutersKimiK2p7CodeFast => {
1949                "accounts/fireworks/routers/kimi-k2p7-code-fast"
1950            }
1951        }
1952    }
1953    #[allow(clippy::too_many_lines)]
1954    fn display_name(self) -> &'static str {
1955        match self {
1956            Self::AccountsFireworksModelsDeepseekV4Flash => "DeepSeek V4 Flash",
1957            Self::AccountsFireworksModelsDeepseekV4Pro => "DeepSeek V4 Pro",
1958            Self::AccountsFireworksModelsGlm5p2 => "GLM 5.2",
1959            Self::AccountsFireworksRoutersGlm5p2Fast => "GLM 5.2 Fast",
1960            Self::AccountsFireworksModelsGptOss120b => "GPT OSS 120B",
1961            Self::AccountsFireworksModelsGptOss20b => "GPT OSS 20B",
1962            Self::AccountsFireworksModelsKimiK2p6 => "Kimi K2.6",
1963            Self::AccountsFireworksRoutersKimiK2p6Fast => "Kimi K2.6 Fast",
1964            Self::AccountsFireworksRoutersKimiK2p6Turbo => "Kimi K2.6 Turbo",
1965            Self::AccountsFireworksModelsKimiK2p7Code => "Kimi K2.7 Code",
1966            Self::AccountsFireworksRoutersKimiK2p7CodeFast => "Kimi K2.7 Code Fast",
1967            Self::AccountsFireworksModelsMinimaxM2p7 => "MiniMax-M2.7",
1968            Self::AccountsFireworksModelsMinimaxM3 => "MiniMax-M3",
1969            Self::AccountsFireworksModelsQwen3p7Plus => "Qwen 3.7 Plus",
1970        }
1971    }
1972    #[allow(clippy::too_many_lines)]
1973    fn context_window(self) -> u32 {
1974        match self {
1975            Self::AccountsFireworksModelsGptOss120b
1976            | Self::AccountsFireworksModelsGptOss20b => 131_072,
1977            Self::AccountsFireworksModelsMinimaxM2p7 => 196_608,
1978            Self::AccountsFireworksModelsKimiK2p6
1979            | Self::AccountsFireworksModelsKimiK2p7Code
1980            | Self::AccountsFireworksRoutersKimiK2p6Fast
1981            | Self::AccountsFireworksRoutersKimiK2p6Turbo
1982            | Self::AccountsFireworksRoutersKimiK2p7CodeFast => 262_000,
1983            Self::AccountsFireworksModelsQwen3p7Plus => 262_144,
1984            Self::AccountsFireworksModelsMinimaxM3 => 512_000,
1985            Self::AccountsFireworksModelsDeepseekV4Flash
1986            | Self::AccountsFireworksModelsDeepseekV4Pro => 1_000_000,
1987            Self::AccountsFireworksModelsGlm5p2
1988            | Self::AccountsFireworksRoutersGlm5p2Fast => 1_048_575,
1989        }
1990    }
1991    #[allow(clippy::too_many_lines)]
1992    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
1993        match self {
1994            Self::AccountsFireworksModelsDeepseekV4Flash
1995            | Self::AccountsFireworksModelsDeepseekV4Pro
1996            | Self::AccountsFireworksModelsGlm5p2
1997            | Self::AccountsFireworksRoutersGlm5p2Fast => {
1998                &[ReasoningEffort::High, ReasoningEffort::Max]
1999            }
2000            Self::AccountsFireworksModelsGptOss120b
2001            | Self::AccountsFireworksModelsGptOss20b
2002            | Self::AccountsFireworksModelsKimiK2p6
2003            | Self::AccountsFireworksModelsKimiK2p7Code
2004            | Self::AccountsFireworksModelsMinimaxM2p7
2005            | Self::AccountsFireworksModelsMinimaxM3
2006            | Self::AccountsFireworksModelsQwen3p7Plus
2007            | Self::AccountsFireworksRoutersKimiK2p6Fast
2008            | Self::AccountsFireworksRoutersKimiK2p6Turbo
2009            | Self::AccountsFireworksRoutersKimiK2p7CodeFast => {
2010                &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
2011            }
2012        }
2013    }
2014    pub fn supports_reasoning(self) -> bool {
2015        !self.reasoning_levels().is_empty()
2016    }
2017    #[allow(clippy::too_many_lines)]
2018    pub fn supports_prompt_caching(self) -> bool {
2019        match self {
2020            Self::AccountsFireworksModelsDeepseekV4Flash
2021            | Self::AccountsFireworksModelsDeepseekV4Pro
2022            | Self::AccountsFireworksModelsGlm5p2
2023            | Self::AccountsFireworksModelsGptOss120b
2024            | Self::AccountsFireworksModelsGptOss20b
2025            | Self::AccountsFireworksModelsKimiK2p6
2026            | Self::AccountsFireworksModelsKimiK2p7Code
2027            | Self::AccountsFireworksModelsMinimaxM2p7
2028            | Self::AccountsFireworksModelsMinimaxM3
2029            | Self::AccountsFireworksModelsQwen3p7Plus
2030            | Self::AccountsFireworksRoutersGlm5p2Fast
2031            | Self::AccountsFireworksRoutersKimiK2p6Fast
2032            | Self::AccountsFireworksRoutersKimiK2p6Turbo
2033            | Self::AccountsFireworksRoutersKimiK2p7CodeFast => true,
2034        }
2035    }
2036    #[allow(clippy::too_many_lines)]
2037    pub fn supports_image(self) -> bool {
2038        match self {
2039            Self::AccountsFireworksModelsDeepseekV4Flash
2040            | Self::AccountsFireworksModelsDeepseekV4Pro
2041            | Self::AccountsFireworksModelsGlm5p2
2042            | Self::AccountsFireworksModelsGptOss120b
2043            | Self::AccountsFireworksModelsGptOss20b
2044            | Self::AccountsFireworksModelsMinimaxM2p7
2045            | Self::AccountsFireworksRoutersGlm5p2Fast => false,
2046            Self::AccountsFireworksModelsKimiK2p6
2047            | Self::AccountsFireworksModelsKimiK2p7Code
2048            | Self::AccountsFireworksModelsMinimaxM3
2049            | Self::AccountsFireworksModelsQwen3p7Plus
2050            | Self::AccountsFireworksRoutersKimiK2p6Fast
2051            | Self::AccountsFireworksRoutersKimiK2p6Turbo
2052            | Self::AccountsFireworksRoutersKimiK2p7CodeFast => true,
2053        }
2054    }
2055    #[allow(clippy::too_many_lines)]
2056    pub fn supports_audio(self) -> bool {
2057        match self {
2058            Self::AccountsFireworksModelsDeepseekV4Flash
2059            | Self::AccountsFireworksModelsDeepseekV4Pro
2060            | Self::AccountsFireworksModelsGlm5p2
2061            | Self::AccountsFireworksModelsGptOss120b
2062            | Self::AccountsFireworksModelsGptOss20b
2063            | Self::AccountsFireworksModelsKimiK2p6
2064            | Self::AccountsFireworksModelsKimiK2p7Code
2065            | Self::AccountsFireworksModelsMinimaxM2p7
2066            | Self::AccountsFireworksModelsMinimaxM3
2067            | Self::AccountsFireworksModelsQwen3p7Plus
2068            | Self::AccountsFireworksRoutersGlm5p2Fast
2069            | Self::AccountsFireworksRoutersKimiK2p6Fast
2070            | Self::AccountsFireworksRoutersKimiK2p6Turbo
2071            | Self::AccountsFireworksRoutersKimiK2p7CodeFast => false,
2072        }
2073    }
2074    #[allow(clippy::too_many_lines)]
2075    pub fn transport(self) -> Option<ModelTransport> {
2076        match self {
2077            Self::AccountsFireworksModelsDeepseekV4Flash
2078            | Self::AccountsFireworksModelsDeepseekV4Pro
2079            | Self::AccountsFireworksModelsGlm5p2
2080            | Self::AccountsFireworksModelsGptOss120b
2081            | Self::AccountsFireworksModelsGptOss20b
2082            | Self::AccountsFireworksModelsKimiK2p6
2083            | Self::AccountsFireworksModelsKimiK2p7Code
2084            | Self::AccountsFireworksModelsMinimaxM2p7
2085            | Self::AccountsFireworksModelsMinimaxM3
2086            | Self::AccountsFireworksModelsQwen3p7Plus
2087            | Self::AccountsFireworksRoutersGlm5p2Fast
2088            | Self::AccountsFireworksRoutersKimiK2p6Fast
2089            | Self::AccountsFireworksRoutersKimiK2p6Turbo
2090            | Self::AccountsFireworksRoutersKimiK2p7CodeFast => None,
2091        }
2092    }
2093    const ALL: &[FireworksModel] = &[
2094        Self::AccountsFireworksModelsDeepseekV4Flash,
2095        Self::AccountsFireworksModelsDeepseekV4Pro,
2096        Self::AccountsFireworksModelsGlm5p2,
2097        Self::AccountsFireworksModelsGptOss120b,
2098        Self::AccountsFireworksModelsGptOss20b,
2099        Self::AccountsFireworksModelsKimiK2p6,
2100        Self::AccountsFireworksModelsKimiK2p7Code,
2101        Self::AccountsFireworksModelsMinimaxM2p7,
2102        Self::AccountsFireworksModelsMinimaxM3,
2103        Self::AccountsFireworksModelsQwen3p7Plus,
2104        Self::AccountsFireworksRoutersGlm5p2Fast,
2105        Self::AccountsFireworksRoutersKimiK2p6Fast,
2106        Self::AccountsFireworksRoutersKimiK2p6Turbo,
2107        Self::AccountsFireworksRoutersKimiK2p7CodeFast,
2108    ];
2109}
2110impl std::str::FromStr for FireworksModel {
2111    type Err = String;
2112    #[allow(clippy::too_many_lines)]
2113    fn from_str(s: &str) -> Result<Self, Self::Err> {
2114        match s {
2115            "accounts/fireworks/models/deepseek-v4-flash" => {
2116                Ok(Self::AccountsFireworksModelsDeepseekV4Flash)
2117            }
2118            "accounts/fireworks/models/deepseek-v4-pro" => {
2119                Ok(Self::AccountsFireworksModelsDeepseekV4Pro)
2120            }
2121            "accounts/fireworks/models/glm-5p2" => {
2122                Ok(Self::AccountsFireworksModelsGlm5p2)
2123            }
2124            "accounts/fireworks/models/gpt-oss-120b" => {
2125                Ok(Self::AccountsFireworksModelsGptOss120b)
2126            }
2127            "accounts/fireworks/models/gpt-oss-20b" => {
2128                Ok(Self::AccountsFireworksModelsGptOss20b)
2129            }
2130            "accounts/fireworks/models/kimi-k2p6" => {
2131                Ok(Self::AccountsFireworksModelsKimiK2p6)
2132            }
2133            "accounts/fireworks/models/kimi-k2p7-code" => {
2134                Ok(Self::AccountsFireworksModelsKimiK2p7Code)
2135            }
2136            "accounts/fireworks/models/minimax-m2p7" => {
2137                Ok(Self::AccountsFireworksModelsMinimaxM2p7)
2138            }
2139            "accounts/fireworks/models/minimax-m3" => {
2140                Ok(Self::AccountsFireworksModelsMinimaxM3)
2141            }
2142            "accounts/fireworks/models/qwen3p7-plus" => {
2143                Ok(Self::AccountsFireworksModelsQwen3p7Plus)
2144            }
2145            "accounts/fireworks/routers/glm-5p2-fast" => {
2146                Ok(Self::AccountsFireworksRoutersGlm5p2Fast)
2147            }
2148            "accounts/fireworks/routers/kimi-k2p6-fast" => {
2149                Ok(Self::AccountsFireworksRoutersKimiK2p6Fast)
2150            }
2151            "accounts/fireworks/routers/kimi-k2p6-turbo" => {
2152                Ok(Self::AccountsFireworksRoutersKimiK2p6Turbo)
2153            }
2154            "accounts/fireworks/routers/kimi-k2p7-code-fast" => {
2155                Ok(Self::AccountsFireworksRoutersKimiK2p7CodeFast)
2156            }
2157            _ => Err(format!("Unknown fireworks model: '{s}'")),
2158        }
2159    }
2160}
2161impl GeminiModel {
2162    #[allow(clippy::too_many_lines)]
2163    fn model_id(self) -> &'static str {
2164        match self {
2165            Self::DeepResearchMaxPreview042026 => "deep-research-max-preview-04-2026",
2166            Self::DeepResearchPreview042026 => "deep-research-preview-04-2026",
2167            Self::Gemini20Flash => "gemini-2.0-flash",
2168            Self::Gemini20FlashLite => "gemini-2.0-flash-lite",
2169            Self::Gemini25ComputerUsePreview102025 => {
2170                "gemini-2.5-computer-use-preview-10-2025"
2171            }
2172            Self::Gemini25Flash => "gemini-2.5-flash",
2173            Self::Gemini25FlashLite => "gemini-2.5-flash-lite",
2174            Self::Gemini25Pro => "gemini-2.5-pro",
2175            Self::Gemini3FlashPreview => "gemini-3-flash-preview",
2176            Self::Gemini3ProPreview => "gemini-3-pro-preview",
2177            Self::Gemini31FlashLite => "gemini-3.1-flash-lite",
2178            Self::Gemini31FlashLiteImage => "gemini-3.1-flash-lite-image",
2179            Self::Gemini31FlashLitePreview => "gemini-3.1-flash-lite-preview",
2180            Self::Gemini31FlashLivePreview => "gemini-3.1-flash-live-preview",
2181            Self::Gemini31ProPreview => "gemini-3.1-pro-preview",
2182            Self::Gemini31ProPreviewCustomtools => "gemini-3.1-pro-preview-customtools",
2183            Self::Gemini35Flash => "gemini-3.5-flash",
2184            Self::Gemini35FlashLite => "gemini-3.5-flash-lite",
2185            Self::Gemini36Flash => "gemini-3.6-flash",
2186            Self::GeminiRoboticsEr16Preview => "gemini-robotics-er-1.6-preview",
2187            Self::Gemma426bA4bIt => "gemma-4-26b-a4b-it",
2188            Self::Gemma431bIt => "gemma-4-31b-it",
2189        }
2190    }
2191    #[allow(clippy::too_many_lines)]
2192    fn display_name(self) -> &'static str {
2193        match self {
2194            Self::DeepResearchMaxPreview042026 => {
2195                "Deep Research Max Preview (Apr-21-2026)"
2196            }
2197            Self::DeepResearchPreview042026 => "Deep Research Preview (Apr-21-2026)",
2198            Self::Gemini20Flash => "Gemini 2.0 Flash",
2199            Self::Gemini20FlashLite => "Gemini 2.0 Flash-Lite",
2200            Self::Gemini25ComputerUsePreview102025 => {
2201                "Gemini 2.5 Computer Use Preview 10-2025"
2202            }
2203            Self::Gemini25Flash => "Gemini 2.5 Flash",
2204            Self::Gemini25FlashLite => "Gemini 2.5 Flash-Lite",
2205            Self::Gemini25Pro => "Gemini 2.5 Pro",
2206            Self::Gemini3FlashPreview => "Gemini 3 Flash Preview",
2207            Self::Gemini3ProPreview => "Gemini 3 Pro Preview",
2208            Self::Gemini31FlashLite => "Gemini 3.1 Flash Lite",
2209            Self::Gemini31FlashLitePreview => "Gemini 3.1 Flash Lite Preview",
2210            Self::Gemini31FlashLivePreview => "Gemini 3.1 Flash Live Preview",
2211            Self::Gemini31ProPreview => "Gemini 3.1 Pro Preview",
2212            Self::Gemini31ProPreviewCustomtools => "Gemini 3.1 Pro Preview Custom Tools",
2213            Self::Gemini35Flash => "Gemini 3.5 Flash",
2214            Self::Gemini35FlashLite => "Gemini 3.5 Flash Lite",
2215            Self::Gemini36Flash => "Gemini 3.6 Flash",
2216            Self::GeminiRoboticsEr16Preview => "Gemini Robotics-ER 1.6 Preview",
2217            Self::Gemma426bA4bIt => "Gemma 4 26B A4B IT",
2218            Self::Gemma431bIt => "Gemma 4 31B IT",
2219            Self::Gemini31FlashLiteImage => "Nano Banana 2 Lite",
2220        }
2221    }
2222    #[allow(clippy::too_many_lines)]
2223    fn context_window(self) -> u32 {
2224        match self {
2225            Self::Gemini31FlashLiteImage => 65_536,
2226            Self::DeepResearchMaxPreview042026
2227            | Self::DeepResearchPreview042026
2228            | Self::Gemini25ComputerUsePreview102025
2229            | Self::Gemini31FlashLivePreview
2230            | Self::GeminiRoboticsEr16Preview => 131_072,
2231            Self::Gemma426bA4bIt | Self::Gemma431bIt => 262_144,
2232            Self::Gemini20Flash
2233            | Self::Gemini20FlashLite
2234            | Self::Gemini25Flash
2235            | Self::Gemini25FlashLite
2236            | Self::Gemini25Pro
2237            | Self::Gemini3FlashPreview
2238            | Self::Gemini3ProPreview
2239            | Self::Gemini31FlashLite
2240            | Self::Gemini31FlashLitePreview
2241            | Self::Gemini31ProPreview
2242            | Self::Gemini31ProPreviewCustomtools
2243            | Self::Gemini35Flash
2244            | Self::Gemini35FlashLite
2245            | Self::Gemini36Flash => 1_048_576,
2246        }
2247    }
2248    #[allow(clippy::too_many_lines)]
2249    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
2250        match self {
2251            Self::Gemini20Flash | Self::Gemini20FlashLite => &[],
2252            Self::Gemini3ProPreview => &[ReasoningEffort::Low, ReasoningEffort::High],
2253            Self::DeepResearchMaxPreview042026
2254            | Self::DeepResearchPreview042026
2255            | Self::Gemini25ComputerUsePreview102025
2256            | Self::Gemini25Flash
2257            | Self::Gemini25FlashLite
2258            | Self::Gemini25Pro
2259            | Self::Gemini31ProPreview
2260            | Self::Gemini31ProPreviewCustomtools
2261            | Self::GeminiRoboticsEr16Preview
2262            | Self::Gemma426bA4bIt
2263            | Self::Gemma431bIt => {
2264                &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
2265            }
2266            Self::Gemini31FlashLiteImage => {
2267                &[ReasoningEffort::Minimal, ReasoningEffort::High]
2268            }
2269            Self::Gemini3FlashPreview
2270            | Self::Gemini31FlashLite
2271            | Self::Gemini31FlashLitePreview
2272            | Self::Gemini31FlashLivePreview
2273            | Self::Gemini35Flash
2274            | Self::Gemini35FlashLite
2275            | Self::Gemini36Flash => {
2276                &[
2277                    ReasoningEffort::Minimal,
2278                    ReasoningEffort::Low,
2279                    ReasoningEffort::Medium,
2280                    ReasoningEffort::High,
2281                ]
2282            }
2283        }
2284    }
2285    pub fn supports_reasoning(self) -> bool {
2286        !self.reasoning_levels().is_empty()
2287    }
2288    #[allow(clippy::too_many_lines)]
2289    pub fn supports_prompt_caching(self) -> bool {
2290        match self {
2291            Self::Gemini20FlashLite
2292            | Self::Gemini25ComputerUsePreview102025
2293            | Self::Gemini31FlashLiteImage
2294            | Self::Gemini31FlashLivePreview
2295            | Self::GeminiRoboticsEr16Preview
2296            | Self::Gemma426bA4bIt
2297            | Self::Gemma431bIt => false,
2298            Self::DeepResearchMaxPreview042026
2299            | Self::DeepResearchPreview042026
2300            | Self::Gemini20Flash
2301            | Self::Gemini25Flash
2302            | Self::Gemini25FlashLite
2303            | Self::Gemini25Pro
2304            | Self::Gemini3FlashPreview
2305            | Self::Gemini3ProPreview
2306            | Self::Gemini31FlashLite
2307            | Self::Gemini31FlashLitePreview
2308            | Self::Gemini31ProPreview
2309            | Self::Gemini31ProPreviewCustomtools
2310            | Self::Gemini35Flash
2311            | Self::Gemini35FlashLite
2312            | Self::Gemini36Flash => true,
2313        }
2314    }
2315    #[allow(clippy::too_many_lines)]
2316    pub fn supports_image(self) -> bool {
2317        match self {
2318            Self::DeepResearchMaxPreview042026
2319            | Self::DeepResearchPreview042026
2320            | Self::Gemini20Flash
2321            | Self::Gemini20FlashLite
2322            | Self::Gemini25ComputerUsePreview102025
2323            | Self::Gemini25Flash
2324            | Self::Gemini25FlashLite
2325            | Self::Gemini25Pro
2326            | Self::Gemini3FlashPreview
2327            | Self::Gemini3ProPreview
2328            | Self::Gemini31FlashLite
2329            | Self::Gemini31FlashLiteImage
2330            | Self::Gemini31FlashLitePreview
2331            | Self::Gemini31FlashLivePreview
2332            | Self::Gemini31ProPreview
2333            | Self::Gemini31ProPreviewCustomtools
2334            | Self::Gemini35Flash
2335            | Self::Gemini35FlashLite
2336            | Self::Gemini36Flash
2337            | Self::GeminiRoboticsEr16Preview
2338            | Self::Gemma426bA4bIt
2339            | Self::Gemma431bIt => true,
2340        }
2341    }
2342    #[allow(clippy::too_many_lines)]
2343    pub fn supports_audio(self) -> bool {
2344        match self {
2345            Self::Gemini25ComputerUsePreview102025
2346            | Self::Gemini31FlashLiteImage
2347            | Self::Gemma426bA4bIt
2348            | Self::Gemma431bIt => false,
2349            Self::DeepResearchMaxPreview042026
2350            | Self::DeepResearchPreview042026
2351            | Self::Gemini20Flash
2352            | Self::Gemini20FlashLite
2353            | Self::Gemini25Flash
2354            | Self::Gemini25FlashLite
2355            | Self::Gemini25Pro
2356            | Self::Gemini3FlashPreview
2357            | Self::Gemini3ProPreview
2358            | Self::Gemini31FlashLite
2359            | Self::Gemini31FlashLitePreview
2360            | Self::Gemini31FlashLivePreview
2361            | Self::Gemini31ProPreview
2362            | Self::Gemini31ProPreviewCustomtools
2363            | Self::Gemini35Flash
2364            | Self::Gemini35FlashLite
2365            | Self::Gemini36Flash
2366            | Self::GeminiRoboticsEr16Preview => true,
2367        }
2368    }
2369    #[allow(clippy::too_many_lines)]
2370    pub fn transport(self) -> Option<ModelTransport> {
2371        match self {
2372            Self::DeepResearchMaxPreview042026
2373            | Self::DeepResearchPreview042026
2374            | Self::Gemini20Flash
2375            | Self::Gemini20FlashLite
2376            | Self::Gemini25ComputerUsePreview102025
2377            | Self::Gemini25Flash
2378            | Self::Gemini25FlashLite
2379            | Self::Gemini25Pro
2380            | Self::Gemini3FlashPreview
2381            | Self::Gemini3ProPreview
2382            | Self::Gemini31FlashLite
2383            | Self::Gemini31FlashLiteImage
2384            | Self::Gemini31FlashLitePreview
2385            | Self::Gemini31FlashLivePreview
2386            | Self::Gemini31ProPreview
2387            | Self::Gemini31ProPreviewCustomtools
2388            | Self::Gemini35Flash
2389            | Self::Gemini35FlashLite
2390            | Self::Gemini36Flash
2391            | Self::GeminiRoboticsEr16Preview
2392            | Self::Gemma426bA4bIt
2393            | Self::Gemma431bIt => None,
2394        }
2395    }
2396    const ALL: &[GeminiModel] = &[
2397        Self::DeepResearchMaxPreview042026,
2398        Self::DeepResearchPreview042026,
2399        Self::Gemini20Flash,
2400        Self::Gemini20FlashLite,
2401        Self::Gemini25ComputerUsePreview102025,
2402        Self::Gemini25Flash,
2403        Self::Gemini25FlashLite,
2404        Self::Gemini25Pro,
2405        Self::Gemini3FlashPreview,
2406        Self::Gemini3ProPreview,
2407        Self::Gemini31FlashLite,
2408        Self::Gemini31FlashLiteImage,
2409        Self::Gemini31FlashLitePreview,
2410        Self::Gemini31FlashLivePreview,
2411        Self::Gemini31ProPreview,
2412        Self::Gemini31ProPreviewCustomtools,
2413        Self::Gemini35Flash,
2414        Self::Gemini35FlashLite,
2415        Self::Gemini36Flash,
2416        Self::GeminiRoboticsEr16Preview,
2417        Self::Gemma426bA4bIt,
2418        Self::Gemma431bIt,
2419    ];
2420}
2421impl std::str::FromStr for GeminiModel {
2422    type Err = String;
2423    #[allow(clippy::too_many_lines)]
2424    fn from_str(s: &str) -> Result<Self, Self::Err> {
2425        match s {
2426            "deep-research-max-preview-04-2026" => Ok(Self::DeepResearchMaxPreview042026),
2427            "deep-research-preview-04-2026" => Ok(Self::DeepResearchPreview042026),
2428            "gemini-2.0-flash" => Ok(Self::Gemini20Flash),
2429            "gemini-2.0-flash-lite" => Ok(Self::Gemini20FlashLite),
2430            "gemini-2.5-computer-use-preview-10-2025" => {
2431                Ok(Self::Gemini25ComputerUsePreview102025)
2432            }
2433            "gemini-2.5-flash" => Ok(Self::Gemini25Flash),
2434            "gemini-2.5-flash-lite" => Ok(Self::Gemini25FlashLite),
2435            "gemini-2.5-pro" => Ok(Self::Gemini25Pro),
2436            "gemini-3-flash-preview" => Ok(Self::Gemini3FlashPreview),
2437            "gemini-3-pro-preview" => Ok(Self::Gemini3ProPreview),
2438            "gemini-3.1-flash-lite" => Ok(Self::Gemini31FlashLite),
2439            "gemini-3.1-flash-lite-image" => Ok(Self::Gemini31FlashLiteImage),
2440            "gemini-3.1-flash-lite-preview" => Ok(Self::Gemini31FlashLitePreview),
2441            "gemini-3.1-flash-live-preview" => Ok(Self::Gemini31FlashLivePreview),
2442            "gemini-3.1-pro-preview" => Ok(Self::Gemini31ProPreview),
2443            "gemini-3.1-pro-preview-customtools" => {
2444                Ok(Self::Gemini31ProPreviewCustomtools)
2445            }
2446            "gemini-3.5-flash" => Ok(Self::Gemini35Flash),
2447            "gemini-3.5-flash-lite" => Ok(Self::Gemini35FlashLite),
2448            "gemini-3.6-flash" => Ok(Self::Gemini36Flash),
2449            "gemini-robotics-er-1.6-preview" => Ok(Self::GeminiRoboticsEr16Preview),
2450            "gemma-4-26b-a4b-it" => Ok(Self::Gemma426bA4bIt),
2451            "gemma-4-31b-it" => Ok(Self::Gemma431bIt),
2452            _ => Err(format!("Unknown gemini model: '{s}'")),
2453        }
2454    }
2455}
2456impl MoonshotModel {
2457    #[allow(clippy::too_many_lines)]
2458    fn model_id(self) -> &'static str {
2459        match self {
2460            Self::KimiK20711Preview => "kimi-k2-0711-preview",
2461            Self::KimiK20905Preview => "kimi-k2-0905-preview",
2462            Self::KimiK2Thinking => "kimi-k2-thinking",
2463            Self::KimiK2ThinkingTurbo => "kimi-k2-thinking-turbo",
2464            Self::KimiK2TurboPreview => "kimi-k2-turbo-preview",
2465            Self::KimiK25 => "kimi-k2.5",
2466            Self::KimiK26 => "kimi-k2.6",
2467            Self::KimiK27Code => "kimi-k2.7-code",
2468            Self::KimiK27CodeHighspeed => "kimi-k2.7-code-highspeed",
2469            Self::KimiK3 => "kimi-k3",
2470        }
2471    }
2472    #[allow(clippy::too_many_lines)]
2473    fn display_name(self) -> &'static str {
2474        match self {
2475            Self::KimiK20711Preview => "Kimi K2 0711",
2476            Self::KimiK20905Preview => "Kimi K2 0905",
2477            Self::KimiK2Thinking => "Kimi K2 Thinking",
2478            Self::KimiK2ThinkingTurbo => "Kimi K2 Thinking Turbo",
2479            Self::KimiK2TurboPreview => "Kimi K2 Turbo",
2480            Self::KimiK25 => "Kimi K2.5",
2481            Self::KimiK26 => "Kimi K2.6",
2482            Self::KimiK27Code => "Kimi K2.7 Code",
2483            Self::KimiK27CodeHighspeed => "Kimi K2.7 Code HighSpeed",
2484            Self::KimiK3 => "Kimi K3",
2485        }
2486    }
2487    #[allow(clippy::too_many_lines)]
2488    fn context_window(self) -> u32 {
2489        match self {
2490            Self::KimiK20711Preview => 131_072,
2491            Self::KimiK20905Preview
2492            | Self::KimiK2Thinking
2493            | Self::KimiK2ThinkingTurbo
2494            | Self::KimiK2TurboPreview
2495            | Self::KimiK25
2496            | Self::KimiK26
2497            | Self::KimiK27Code
2498            | Self::KimiK27CodeHighspeed => 262_144,
2499            Self::KimiK3 => 1_048_576,
2500        }
2501    }
2502    #[allow(clippy::too_many_lines)]
2503    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
2504        match self {
2505            Self::KimiK20711Preview
2506            | Self::KimiK20905Preview
2507            | Self::KimiK2TurboPreview => &[],
2508            Self::KimiK3 => {
2509                &[ReasoningEffort::Low, ReasoningEffort::High, ReasoningEffort::Max]
2510            }
2511            Self::KimiK2Thinking
2512            | Self::KimiK2ThinkingTurbo
2513            | Self::KimiK25
2514            | Self::KimiK26
2515            | Self::KimiK27Code
2516            | Self::KimiK27CodeHighspeed => {
2517                &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
2518            }
2519        }
2520    }
2521    pub fn supports_reasoning(self) -> bool {
2522        !self.reasoning_levels().is_empty()
2523    }
2524    #[allow(clippy::too_many_lines)]
2525    pub fn supports_prompt_caching(self) -> bool {
2526        match self {
2527            Self::KimiK20711Preview
2528            | Self::KimiK20905Preview
2529            | Self::KimiK2Thinking
2530            | Self::KimiK2ThinkingTurbo
2531            | Self::KimiK2TurboPreview
2532            | Self::KimiK25
2533            | Self::KimiK26
2534            | Self::KimiK27Code
2535            | Self::KimiK27CodeHighspeed
2536            | Self::KimiK3 => true,
2537        }
2538    }
2539    #[allow(clippy::too_many_lines)]
2540    pub fn supports_image(self) -> bool {
2541        match self {
2542            Self::KimiK20711Preview
2543            | Self::KimiK20905Preview
2544            | Self::KimiK2Thinking
2545            | Self::KimiK2ThinkingTurbo
2546            | Self::KimiK2TurboPreview => false,
2547            Self::KimiK25
2548            | Self::KimiK26
2549            | Self::KimiK27Code
2550            | Self::KimiK27CodeHighspeed
2551            | Self::KimiK3 => true,
2552        }
2553    }
2554    #[allow(clippy::too_many_lines)]
2555    pub fn supports_audio(self) -> bool {
2556        match self {
2557            Self::KimiK20711Preview
2558            | Self::KimiK20905Preview
2559            | Self::KimiK2Thinking
2560            | Self::KimiK2ThinkingTurbo
2561            | Self::KimiK2TurboPreview
2562            | Self::KimiK25
2563            | Self::KimiK26
2564            | Self::KimiK27Code
2565            | Self::KimiK27CodeHighspeed
2566            | Self::KimiK3 => false,
2567        }
2568    }
2569    #[allow(clippy::too_many_lines)]
2570    pub fn transport(self) -> Option<ModelTransport> {
2571        match self {
2572            Self::KimiK20711Preview
2573            | Self::KimiK20905Preview
2574            | Self::KimiK2Thinking
2575            | Self::KimiK2ThinkingTurbo
2576            | Self::KimiK2TurboPreview
2577            | Self::KimiK25
2578            | Self::KimiK26
2579            | Self::KimiK27Code
2580            | Self::KimiK27CodeHighspeed
2581            | Self::KimiK3 => None,
2582        }
2583    }
2584    const ALL: &[MoonshotModel] = &[
2585        Self::KimiK20711Preview,
2586        Self::KimiK20905Preview,
2587        Self::KimiK2Thinking,
2588        Self::KimiK2ThinkingTurbo,
2589        Self::KimiK2TurboPreview,
2590        Self::KimiK25,
2591        Self::KimiK26,
2592        Self::KimiK27Code,
2593        Self::KimiK27CodeHighspeed,
2594        Self::KimiK3,
2595    ];
2596}
2597impl std::str::FromStr for MoonshotModel {
2598    type Err = String;
2599    #[allow(clippy::too_many_lines)]
2600    fn from_str(s: &str) -> Result<Self, Self::Err> {
2601        match s {
2602            "kimi-k2-0711-preview" => Ok(Self::KimiK20711Preview),
2603            "kimi-k2-0905-preview" => Ok(Self::KimiK20905Preview),
2604            "kimi-k2-thinking" => Ok(Self::KimiK2Thinking),
2605            "kimi-k2-thinking-turbo" => Ok(Self::KimiK2ThinkingTurbo),
2606            "kimi-k2-turbo-preview" => Ok(Self::KimiK2TurboPreview),
2607            "kimi-k2.5" => Ok(Self::KimiK25),
2608            "kimi-k2.6" => Ok(Self::KimiK26),
2609            "kimi-k2.7-code" => Ok(Self::KimiK27Code),
2610            "kimi-k2.7-code-highspeed" => Ok(Self::KimiK27CodeHighspeed),
2611            "kimi-k3" => Ok(Self::KimiK3),
2612            _ => Err(format!("Unknown moonshot model: '{s}'")),
2613        }
2614    }
2615}
2616impl OpenaiModel {
2617    #[allow(clippy::too_many_lines)]
2618    fn model_id(self) -> &'static str {
2619        match self {
2620            Self::Gpt4 => "gpt-4",
2621            Self::Gpt4Turbo => "gpt-4-turbo",
2622            Self::Gpt41 => "gpt-4.1",
2623            Self::Gpt41Mini => "gpt-4.1-mini",
2624            Self::Gpt41Nano => "gpt-4.1-nano",
2625            Self::Gpt4o => "gpt-4o",
2626            Self::Gpt4o20240513 => "gpt-4o-2024-05-13",
2627            Self::Gpt4o20240806 => "gpt-4o-2024-08-06",
2628            Self::Gpt4o20241120 => "gpt-4o-2024-11-20",
2629            Self::Gpt4oMini => "gpt-4o-mini",
2630            Self::Gpt5 => "gpt-5",
2631            Self::Gpt5Mini => "gpt-5-mini",
2632            Self::Gpt5Nano => "gpt-5-nano",
2633            Self::Gpt5Pro => "gpt-5-pro",
2634            Self::Gpt51 => "gpt-5.1",
2635            Self::Gpt52 => "gpt-5.2",
2636            Self::Gpt52Pro => "gpt-5.2-pro",
2637            Self::Gpt53Codex => "gpt-5.3-codex",
2638            Self::Gpt53CodexSpark => "gpt-5.3-codex-spark",
2639            Self::Gpt54 => "gpt-5.4",
2640            Self::Gpt54Mini => "gpt-5.4-mini",
2641            Self::Gpt54Nano => "gpt-5.4-nano",
2642            Self::Gpt54Pro => "gpt-5.4-pro",
2643            Self::Gpt55 => "gpt-5.5",
2644            Self::Gpt55Pro => "gpt-5.5-pro",
2645            Self::Gpt56 => "gpt-5.6",
2646            Self::Gpt56Luna => "gpt-5.6-luna",
2647            Self::Gpt56Sol => "gpt-5.6-sol",
2648            Self::Gpt56Terra => "gpt-5.6-terra",
2649            Self::GptRealtime21 => "gpt-realtime-2.1",
2650            Self::O1 => "o1",
2651            Self::O1Pro => "o1-pro",
2652            Self::O3 => "o3",
2653            Self::O3Mini => "o3-mini",
2654            Self::O3Pro => "o3-pro",
2655            Self::O4Mini => "o4-mini",
2656        }
2657    }
2658    #[allow(clippy::too_many_lines)]
2659    fn display_name(self) -> &'static str {
2660        match self {
2661            Self::Gpt4 => "GPT-4",
2662            Self::Gpt4Turbo => "GPT-4 Turbo",
2663            Self::Gpt41 => "GPT-4.1",
2664            Self::Gpt41Mini => "GPT-4.1 mini",
2665            Self::Gpt41Nano => "GPT-4.1 nano",
2666            Self::Gpt4o => "GPT-4o",
2667            Self::Gpt4o20240513 => "GPT-4o (2024-05-13)",
2668            Self::Gpt4o20240806 => "GPT-4o (2024-08-06)",
2669            Self::Gpt4o20241120 => "GPT-4o (2024-11-20)",
2670            Self::Gpt4oMini => "GPT-4o mini",
2671            Self::Gpt5 => "GPT-5",
2672            Self::Gpt5Mini => "GPT-5 Mini",
2673            Self::Gpt5Nano => "GPT-5 Nano",
2674            Self::Gpt5Pro => "GPT-5 Pro",
2675            Self::Gpt51 => "GPT-5.1",
2676            Self::Gpt52 => "GPT-5.2",
2677            Self::Gpt52Pro => "GPT-5.2 Pro",
2678            Self::Gpt53Codex => "GPT-5.3 Codex",
2679            Self::Gpt53CodexSpark => "GPT-5.3 Codex Spark",
2680            Self::Gpt54 => "GPT-5.4",
2681            Self::Gpt54Pro => "GPT-5.4 Pro",
2682            Self::Gpt54Mini => "GPT-5.4 mini",
2683            Self::Gpt54Nano => "GPT-5.4 nano",
2684            Self::Gpt55 => "GPT-5.5",
2685            Self::Gpt55Pro => "GPT-5.5 Pro",
2686            Self::Gpt56 => "GPT-5.6",
2687            Self::Gpt56Luna => "GPT-5.6 Luna",
2688            Self::Gpt56Sol => "GPT-5.6 Sol",
2689            Self::Gpt56Terra => "GPT-5.6 Terra",
2690            Self::GptRealtime21 => "GPT-Realtime-2.1",
2691            Self::O1 => "o1",
2692            Self::O1Pro => "o1-pro",
2693            Self::O3 => "o3",
2694            Self::O3Mini => "o3-mini",
2695            Self::O3Pro => "o3-pro",
2696            Self::O4Mini => "o4-mini",
2697        }
2698    }
2699    #[allow(clippy::too_many_lines)]
2700    fn context_window(self) -> u32 {
2701        match self {
2702            Self::Gpt4 => 8192,
2703            Self::Gpt4Turbo
2704            | Self::Gpt4o
2705            | Self::Gpt4o20240513
2706            | Self::Gpt4o20240806
2707            | Self::Gpt4o20241120
2708            | Self::Gpt4oMini
2709            | Self::Gpt53CodexSpark
2710            | Self::GptRealtime21 => 128_000,
2711            Self::O1
2712            | Self::O1Pro
2713            | Self::O3
2714            | Self::O3Mini
2715            | Self::O3Pro
2716            | Self::O4Mini => 200_000,
2717            Self::Gpt5
2718            | Self::Gpt5Mini
2719            | Self::Gpt5Nano
2720            | Self::Gpt5Pro
2721            | Self::Gpt51
2722            | Self::Gpt52
2723            | Self::Gpt52Pro
2724            | Self::Gpt53Codex
2725            | Self::Gpt54Mini
2726            | Self::Gpt54Nano => 400_000,
2727            Self::Gpt41 | Self::Gpt41Mini | Self::Gpt41Nano => 1_047_576,
2728            Self::Gpt54
2729            | Self::Gpt54Pro
2730            | Self::Gpt55
2731            | Self::Gpt55Pro
2732            | Self::Gpt56
2733            | Self::Gpt56Luna
2734            | Self::Gpt56Sol
2735            | Self::Gpt56Terra => 1_050_000,
2736        }
2737    }
2738    #[allow(clippy::too_many_lines)]
2739    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
2740        match self {
2741            Self::Gpt4
2742            | Self::Gpt4Turbo
2743            | Self::Gpt41
2744            | Self::Gpt41Mini
2745            | Self::Gpt41Nano
2746            | Self::Gpt4o
2747            | Self::Gpt4o20240513
2748            | Self::Gpt4o20240806
2749            | Self::Gpt4o20241120
2750            | Self::Gpt4oMini => &[],
2751            Self::Gpt5Pro => &[ReasoningEffort::High],
2752            Self::Gpt51
2753            | Self::O1
2754            | Self::O1Pro
2755            | Self::O3
2756            | Self::O3Mini
2757            | Self::O3Pro
2758            | Self::O4Mini => {
2759                &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
2760            }
2761            Self::Gpt52
2762            | Self::Gpt53Codex
2763            | Self::Gpt53CodexSpark
2764            | Self::Gpt54
2765            | Self::Gpt54Mini
2766            | Self::Gpt54Nano
2767            | Self::Gpt55 => {
2768                &[
2769                    ReasoningEffort::Low,
2770                    ReasoningEffort::Medium,
2771                    ReasoningEffort::High,
2772                    ReasoningEffort::Xhigh,
2773                ]
2774            }
2775            Self::Gpt56 | Self::Gpt56Luna | Self::Gpt56Sol | Self::Gpt56Terra => {
2776                &[
2777                    ReasoningEffort::Low,
2778                    ReasoningEffort::Medium,
2779                    ReasoningEffort::High,
2780                    ReasoningEffort::Xhigh,
2781                    ReasoningEffort::Max,
2782                ]
2783            }
2784            Self::Gpt52Pro | Self::Gpt54Pro | Self::Gpt55Pro => {
2785                &[ReasoningEffort::Medium, ReasoningEffort::High, ReasoningEffort::Xhigh]
2786            }
2787            Self::Gpt5 | Self::Gpt5Mini | Self::Gpt5Nano => {
2788                &[
2789                    ReasoningEffort::Minimal,
2790                    ReasoningEffort::Low,
2791                    ReasoningEffort::Medium,
2792                    ReasoningEffort::High,
2793                ]
2794            }
2795            Self::GptRealtime21 => {
2796                &[
2797                    ReasoningEffort::Minimal,
2798                    ReasoningEffort::Low,
2799                    ReasoningEffort::Medium,
2800                    ReasoningEffort::High,
2801                    ReasoningEffort::Xhigh,
2802                ]
2803            }
2804        }
2805    }
2806    pub fn supports_reasoning(self) -> bool {
2807        !self.reasoning_levels().is_empty()
2808    }
2809    #[allow(clippy::too_many_lines)]
2810    pub fn supports_prompt_caching(self) -> bool {
2811        match self {
2812            Self::Gpt4
2813            | Self::Gpt4Turbo
2814            | Self::Gpt4o20240513
2815            | Self::Gpt5Pro
2816            | Self::Gpt52Pro
2817            | Self::Gpt54Pro
2818            | Self::Gpt55Pro
2819            | Self::O1Pro
2820            | Self::O3Pro => false,
2821            Self::Gpt41
2822            | Self::Gpt41Mini
2823            | Self::Gpt41Nano
2824            | Self::Gpt4o
2825            | Self::Gpt4o20240806
2826            | Self::Gpt4o20241120
2827            | Self::Gpt4oMini
2828            | Self::Gpt5
2829            | Self::Gpt5Mini
2830            | Self::Gpt5Nano
2831            | Self::Gpt51
2832            | Self::Gpt52
2833            | Self::Gpt53Codex
2834            | Self::Gpt53CodexSpark
2835            | Self::Gpt54
2836            | Self::Gpt54Mini
2837            | Self::Gpt54Nano
2838            | Self::Gpt55
2839            | Self::Gpt56
2840            | Self::Gpt56Luna
2841            | Self::Gpt56Sol
2842            | Self::Gpt56Terra
2843            | Self::GptRealtime21
2844            | Self::O1
2845            | Self::O3
2846            | Self::O3Mini
2847            | Self::O4Mini => true,
2848        }
2849    }
2850    #[allow(clippy::too_many_lines)]
2851    pub fn supports_image(self) -> bool {
2852        match self {
2853            Self::Gpt4 | Self::O3Mini => false,
2854            Self::Gpt4Turbo
2855            | Self::Gpt41
2856            | Self::Gpt41Mini
2857            | Self::Gpt41Nano
2858            | Self::Gpt4o
2859            | Self::Gpt4o20240513
2860            | Self::Gpt4o20240806
2861            | Self::Gpt4o20241120
2862            | Self::Gpt4oMini
2863            | Self::Gpt5
2864            | Self::Gpt5Mini
2865            | Self::Gpt5Nano
2866            | Self::Gpt5Pro
2867            | Self::Gpt51
2868            | Self::Gpt52
2869            | Self::Gpt52Pro
2870            | Self::Gpt53Codex
2871            | Self::Gpt53CodexSpark
2872            | Self::Gpt54
2873            | Self::Gpt54Mini
2874            | Self::Gpt54Nano
2875            | Self::Gpt54Pro
2876            | Self::Gpt55
2877            | Self::Gpt55Pro
2878            | Self::Gpt56
2879            | Self::Gpt56Luna
2880            | Self::Gpt56Sol
2881            | Self::Gpt56Terra
2882            | Self::GptRealtime21
2883            | Self::O1
2884            | Self::O1Pro
2885            | Self::O3
2886            | Self::O3Pro
2887            | Self::O4Mini => true,
2888        }
2889    }
2890    #[allow(clippy::too_many_lines)]
2891    pub fn supports_audio(self) -> bool {
2892        match self {
2893            Self::Gpt4
2894            | Self::Gpt4Turbo
2895            | Self::Gpt41
2896            | Self::Gpt41Mini
2897            | Self::Gpt41Nano
2898            | Self::Gpt4o
2899            | Self::Gpt4o20240513
2900            | Self::Gpt4o20240806
2901            | Self::Gpt4o20241120
2902            | Self::Gpt4oMini
2903            | Self::Gpt5
2904            | Self::Gpt5Mini
2905            | Self::Gpt5Nano
2906            | Self::Gpt5Pro
2907            | Self::Gpt51
2908            | Self::Gpt52
2909            | Self::Gpt52Pro
2910            | Self::Gpt53Codex
2911            | Self::Gpt53CodexSpark
2912            | Self::Gpt54
2913            | Self::Gpt54Mini
2914            | Self::Gpt54Nano
2915            | Self::Gpt54Pro
2916            | Self::Gpt55
2917            | Self::Gpt55Pro
2918            | Self::Gpt56
2919            | Self::Gpt56Luna
2920            | Self::Gpt56Sol
2921            | Self::Gpt56Terra
2922            | Self::O1
2923            | Self::O1Pro
2924            | Self::O3
2925            | Self::O3Mini
2926            | Self::O3Pro
2927            | Self::O4Mini => false,
2928            Self::GptRealtime21 => true,
2929        }
2930    }
2931    #[allow(clippy::too_many_lines)]
2932    pub fn transport(self) -> Option<ModelTransport> {
2933        match self {
2934            Self::Gpt4
2935            | Self::Gpt4Turbo
2936            | Self::Gpt41
2937            | Self::Gpt41Mini
2938            | Self::Gpt41Nano
2939            | Self::Gpt4o
2940            | Self::Gpt4o20240513
2941            | Self::Gpt4o20240806
2942            | Self::Gpt4o20241120
2943            | Self::Gpt4oMini
2944            | Self::Gpt5
2945            | Self::Gpt5Mini
2946            | Self::Gpt5Nano
2947            | Self::Gpt5Pro
2948            | Self::Gpt51
2949            | Self::Gpt52
2950            | Self::Gpt52Pro
2951            | Self::Gpt53Codex
2952            | Self::Gpt53CodexSpark
2953            | Self::Gpt54
2954            | Self::Gpt54Mini
2955            | Self::Gpt54Nano
2956            | Self::Gpt54Pro
2957            | Self::Gpt55
2958            | Self::Gpt55Pro
2959            | Self::Gpt56
2960            | Self::Gpt56Luna
2961            | Self::Gpt56Sol
2962            | Self::Gpt56Terra
2963            | Self::GptRealtime21
2964            | Self::O1
2965            | Self::O1Pro
2966            | Self::O3
2967            | Self::O3Mini
2968            | Self::O3Pro
2969            | Self::O4Mini => None,
2970        }
2971    }
2972    const ALL: &[OpenaiModel] = &[
2973        Self::Gpt4,
2974        Self::Gpt4Turbo,
2975        Self::Gpt41,
2976        Self::Gpt41Mini,
2977        Self::Gpt41Nano,
2978        Self::Gpt4o,
2979        Self::Gpt4o20240513,
2980        Self::Gpt4o20240806,
2981        Self::Gpt4o20241120,
2982        Self::Gpt4oMini,
2983        Self::Gpt5,
2984        Self::Gpt5Mini,
2985        Self::Gpt5Nano,
2986        Self::Gpt5Pro,
2987        Self::Gpt51,
2988        Self::Gpt52,
2989        Self::Gpt52Pro,
2990        Self::Gpt53Codex,
2991        Self::Gpt53CodexSpark,
2992        Self::Gpt54,
2993        Self::Gpt54Mini,
2994        Self::Gpt54Nano,
2995        Self::Gpt54Pro,
2996        Self::Gpt55,
2997        Self::Gpt55Pro,
2998        Self::Gpt56,
2999        Self::Gpt56Luna,
3000        Self::Gpt56Sol,
3001        Self::Gpt56Terra,
3002        Self::GptRealtime21,
3003        Self::O1,
3004        Self::O1Pro,
3005        Self::O3,
3006        Self::O3Mini,
3007        Self::O3Pro,
3008        Self::O4Mini,
3009    ];
3010}
3011impl std::str::FromStr for OpenaiModel {
3012    type Err = String;
3013    #[allow(clippy::too_many_lines)]
3014    fn from_str(s: &str) -> Result<Self, Self::Err> {
3015        match s {
3016            "gpt-4" => Ok(Self::Gpt4),
3017            "gpt-4-turbo" => Ok(Self::Gpt4Turbo),
3018            "gpt-4.1" => Ok(Self::Gpt41),
3019            "gpt-4.1-mini" => Ok(Self::Gpt41Mini),
3020            "gpt-4.1-nano" => Ok(Self::Gpt41Nano),
3021            "gpt-4o" => Ok(Self::Gpt4o),
3022            "gpt-4o-2024-05-13" => Ok(Self::Gpt4o20240513),
3023            "gpt-4o-2024-08-06" => Ok(Self::Gpt4o20240806),
3024            "gpt-4o-2024-11-20" => Ok(Self::Gpt4o20241120),
3025            "gpt-4o-mini" => Ok(Self::Gpt4oMini),
3026            "gpt-5" => Ok(Self::Gpt5),
3027            "gpt-5-mini" => Ok(Self::Gpt5Mini),
3028            "gpt-5-nano" => Ok(Self::Gpt5Nano),
3029            "gpt-5-pro" => Ok(Self::Gpt5Pro),
3030            "gpt-5.1" => Ok(Self::Gpt51),
3031            "gpt-5.2" => Ok(Self::Gpt52),
3032            "gpt-5.2-pro" => Ok(Self::Gpt52Pro),
3033            "gpt-5.3-codex" => Ok(Self::Gpt53Codex),
3034            "gpt-5.3-codex-spark" => Ok(Self::Gpt53CodexSpark),
3035            "gpt-5.4" => Ok(Self::Gpt54),
3036            "gpt-5.4-mini" => Ok(Self::Gpt54Mini),
3037            "gpt-5.4-nano" => Ok(Self::Gpt54Nano),
3038            "gpt-5.4-pro" => Ok(Self::Gpt54Pro),
3039            "gpt-5.5" => Ok(Self::Gpt55),
3040            "gpt-5.5-pro" => Ok(Self::Gpt55Pro),
3041            "gpt-5.6" => Ok(Self::Gpt56),
3042            "gpt-5.6-luna" => Ok(Self::Gpt56Luna),
3043            "gpt-5.6-sol" => Ok(Self::Gpt56Sol),
3044            "gpt-5.6-terra" => Ok(Self::Gpt56Terra),
3045            "gpt-realtime-2.1" => Ok(Self::GptRealtime21),
3046            "o1" => Ok(Self::O1),
3047            "o1-pro" => Ok(Self::O1Pro),
3048            "o3" => Ok(Self::O3),
3049            "o3-mini" => Ok(Self::O3Mini),
3050            "o3-pro" => Ok(Self::O3Pro),
3051            "o4-mini" => Ok(Self::O4Mini),
3052            _ => Err(format!("Unknown openai model: '{s}'")),
3053        }
3054    }
3055}
3056impl OpenRouterModel {
3057    #[allow(clippy::too_many_lines)]
3058    fn model_id(self) -> &'static str {
3059        match self {
3060            Self::Ai21JambaLarge17 => "ai21/jamba-large-1.7",
3061            Self::AionLabsAion20 => "aion-labs/aion-2.0",
3062            Self::AionLabsAion30 => "aion-labs/aion-3.0",
3063            Self::AionLabsAion30Mini => "aion-labs/aion-3.0-mini",
3064            Self::AmazonNova2LiteV1 => "amazon/nova-2-lite-v1",
3065            Self::AmazonNovaLiteV1 => "amazon/nova-lite-v1",
3066            Self::AmazonNovaMicroV1 => "amazon/nova-micro-v1",
3067            Self::AmazonNovaPremierV1 => "amazon/nova-premier-v1",
3068            Self::AmazonNovaProV1 => "amazon/nova-pro-v1",
3069            Self::AnthropicClaude3Haiku => "anthropic/claude-3-haiku",
3070            Self::AnthropicClaudeFable5 => "anthropic/claude-fable-5",
3071            Self::AnthropicClaudeHaiku45 => "anthropic/claude-haiku-4.5",
3072            Self::AnthropicClaudeOpus4 => "anthropic/claude-opus-4",
3073            Self::AnthropicClaudeOpus41 => "anthropic/claude-opus-4.1",
3074            Self::AnthropicClaudeOpus45 => "anthropic/claude-opus-4.5",
3075            Self::AnthropicClaudeOpus46 => "anthropic/claude-opus-4.6",
3076            Self::AnthropicClaudeOpus47 => "anthropic/claude-opus-4.7",
3077            Self::AnthropicClaudeOpus47Fast => "anthropic/claude-opus-4.7-fast",
3078            Self::AnthropicClaudeOpus48 => "anthropic/claude-opus-4.8",
3079            Self::AnthropicClaudeOpus48Fast => "anthropic/claude-opus-4.8-fast",
3080            Self::AnthropicClaudeOpus5 => "anthropic/claude-opus-5",
3081            Self::AnthropicClaudeOpus5Fast => "anthropic/claude-opus-5-fast",
3082            Self::AnthropicClaudeSonnet4 => "anthropic/claude-sonnet-4",
3083            Self::AnthropicClaudeSonnet45 => "anthropic/claude-sonnet-4.5",
3084            Self::AnthropicClaudeSonnet46 => "anthropic/claude-sonnet-4.6",
3085            Self::AnthropicClaudeSonnet5 => "anthropic/claude-sonnet-5",
3086            Self::ArceeAiTrinityLargeThinking => "arcee-ai/trinity-large-thinking",
3087            Self::ArceeAiVirtuosoLarge => "arcee-ai/virtuoso-large",
3088            Self::BytedanceSeedSeed16 => "bytedance-seed/seed-1.6",
3089            Self::BytedanceSeedSeed16Flash => "bytedance-seed/seed-1.6-flash",
3090            Self::BytedanceSeedSeed20Lite => "bytedance-seed/seed-2.0-lite",
3091            Self::BytedanceSeedSeed20Mini => "bytedance-seed/seed-2.0-mini",
3092            Self::CohereCommandR082024 => "cohere/command-r-08-2024",
3093            Self::CohereCommandRPlus082024 => "cohere/command-r-plus-08-2024",
3094            Self::CohereNorthMiniCodeFree => "cohere/north-mini-code:free",
3095            Self::DeepseekDeepseekChat => "deepseek/deepseek-chat",
3096            Self::DeepseekDeepseekChatV30324 => "deepseek/deepseek-chat-v3-0324",
3097            Self::DeepseekDeepseekChatV31 => "deepseek/deepseek-chat-v3.1",
3098            Self::DeepseekDeepseekR1 => "deepseek/deepseek-r1",
3099            Self::DeepseekDeepseekR10528 => "deepseek/deepseek-r1-0528",
3100            Self::DeepseekDeepseekV31Terminus => "deepseek/deepseek-v3.1-terminus",
3101            Self::DeepseekDeepseekV32 => "deepseek/deepseek-v3.2",
3102            Self::DeepseekDeepseekV32Exp => "deepseek/deepseek-v3.2-exp",
3103            Self::DeepseekDeepseekV4Flash => "deepseek/deepseek-v4-flash",
3104            Self::DeepseekDeepseekV4Pro => "deepseek/deepseek-v4-pro",
3105            Self::GoogleGemini25Flash => "google/gemini-2.5-flash",
3106            Self::GoogleGemini25FlashLite => "google/gemini-2.5-flash-lite",
3107            Self::GoogleGemini25Pro => "google/gemini-2.5-pro",
3108            Self::GoogleGemini25ProPreview => "google/gemini-2.5-pro-preview",
3109            Self::GoogleGemini25ProPreview0506 => "google/gemini-2.5-pro-preview-05-06",
3110            Self::GoogleGemini3FlashPreview => "google/gemini-3-flash-preview",
3111            Self::GoogleGemini3ProImage => "google/gemini-3-pro-image",
3112            Self::GoogleGemini31FlashLite => "google/gemini-3.1-flash-lite",
3113            Self::GoogleGemini31FlashLitePreview => {
3114                "google/gemini-3.1-flash-lite-preview"
3115            }
3116            Self::GoogleGemini31ProPreview => "google/gemini-3.1-pro-preview",
3117            Self::GoogleGemini31ProPreviewCustomtools => {
3118                "google/gemini-3.1-pro-preview-customtools"
3119            }
3120            Self::GoogleGemini35Flash => "google/gemini-3.5-flash",
3121            Self::GoogleGemini35FlashLite => "google/gemini-3.5-flash-lite",
3122            Self::GoogleGemini36Flash => "google/gemini-3.6-flash",
3123            Self::GoogleGemma312bIt => "google/gemma-3-12b-it",
3124            Self::GoogleGemma327bIt => "google/gemma-3-27b-it",
3125            Self::GoogleGemma426bA4bIt => "google/gemma-4-26b-a4b-it",
3126            Self::GoogleGemma426bA4bItFree => "google/gemma-4-26b-a4b-it:free",
3127            Self::GoogleGemma431bIt => "google/gemma-4-31b-it",
3128            Self::GoogleGemma431bItFree => "google/gemma-4-31b-it:free",
3129            Self::IbmGraniteGranite418b => "ibm-granite/granite-4.1-8b",
3130            Self::InceptionMercury2 => "inception/mercury-2",
3131            Self::InclusionaiLing261t => "inclusionai/ling-2.6-1t",
3132            Self::InclusionaiLing26Flash => "inclusionai/ling-2.6-flash",
3133            Self::InclusionaiLing30FlashFree => "inclusionai/ling-3.0-flash:free",
3134            Self::InclusionaiRing261t => "inclusionai/ring-2.6-1t",
3135            Self::KwaipilotKatCoderAirV25 => "kwaipilot/kat-coder-air-v2.5",
3136            Self::KwaipilotKatCoderProV2 => "kwaipilot/kat-coder-pro-v2",
3137            Self::KwaipilotKatCoderProV25 => "kwaipilot/kat-coder-pro-v2.5",
3138            Self::MeituanLongcat20 => "meituan/longcat-2.0",
3139            Self::MetaLlamaLlama3170bInstruct => "meta-llama/llama-3.1-70b-instruct",
3140            Self::MetaLlamaLlama318bInstruct => "meta-llama/llama-3.1-8b-instruct",
3141            Self::MetaLlamaLlama3370bInstruct => "meta-llama/llama-3.3-70b-instruct",
3142            Self::MetaLlamaLlama4Maverick => "meta-llama/llama-4-maverick",
3143            Self::MetaLlamaLlama4Scout => "meta-llama/llama-4-scout",
3144            Self::MetaMuseSpark11 => "meta/muse-spark-1.1",
3145            Self::MinimaxMinimaxM1 => "minimax/minimax-m1",
3146            Self::MinimaxMinimaxM2 => "minimax/minimax-m2",
3147            Self::MinimaxMinimaxM21 => "minimax/minimax-m2.1",
3148            Self::MinimaxMinimaxM25 => "minimax/minimax-m2.5",
3149            Self::MinimaxMinimaxM27 => "minimax/minimax-m2.7",
3150            Self::MinimaxMinimaxM3 => "minimax/minimax-m3",
3151            Self::MistralaiCodestral2508 => "mistralai/codestral-2508",
3152            Self::MistralaiDevstral2512 => "mistralai/devstral-2512",
3153            Self::MistralaiMinistral14b2512 => "mistralai/ministral-14b-2512",
3154            Self::MistralaiMinistral3b2512 => "mistralai/ministral-3b-2512",
3155            Self::MistralaiMinistral8b2512 => "mistralai/ministral-8b-2512",
3156            Self::MistralaiMistralLarge => "mistralai/mistral-large",
3157            Self::MistralaiMistralLarge2407 => "mistralai/mistral-large-2407",
3158            Self::MistralaiMistralLarge2512 => "mistralai/mistral-large-2512",
3159            Self::MistralaiMistralMedium3 => "mistralai/mistral-medium-3",
3160            Self::MistralaiMistralMedium35 => "mistralai/mistral-medium-3-5",
3161            Self::MistralaiMistralMedium31 => "mistralai/mistral-medium-3.1",
3162            Self::MistralaiMistralNemo => "mistralai/mistral-nemo",
3163            Self::MistralaiMistralSaba => "mistralai/mistral-saba",
3164            Self::MistralaiMistralSmall2603 => "mistralai/mistral-small-2603",
3165            Self::MistralaiMistralSmall3224bInstruct => {
3166                "mistralai/mistral-small-3.2-24b-instruct"
3167            }
3168            Self::MistralaiMixtral8x22bInstruct => "mistralai/mixtral-8x22b-instruct",
3169            Self::MistralaiVoxtralSmall24b2507 => "mistralai/voxtral-small-24b-2507",
3170            Self::MoonshotaiKimiK2 => "moonshotai/kimi-k2",
3171            Self::MoonshotaiKimiK20905 => "moonshotai/kimi-k2-0905",
3172            Self::MoonshotaiKimiK2Thinking => "moonshotai/kimi-k2-thinking",
3173            Self::MoonshotaiKimiK25 => "moonshotai/kimi-k2.5",
3174            Self::MoonshotaiKimiK26 => "moonshotai/kimi-k2.6",
3175            Self::MoonshotaiKimiK27Code => "moonshotai/kimi-k2.7-code",
3176            Self::MoonshotaiKimiK3 => "moonshotai/kimi-k3",
3177            Self::NexAgiNexN2Mini => "nex-agi/nex-n2-mini",
3178            Self::NexAgiNexN2Pro => "nex-agi/nex-n2-pro",
3179            Self::NvidiaNemotron3Nano30bA3b => "nvidia/nemotron-3-nano-30b-a3b",
3180            Self::NvidiaNemotron3Nano30bA3bFree => "nvidia/nemotron-3-nano-30b-a3b:free",
3181            Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree => {
3182                "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free"
3183            }
3184            Self::NvidiaNemotron3Super120bA12b => "nvidia/nemotron-3-super-120b-a12b",
3185            Self::NvidiaNemotron3Super120bA12bFree => {
3186                "nvidia/nemotron-3-super-120b-a12b:free"
3187            }
3188            Self::NvidiaNemotron3Ultra550bA55b => "nvidia/nemotron-3-ultra-550b-a55b",
3189            Self::NvidiaNemotron3Ultra550bA55bFree => {
3190                "nvidia/nemotron-3-ultra-550b-a55b:free"
3191            }
3192            Self::NvidiaNemotronNano12bV2VlFree => "nvidia/nemotron-nano-12b-v2-vl:free",
3193            Self::NvidiaNemotronNano9bV2Free => "nvidia/nemotron-nano-9b-v2:free",
3194            Self::OpenaiGpt35Turbo => "openai/gpt-3.5-turbo",
3195            Self::OpenaiGpt35Turbo0613 => "openai/gpt-3.5-turbo-0613",
3196            Self::OpenaiGpt35Turbo16k => "openai/gpt-3.5-turbo-16k",
3197            Self::OpenaiGpt4 => "openai/gpt-4",
3198            Self::OpenaiGpt4Turbo => "openai/gpt-4-turbo",
3199            Self::OpenaiGpt4TurboPreview => "openai/gpt-4-turbo-preview",
3200            Self::OpenaiGpt41 => "openai/gpt-4.1",
3201            Self::OpenaiGpt41Mini => "openai/gpt-4.1-mini",
3202            Self::OpenaiGpt41Nano => "openai/gpt-4.1-nano",
3203            Self::OpenaiGpt4o => "openai/gpt-4o",
3204            Self::OpenaiGpt4o20240513 => "openai/gpt-4o-2024-05-13",
3205            Self::OpenaiGpt4o20240806 => "openai/gpt-4o-2024-08-06",
3206            Self::OpenaiGpt4o20241120 => "openai/gpt-4o-2024-11-20",
3207            Self::OpenaiGpt4oMini => "openai/gpt-4o-mini",
3208            Self::OpenaiGpt4oMini20240718 => "openai/gpt-4o-mini-2024-07-18",
3209            Self::OpenaiGpt5 => "openai/gpt-5",
3210            Self::OpenaiGpt5Codex => "openai/gpt-5-codex",
3211            Self::OpenaiGpt5Mini => "openai/gpt-5-mini",
3212            Self::OpenaiGpt5Nano => "openai/gpt-5-nano",
3213            Self::OpenaiGpt5Pro => "openai/gpt-5-pro",
3214            Self::OpenaiGpt51 => "openai/gpt-5.1",
3215            Self::OpenaiGpt51Chat => "openai/gpt-5.1-chat",
3216            Self::OpenaiGpt51Codex => "openai/gpt-5.1-codex",
3217            Self::OpenaiGpt51CodexMax => "openai/gpt-5.1-codex-max",
3218            Self::OpenaiGpt51CodexMini => "openai/gpt-5.1-codex-mini",
3219            Self::OpenaiGpt52 => "openai/gpt-5.2",
3220            Self::OpenaiGpt52Chat => "openai/gpt-5.2-chat",
3221            Self::OpenaiGpt52Codex => "openai/gpt-5.2-codex",
3222            Self::OpenaiGpt52Pro => "openai/gpt-5.2-pro",
3223            Self::OpenaiGpt53Chat => "openai/gpt-5.3-chat",
3224            Self::OpenaiGpt53Codex => "openai/gpt-5.3-codex",
3225            Self::OpenaiGpt54 => "openai/gpt-5.4",
3226            Self::OpenaiGpt54Mini => "openai/gpt-5.4-mini",
3227            Self::OpenaiGpt54Nano => "openai/gpt-5.4-nano",
3228            Self::OpenaiGpt54Pro => "openai/gpt-5.4-pro",
3229            Self::OpenaiGpt55 => "openai/gpt-5.5",
3230            Self::OpenaiGpt55Pro => "openai/gpt-5.5-pro",
3231            Self::OpenaiGpt56Luna => "openai/gpt-5.6-luna",
3232            Self::OpenaiGpt56LunaPro => "openai/gpt-5.6-luna-pro",
3233            Self::OpenaiGpt56Sol => "openai/gpt-5.6-sol",
3234            Self::OpenaiGpt56SolPro => "openai/gpt-5.6-sol-pro",
3235            Self::OpenaiGpt56Terra => "openai/gpt-5.6-terra",
3236            Self::OpenaiGpt56TerraPro => "openai/gpt-5.6-terra-pro",
3237            Self::OpenaiGptAudio => "openai/gpt-audio",
3238            Self::OpenaiGptAudioMini => "openai/gpt-audio-mini",
3239            Self::OpenaiGptOss120b => "openai/gpt-oss-120b",
3240            Self::OpenaiGptOss20b => "openai/gpt-oss-20b",
3241            Self::OpenaiGptOss20bFree => "openai/gpt-oss-20b:free",
3242            Self::OpenaiGptOssSafeguard20b => "openai/gpt-oss-safeguard-20b",
3243            Self::OpenaiO1 => "openai/o1",
3244            Self::OpenaiO3 => "openai/o3",
3245            Self::OpenaiO3DeepResearch => "openai/o3-deep-research",
3246            Self::OpenaiO3Mini => "openai/o3-mini",
3247            Self::OpenaiO3MiniHigh => "openai/o3-mini-high",
3248            Self::OpenaiO3Pro => "openai/o3-pro",
3249            Self::OpenaiO4Mini => "openai/o4-mini",
3250            Self::OpenaiO4MiniDeepResearch => "openai/o4-mini-deep-research",
3251            Self::OpenaiO4MiniHigh => "openai/o4-mini-high",
3252            Self::OpenrouterAuto => "openrouter/auto",
3253            Self::OpenrouterFree => "openrouter/free",
3254            Self::PoolsideLagunaM1 => "poolside/laguna-m.1",
3255            Self::PoolsideLagunaM1Free => "poolside/laguna-m.1:free",
3256            Self::PoolsideLagunaS21 => "poolside/laguna-s-2.1",
3257            Self::PoolsideLagunaS21Free => "poolside/laguna-s-2.1:free",
3258            Self::PoolsideLagunaXs21 => "poolside/laguna-xs-2.1",
3259            Self::PoolsideLagunaXs21Free => "poolside/laguna-xs-2.1:free",
3260            Self::QwenQwen2572bInstruct => "qwen/qwen-2.5-72b-instruct",
3261            Self::QwenQwen257bInstruct => "qwen/qwen-2.5-7b-instruct",
3262            Self::QwenQwenPlus => "qwen/qwen-plus",
3263            Self::QwenQwenPlus20250728 => "qwen/qwen-plus-2025-07-28",
3264            Self::QwenQwenPlus20250728Thinking => "qwen/qwen-plus-2025-07-28:thinking",
3265            Self::QwenQwen314b => "qwen/qwen3-14b",
3266            Self::QwenQwen3235bA22b => "qwen/qwen3-235b-a22b",
3267            Self::QwenQwen3235bA22b2507 => "qwen/qwen3-235b-a22b-2507",
3268            Self::QwenQwen3235bA22bThinking2507 => "qwen/qwen3-235b-a22b-thinking-2507",
3269            Self::QwenQwen330bA3b => "qwen/qwen3-30b-a3b",
3270            Self::QwenQwen330bA3bInstruct2507 => "qwen/qwen3-30b-a3b-instruct-2507",
3271            Self::QwenQwen330bA3bThinking2507 => "qwen/qwen3-30b-a3b-thinking-2507",
3272            Self::QwenQwen332b => "qwen/qwen3-32b",
3273            Self::QwenQwen38b => "qwen/qwen3-8b",
3274            Self::QwenQwen3Coder => "qwen/qwen3-coder",
3275            Self::QwenQwen3Coder30bA3bInstruct => "qwen/qwen3-coder-30b-a3b-instruct",
3276            Self::QwenQwen3CoderFlash => "qwen/qwen3-coder-flash",
3277            Self::QwenQwen3CoderNext => "qwen/qwen3-coder-next",
3278            Self::QwenQwen3CoderPlus => "qwen/qwen3-coder-plus",
3279            Self::QwenQwen3Max => "qwen/qwen3-max",
3280            Self::QwenQwen3MaxThinking => "qwen/qwen3-max-thinking",
3281            Self::QwenQwen3Next80bA3bInstruct => "qwen/qwen3-next-80b-a3b-instruct",
3282            Self::QwenQwen3Next80bA3bThinking => "qwen/qwen3-next-80b-a3b-thinking",
3283            Self::QwenQwen3Vl235bA22bInstruct => "qwen/qwen3-vl-235b-a22b-instruct",
3284            Self::QwenQwen3Vl235bA22bThinking => "qwen/qwen3-vl-235b-a22b-thinking",
3285            Self::QwenQwen3Vl30bA3bInstruct => "qwen/qwen3-vl-30b-a3b-instruct",
3286            Self::QwenQwen3Vl30bA3bThinking => "qwen/qwen3-vl-30b-a3b-thinking",
3287            Self::QwenQwen3Vl32bInstruct => "qwen/qwen3-vl-32b-instruct",
3288            Self::QwenQwen3Vl8bInstruct => "qwen/qwen3-vl-8b-instruct",
3289            Self::QwenQwen3Vl8bThinking => "qwen/qwen3-vl-8b-thinking",
3290            Self::QwenQwen35122bA10b => "qwen/qwen3.5-122b-a10b",
3291            Self::QwenQwen3527b => "qwen/qwen3.5-27b",
3292            Self::QwenQwen3535bA3b => "qwen/qwen3.5-35b-a3b",
3293            Self::QwenQwen35397bA17b => "qwen/qwen3.5-397b-a17b",
3294            Self::QwenQwen359b => "qwen/qwen3.5-9b",
3295            Self::QwenQwen35Flash0223 => "qwen/qwen3.5-flash-02-23",
3296            Self::QwenQwen35Plus0215 => "qwen/qwen3.5-plus-02-15",
3297            Self::QwenQwen35Plus20260420 => "qwen/qwen3.5-plus-20260420",
3298            Self::QwenQwen3627b => "qwen/qwen3.6-27b",
3299            Self::QwenQwen3635bA3b => "qwen/qwen3.6-35b-a3b",
3300            Self::QwenQwen36Flash => "qwen/qwen3.6-flash",
3301            Self::QwenQwen36MaxPreview => "qwen/qwen3.6-max-preview",
3302            Self::QwenQwen36Plus => "qwen/qwen3.6-plus",
3303            Self::QwenQwen37Max => "qwen/qwen3.7-max",
3304            Self::QwenQwen37Plus => "qwen/qwen3.7-plus",
3305            Self::RekaaiRekaEdge => "rekaai/reka-edge",
3306            Self::RelaceRelaceSearch => "relace/relace-search",
3307            Self::SakanaFuguUltra => "sakana/fugu-ultra",
3308            Self::Sao10kL31Euryale70b => "sao10k/l3.1-euryale-70b",
3309            Self::StepfunStep35Flash => "stepfun/step-3.5-flash",
3310            Self::StepfunStep37Flash => "stepfun/step-3.7-flash",
3311            Self::TencentHy3 => "tencent/hy3",
3312            Self::TencentHy3Preview => "tencent/hy3-preview",
3313            Self::ThedrummerUnslopnemo12b => "thedrummer/unslopnemo-12b",
3314            Self::ThinkingmachinesInkling => "thinkingmachines/inkling",
3315            Self::UpstageSolarPro3 => "upstage/solar-pro-3",
3316            Self::XAiGrok420 => "x-ai/grok-4.20",
3317            Self::XAiGrok43 => "x-ai/grok-4.3",
3318            Self::XAiGrok45 => "x-ai/grok-4.5",
3319            Self::XAiGrokBuild01 => "x-ai/grok-build-0.1",
3320            Self::XiaomiMimoV25 => "xiaomi/mimo-v2.5",
3321            Self::XiaomiMimoV25Pro => "xiaomi/mimo-v2.5-pro",
3322            Self::ZAiGlm45 => "z-ai/glm-4.5",
3323            Self::ZAiGlm45Air => "z-ai/glm-4.5-air",
3324            Self::ZAiGlm45v => "z-ai/glm-4.5v",
3325            Self::ZAiGlm46 => "z-ai/glm-4.6",
3326            Self::ZAiGlm46v => "z-ai/glm-4.6v",
3327            Self::ZAiGlm47 => "z-ai/glm-4.7",
3328            Self::ZAiGlm47Flash => "z-ai/glm-4.7-flash",
3329            Self::ZAiGlm5 => "z-ai/glm-5",
3330            Self::ZAiGlm5Turbo => "z-ai/glm-5-turbo",
3331            Self::ZAiGlm51 => "z-ai/glm-5.1",
3332            Self::ZAiGlm52 => "z-ai/glm-5.2",
3333            Self::ZAiGlm5vTurbo => "z-ai/glm-5v-turbo",
3334        }
3335    }
3336    #[allow(clippy::too_many_lines)]
3337    fn display_name(self) -> &'static str {
3338        match self {
3339            Self::AionLabsAion20 => "Aion-2.0",
3340            Self::AionLabsAion30 => "Aion-3.0",
3341            Self::AionLabsAion30Mini => "Aion-3.0-Mini",
3342            Self::OpenrouterAuto => "Auto Router",
3343            Self::AnthropicClaude3Haiku => "Claude 3 Haiku",
3344            Self::AnthropicClaudeFable5 => "Claude Fable 5",
3345            Self::AnthropicClaudeHaiku45 => "Claude Haiku 4.5 (latest)",
3346            Self::AnthropicClaudeOpus4 => "Claude Opus 4",
3347            Self::AnthropicClaudeOpus41 => "Claude Opus 4.1 (latest)",
3348            Self::AnthropicClaudeOpus45 => "Claude Opus 4.5 (latest)",
3349            Self::AnthropicClaudeOpus46 => "Claude Opus 4.6",
3350            Self::AnthropicClaudeOpus47 => "Claude Opus 4.7",
3351            Self::AnthropicClaudeOpus47Fast => "Claude Opus 4.7 (Fast)",
3352            Self::AnthropicClaudeOpus48 => "Claude Opus 4.8",
3353            Self::AnthropicClaudeOpus48Fast => "Claude Opus 4.8 (Fast)",
3354            Self::AnthropicClaudeOpus5 => "Claude Opus 5",
3355            Self::AnthropicClaudeOpus5Fast => "Claude Opus 5 (Fast)",
3356            Self::AnthropicClaudeSonnet4 => "Claude Sonnet 4",
3357            Self::AnthropicClaudeSonnet45 => "Claude Sonnet 4.5 (latest)",
3358            Self::AnthropicClaudeSonnet46 => "Claude Sonnet 4.6",
3359            Self::AnthropicClaudeSonnet5 => "Claude Sonnet 5",
3360            Self::MistralaiCodestral2508 => "Codestral 2508",
3361            Self::CohereCommandR082024 => "Command R",
3362            Self::CohereCommandRPlus082024 => "Command R+",
3363            Self::DeepseekDeepseekChat => "DeepSeek Chat",
3364            Self::DeepseekDeepseekChatV30324 => "DeepSeek V3 0324",
3365            Self::DeepseekDeepseekChatV31 => "DeepSeek V3.1",
3366            Self::DeepseekDeepseekV31Terminus => "DeepSeek V3.1 Terminus",
3367            Self::DeepseekDeepseekV32 => "DeepSeek V3.2",
3368            Self::DeepseekDeepseekV32Exp => "DeepSeek V3.2 Exp",
3369            Self::DeepseekDeepseekV4Flash => "DeepSeek V4 Flash",
3370            Self::DeepseekDeepseekV4Pro => "DeepSeek V4 Pro",
3371            Self::DeepseekDeepseekR1 => "DeepSeek-R1",
3372            Self::MistralaiDevstral2512 => "Devstral 2",
3373            Self::OpenrouterFree => "Free Models Router",
3374            Self::SakanaFuguUltra => "Fugu Ultra",
3375            Self::ZAiGlm45 => "GLM-4.5",
3376            Self::ZAiGlm45Air => "GLM-4.5-Air",
3377            Self::ZAiGlm45v => "GLM-4.5V",
3378            Self::ZAiGlm46 => "GLM-4.6",
3379            Self::ZAiGlm46v => "GLM-4.6V",
3380            Self::ZAiGlm47 => "GLM-4.7",
3381            Self::ZAiGlm47Flash => "GLM-4.7-Flash",
3382            Self::ZAiGlm5 => "GLM-5",
3383            Self::ZAiGlm5Turbo => "GLM-5-Turbo",
3384            Self::ZAiGlm51 => "GLM-5.1",
3385            Self::ZAiGlm52 => "GLM-5.2",
3386            Self::ZAiGlm5vTurbo => "GLM-5V-Turbo",
3387            Self::OpenaiGptAudio => "GPT Audio",
3388            Self::OpenaiGptAudioMini => "GPT Audio Mini",
3389            Self::OpenaiGptOss120b => "GPT OSS 120B",
3390            Self::OpenaiGptOss20b => "GPT OSS 20B",
3391            Self::OpenaiGpt35Turbo0613 => "GPT-3.5 Turbo (older v0613)",
3392            Self::OpenaiGpt35Turbo16k => "GPT-3.5 Turbo 16k",
3393            Self::OpenaiGpt35Turbo => "GPT-3.5-turbo",
3394            Self::OpenaiGpt4 => "GPT-4",
3395            Self::OpenaiGpt4Turbo => "GPT-4 Turbo",
3396            Self::OpenaiGpt4TurboPreview => "GPT-4 Turbo Preview",
3397            Self::OpenaiGpt41 => "GPT-4.1",
3398            Self::OpenaiGpt41Mini => "GPT-4.1 mini",
3399            Self::OpenaiGpt41Nano => "GPT-4.1 nano",
3400            Self::OpenaiGpt4o => "GPT-4o",
3401            Self::OpenaiGpt4o20240513 => "GPT-4o (2024-05-13)",
3402            Self::OpenaiGpt4o20240806 => "GPT-4o (2024-08-06)",
3403            Self::OpenaiGpt4o20241120 => "GPT-4o (2024-11-20)",
3404            Self::OpenaiGpt4oMini => "GPT-4o mini",
3405            Self::OpenaiGpt4oMini20240718 => "GPT-4o-mini (2024-07-18)",
3406            Self::OpenaiGpt5 => "GPT-5",
3407            Self::OpenaiGpt5Mini => "GPT-5 Mini",
3408            Self::OpenaiGpt5Nano => "GPT-5 Nano",
3409            Self::OpenaiGpt5Pro => "GPT-5 Pro",
3410            Self::OpenaiGpt5Codex => "GPT-5-Codex",
3411            Self::OpenaiGpt51 => "GPT-5.1",
3412            Self::OpenaiGpt51Chat => "GPT-5.1 Chat",
3413            Self::OpenaiGpt51Codex => "GPT-5.1 Codex",
3414            Self::OpenaiGpt51CodexMax => "GPT-5.1 Codex Max",
3415            Self::OpenaiGpt51CodexMini => "GPT-5.1 Codex mini",
3416            Self::OpenaiGpt52 => "GPT-5.2",
3417            Self::OpenaiGpt52Chat => "GPT-5.2 Chat",
3418            Self::OpenaiGpt52Codex => "GPT-5.2 Codex",
3419            Self::OpenaiGpt52Pro => "GPT-5.2 Pro",
3420            Self::OpenaiGpt53Chat => "GPT-5.3 Chat",
3421            Self::OpenaiGpt53Codex => "GPT-5.3 Codex",
3422            Self::OpenaiGpt54 => "GPT-5.4",
3423            Self::OpenaiGpt54Pro => "GPT-5.4 Pro",
3424            Self::OpenaiGpt54Mini => "GPT-5.4 mini",
3425            Self::OpenaiGpt54Nano => "GPT-5.4 nano",
3426            Self::OpenaiGpt55 => "GPT-5.5",
3427            Self::OpenaiGpt55Pro => "GPT-5.5 Pro",
3428            Self::OpenaiGpt56Luna => "GPT-5.6 Luna",
3429            Self::OpenaiGpt56LunaPro => "GPT-5.6 Luna Pro",
3430            Self::OpenaiGpt56Sol => "GPT-5.6 Sol",
3431            Self::OpenaiGpt56SolPro => "GPT-5.6 Sol Pro",
3432            Self::OpenaiGpt56Terra => "GPT-5.6 Terra",
3433            Self::OpenaiGpt56TerraPro => "GPT-5.6 Terra Pro",
3434            Self::GoogleGemini25Flash => "Gemini 2.5 Flash",
3435            Self::GoogleGemini25FlashLite => "Gemini 2.5 Flash-Lite",
3436            Self::GoogleGemini25Pro => "Gemini 2.5 Pro",
3437            Self::GoogleGemini25ProPreview0506 => "Gemini 2.5 Pro Preview 05-06",
3438            Self::GoogleGemini25ProPreview => "Gemini 2.5 Pro Preview 06-05",
3439            Self::GoogleGemini3FlashPreview => "Gemini 3 Flash Preview",
3440            Self::GoogleGemini31FlashLite => "Gemini 3.1 Flash Lite",
3441            Self::GoogleGemini31FlashLitePreview => "Gemini 3.1 Flash Lite Preview",
3442            Self::GoogleGemini31ProPreview => "Gemini 3.1 Pro Preview",
3443            Self::GoogleGemini31ProPreviewCustomtools => {
3444                "Gemini 3.1 Pro Preview Custom Tools"
3445            }
3446            Self::GoogleGemini35Flash => "Gemini 3.5 Flash",
3447            Self::GoogleGemini35FlashLite => "Gemini 3.5 Flash Lite",
3448            Self::GoogleGemini36Flash => "Gemini 3.6 Flash",
3449            Self::GoogleGemma312bIt => "Gemma 3 12B",
3450            Self::GoogleGemma327bIt => "Gemma 3 27B",
3451            Self::GoogleGemma426bA4bItFree => "Gemma 4 26B A4B  (free)",
3452            Self::GoogleGemma426bA4bIt => "Gemma 4 26B A4B IT",
3453            Self::GoogleGemma431bItFree => "Gemma 4 31B (free)",
3454            Self::GoogleGemma431bIt => "Gemma 4 31B IT",
3455            Self::IbmGraniteGranite418b => "Granite 4.1 8B",
3456            Self::XAiGrok420 => "Grok 4.20",
3457            Self::XAiGrok43 => "Grok 4.3",
3458            Self::XAiGrok45 => "Grok 4.5",
3459            Self::XAiGrokBuild01 => "Grok Build 0.1",
3460            Self::TencentHy3 => "Hy3",
3461            Self::TencentHy3Preview => "Hy3 preview",
3462            Self::ThinkingmachinesInkling => "Inkling",
3463            Self::Ai21JambaLarge17 => "Jamba Large 1.7",
3464            Self::KwaipilotKatCoderAirV25 => "KAT-Coder-Air V2.5",
3465            Self::KwaipilotKatCoderProV2 => "KAT-Coder-Pro V2",
3466            Self::KwaipilotKatCoderProV25 => "KAT-Coder-Pro V2.5",
3467            Self::MoonshotaiKimiK2 => "Kimi K2 0711",
3468            Self::MoonshotaiKimiK20905 => "Kimi K2 0905",
3469            Self::MoonshotaiKimiK2Thinking => "Kimi K2 Thinking",
3470            Self::MoonshotaiKimiK25 => "Kimi K2.5",
3471            Self::MoonshotaiKimiK26 => "Kimi K2.6",
3472            Self::MoonshotaiKimiK27Code => "Kimi K2.7 Code",
3473            Self::MoonshotaiKimiK3 => "Kimi K3",
3474            Self::PoolsideLagunaM1 => "Laguna M.1",
3475            Self::PoolsideLagunaM1Free => "Laguna M.1 (free)",
3476            Self::PoolsideLagunaS21 => "Laguna S 2.1",
3477            Self::PoolsideLagunaS21Free => "Laguna S 2.1 (free)",
3478            Self::PoolsideLagunaXs21 => "Laguna XS 2.1",
3479            Self::PoolsideLagunaXs21Free => "Laguna XS 2.1 (free)",
3480            Self::InclusionaiLing261t => "Ling-2.6-1T",
3481            Self::InclusionaiLing26Flash => "Ling-2.6-flash",
3482            Self::InclusionaiLing30FlashFree => "Ling-3.0-flash (free)",
3483            Self::MetaLlamaLlama3170bInstruct => "Llama 3.1 70B Instruct",
3484            Self::MetaLlamaLlama318bInstruct => "Llama 3.1 8B Instruct",
3485            Self::Sao10kL31Euryale70b => "Llama 3.1 Euryale 70B v2.2",
3486            Self::MetaLlamaLlama4Maverick => "Llama 4 Maverick",
3487            Self::MetaLlamaLlama4Scout => "Llama 4 Scout",
3488            Self::MetaLlamaLlama3370bInstruct => "Llama-3.3-70B-Instruct",
3489            Self::MeituanLongcat20 => "LongCat 2.0",
3490            Self::InceptionMercury2 => "Mercury 2",
3491            Self::XiaomiMimoV25 => "MiMo-V2.5",
3492            Self::XiaomiMimoV25Pro => "MiMo-V2.5-Pro",
3493            Self::MinimaxMinimaxM1 => "MiniMax M1",
3494            Self::MinimaxMinimaxM2 => "MiniMax-M2",
3495            Self::MinimaxMinimaxM21 => "MiniMax-M2.1",
3496            Self::MinimaxMinimaxM25 => "MiniMax-M2.5",
3497            Self::MinimaxMinimaxM27 => "MiniMax-M2.7",
3498            Self::MinimaxMinimaxM3 => "MiniMax-M3",
3499            Self::MistralaiMinistral14b2512 => "Ministral 3 14B 2512",
3500            Self::MistralaiMinistral3b2512 => "Ministral 3 3B 2512",
3501            Self::MistralaiMinistral8b2512 => "Ministral 3 8B 2512",
3502            Self::MistralaiMistralLarge => "Mistral Large",
3503            Self::MistralaiMistralLarge2407 => "Mistral Large 2407",
3504            Self::MistralaiMistralLarge2512 => "Mistral Large 3",
3505            Self::MistralaiMistralMedium3 => "Mistral Medium 3",
3506            Self::MistralaiMistralMedium31 => "Mistral Medium 3.1",
3507            Self::MistralaiMistralMedium35 => "Mistral Medium 3.5",
3508            Self::MistralaiMistralNemo => "Mistral Nemo",
3509            Self::MistralaiMistralSmall3224bInstruct => "Mistral Small 3.2 24B",
3510            Self::MistralaiMistralSmall2603 => "Mistral Small 4",
3511            Self::MistralaiMixtral8x22bInstruct => "Mixtral 8x22B Instruct",
3512            Self::MetaMuseSpark11 => "Muse Spark 1.1",
3513            Self::GoogleGemini3ProImage => "Nano Banana Pro",
3514            Self::NvidiaNemotron3Nano30bA3b => "Nemotron 3 Nano 30B A3B",
3515            Self::NvidiaNemotron3Nano30bA3bFree => "Nemotron 3 Nano 30B A3B (free)",
3516            Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree => {
3517                "Nemotron 3 Nano Omni (free)"
3518            }
3519            Self::NvidiaNemotron3Super120bA12bFree => "Nemotron 3 Super (free)",
3520            Self::NvidiaNemotron3Super120bA12b => "Nemotron 3 Super 120B A12B",
3521            Self::NvidiaNemotron3Ultra550bA55bFree => "Nemotron 3 Ultra (free)",
3522            Self::NvidiaNemotron3Ultra550bA55b => "Nemotron 3 Ultra 550B A55B",
3523            Self::NvidiaNemotronNano12bV2VlFree => "Nemotron Nano 12B 2 VL (free)",
3524            Self::NvidiaNemotronNano9bV2Free => "Nemotron Nano 9B V2 (free)",
3525            Self::NexAgiNexN2Mini => "Nex-N2-Mini",
3526            Self::NexAgiNexN2Pro => "Nex-N2-Pro",
3527            Self::CohereNorthMiniCodeFree => "North Mini Code (free)",
3528            Self::AmazonNova2LiteV1 => "Nova 2 Lite",
3529            Self::AmazonNovaLiteV1 => "Nova Lite 1.0",
3530            Self::AmazonNovaMicroV1 => "Nova Micro 1.0",
3531            Self::AmazonNovaPremierV1 => "Nova Premier 1.0",
3532            Self::AmazonNovaProV1 => "Nova Pro 1.0",
3533            Self::QwenQwenPlus => "Qwen Plus",
3534            Self::QwenQwenPlus20250728 => "Qwen Plus 0728",
3535            Self::QwenQwenPlus20250728Thinking => "Qwen Plus 0728 (thinking)",
3536            Self::QwenQwen2572bInstruct => "Qwen2.5 72B Instruct",
3537            Self::QwenQwen257bInstruct => "Qwen2.5 7B Instruct",
3538            Self::QwenQwen314b => "Qwen3 14B",
3539            Self::QwenQwen3235bA22b2507 => "Qwen3 235B A22B Instruct 2507",
3540            Self::QwenQwen3235bA22bThinking2507 => "Qwen3 235B A22B Thinking 2507",
3541            Self::QwenQwen3235bA22b => "Qwen3 235B-A22B",
3542            Self::QwenQwen330bA3b => "Qwen3 30B A3B",
3543            Self::QwenQwen330bA3bInstruct2507 => "Qwen3 30B A3B Instruct 2507",
3544            Self::QwenQwen330bA3bThinking2507 => "Qwen3 30B A3B Thinking 2507",
3545            Self::QwenQwen332b => "Qwen3 32B",
3546            Self::QwenQwen38b => "Qwen3 8B",
3547            Self::QwenQwen3Coder => "Qwen3 Coder 480B A35B",
3548            Self::QwenQwen3CoderFlash => "Qwen3 Coder Flash",
3549            Self::QwenQwen3CoderNext => "Qwen3 Coder Next",
3550            Self::QwenQwen3CoderPlus => "Qwen3 Coder Plus",
3551            Self::QwenQwen3Max => "Qwen3 Max",
3552            Self::QwenQwen3MaxThinking => "Qwen3 Max Thinking",
3553            Self::QwenQwen3Vl235bA22bInstruct => "Qwen3 VL 235B A22B Instruct",
3554            Self::QwenQwen3Vl235bA22bThinking => "Qwen3 VL 235B A22B Thinking",
3555            Self::QwenQwen3Vl30bA3bInstruct => "Qwen3 VL 30B A3B Instruct",
3556            Self::QwenQwen3Vl30bA3bThinking => "Qwen3 VL 30B A3B Thinking",
3557            Self::QwenQwen3Vl32bInstruct => "Qwen3 VL 32B Instruct",
3558            Self::QwenQwen3Vl8bInstruct => "Qwen3 VL 8B Instruct",
3559            Self::QwenQwen3Vl8bThinking => "Qwen3 VL 8B Thinking",
3560            Self::QwenQwen3Coder30bA3bInstruct => "Qwen3-Coder 30B-A3B Instruct",
3561            Self::QwenQwen3Next80bA3bThinking => "Qwen3-Next 80B-A3B (Thinking)",
3562            Self::QwenQwen3Next80bA3bInstruct => "Qwen3-Next 80B-A3B Instruct",
3563            Self::QwenQwen35122bA10b => "Qwen3.5 122B-A10B",
3564            Self::QwenQwen3527b => "Qwen3.5 27B",
3565            Self::QwenQwen3535bA3b => "Qwen3.5 35B-A3B",
3566            Self::QwenQwen35397bA17b => "Qwen3.5 397B-A17B",
3567            Self::QwenQwen359b => "Qwen3.5 9B",
3568            Self::QwenQwen35Plus0215 => "Qwen3.5 Plus 2026-02-15",
3569            Self::QwenQwen35Plus20260420 => "Qwen3.5 Plus 2026-04-20",
3570            Self::QwenQwen35Flash0223 => "Qwen3.5-Flash",
3571            Self::QwenQwen3627b => "Qwen3.6 27B",
3572            Self::QwenQwen3635bA3b => "Qwen3.6 35B-A3B",
3573            Self::QwenQwen36Flash => "Qwen3.6 Flash",
3574            Self::QwenQwen36MaxPreview => "Qwen3.6 Max Preview",
3575            Self::QwenQwen36Plus => "Qwen3.6 Plus",
3576            Self::QwenQwen37Max => "Qwen3.7 Max",
3577            Self::QwenQwen37Plus => "Qwen3.7 Plus",
3578            Self::DeepseekDeepseekR10528 => "R1 0528",
3579            Self::RekaaiRekaEdge => "Reka Edge",
3580            Self::RelaceRelaceSearch => "Relace Search",
3581            Self::InclusionaiRing261t => "Ring-2.6-1T",
3582            Self::MistralaiMistralSaba => "Saba",
3583            Self::BytedanceSeedSeed16 => "Seed 1.6",
3584            Self::BytedanceSeedSeed16Flash => "Seed 1.6 Flash",
3585            Self::BytedanceSeedSeed20Lite => "Seed-2.0-Lite",
3586            Self::BytedanceSeedSeed20Mini => "Seed-2.0-Mini",
3587            Self::UpstageSolarPro3 => "Solar Pro 3",
3588            Self::StepfunStep35Flash => "Step 3.5 Flash",
3589            Self::StepfunStep37Flash => "Step 3.7 Flash",
3590            Self::ArceeAiTrinityLargeThinking => "Trinity Large Thinking",
3591            Self::ThedrummerUnslopnemo12b => "UnslopNemo 12B",
3592            Self::ArceeAiVirtuosoLarge => "Virtuoso Large",
3593            Self::MistralaiVoxtralSmall24b2507 => "Voxtral Small 24B 2507",
3594            Self::OpenaiGptOss20bFree => "gpt-oss-20b (free)",
3595            Self::OpenaiGptOssSafeguard20b => "gpt-oss-safeguard-20b",
3596            Self::OpenaiO1 => "o1",
3597            Self::OpenaiO3 => "o3",
3598            Self::OpenaiO3MiniHigh => "o3 Mini High",
3599            Self::OpenaiO3DeepResearch => "o3-deep-research",
3600            Self::OpenaiO3Mini => "o3-mini",
3601            Self::OpenaiO3Pro => "o3-pro",
3602            Self::OpenaiO4MiniHigh => "o4 Mini High",
3603            Self::OpenaiO4Mini => "o4-mini",
3604            Self::OpenaiO4MiniDeepResearch => "o4-mini-deep-research",
3605        }
3606    }
3607    #[allow(clippy::too_many_lines)]
3608    fn context_window(self) -> u32 {
3609        match self {
3610            Self::OpenaiGpt35Turbo0613 => 4095,
3611            Self::OpenaiGpt4 => 8191,
3612            Self::RekaaiRekaEdge => 16_384,
3613            Self::OpenaiGpt35Turbo | Self::OpenaiGpt35Turbo16k => 16_385,
3614            Self::MistralaiVoxtralSmall24b2507 => 32_000,
3615            Self::MistralaiMistralSaba
3616            | Self::QwenQwen2572bInstruct
3617            | Self::QwenQwen257bInstruct
3618            | Self::ThedrummerUnslopnemo12b => 32_768,
3619            Self::MistralaiMixtral8x22bInstruct | Self::ZAiGlm45v => 65_536,
3620            Self::QwenQwen330bA3bThinking2507 => 81_920,
3621            Self::AmazonNovaMicroV1
3622            | Self::CohereCommandR082024
3623            | Self::CohereCommandRPlus082024
3624            | Self::InceptionMercury2
3625            | Self::MistralaiMistralLarge
3626            | Self::NvidiaNemotronNano12bV2VlFree
3627            | Self::NvidiaNemotronNano9bV2Free
3628            | Self::OpenaiGpt4Turbo
3629            | Self::OpenaiGpt4TurboPreview
3630            | Self::OpenaiGpt4o
3631            | Self::OpenaiGpt4o20240513
3632            | Self::OpenaiGpt4o20240806
3633            | Self::OpenaiGpt4o20241120
3634            | Self::OpenaiGpt4oMini
3635            | Self::OpenaiGpt4oMini20240718
3636            | Self::OpenaiGpt51Chat
3637            | Self::OpenaiGpt52Chat
3638            | Self::OpenaiGpt53Chat
3639            | Self::OpenaiGptAudio
3640            | Self::OpenaiGptAudioMini
3641            | Self::UpstageSolarPro3 => 128_000,
3642            Self::AionLabsAion20
3643            | Self::AionLabsAion30
3644            | Self::AionLabsAion30Mini
3645            | Self::ArceeAiVirtuosoLarge
3646            | Self::GoogleGemini3ProImage
3647            | Self::GoogleGemma312bIt
3648            | Self::IbmGraniteGranite418b
3649            | Self::MetaLlamaLlama3170bInstruct
3650            | Self::MetaLlamaLlama318bInstruct
3651            | Self::MetaLlamaLlama3370bInstruct
3652            | Self::MistralaiMinistral3b2512
3653            | Self::MistralaiMistralLarge2407
3654            | Self::MistralaiMistralMedium3
3655            | Self::MistralaiMistralMedium31
3656            | Self::MistralaiMistralNemo
3657            | Self::MoonshotaiKimiK2
3658            | Self::OpenaiGptOss120b
3659            | Self::OpenaiGptOss20b
3660            | Self::OpenaiGptOss20bFree
3661            | Self::OpenaiGptOssSafeguard20b
3662            | Self::QwenQwen314b
3663            | Self::QwenQwen3235bA22b
3664            | Self::QwenQwen330bA3b
3665            | Self::QwenQwen332b
3666            | Self::QwenQwen38b
3667            | Self::QwenQwen3Vl235bA22bThinking
3668            | Self::QwenQwen3Vl32bInstruct
3669            | Self::QwenQwen3Vl8bThinking
3670            | Self::Sao10kL31Euryale70b
3671            | Self::ZAiGlm45
3672            | Self::ZAiGlm45Air
3673            | Self::ZAiGlm46v => 131_072,
3674            Self::DeepseekDeepseekChat
3675            | Self::DeepseekDeepseekChatV30324
3676            | Self::DeepseekDeepseekChatV31
3677            | Self::DeepseekDeepseekR1
3678            | Self::DeepseekDeepseekR10528
3679            | Self::DeepseekDeepseekV31Terminus
3680            | Self::DeepseekDeepseekV32
3681            | Self::DeepseekDeepseekV32Exp => 163_840,
3682            Self::AnthropicClaude3Haiku
3683            | Self::AnthropicClaudeHaiku45
3684            | Self::AnthropicClaudeOpus4
3685            | Self::AnthropicClaudeOpus41
3686            | Self::AnthropicClaudeOpus45
3687            | Self::OpenaiO1
3688            | Self::OpenaiO3
3689            | Self::OpenaiO3DeepResearch
3690            | Self::OpenaiO3Mini
3691            | Self::OpenaiO3MiniHigh
3692            | Self::OpenaiO3Pro
3693            | Self::OpenaiO4Mini
3694            | Self::OpenaiO4MiniDeepResearch
3695            | Self::OpenaiO4MiniHigh
3696            | Self::OpenrouterFree => 200_000,
3697            Self::ZAiGlm47Flash | Self::ZAiGlm5Turbo | Self::ZAiGlm5vTurbo => 202_752,
3698            Self::MinimaxMinimaxM2
3699            | Self::MinimaxMinimaxM21
3700            | Self::MinimaxMinimaxM25
3701            | Self::MinimaxMinimaxM27
3702            | Self::ZAiGlm46
3703            | Self::ZAiGlm47
3704            | Self::ZAiGlm5
3705            | Self::ZAiGlm51 => 204_800,
3706            Self::Ai21JambaLarge17
3707            | Self::CohereNorthMiniCodeFree
3708            | Self::KwaipilotKatCoderAirV25
3709            | Self::KwaipilotKatCoderProV25
3710            | Self::MistralaiCodestral2508
3711            | Self::MistralaiMistralSmall3224bInstruct
3712            | Self::NvidiaNemotron3Nano30bA3bFree
3713            | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
3714            | Self::RelaceRelaceSearch
3715            | Self::XAiGrokBuild01 => 256_000,
3716            Self::ArceeAiTrinityLargeThinking
3717            | Self::BytedanceSeedSeed16
3718            | Self::BytedanceSeedSeed16Flash
3719            | Self::BytedanceSeedSeed20Lite
3720            | Self::BytedanceSeedSeed20Mini
3721            | Self::GoogleGemma327bIt
3722            | Self::GoogleGemma426bA4bIt
3723            | Self::GoogleGemma426bA4bItFree
3724            | Self::GoogleGemma431bIt
3725            | Self::GoogleGemma431bItFree
3726            | Self::InclusionaiLing261t
3727            | Self::InclusionaiLing26Flash
3728            | Self::InclusionaiLing30FlashFree
3729            | Self::InclusionaiRing261t
3730            | Self::KwaipilotKatCoderProV2
3731            | Self::MistralaiDevstral2512
3732            | Self::MistralaiMinistral14b2512
3733            | Self::MistralaiMinistral8b2512
3734            | Self::MistralaiMistralLarge2512
3735            | Self::MistralaiMistralMedium35
3736            | Self::MistralaiMistralSmall2603
3737            | Self::MoonshotaiKimiK20905
3738            | Self::MoonshotaiKimiK2Thinking
3739            | Self::MoonshotaiKimiK25
3740            | Self::MoonshotaiKimiK26
3741            | Self::MoonshotaiKimiK27Code
3742            | Self::NexAgiNexN2Mini
3743            | Self::NexAgiNexN2Pro
3744            | Self::NvidiaNemotron3Nano30bA3b
3745            | Self::NvidiaNemotron3Super120bA12bFree
3746            | Self::PoolsideLagunaM1
3747            | Self::PoolsideLagunaM1Free
3748            | Self::PoolsideLagunaS21Free
3749            | Self::PoolsideLagunaXs21
3750            | Self::PoolsideLagunaXs21Free
3751            | Self::QwenQwen3235bA22b2507
3752            | Self::QwenQwen3235bA22bThinking2507
3753            | Self::QwenQwen330bA3bInstruct2507
3754            | Self::QwenQwen3Coder
3755            | Self::QwenQwen3Coder30bA3bInstruct
3756            | Self::QwenQwen3CoderNext
3757            | Self::QwenQwen3Max
3758            | Self::QwenQwen3MaxThinking
3759            | Self::QwenQwen3Next80bA3bInstruct
3760            | Self::QwenQwen3Next80bA3bThinking
3761            | Self::QwenQwen3Vl235bA22bInstruct
3762            | Self::QwenQwen3Vl30bA3bInstruct
3763            | Self::QwenQwen3Vl30bA3bThinking
3764            | Self::QwenQwen3Vl8bInstruct
3765            | Self::QwenQwen35122bA10b
3766            | Self::QwenQwen3527b
3767            | Self::QwenQwen3535bA3b
3768            | Self::QwenQwen35397bA17b
3769            | Self::QwenQwen359b
3770            | Self::QwenQwen3627b
3771            | Self::QwenQwen3635bA3b
3772            | Self::QwenQwen36MaxPreview
3773            | Self::StepfunStep35Flash
3774            | Self::StepfunStep37Flash
3775            | Self::TencentHy3
3776            | Self::TencentHy3Preview => 262_144,
3777            Self::AmazonNovaLiteV1 | Self::AmazonNovaProV1 => 300_000,
3778            Self::OpenaiGpt5
3779            | Self::OpenaiGpt5Codex
3780            | Self::OpenaiGpt5Mini
3781            | Self::OpenaiGpt5Nano
3782            | Self::OpenaiGpt5Pro
3783            | Self::OpenaiGpt51
3784            | Self::OpenaiGpt51Codex
3785            | Self::OpenaiGpt51CodexMax
3786            | Self::OpenaiGpt51CodexMini
3787            | Self::OpenaiGpt52
3788            | Self::OpenaiGpt52Codex
3789            | Self::OpenaiGpt52Pro
3790            | Self::OpenaiGpt53Codex
3791            | Self::OpenaiGpt54Mini
3792            | Self::OpenaiGpt54Nano => 400_000,
3793            Self::XAiGrok45 => 500_000,
3794            Self::NvidiaNemotron3Ultra550bA55b => 512_288,
3795            Self::AmazonNova2LiteV1
3796            | Self::AmazonNovaPremierV1
3797            | Self::AnthropicClaudeFable5
3798            | Self::AnthropicClaudeOpus46
3799            | Self::AnthropicClaudeOpus47
3800            | Self::AnthropicClaudeOpus47Fast
3801            | Self::AnthropicClaudeOpus48
3802            | Self::AnthropicClaudeOpus48Fast
3803            | Self::AnthropicClaudeOpus5
3804            | Self::AnthropicClaudeOpus5Fast
3805            | Self::AnthropicClaudeSonnet4
3806            | Self::AnthropicClaudeSonnet45
3807            | Self::AnthropicClaudeSonnet46
3808            | Self::AnthropicClaudeSonnet5
3809            | Self::MinimaxMinimaxM1
3810            | Self::NvidiaNemotron3Super120bA12b
3811            | Self::NvidiaNemotron3Ultra550bA55bFree
3812            | Self::QwenQwenPlus
3813            | Self::QwenQwenPlus20250728
3814            | Self::QwenQwenPlus20250728Thinking
3815            | Self::QwenQwen3CoderFlash
3816            | Self::QwenQwen3CoderPlus
3817            | Self::QwenQwen35Flash0223
3818            | Self::QwenQwen35Plus0215
3819            | Self::QwenQwen35Plus20260420
3820            | Self::QwenQwen36Flash
3821            | Self::QwenQwen36Plus
3822            | Self::QwenQwen37Max
3823            | Self::QwenQwen37Plus
3824            | Self::SakanaFuguUltra
3825            | Self::XAiGrok43 => 1_000_000,
3826            Self::OpenaiGpt41 | Self::OpenaiGpt41Mini | Self::OpenaiGpt41Nano => {
3827                1_047_576
3828            }
3829            Self::DeepseekDeepseekV4Flash
3830            | Self::DeepseekDeepseekV4Pro
3831            | Self::GoogleGemini25Flash
3832            | Self::GoogleGemini25FlashLite
3833            | Self::GoogleGemini25Pro
3834            | Self::GoogleGemini25ProPreview
3835            | Self::GoogleGemini25ProPreview0506
3836            | Self::GoogleGemini3FlashPreview
3837            | Self::GoogleGemini31FlashLite
3838            | Self::GoogleGemini31FlashLitePreview
3839            | Self::GoogleGemini31ProPreview
3840            | Self::GoogleGemini31ProPreviewCustomtools
3841            | Self::GoogleGemini35Flash
3842            | Self::GoogleGemini35FlashLite
3843            | Self::GoogleGemini36Flash
3844            | Self::MetaLlamaLlama4Maverick
3845            | Self::MetaMuseSpark11
3846            | Self::MinimaxMinimaxM3
3847            | Self::MoonshotaiKimiK3
3848            | Self::PoolsideLagunaS21
3849            | Self::ThinkingmachinesInkling
3850            | Self::ZAiGlm52 => 1_048_576,
3851            Self::MeituanLongcat20 => 1_048_756,
3852            Self::OpenaiGpt54
3853            | Self::OpenaiGpt54Pro
3854            | Self::OpenaiGpt55
3855            | Self::OpenaiGpt55Pro
3856            | Self::OpenaiGpt56Luna
3857            | Self::OpenaiGpt56LunaPro
3858            | Self::OpenaiGpt56Sol
3859            | Self::OpenaiGpt56SolPro
3860            | Self::OpenaiGpt56Terra
3861            | Self::OpenaiGpt56TerraPro
3862            | Self::XiaomiMimoV25
3863            | Self::XiaomiMimoV25Pro => 1_050_000,
3864            Self::MetaLlamaLlama4Scout => 1_310_720,
3865            Self::OpenrouterAuto | Self::XAiGrok420 => 2_000_000,
3866        }
3867    }
3868    #[allow(clippy::too_many_lines)]
3869    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
3870        match self {
3871            Self::Ai21JambaLarge17
3872            | Self::AmazonNovaLiteV1
3873            | Self::AmazonNovaMicroV1
3874            | Self::AmazonNovaPremierV1
3875            | Self::AmazonNovaProV1
3876            | Self::AnthropicClaude3Haiku
3877            | Self::ArceeAiVirtuosoLarge
3878            | Self::CohereCommandR082024
3879            | Self::CohereCommandRPlus082024
3880            | Self::DeepseekDeepseekChat
3881            | Self::DeepseekDeepseekChatV30324
3882            | Self::GoogleGemma312bIt
3883            | Self::GoogleGemma327bIt
3884            | Self::IbmGraniteGranite418b
3885            | Self::InclusionaiLing261t
3886            | Self::InclusionaiLing26Flash
3887            | Self::KwaipilotKatCoderAirV25
3888            | Self::KwaipilotKatCoderProV2
3889            | Self::KwaipilotKatCoderProV25
3890            | Self::MetaLlamaLlama3170bInstruct
3891            | Self::MetaLlamaLlama318bInstruct
3892            | Self::MetaLlamaLlama3370bInstruct
3893            | Self::MetaLlamaLlama4Maverick
3894            | Self::MetaLlamaLlama4Scout
3895            | Self::MistralaiCodestral2508
3896            | Self::MistralaiDevstral2512
3897            | Self::MistralaiMinistral14b2512
3898            | Self::MistralaiMinistral3b2512
3899            | Self::MistralaiMinistral8b2512
3900            | Self::MistralaiMistralLarge
3901            | Self::MistralaiMistralLarge2407
3902            | Self::MistralaiMistralLarge2512
3903            | Self::MistralaiMistralMedium3
3904            | Self::MistralaiMistralMedium31
3905            | Self::MistralaiMistralNemo
3906            | Self::MistralaiMistralSaba
3907            | Self::MistralaiMistralSmall3224bInstruct
3908            | Self::MistralaiMixtral8x22bInstruct
3909            | Self::MistralaiVoxtralSmall24b2507
3910            | Self::MoonshotaiKimiK2
3911            | Self::MoonshotaiKimiK20905
3912            | Self::OpenaiGpt35Turbo
3913            | Self::OpenaiGpt35Turbo0613
3914            | Self::OpenaiGpt35Turbo16k
3915            | Self::OpenaiGpt4
3916            | Self::OpenaiGpt4Turbo
3917            | Self::OpenaiGpt4TurboPreview
3918            | Self::OpenaiGpt41
3919            | Self::OpenaiGpt41Mini
3920            | Self::OpenaiGpt41Nano
3921            | Self::OpenaiGpt4o
3922            | Self::OpenaiGpt4o20240513
3923            | Self::OpenaiGpt4o20240806
3924            | Self::OpenaiGpt4o20241120
3925            | Self::OpenaiGpt4oMini
3926            | Self::OpenaiGpt4oMini20240718
3927            | Self::OpenaiGpt51Chat
3928            | Self::OpenaiGpt52Chat
3929            | Self::OpenaiGpt53Chat
3930            | Self::OpenaiGptAudio
3931            | Self::OpenaiGptAudioMini
3932            | Self::QwenQwen2572bInstruct
3933            | Self::QwenQwen257bInstruct
3934            | Self::QwenQwenPlus
3935            | Self::QwenQwenPlus20250728
3936            | Self::QwenQwen3235bA22b2507
3937            | Self::QwenQwen330bA3bInstruct2507
3938            | Self::QwenQwen3Coder
3939            | Self::QwenQwen3Coder30bA3bInstruct
3940            | Self::QwenQwen3CoderFlash
3941            | Self::QwenQwen3CoderNext
3942            | Self::QwenQwen3CoderPlus
3943            | Self::QwenQwen3Max
3944            | Self::QwenQwen3Next80bA3bInstruct
3945            | Self::QwenQwen3Vl235bA22bInstruct
3946            | Self::QwenQwen3Vl30bA3bInstruct
3947            | Self::QwenQwen3Vl32bInstruct
3948            | Self::QwenQwen3Vl8bInstruct
3949            | Self::RekaaiRekaEdge
3950            | Self::RelaceRelaceSearch
3951            | Self::Sao10kL31Euryale70b
3952            | Self::ThedrummerUnslopnemo12b => &[],
3953            Self::MistralaiMistralMedium35
3954            | Self::MistralaiMistralSmall2603
3955            | Self::OpenaiGpt5Pro
3956            | Self::OpenaiO3MiniHigh
3957            | Self::OpenaiO4MiniHigh => &[ReasoningEffort::High],
3958            Self::DeepseekDeepseekV4Flash
3959            | Self::DeepseekDeepseekV4Pro
3960            | Self::InclusionaiRing261t
3961            | Self::ZAiGlm52 => &[ReasoningEffort::High, ReasoningEffort::Xhigh],
3962            Self::TencentHy3 | Self::TencentHy3Preview => {
3963                &[ReasoningEffort::Low, ReasoningEffort::High]
3964            }
3965            Self::MoonshotaiKimiK3 => {
3966                &[ReasoningEffort::Low, ReasoningEffort::High, ReasoningEffort::Max]
3967            }
3968            Self::NvidiaNemotron3Super120bA12b
3969            | Self::NvidiaNemotron3Super120bA12bFree => {
3970                &[ReasoningEffort::Low, ReasoningEffort::Medium]
3971            }
3972            Self::AionLabsAion20
3973            | Self::AionLabsAion30
3974            | Self::AionLabsAion30Mini
3975            | Self::AmazonNova2LiteV1
3976            | Self::AnthropicClaudeHaiku45
3977            | Self::AnthropicClaudeOpus4
3978            | Self::AnthropicClaudeOpus41
3979            | Self::AnthropicClaudeOpus45
3980            | Self::AnthropicClaudeSonnet4
3981            | Self::AnthropicClaudeSonnet45
3982            | Self::ArceeAiTrinityLargeThinking
3983            | Self::BytedanceSeedSeed16
3984            | Self::BytedanceSeedSeed16Flash
3985            | Self::CohereNorthMiniCodeFree
3986            | Self::DeepseekDeepseekChatV31
3987            | Self::DeepseekDeepseekR1
3988            | Self::DeepseekDeepseekR10528
3989            | Self::DeepseekDeepseekV31Terminus
3990            | Self::DeepseekDeepseekV32
3991            | Self::DeepseekDeepseekV32Exp
3992            | Self::GoogleGemini25Flash
3993            | Self::GoogleGemini25FlashLite
3994            | Self::GoogleGemini25Pro
3995            | Self::GoogleGemini25ProPreview
3996            | Self::GoogleGemini25ProPreview0506
3997            | Self::GoogleGemini3ProImage
3998            | Self::GoogleGemini31ProPreview
3999            | Self::GoogleGemini31ProPreviewCustomtools
4000            | Self::GoogleGemma426bA4bIt
4001            | Self::GoogleGemma426bA4bItFree
4002            | Self::GoogleGemma431bIt
4003            | Self::GoogleGemma431bItFree
4004            | Self::InceptionMercury2
4005            | Self::InclusionaiLing30FlashFree
4006            | Self::MeituanLongcat20
4007            | Self::MinimaxMinimaxM1
4008            | Self::MinimaxMinimaxM2
4009            | Self::MinimaxMinimaxM21
4010            | Self::MinimaxMinimaxM25
4011            | Self::MinimaxMinimaxM27
4012            | Self::MinimaxMinimaxM3
4013            | Self::MoonshotaiKimiK2Thinking
4014            | Self::MoonshotaiKimiK25
4015            | Self::MoonshotaiKimiK26
4016            | Self::MoonshotaiKimiK27Code
4017            | Self::NexAgiNexN2Mini
4018            | Self::NexAgiNexN2Pro
4019            | Self::NvidiaNemotron3Nano30bA3b
4020            | Self::NvidiaNemotron3Nano30bA3bFree
4021            | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
4022            | Self::NvidiaNemotronNano12bV2VlFree
4023            | Self::NvidiaNemotronNano9bV2Free
4024            | Self::OpenaiGpt5Codex
4025            | Self::OpenaiGpt51
4026            | Self::OpenaiGpt51Codex
4027            | Self::OpenaiGpt51CodexMini
4028            | Self::OpenaiGptOss120b
4029            | Self::OpenaiGptOss20b
4030            | Self::OpenaiGptOss20bFree
4031            | Self::OpenaiGptOssSafeguard20b
4032            | Self::OpenaiO1
4033            | Self::OpenaiO3
4034            | Self::OpenaiO3DeepResearch
4035            | Self::OpenaiO3Mini
4036            | Self::OpenaiO3Pro
4037            | Self::OpenaiO4Mini
4038            | Self::OpenaiO4MiniDeepResearch
4039            | Self::OpenrouterAuto
4040            | Self::OpenrouterFree
4041            | Self::PoolsideLagunaM1
4042            | Self::PoolsideLagunaM1Free
4043            | Self::PoolsideLagunaS21
4044            | Self::PoolsideLagunaS21Free
4045            | Self::PoolsideLagunaXs21
4046            | Self::PoolsideLagunaXs21Free
4047            | Self::QwenQwenPlus20250728Thinking
4048            | Self::QwenQwen314b
4049            | Self::QwenQwen3235bA22b
4050            | Self::QwenQwen3235bA22bThinking2507
4051            | Self::QwenQwen330bA3b
4052            | Self::QwenQwen330bA3bThinking2507
4053            | Self::QwenQwen332b
4054            | Self::QwenQwen38b
4055            | Self::QwenQwen3MaxThinking
4056            | Self::QwenQwen3Next80bA3bThinking
4057            | Self::QwenQwen3Vl235bA22bThinking
4058            | Self::QwenQwen3Vl30bA3bThinking
4059            | Self::QwenQwen3Vl8bThinking
4060            | Self::QwenQwen35122bA10b
4061            | Self::QwenQwen3527b
4062            | Self::QwenQwen3535bA3b
4063            | Self::QwenQwen35397bA17b
4064            | Self::QwenQwen359b
4065            | Self::QwenQwen35Flash0223
4066            | Self::QwenQwen35Plus0215
4067            | Self::QwenQwen35Plus20260420
4068            | Self::QwenQwen3627b
4069            | Self::QwenQwen3635bA3b
4070            | Self::QwenQwen36Flash
4071            | Self::QwenQwen36MaxPreview
4072            | Self::QwenQwen36Plus
4073            | Self::QwenQwen37Max
4074            | Self::QwenQwen37Plus
4075            | Self::StepfunStep35Flash
4076            | Self::StepfunStep37Flash
4077            | Self::UpstageSolarPro3
4078            | Self::XAiGrok420
4079            | Self::XAiGrok43
4080            | Self::XAiGrok45
4081            | Self::XAiGrokBuild01
4082            | Self::XiaomiMimoV25
4083            | Self::XiaomiMimoV25Pro
4084            | Self::ZAiGlm45
4085            | Self::ZAiGlm45Air
4086            | Self::ZAiGlm45v
4087            | Self::ZAiGlm46
4088            | Self::ZAiGlm46v
4089            | Self::ZAiGlm47
4090            | Self::ZAiGlm47Flash
4091            | Self::ZAiGlm5
4092            | Self::ZAiGlm5Turbo
4093            | Self::ZAiGlm51
4094            | Self::ZAiGlm5vTurbo => {
4095                &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
4096            }
4097            Self::AnthropicClaudeOpus46 | Self::AnthropicClaudeSonnet46 => {
4098                &[
4099                    ReasoningEffort::Low,
4100                    ReasoningEffort::Medium,
4101                    ReasoningEffort::High,
4102                    ReasoningEffort::Max,
4103                ]
4104            }
4105            Self::OpenaiGpt51CodexMax
4106            | Self::OpenaiGpt52
4107            | Self::OpenaiGpt52Codex
4108            | Self::OpenaiGpt53Codex
4109            | Self::OpenaiGpt54
4110            | Self::OpenaiGpt54Mini
4111            | Self::OpenaiGpt54Nano
4112            | Self::OpenaiGpt55 => {
4113                &[
4114                    ReasoningEffort::Low,
4115                    ReasoningEffort::Medium,
4116                    ReasoningEffort::High,
4117                    ReasoningEffort::Xhigh,
4118                ]
4119            }
4120            Self::AnthropicClaudeFable5
4121            | Self::AnthropicClaudeOpus47
4122            | Self::AnthropicClaudeOpus47Fast
4123            | Self::AnthropicClaudeOpus48
4124            | Self::AnthropicClaudeOpus48Fast
4125            | Self::AnthropicClaudeOpus5
4126            | Self::AnthropicClaudeOpus5Fast
4127            | Self::AnthropicClaudeSonnet5
4128            | Self::OpenaiGpt56Luna
4129            | Self::OpenaiGpt56LunaPro
4130            | Self::OpenaiGpt56Sol
4131            | Self::OpenaiGpt56SolPro
4132            | Self::OpenaiGpt56Terra
4133            | Self::OpenaiGpt56TerraPro => {
4134                &[
4135                    ReasoningEffort::Low,
4136                    ReasoningEffort::Medium,
4137                    ReasoningEffort::High,
4138                    ReasoningEffort::Xhigh,
4139                    ReasoningEffort::Max,
4140                ]
4141            }
4142            Self::SakanaFuguUltra => {
4143                &[ReasoningEffort::Max, ReasoningEffort::Xhigh, ReasoningEffort::High]
4144            }
4145            Self::NvidiaNemotron3Ultra550bA55b
4146            | Self::NvidiaNemotron3Ultra550bA55bFree => {
4147                &[ReasoningEffort::Medium, ReasoningEffort::High]
4148            }
4149            Self::OpenaiGpt52Pro | Self::OpenaiGpt54Pro | Self::OpenaiGpt55Pro => {
4150                &[ReasoningEffort::Medium, ReasoningEffort::High, ReasoningEffort::Xhigh]
4151            }
4152            Self::BytedanceSeedSeed20Lite
4153            | Self::BytedanceSeedSeed20Mini
4154            | Self::GoogleGemini3FlashPreview
4155            | Self::GoogleGemini31FlashLite
4156            | Self::GoogleGemini31FlashLitePreview
4157            | Self::GoogleGemini35Flash
4158            | Self::GoogleGemini35FlashLite
4159            | Self::GoogleGemini36Flash
4160            | Self::OpenaiGpt5
4161            | Self::OpenaiGpt5Mini
4162            | Self::OpenaiGpt5Nano => {
4163                &[
4164                    ReasoningEffort::Minimal,
4165                    ReasoningEffort::Low,
4166                    ReasoningEffort::Medium,
4167                    ReasoningEffort::High,
4168                ]
4169            }
4170            Self::ThinkingmachinesInkling => {
4171                &[
4172                    ReasoningEffort::Minimal,
4173                    ReasoningEffort::Low,
4174                    ReasoningEffort::Medium,
4175                    ReasoningEffort::High,
4176                    ReasoningEffort::Max,
4177                ]
4178            }
4179            Self::MetaMuseSpark11 => {
4180                &[
4181                    ReasoningEffort::Minimal,
4182                    ReasoningEffort::Low,
4183                    ReasoningEffort::Medium,
4184                    ReasoningEffort::High,
4185                    ReasoningEffort::Xhigh,
4186                ]
4187            }
4188        }
4189    }
4190    pub fn supports_reasoning(self) -> bool {
4191        !self.reasoning_levels().is_empty()
4192    }
4193    #[allow(clippy::too_many_lines)]
4194    pub fn supports_prompt_caching(self) -> bool {
4195        match self {
4196            Self::Ai21JambaLarge17
4197            | Self::AmazonNova2LiteV1
4198            | Self::AmazonNovaLiteV1
4199            | Self::AmazonNovaMicroV1
4200            | Self::AmazonNovaProV1
4201            | Self::ArceeAiVirtuosoLarge
4202            | Self::BytedanceSeedSeed16
4203            | Self::BytedanceSeedSeed16Flash
4204            | Self::BytedanceSeedSeed20Lite
4205            | Self::BytedanceSeedSeed20Mini
4206            | Self::CohereCommandR082024
4207            | Self::CohereCommandRPlus082024
4208            | Self::CohereNorthMiniCodeFree
4209            | Self::DeepseekDeepseekChat
4210            | Self::DeepseekDeepseekR1
4211            | Self::DeepseekDeepseekV32Exp
4212            | Self::GoogleGemma312bIt
4213            | Self::GoogleGemma426bA4bItFree
4214            | Self::GoogleGemma431bIt
4215            | Self::GoogleGemma431bItFree
4216            | Self::InclusionaiLing30FlashFree
4217            | Self::MetaLlamaLlama3170bInstruct
4218            | Self::MetaLlamaLlama3370bInstruct
4219            | Self::MetaLlamaLlama4Maverick
4220            | Self::MetaLlamaLlama4Scout
4221            | Self::MinimaxMinimaxM1
4222            | Self::MinimaxMinimaxM2
4223            | Self::MistralaiMistralMedium35
4224            | Self::MistralaiMistralNemo
4225            | Self::MoonshotaiKimiK2
4226            | Self::MoonshotaiKimiK20905
4227            | Self::NvidiaNemotron3Nano30bA3b
4228            | Self::NvidiaNemotron3Nano30bA3bFree
4229            | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
4230            | Self::NvidiaNemotron3Super120bA12b
4231            | Self::NvidiaNemotron3Super120bA12bFree
4232            | Self::NvidiaNemotron3Ultra550bA55bFree
4233            | Self::NvidiaNemotronNano12bV2VlFree
4234            | Self::NvidiaNemotronNano9bV2Free
4235            | Self::OpenaiGpt35Turbo
4236            | Self::OpenaiGpt35Turbo0613
4237            | Self::OpenaiGpt35Turbo16k
4238            | Self::OpenaiGpt4
4239            | Self::OpenaiGpt4Turbo
4240            | Self::OpenaiGpt4TurboPreview
4241            | Self::OpenaiGpt4o20240513
4242            | Self::OpenaiGpt5Pro
4243            | Self::OpenaiGpt52Pro
4244            | Self::OpenaiGpt54Pro
4245            | Self::OpenaiGpt55Pro
4246            | Self::OpenaiGptAudio
4247            | Self::OpenaiGptAudioMini
4248            | Self::OpenaiGptOss120b
4249            | Self::OpenaiGptOss20b
4250            | Self::OpenaiGptOss20bFree
4251            | Self::OpenaiO3Pro
4252            | Self::OpenrouterAuto
4253            | Self::OpenrouterFree
4254            | Self::PoolsideLagunaM1Free
4255            | Self::PoolsideLagunaS21Free
4256            | Self::PoolsideLagunaXs21Free
4257            | Self::QwenQwen2572bInstruct
4258            | Self::QwenQwen257bInstruct
4259            | Self::QwenQwenPlus20250728
4260            | Self::QwenQwen314b
4261            | Self::QwenQwen3235bA22b
4262            | Self::QwenQwen3235bA22b2507
4263            | Self::QwenQwen3235bA22bThinking2507
4264            | Self::QwenQwen330bA3b
4265            | Self::QwenQwen330bA3bInstruct2507
4266            | Self::QwenQwen330bA3bThinking2507
4267            | Self::QwenQwen332b
4268            | Self::QwenQwen38b
4269            | Self::QwenQwen3Coder30bA3bInstruct
4270            | Self::QwenQwen3MaxThinking
4271            | Self::QwenQwen3Next80bA3bThinking
4272            | Self::QwenQwen3Vl235bA22bThinking
4273            | Self::QwenQwen3Vl30bA3bInstruct
4274            | Self::QwenQwen3Vl30bA3bThinking
4275            | Self::QwenQwen3Vl32bInstruct
4276            | Self::QwenQwen3Vl8bInstruct
4277            | Self::QwenQwen3Vl8bThinking
4278            | Self::QwenQwen35122bA10b
4279            | Self::QwenQwen3527b
4280            | Self::QwenQwen3535bA3b
4281            | Self::QwenQwen35397bA17b
4282            | Self::QwenQwen359b
4283            | Self::QwenQwen35Flash0223
4284            | Self::QwenQwen35Plus0215
4285            | Self::QwenQwen3635bA3b
4286            | Self::RekaaiRekaEdge
4287            | Self::RelaceRelaceSearch
4288            | Self::Sao10kL31Euryale70b
4289            | Self::StepfunStep35Flash
4290            | Self::ThedrummerUnslopnemo12b => false,
4291            Self::AionLabsAion20
4292            | Self::AionLabsAion30
4293            | Self::AionLabsAion30Mini
4294            | Self::AmazonNovaPremierV1
4295            | Self::AnthropicClaude3Haiku
4296            | Self::AnthropicClaudeFable5
4297            | Self::AnthropicClaudeHaiku45
4298            | Self::AnthropicClaudeOpus4
4299            | Self::AnthropicClaudeOpus41
4300            | Self::AnthropicClaudeOpus45
4301            | Self::AnthropicClaudeOpus46
4302            | Self::AnthropicClaudeOpus47
4303            | Self::AnthropicClaudeOpus47Fast
4304            | Self::AnthropicClaudeOpus48
4305            | Self::AnthropicClaudeOpus48Fast
4306            | Self::AnthropicClaudeOpus5
4307            | Self::AnthropicClaudeOpus5Fast
4308            | Self::AnthropicClaudeSonnet4
4309            | Self::AnthropicClaudeSonnet45
4310            | Self::AnthropicClaudeSonnet46
4311            | Self::AnthropicClaudeSonnet5
4312            | Self::ArceeAiTrinityLargeThinking
4313            | Self::DeepseekDeepseekChatV30324
4314            | Self::DeepseekDeepseekChatV31
4315            | Self::DeepseekDeepseekR10528
4316            | Self::DeepseekDeepseekV31Terminus
4317            | Self::DeepseekDeepseekV32
4318            | Self::DeepseekDeepseekV4Flash
4319            | Self::DeepseekDeepseekV4Pro
4320            | Self::GoogleGemini25Flash
4321            | Self::GoogleGemini25FlashLite
4322            | Self::GoogleGemini25Pro
4323            | Self::GoogleGemini25ProPreview
4324            | Self::GoogleGemini25ProPreview0506
4325            | Self::GoogleGemini3FlashPreview
4326            | Self::GoogleGemini3ProImage
4327            | Self::GoogleGemini31FlashLite
4328            | Self::GoogleGemini31FlashLitePreview
4329            | Self::GoogleGemini31ProPreview
4330            | Self::GoogleGemini31ProPreviewCustomtools
4331            | Self::GoogleGemini35Flash
4332            | Self::GoogleGemini35FlashLite
4333            | Self::GoogleGemini36Flash
4334            | Self::GoogleGemma327bIt
4335            | Self::GoogleGemma426bA4bIt
4336            | Self::IbmGraniteGranite418b
4337            | Self::InceptionMercury2
4338            | Self::InclusionaiLing261t
4339            | Self::InclusionaiLing26Flash
4340            | Self::InclusionaiRing261t
4341            | Self::KwaipilotKatCoderAirV25
4342            | Self::KwaipilotKatCoderProV2
4343            | Self::KwaipilotKatCoderProV25
4344            | Self::MeituanLongcat20
4345            | Self::MetaLlamaLlama318bInstruct
4346            | Self::MetaMuseSpark11
4347            | Self::MinimaxMinimaxM21
4348            | Self::MinimaxMinimaxM25
4349            | Self::MinimaxMinimaxM27
4350            | Self::MinimaxMinimaxM3
4351            | Self::MistralaiCodestral2508
4352            | Self::MistralaiDevstral2512
4353            | Self::MistralaiMinistral14b2512
4354            | Self::MistralaiMinistral3b2512
4355            | Self::MistralaiMinistral8b2512
4356            | Self::MistralaiMistralLarge
4357            | Self::MistralaiMistralLarge2407
4358            | Self::MistralaiMistralLarge2512
4359            | Self::MistralaiMistralMedium3
4360            | Self::MistralaiMistralMedium31
4361            | Self::MistralaiMistralSaba
4362            | Self::MistralaiMistralSmall2603
4363            | Self::MistralaiMistralSmall3224bInstruct
4364            | Self::MistralaiMixtral8x22bInstruct
4365            | Self::MistralaiVoxtralSmall24b2507
4366            | Self::MoonshotaiKimiK2Thinking
4367            | Self::MoonshotaiKimiK25
4368            | Self::MoonshotaiKimiK26
4369            | Self::MoonshotaiKimiK27Code
4370            | Self::MoonshotaiKimiK3
4371            | Self::NexAgiNexN2Mini
4372            | Self::NexAgiNexN2Pro
4373            | Self::NvidiaNemotron3Ultra550bA55b
4374            | Self::OpenaiGpt41
4375            | Self::OpenaiGpt41Mini
4376            | Self::OpenaiGpt41Nano
4377            | Self::OpenaiGpt4o
4378            | Self::OpenaiGpt4o20240806
4379            | Self::OpenaiGpt4o20241120
4380            | Self::OpenaiGpt4oMini
4381            | Self::OpenaiGpt4oMini20240718
4382            | Self::OpenaiGpt5
4383            | Self::OpenaiGpt5Codex
4384            | Self::OpenaiGpt5Mini
4385            | Self::OpenaiGpt5Nano
4386            | Self::OpenaiGpt51
4387            | Self::OpenaiGpt51Chat
4388            | Self::OpenaiGpt51Codex
4389            | Self::OpenaiGpt51CodexMax
4390            | Self::OpenaiGpt51CodexMini
4391            | Self::OpenaiGpt52
4392            | Self::OpenaiGpt52Chat
4393            | Self::OpenaiGpt52Codex
4394            | Self::OpenaiGpt53Chat
4395            | Self::OpenaiGpt53Codex
4396            | Self::OpenaiGpt54
4397            | Self::OpenaiGpt54Mini
4398            | Self::OpenaiGpt54Nano
4399            | Self::OpenaiGpt55
4400            | Self::OpenaiGpt56Luna
4401            | Self::OpenaiGpt56LunaPro
4402            | Self::OpenaiGpt56Sol
4403            | Self::OpenaiGpt56SolPro
4404            | Self::OpenaiGpt56Terra
4405            | Self::OpenaiGpt56TerraPro
4406            | Self::OpenaiGptOssSafeguard20b
4407            | Self::OpenaiO1
4408            | Self::OpenaiO3
4409            | Self::OpenaiO3DeepResearch
4410            | Self::OpenaiO3Mini
4411            | Self::OpenaiO3MiniHigh
4412            | Self::OpenaiO4Mini
4413            | Self::OpenaiO4MiniDeepResearch
4414            | Self::OpenaiO4MiniHigh
4415            | Self::PoolsideLagunaM1
4416            | Self::PoolsideLagunaS21
4417            | Self::PoolsideLagunaXs21
4418            | Self::QwenQwenPlus
4419            | Self::QwenQwenPlus20250728Thinking
4420            | Self::QwenQwen3Coder
4421            | Self::QwenQwen3CoderFlash
4422            | Self::QwenQwen3CoderNext
4423            | Self::QwenQwen3CoderPlus
4424            | Self::QwenQwen3Max
4425            | Self::QwenQwen3Next80bA3bInstruct
4426            | Self::QwenQwen3Vl235bA22bInstruct
4427            | Self::QwenQwen35Plus20260420
4428            | Self::QwenQwen3627b
4429            | Self::QwenQwen36Flash
4430            | Self::QwenQwen36MaxPreview
4431            | Self::QwenQwen36Plus
4432            | Self::QwenQwen37Max
4433            | Self::QwenQwen37Plus
4434            | Self::SakanaFuguUltra
4435            | Self::StepfunStep37Flash
4436            | Self::TencentHy3
4437            | Self::TencentHy3Preview
4438            | Self::ThinkingmachinesInkling
4439            | Self::UpstageSolarPro3
4440            | Self::XAiGrok420
4441            | Self::XAiGrok43
4442            | Self::XAiGrok45
4443            | Self::XAiGrokBuild01
4444            | Self::XiaomiMimoV25
4445            | Self::XiaomiMimoV25Pro
4446            | Self::ZAiGlm45
4447            | Self::ZAiGlm45Air
4448            | Self::ZAiGlm45v
4449            | Self::ZAiGlm46
4450            | Self::ZAiGlm46v
4451            | Self::ZAiGlm47
4452            | Self::ZAiGlm47Flash
4453            | Self::ZAiGlm5
4454            | Self::ZAiGlm5Turbo
4455            | Self::ZAiGlm51
4456            | Self::ZAiGlm52
4457            | Self::ZAiGlm5vTurbo => true,
4458        }
4459    }
4460    #[allow(clippy::too_many_lines)]
4461    pub fn supports_image(self) -> bool {
4462        match self {
4463            Self::Ai21JambaLarge17
4464            | Self::AionLabsAion20
4465            | Self::AionLabsAion30
4466            | Self::AionLabsAion30Mini
4467            | Self::AmazonNovaMicroV1
4468            | Self::ArceeAiTrinityLargeThinking
4469            | Self::ArceeAiVirtuosoLarge
4470            | Self::CohereCommandR082024
4471            | Self::CohereCommandRPlus082024
4472            | Self::CohereNorthMiniCodeFree
4473            | Self::DeepseekDeepseekChat
4474            | Self::DeepseekDeepseekChatV30324
4475            | Self::DeepseekDeepseekChatV31
4476            | Self::DeepseekDeepseekR1
4477            | Self::DeepseekDeepseekR10528
4478            | Self::DeepseekDeepseekV31Terminus
4479            | Self::DeepseekDeepseekV32
4480            | Self::DeepseekDeepseekV32Exp
4481            | Self::DeepseekDeepseekV4Flash
4482            | Self::DeepseekDeepseekV4Pro
4483            | Self::IbmGraniteGranite418b
4484            | Self::InceptionMercury2
4485            | Self::InclusionaiLing261t
4486            | Self::InclusionaiLing26Flash
4487            | Self::InclusionaiLing30FlashFree
4488            | Self::InclusionaiRing261t
4489            | Self::KwaipilotKatCoderAirV25
4490            | Self::KwaipilotKatCoderProV2
4491            | Self::KwaipilotKatCoderProV25
4492            | Self::MeituanLongcat20
4493            | Self::MetaLlamaLlama3170bInstruct
4494            | Self::MetaLlamaLlama318bInstruct
4495            | Self::MetaLlamaLlama3370bInstruct
4496            | Self::MinimaxMinimaxM1
4497            | Self::MinimaxMinimaxM2
4498            | Self::MinimaxMinimaxM21
4499            | Self::MinimaxMinimaxM25
4500            | Self::MinimaxMinimaxM27
4501            | Self::MistralaiCodestral2508
4502            | Self::MistralaiDevstral2512
4503            | Self::MistralaiMistralLarge
4504            | Self::MistralaiMistralLarge2407
4505            | Self::MistralaiMistralNemo
4506            | Self::MistralaiMistralSaba
4507            | Self::MistralaiMixtral8x22bInstruct
4508            | Self::MistralaiVoxtralSmall24b2507
4509            | Self::MoonshotaiKimiK2
4510            | Self::MoonshotaiKimiK20905
4511            | Self::MoonshotaiKimiK2Thinking
4512            | Self::NvidiaNemotron3Nano30bA3b
4513            | Self::NvidiaNemotron3Nano30bA3bFree
4514            | Self::NvidiaNemotron3Super120bA12b
4515            | Self::NvidiaNemotron3Super120bA12bFree
4516            | Self::NvidiaNemotron3Ultra550bA55b
4517            | Self::NvidiaNemotron3Ultra550bA55bFree
4518            | Self::NvidiaNemotronNano9bV2Free
4519            | Self::OpenaiGpt35Turbo
4520            | Self::OpenaiGpt35Turbo0613
4521            | Self::OpenaiGpt35Turbo16k
4522            | Self::OpenaiGpt4
4523            | Self::OpenaiGpt4TurboPreview
4524            | Self::OpenaiGptAudio
4525            | Self::OpenaiGptAudioMini
4526            | Self::OpenaiGptOss120b
4527            | Self::OpenaiGptOss20b
4528            | Self::OpenaiGptOss20bFree
4529            | Self::OpenaiGptOssSafeguard20b
4530            | Self::OpenaiO3Mini
4531            | Self::OpenaiO3MiniHigh
4532            | Self::PoolsideLagunaM1
4533            | Self::PoolsideLagunaM1Free
4534            | Self::PoolsideLagunaS21
4535            | Self::PoolsideLagunaS21Free
4536            | Self::PoolsideLagunaXs21
4537            | Self::PoolsideLagunaXs21Free
4538            | Self::QwenQwen2572bInstruct
4539            | Self::QwenQwen257bInstruct
4540            | Self::QwenQwenPlus
4541            | Self::QwenQwenPlus20250728
4542            | Self::QwenQwenPlus20250728Thinking
4543            | Self::QwenQwen314b
4544            | Self::QwenQwen3235bA22b
4545            | Self::QwenQwen3235bA22b2507
4546            | Self::QwenQwen3235bA22bThinking2507
4547            | Self::QwenQwen330bA3b
4548            | Self::QwenQwen330bA3bInstruct2507
4549            | Self::QwenQwen330bA3bThinking2507
4550            | Self::QwenQwen332b
4551            | Self::QwenQwen38b
4552            | Self::QwenQwen3Coder
4553            | Self::QwenQwen3Coder30bA3bInstruct
4554            | Self::QwenQwen3CoderFlash
4555            | Self::QwenQwen3CoderNext
4556            | Self::QwenQwen3CoderPlus
4557            | Self::QwenQwen3Max
4558            | Self::QwenQwen3MaxThinking
4559            | Self::QwenQwen3Next80bA3bInstruct
4560            | Self::QwenQwen3Next80bA3bThinking
4561            | Self::QwenQwen36MaxPreview
4562            | Self::QwenQwen37Max
4563            | Self::RelaceRelaceSearch
4564            | Self::Sao10kL31Euryale70b
4565            | Self::StepfunStep35Flash
4566            | Self::TencentHy3
4567            | Self::TencentHy3Preview
4568            | Self::ThedrummerUnslopnemo12b
4569            | Self::UpstageSolarPro3
4570            | Self::XiaomiMimoV25Pro
4571            | Self::ZAiGlm45
4572            | Self::ZAiGlm45Air
4573            | Self::ZAiGlm46
4574            | Self::ZAiGlm47
4575            | Self::ZAiGlm47Flash
4576            | Self::ZAiGlm5
4577            | Self::ZAiGlm5Turbo
4578            | Self::ZAiGlm51
4579            | Self::ZAiGlm52 => false,
4580            Self::AmazonNova2LiteV1
4581            | Self::AmazonNovaLiteV1
4582            | Self::AmazonNovaPremierV1
4583            | Self::AmazonNovaProV1
4584            | Self::AnthropicClaude3Haiku
4585            | Self::AnthropicClaudeFable5
4586            | Self::AnthropicClaudeHaiku45
4587            | Self::AnthropicClaudeOpus4
4588            | Self::AnthropicClaudeOpus41
4589            | Self::AnthropicClaudeOpus45
4590            | Self::AnthropicClaudeOpus46
4591            | Self::AnthropicClaudeOpus47
4592            | Self::AnthropicClaudeOpus47Fast
4593            | Self::AnthropicClaudeOpus48
4594            | Self::AnthropicClaudeOpus48Fast
4595            | Self::AnthropicClaudeOpus5
4596            | Self::AnthropicClaudeOpus5Fast
4597            | Self::AnthropicClaudeSonnet4
4598            | Self::AnthropicClaudeSonnet45
4599            | Self::AnthropicClaudeSonnet46
4600            | Self::AnthropicClaudeSonnet5
4601            | Self::BytedanceSeedSeed16
4602            | Self::BytedanceSeedSeed16Flash
4603            | Self::BytedanceSeedSeed20Lite
4604            | Self::BytedanceSeedSeed20Mini
4605            | Self::GoogleGemini25Flash
4606            | Self::GoogleGemini25FlashLite
4607            | Self::GoogleGemini25Pro
4608            | Self::GoogleGemini25ProPreview
4609            | Self::GoogleGemini25ProPreview0506
4610            | Self::GoogleGemini3FlashPreview
4611            | Self::GoogleGemini3ProImage
4612            | Self::GoogleGemini31FlashLite
4613            | Self::GoogleGemini31FlashLitePreview
4614            | Self::GoogleGemini31ProPreview
4615            | Self::GoogleGemini31ProPreviewCustomtools
4616            | Self::GoogleGemini35Flash
4617            | Self::GoogleGemini35FlashLite
4618            | Self::GoogleGemini36Flash
4619            | Self::GoogleGemma312bIt
4620            | Self::GoogleGemma327bIt
4621            | Self::GoogleGemma426bA4bIt
4622            | Self::GoogleGemma426bA4bItFree
4623            | Self::GoogleGemma431bIt
4624            | Self::GoogleGemma431bItFree
4625            | Self::MetaLlamaLlama4Maverick
4626            | Self::MetaLlamaLlama4Scout
4627            | Self::MetaMuseSpark11
4628            | Self::MinimaxMinimaxM3
4629            | Self::MistralaiMinistral14b2512
4630            | Self::MistralaiMinistral3b2512
4631            | Self::MistralaiMinistral8b2512
4632            | Self::MistralaiMistralLarge2512
4633            | Self::MistralaiMistralMedium3
4634            | Self::MistralaiMistralMedium35
4635            | Self::MistralaiMistralMedium31
4636            | Self::MistralaiMistralSmall2603
4637            | Self::MistralaiMistralSmall3224bInstruct
4638            | Self::MoonshotaiKimiK25
4639            | Self::MoonshotaiKimiK26
4640            | Self::MoonshotaiKimiK27Code
4641            | Self::MoonshotaiKimiK3
4642            | Self::NexAgiNexN2Mini
4643            | Self::NexAgiNexN2Pro
4644            | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
4645            | Self::NvidiaNemotronNano12bV2VlFree
4646            | Self::OpenaiGpt4Turbo
4647            | Self::OpenaiGpt41
4648            | Self::OpenaiGpt41Mini
4649            | Self::OpenaiGpt41Nano
4650            | Self::OpenaiGpt4o
4651            | Self::OpenaiGpt4o20240513
4652            | Self::OpenaiGpt4o20240806
4653            | Self::OpenaiGpt4o20241120
4654            | Self::OpenaiGpt4oMini
4655            | Self::OpenaiGpt4oMini20240718
4656            | Self::OpenaiGpt5
4657            | Self::OpenaiGpt5Codex
4658            | Self::OpenaiGpt5Mini
4659            | Self::OpenaiGpt5Nano
4660            | Self::OpenaiGpt5Pro
4661            | Self::OpenaiGpt51
4662            | Self::OpenaiGpt51Chat
4663            | Self::OpenaiGpt51Codex
4664            | Self::OpenaiGpt51CodexMax
4665            | Self::OpenaiGpt51CodexMini
4666            | Self::OpenaiGpt52
4667            | Self::OpenaiGpt52Chat
4668            | Self::OpenaiGpt52Codex
4669            | Self::OpenaiGpt52Pro
4670            | Self::OpenaiGpt53Chat
4671            | Self::OpenaiGpt53Codex
4672            | Self::OpenaiGpt54
4673            | Self::OpenaiGpt54Mini
4674            | Self::OpenaiGpt54Nano
4675            | Self::OpenaiGpt54Pro
4676            | Self::OpenaiGpt55
4677            | Self::OpenaiGpt55Pro
4678            | Self::OpenaiGpt56Luna
4679            | Self::OpenaiGpt56LunaPro
4680            | Self::OpenaiGpt56Sol
4681            | Self::OpenaiGpt56SolPro
4682            | Self::OpenaiGpt56Terra
4683            | Self::OpenaiGpt56TerraPro
4684            | Self::OpenaiO1
4685            | Self::OpenaiO3
4686            | Self::OpenaiO3DeepResearch
4687            | Self::OpenaiO3Pro
4688            | Self::OpenaiO4Mini
4689            | Self::OpenaiO4MiniDeepResearch
4690            | Self::OpenaiO4MiniHigh
4691            | Self::OpenrouterAuto
4692            | Self::OpenrouterFree
4693            | Self::QwenQwen3Vl235bA22bInstruct
4694            | Self::QwenQwen3Vl235bA22bThinking
4695            | Self::QwenQwen3Vl30bA3bInstruct
4696            | Self::QwenQwen3Vl30bA3bThinking
4697            | Self::QwenQwen3Vl32bInstruct
4698            | Self::QwenQwen3Vl8bInstruct
4699            | Self::QwenQwen3Vl8bThinking
4700            | Self::QwenQwen35122bA10b
4701            | Self::QwenQwen3527b
4702            | Self::QwenQwen3535bA3b
4703            | Self::QwenQwen35397bA17b
4704            | Self::QwenQwen359b
4705            | Self::QwenQwen35Flash0223
4706            | Self::QwenQwen35Plus0215
4707            | Self::QwenQwen35Plus20260420
4708            | Self::QwenQwen3627b
4709            | Self::QwenQwen3635bA3b
4710            | Self::QwenQwen36Flash
4711            | Self::QwenQwen36Plus
4712            | Self::QwenQwen37Plus
4713            | Self::RekaaiRekaEdge
4714            | Self::SakanaFuguUltra
4715            | Self::StepfunStep37Flash
4716            | Self::ThinkingmachinesInkling
4717            | Self::XAiGrok420
4718            | Self::XAiGrok43
4719            | Self::XAiGrok45
4720            | Self::XAiGrokBuild01
4721            | Self::XiaomiMimoV25
4722            | Self::ZAiGlm45v
4723            | Self::ZAiGlm46v
4724            | Self::ZAiGlm5vTurbo => true,
4725        }
4726    }
4727    #[allow(clippy::too_many_lines)]
4728    pub fn supports_audio(self) -> bool {
4729        match self {
4730            Self::Ai21JambaLarge17
4731            | Self::AionLabsAion20
4732            | Self::AionLabsAion30
4733            | Self::AionLabsAion30Mini
4734            | Self::AmazonNova2LiteV1
4735            | Self::AmazonNovaLiteV1
4736            | Self::AmazonNovaMicroV1
4737            | Self::AmazonNovaPremierV1
4738            | Self::AmazonNovaProV1
4739            | Self::AnthropicClaude3Haiku
4740            | Self::AnthropicClaudeFable5
4741            | Self::AnthropicClaudeHaiku45
4742            | Self::AnthropicClaudeOpus4
4743            | Self::AnthropicClaudeOpus41
4744            | Self::AnthropicClaudeOpus45
4745            | Self::AnthropicClaudeOpus46
4746            | Self::AnthropicClaudeOpus47
4747            | Self::AnthropicClaudeOpus47Fast
4748            | Self::AnthropicClaudeOpus48
4749            | Self::AnthropicClaudeOpus48Fast
4750            | Self::AnthropicClaudeOpus5
4751            | Self::AnthropicClaudeOpus5Fast
4752            | Self::AnthropicClaudeSonnet4
4753            | Self::AnthropicClaudeSonnet45
4754            | Self::AnthropicClaudeSonnet46
4755            | Self::AnthropicClaudeSonnet5
4756            | Self::ArceeAiTrinityLargeThinking
4757            | Self::ArceeAiVirtuosoLarge
4758            | Self::BytedanceSeedSeed16
4759            | Self::BytedanceSeedSeed16Flash
4760            | Self::BytedanceSeedSeed20Lite
4761            | Self::BytedanceSeedSeed20Mini
4762            | Self::CohereCommandR082024
4763            | Self::CohereCommandRPlus082024
4764            | Self::CohereNorthMiniCodeFree
4765            | Self::DeepseekDeepseekChat
4766            | Self::DeepseekDeepseekChatV30324
4767            | Self::DeepseekDeepseekChatV31
4768            | Self::DeepseekDeepseekR1
4769            | Self::DeepseekDeepseekR10528
4770            | Self::DeepseekDeepseekV31Terminus
4771            | Self::DeepseekDeepseekV32
4772            | Self::DeepseekDeepseekV32Exp
4773            | Self::DeepseekDeepseekV4Flash
4774            | Self::DeepseekDeepseekV4Pro
4775            | Self::GoogleGemini3ProImage
4776            | Self::GoogleGemma312bIt
4777            | Self::GoogleGemma327bIt
4778            | Self::GoogleGemma426bA4bIt
4779            | Self::GoogleGemma426bA4bItFree
4780            | Self::GoogleGemma431bIt
4781            | Self::GoogleGemma431bItFree
4782            | Self::IbmGraniteGranite418b
4783            | Self::InceptionMercury2
4784            | Self::InclusionaiLing261t
4785            | Self::InclusionaiLing26Flash
4786            | Self::InclusionaiLing30FlashFree
4787            | Self::InclusionaiRing261t
4788            | Self::KwaipilotKatCoderAirV25
4789            | Self::KwaipilotKatCoderProV2
4790            | Self::KwaipilotKatCoderProV25
4791            | Self::MeituanLongcat20
4792            | Self::MetaLlamaLlama3170bInstruct
4793            | Self::MetaLlamaLlama318bInstruct
4794            | Self::MetaLlamaLlama3370bInstruct
4795            | Self::MetaLlamaLlama4Maverick
4796            | Self::MetaLlamaLlama4Scout
4797            | Self::MinimaxMinimaxM1
4798            | Self::MinimaxMinimaxM2
4799            | Self::MinimaxMinimaxM21
4800            | Self::MinimaxMinimaxM25
4801            | Self::MinimaxMinimaxM27
4802            | Self::MinimaxMinimaxM3
4803            | Self::MistralaiCodestral2508
4804            | Self::MistralaiDevstral2512
4805            | Self::MistralaiMinistral14b2512
4806            | Self::MistralaiMinistral3b2512
4807            | Self::MistralaiMinistral8b2512
4808            | Self::MistralaiMistralLarge
4809            | Self::MistralaiMistralLarge2407
4810            | Self::MistralaiMistralLarge2512
4811            | Self::MistralaiMistralMedium3
4812            | Self::MistralaiMistralMedium35
4813            | Self::MistralaiMistralMedium31
4814            | Self::MistralaiMistralNemo
4815            | Self::MistralaiMistralSaba
4816            | Self::MistralaiMistralSmall2603
4817            | Self::MistralaiMistralSmall3224bInstruct
4818            | Self::MistralaiMixtral8x22bInstruct
4819            | Self::MoonshotaiKimiK2
4820            | Self::MoonshotaiKimiK20905
4821            | Self::MoonshotaiKimiK2Thinking
4822            | Self::MoonshotaiKimiK25
4823            | Self::MoonshotaiKimiK26
4824            | Self::MoonshotaiKimiK27Code
4825            | Self::MoonshotaiKimiK3
4826            | Self::NexAgiNexN2Mini
4827            | Self::NexAgiNexN2Pro
4828            | Self::NvidiaNemotron3Nano30bA3b
4829            | Self::NvidiaNemotron3Nano30bA3bFree
4830            | Self::NvidiaNemotron3Super120bA12b
4831            | Self::NvidiaNemotron3Super120bA12bFree
4832            | Self::NvidiaNemotron3Ultra550bA55b
4833            | Self::NvidiaNemotron3Ultra550bA55bFree
4834            | Self::NvidiaNemotronNano12bV2VlFree
4835            | Self::NvidiaNemotronNano9bV2Free
4836            | Self::OpenaiGpt35Turbo
4837            | Self::OpenaiGpt35Turbo0613
4838            | Self::OpenaiGpt35Turbo16k
4839            | Self::OpenaiGpt4
4840            | Self::OpenaiGpt4Turbo
4841            | Self::OpenaiGpt4TurboPreview
4842            | Self::OpenaiGpt41
4843            | Self::OpenaiGpt41Mini
4844            | Self::OpenaiGpt41Nano
4845            | Self::OpenaiGpt4o
4846            | Self::OpenaiGpt4o20240513
4847            | Self::OpenaiGpt4o20240806
4848            | Self::OpenaiGpt4o20241120
4849            | Self::OpenaiGpt4oMini
4850            | Self::OpenaiGpt4oMini20240718
4851            | Self::OpenaiGpt5
4852            | Self::OpenaiGpt5Codex
4853            | Self::OpenaiGpt5Mini
4854            | Self::OpenaiGpt5Nano
4855            | Self::OpenaiGpt5Pro
4856            | Self::OpenaiGpt51
4857            | Self::OpenaiGpt51Chat
4858            | Self::OpenaiGpt51Codex
4859            | Self::OpenaiGpt51CodexMax
4860            | Self::OpenaiGpt51CodexMini
4861            | Self::OpenaiGpt52
4862            | Self::OpenaiGpt52Chat
4863            | Self::OpenaiGpt52Codex
4864            | Self::OpenaiGpt52Pro
4865            | Self::OpenaiGpt53Chat
4866            | Self::OpenaiGpt53Codex
4867            | Self::OpenaiGpt54
4868            | Self::OpenaiGpt54Mini
4869            | Self::OpenaiGpt54Nano
4870            | Self::OpenaiGpt54Pro
4871            | Self::OpenaiGpt55
4872            | Self::OpenaiGpt55Pro
4873            | Self::OpenaiGpt56Luna
4874            | Self::OpenaiGpt56LunaPro
4875            | Self::OpenaiGpt56Sol
4876            | Self::OpenaiGpt56SolPro
4877            | Self::OpenaiGpt56Terra
4878            | Self::OpenaiGpt56TerraPro
4879            | Self::OpenaiGptOss120b
4880            | Self::OpenaiGptOss20b
4881            | Self::OpenaiGptOss20bFree
4882            | Self::OpenaiGptOssSafeguard20b
4883            | Self::OpenaiO1
4884            | Self::OpenaiO3
4885            | Self::OpenaiO3DeepResearch
4886            | Self::OpenaiO3Mini
4887            | Self::OpenaiO3MiniHigh
4888            | Self::OpenaiO3Pro
4889            | Self::OpenaiO4Mini
4890            | Self::OpenaiO4MiniDeepResearch
4891            | Self::OpenaiO4MiniHigh
4892            | Self::OpenrouterFree
4893            | Self::PoolsideLagunaM1
4894            | Self::PoolsideLagunaM1Free
4895            | Self::PoolsideLagunaS21
4896            | Self::PoolsideLagunaS21Free
4897            | Self::PoolsideLagunaXs21
4898            | Self::PoolsideLagunaXs21Free
4899            | Self::QwenQwen2572bInstruct
4900            | Self::QwenQwen257bInstruct
4901            | Self::QwenQwenPlus
4902            | Self::QwenQwenPlus20250728
4903            | Self::QwenQwenPlus20250728Thinking
4904            | Self::QwenQwen314b
4905            | Self::QwenQwen3235bA22b
4906            | Self::QwenQwen3235bA22b2507
4907            | Self::QwenQwen3235bA22bThinking2507
4908            | Self::QwenQwen330bA3b
4909            | Self::QwenQwen330bA3bInstruct2507
4910            | Self::QwenQwen330bA3bThinking2507
4911            | Self::QwenQwen332b
4912            | Self::QwenQwen38b
4913            | Self::QwenQwen3Coder
4914            | Self::QwenQwen3Coder30bA3bInstruct
4915            | Self::QwenQwen3CoderFlash
4916            | Self::QwenQwen3CoderNext
4917            | Self::QwenQwen3CoderPlus
4918            | Self::QwenQwen3Max
4919            | Self::QwenQwen3MaxThinking
4920            | Self::QwenQwen3Next80bA3bInstruct
4921            | Self::QwenQwen3Next80bA3bThinking
4922            | Self::QwenQwen3Vl235bA22bInstruct
4923            | Self::QwenQwen3Vl235bA22bThinking
4924            | Self::QwenQwen3Vl30bA3bInstruct
4925            | Self::QwenQwen3Vl30bA3bThinking
4926            | Self::QwenQwen3Vl32bInstruct
4927            | Self::QwenQwen3Vl8bInstruct
4928            | Self::QwenQwen3Vl8bThinking
4929            | Self::QwenQwen35122bA10b
4930            | Self::QwenQwen3527b
4931            | Self::QwenQwen3535bA3b
4932            | Self::QwenQwen35397bA17b
4933            | Self::QwenQwen359b
4934            | Self::QwenQwen35Flash0223
4935            | Self::QwenQwen35Plus0215
4936            | Self::QwenQwen35Plus20260420
4937            | Self::QwenQwen3627b
4938            | Self::QwenQwen3635bA3b
4939            | Self::QwenQwen36Flash
4940            | Self::QwenQwen36MaxPreview
4941            | Self::QwenQwen36Plus
4942            | Self::QwenQwen37Max
4943            | Self::QwenQwen37Plus
4944            | Self::RekaaiRekaEdge
4945            | Self::RelaceRelaceSearch
4946            | Self::SakanaFuguUltra
4947            | Self::Sao10kL31Euryale70b
4948            | Self::StepfunStep35Flash
4949            | Self::StepfunStep37Flash
4950            | Self::TencentHy3
4951            | Self::TencentHy3Preview
4952            | Self::ThedrummerUnslopnemo12b
4953            | Self::UpstageSolarPro3
4954            | Self::XAiGrok420
4955            | Self::XAiGrok43
4956            | Self::XAiGrok45
4957            | Self::XAiGrokBuild01
4958            | Self::XiaomiMimoV25Pro
4959            | Self::ZAiGlm45
4960            | Self::ZAiGlm45Air
4961            | Self::ZAiGlm45v
4962            | Self::ZAiGlm46
4963            | Self::ZAiGlm46v
4964            | Self::ZAiGlm47
4965            | Self::ZAiGlm47Flash
4966            | Self::ZAiGlm5
4967            | Self::ZAiGlm5Turbo
4968            | Self::ZAiGlm51
4969            | Self::ZAiGlm52
4970            | Self::ZAiGlm5vTurbo => false,
4971            Self::GoogleGemini25Flash
4972            | Self::GoogleGemini25FlashLite
4973            | Self::GoogleGemini25Pro
4974            | Self::GoogleGemini25ProPreview
4975            | Self::GoogleGemini25ProPreview0506
4976            | Self::GoogleGemini3FlashPreview
4977            | Self::GoogleGemini31FlashLite
4978            | Self::GoogleGemini31FlashLitePreview
4979            | Self::GoogleGemini31ProPreview
4980            | Self::GoogleGemini31ProPreviewCustomtools
4981            | Self::GoogleGemini35Flash
4982            | Self::GoogleGemini35FlashLite
4983            | Self::GoogleGemini36Flash
4984            | Self::MetaMuseSpark11
4985            | Self::MistralaiVoxtralSmall24b2507
4986            | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
4987            | Self::OpenaiGptAudio
4988            | Self::OpenaiGptAudioMini
4989            | Self::OpenrouterAuto
4990            | Self::ThinkingmachinesInkling
4991            | Self::XiaomiMimoV25 => true,
4992        }
4993    }
4994    #[allow(clippy::too_many_lines)]
4995    pub fn transport(self) -> Option<ModelTransport> {
4996        match self {
4997            Self::Ai21JambaLarge17
4998            | Self::AionLabsAion20
4999            | Self::AionLabsAion30
5000            | Self::AionLabsAion30Mini
5001            | Self::AmazonNova2LiteV1
5002            | Self::AmazonNovaLiteV1
5003            | Self::AmazonNovaMicroV1
5004            | Self::AmazonNovaPremierV1
5005            | Self::AmazonNovaProV1
5006            | Self::AnthropicClaude3Haiku
5007            | Self::AnthropicClaudeFable5
5008            | Self::AnthropicClaudeHaiku45
5009            | Self::AnthropicClaudeOpus4
5010            | Self::AnthropicClaudeOpus41
5011            | Self::AnthropicClaudeOpus45
5012            | Self::AnthropicClaudeOpus46
5013            | Self::AnthropicClaudeOpus47
5014            | Self::AnthropicClaudeOpus47Fast
5015            | Self::AnthropicClaudeOpus48
5016            | Self::AnthropicClaudeOpus48Fast
5017            | Self::AnthropicClaudeOpus5
5018            | Self::AnthropicClaudeOpus5Fast
5019            | Self::AnthropicClaudeSonnet4
5020            | Self::AnthropicClaudeSonnet45
5021            | Self::AnthropicClaudeSonnet46
5022            | Self::AnthropicClaudeSonnet5
5023            | Self::ArceeAiTrinityLargeThinking
5024            | Self::ArceeAiVirtuosoLarge
5025            | Self::BytedanceSeedSeed16
5026            | Self::BytedanceSeedSeed16Flash
5027            | Self::BytedanceSeedSeed20Lite
5028            | Self::BytedanceSeedSeed20Mini
5029            | Self::CohereCommandR082024
5030            | Self::CohereCommandRPlus082024
5031            | Self::CohereNorthMiniCodeFree
5032            | Self::DeepseekDeepseekChat
5033            | Self::DeepseekDeepseekChatV30324
5034            | Self::DeepseekDeepseekChatV31
5035            | Self::DeepseekDeepseekR1
5036            | Self::DeepseekDeepseekR10528
5037            | Self::DeepseekDeepseekV31Terminus
5038            | Self::DeepseekDeepseekV32
5039            | Self::DeepseekDeepseekV32Exp
5040            | Self::DeepseekDeepseekV4Flash
5041            | Self::DeepseekDeepseekV4Pro
5042            | Self::GoogleGemini25Flash
5043            | Self::GoogleGemini25FlashLite
5044            | Self::GoogleGemini25Pro
5045            | Self::GoogleGemini25ProPreview
5046            | Self::GoogleGemini25ProPreview0506
5047            | Self::GoogleGemini3FlashPreview
5048            | Self::GoogleGemini3ProImage
5049            | Self::GoogleGemini31FlashLite
5050            | Self::GoogleGemini31FlashLitePreview
5051            | Self::GoogleGemini31ProPreview
5052            | Self::GoogleGemini31ProPreviewCustomtools
5053            | Self::GoogleGemini35Flash
5054            | Self::GoogleGemini35FlashLite
5055            | Self::GoogleGemini36Flash
5056            | Self::GoogleGemma312bIt
5057            | Self::GoogleGemma327bIt
5058            | Self::GoogleGemma426bA4bIt
5059            | Self::GoogleGemma426bA4bItFree
5060            | Self::GoogleGemma431bIt
5061            | Self::GoogleGemma431bItFree
5062            | Self::IbmGraniteGranite418b
5063            | Self::InceptionMercury2
5064            | Self::InclusionaiLing261t
5065            | Self::InclusionaiLing26Flash
5066            | Self::InclusionaiLing30FlashFree
5067            | Self::InclusionaiRing261t
5068            | Self::KwaipilotKatCoderAirV25
5069            | Self::KwaipilotKatCoderProV2
5070            | Self::KwaipilotKatCoderProV25
5071            | Self::MeituanLongcat20
5072            | Self::MetaLlamaLlama3170bInstruct
5073            | Self::MetaLlamaLlama318bInstruct
5074            | Self::MetaLlamaLlama3370bInstruct
5075            | Self::MetaLlamaLlama4Maverick
5076            | Self::MetaLlamaLlama4Scout
5077            | Self::MetaMuseSpark11
5078            | Self::MinimaxMinimaxM1
5079            | Self::MinimaxMinimaxM2
5080            | Self::MinimaxMinimaxM21
5081            | Self::MinimaxMinimaxM25
5082            | Self::MinimaxMinimaxM27
5083            | Self::MinimaxMinimaxM3
5084            | Self::MistralaiCodestral2508
5085            | Self::MistralaiDevstral2512
5086            | Self::MistralaiMinistral14b2512
5087            | Self::MistralaiMinistral3b2512
5088            | Self::MistralaiMinistral8b2512
5089            | Self::MistralaiMistralLarge
5090            | Self::MistralaiMistralLarge2407
5091            | Self::MistralaiMistralLarge2512
5092            | Self::MistralaiMistralMedium3
5093            | Self::MistralaiMistralMedium35
5094            | Self::MistralaiMistralMedium31
5095            | Self::MistralaiMistralNemo
5096            | Self::MistralaiMistralSaba
5097            | Self::MistralaiMistralSmall2603
5098            | Self::MistralaiMistralSmall3224bInstruct
5099            | Self::MistralaiMixtral8x22bInstruct
5100            | Self::MistralaiVoxtralSmall24b2507
5101            | Self::MoonshotaiKimiK2
5102            | Self::MoonshotaiKimiK20905
5103            | Self::MoonshotaiKimiK2Thinking
5104            | Self::MoonshotaiKimiK25
5105            | Self::MoonshotaiKimiK26
5106            | Self::MoonshotaiKimiK27Code
5107            | Self::MoonshotaiKimiK3
5108            | Self::NexAgiNexN2Mini
5109            | Self::NexAgiNexN2Pro
5110            | Self::NvidiaNemotron3Nano30bA3b
5111            | Self::NvidiaNemotron3Nano30bA3bFree
5112            | Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree
5113            | Self::NvidiaNemotron3Super120bA12b
5114            | Self::NvidiaNemotron3Super120bA12bFree
5115            | Self::NvidiaNemotron3Ultra550bA55b
5116            | Self::NvidiaNemotron3Ultra550bA55bFree
5117            | Self::NvidiaNemotronNano12bV2VlFree
5118            | Self::NvidiaNemotronNano9bV2Free
5119            | Self::OpenaiGpt35Turbo
5120            | Self::OpenaiGpt35Turbo0613
5121            | Self::OpenaiGpt35Turbo16k
5122            | Self::OpenaiGpt4
5123            | Self::OpenaiGpt4Turbo
5124            | Self::OpenaiGpt4TurboPreview
5125            | Self::OpenaiGpt41
5126            | Self::OpenaiGpt41Mini
5127            | Self::OpenaiGpt41Nano
5128            | Self::OpenaiGpt4o
5129            | Self::OpenaiGpt4o20240513
5130            | Self::OpenaiGpt4o20240806
5131            | Self::OpenaiGpt4o20241120
5132            | Self::OpenaiGpt4oMini
5133            | Self::OpenaiGpt4oMini20240718
5134            | Self::OpenaiGpt5
5135            | Self::OpenaiGpt5Codex
5136            | Self::OpenaiGpt5Mini
5137            | Self::OpenaiGpt5Nano
5138            | Self::OpenaiGpt5Pro
5139            | Self::OpenaiGpt51
5140            | Self::OpenaiGpt51Chat
5141            | Self::OpenaiGpt51Codex
5142            | Self::OpenaiGpt51CodexMax
5143            | Self::OpenaiGpt51CodexMini
5144            | Self::OpenaiGpt52
5145            | Self::OpenaiGpt52Chat
5146            | Self::OpenaiGpt52Codex
5147            | Self::OpenaiGpt52Pro
5148            | Self::OpenaiGpt53Chat
5149            | Self::OpenaiGpt53Codex
5150            | Self::OpenaiGpt54
5151            | Self::OpenaiGpt54Mini
5152            | Self::OpenaiGpt54Nano
5153            | Self::OpenaiGpt54Pro
5154            | Self::OpenaiGpt55
5155            | Self::OpenaiGpt55Pro
5156            | Self::OpenaiGpt56Luna
5157            | Self::OpenaiGpt56LunaPro
5158            | Self::OpenaiGpt56Sol
5159            | Self::OpenaiGpt56SolPro
5160            | Self::OpenaiGpt56Terra
5161            | Self::OpenaiGpt56TerraPro
5162            | Self::OpenaiGptAudio
5163            | Self::OpenaiGptAudioMini
5164            | Self::OpenaiGptOss120b
5165            | Self::OpenaiGptOss20b
5166            | Self::OpenaiGptOss20bFree
5167            | Self::OpenaiGptOssSafeguard20b
5168            | Self::OpenaiO1
5169            | Self::OpenaiO3
5170            | Self::OpenaiO3DeepResearch
5171            | Self::OpenaiO3Mini
5172            | Self::OpenaiO3MiniHigh
5173            | Self::OpenaiO3Pro
5174            | Self::OpenaiO4Mini
5175            | Self::OpenaiO4MiniDeepResearch
5176            | Self::OpenaiO4MiniHigh
5177            | Self::OpenrouterAuto
5178            | Self::OpenrouterFree
5179            | Self::PoolsideLagunaM1
5180            | Self::PoolsideLagunaM1Free
5181            | Self::PoolsideLagunaS21
5182            | Self::PoolsideLagunaS21Free
5183            | Self::PoolsideLagunaXs21
5184            | Self::PoolsideLagunaXs21Free
5185            | Self::QwenQwen2572bInstruct
5186            | Self::QwenQwen257bInstruct
5187            | Self::QwenQwenPlus
5188            | Self::QwenQwenPlus20250728
5189            | Self::QwenQwenPlus20250728Thinking
5190            | Self::QwenQwen314b
5191            | Self::QwenQwen3235bA22b
5192            | Self::QwenQwen3235bA22b2507
5193            | Self::QwenQwen3235bA22bThinking2507
5194            | Self::QwenQwen330bA3b
5195            | Self::QwenQwen330bA3bInstruct2507
5196            | Self::QwenQwen330bA3bThinking2507
5197            | Self::QwenQwen332b
5198            | Self::QwenQwen38b
5199            | Self::QwenQwen3Coder
5200            | Self::QwenQwen3Coder30bA3bInstruct
5201            | Self::QwenQwen3CoderFlash
5202            | Self::QwenQwen3CoderNext
5203            | Self::QwenQwen3CoderPlus
5204            | Self::QwenQwen3Max
5205            | Self::QwenQwen3MaxThinking
5206            | Self::QwenQwen3Next80bA3bInstruct
5207            | Self::QwenQwen3Next80bA3bThinking
5208            | Self::QwenQwen3Vl235bA22bInstruct
5209            | Self::QwenQwen3Vl235bA22bThinking
5210            | Self::QwenQwen3Vl30bA3bInstruct
5211            | Self::QwenQwen3Vl30bA3bThinking
5212            | Self::QwenQwen3Vl32bInstruct
5213            | Self::QwenQwen3Vl8bInstruct
5214            | Self::QwenQwen3Vl8bThinking
5215            | Self::QwenQwen35122bA10b
5216            | Self::QwenQwen3527b
5217            | Self::QwenQwen3535bA3b
5218            | Self::QwenQwen35397bA17b
5219            | Self::QwenQwen359b
5220            | Self::QwenQwen35Flash0223
5221            | Self::QwenQwen35Plus0215
5222            | Self::QwenQwen35Plus20260420
5223            | Self::QwenQwen3627b
5224            | Self::QwenQwen3635bA3b
5225            | Self::QwenQwen36Flash
5226            | Self::QwenQwen36MaxPreview
5227            | Self::QwenQwen36Plus
5228            | Self::QwenQwen37Max
5229            | Self::QwenQwen37Plus
5230            | Self::RekaaiRekaEdge
5231            | Self::RelaceRelaceSearch
5232            | Self::SakanaFuguUltra
5233            | Self::Sao10kL31Euryale70b
5234            | Self::StepfunStep35Flash
5235            | Self::StepfunStep37Flash
5236            | Self::TencentHy3
5237            | Self::TencentHy3Preview
5238            | Self::ThedrummerUnslopnemo12b
5239            | Self::ThinkingmachinesInkling
5240            | Self::UpstageSolarPro3
5241            | Self::XAiGrok420
5242            | Self::XAiGrok43
5243            | Self::XAiGrok45
5244            | Self::XAiGrokBuild01
5245            | Self::XiaomiMimoV25
5246            | Self::XiaomiMimoV25Pro
5247            | Self::ZAiGlm45
5248            | Self::ZAiGlm45Air
5249            | Self::ZAiGlm45v
5250            | Self::ZAiGlm46
5251            | Self::ZAiGlm46v
5252            | Self::ZAiGlm47
5253            | Self::ZAiGlm47Flash
5254            | Self::ZAiGlm5
5255            | Self::ZAiGlm5Turbo
5256            | Self::ZAiGlm51
5257            | Self::ZAiGlm52
5258            | Self::ZAiGlm5vTurbo => None,
5259        }
5260    }
5261    const ALL: &[OpenRouterModel] = &[
5262        Self::Ai21JambaLarge17,
5263        Self::AionLabsAion20,
5264        Self::AionLabsAion30,
5265        Self::AionLabsAion30Mini,
5266        Self::AmazonNova2LiteV1,
5267        Self::AmazonNovaLiteV1,
5268        Self::AmazonNovaMicroV1,
5269        Self::AmazonNovaPremierV1,
5270        Self::AmazonNovaProV1,
5271        Self::AnthropicClaude3Haiku,
5272        Self::AnthropicClaudeFable5,
5273        Self::AnthropicClaudeHaiku45,
5274        Self::AnthropicClaudeOpus4,
5275        Self::AnthropicClaudeOpus41,
5276        Self::AnthropicClaudeOpus45,
5277        Self::AnthropicClaudeOpus46,
5278        Self::AnthropicClaudeOpus47,
5279        Self::AnthropicClaudeOpus47Fast,
5280        Self::AnthropicClaudeOpus48,
5281        Self::AnthropicClaudeOpus48Fast,
5282        Self::AnthropicClaudeOpus5,
5283        Self::AnthropicClaudeOpus5Fast,
5284        Self::AnthropicClaudeSonnet4,
5285        Self::AnthropicClaudeSonnet45,
5286        Self::AnthropicClaudeSonnet46,
5287        Self::AnthropicClaudeSonnet5,
5288        Self::ArceeAiTrinityLargeThinking,
5289        Self::ArceeAiVirtuosoLarge,
5290        Self::BytedanceSeedSeed16,
5291        Self::BytedanceSeedSeed16Flash,
5292        Self::BytedanceSeedSeed20Lite,
5293        Self::BytedanceSeedSeed20Mini,
5294        Self::CohereCommandR082024,
5295        Self::CohereCommandRPlus082024,
5296        Self::CohereNorthMiniCodeFree,
5297        Self::DeepseekDeepseekChat,
5298        Self::DeepseekDeepseekChatV30324,
5299        Self::DeepseekDeepseekChatV31,
5300        Self::DeepseekDeepseekR1,
5301        Self::DeepseekDeepseekR10528,
5302        Self::DeepseekDeepseekV31Terminus,
5303        Self::DeepseekDeepseekV32,
5304        Self::DeepseekDeepseekV32Exp,
5305        Self::DeepseekDeepseekV4Flash,
5306        Self::DeepseekDeepseekV4Pro,
5307        Self::GoogleGemini25Flash,
5308        Self::GoogleGemini25FlashLite,
5309        Self::GoogleGemini25Pro,
5310        Self::GoogleGemini25ProPreview,
5311        Self::GoogleGemini25ProPreview0506,
5312        Self::GoogleGemini3FlashPreview,
5313        Self::GoogleGemini3ProImage,
5314        Self::GoogleGemini31FlashLite,
5315        Self::GoogleGemini31FlashLitePreview,
5316        Self::GoogleGemini31ProPreview,
5317        Self::GoogleGemini31ProPreviewCustomtools,
5318        Self::GoogleGemini35Flash,
5319        Self::GoogleGemini35FlashLite,
5320        Self::GoogleGemini36Flash,
5321        Self::GoogleGemma312bIt,
5322        Self::GoogleGemma327bIt,
5323        Self::GoogleGemma426bA4bIt,
5324        Self::GoogleGemma426bA4bItFree,
5325        Self::GoogleGemma431bIt,
5326        Self::GoogleGemma431bItFree,
5327        Self::IbmGraniteGranite418b,
5328        Self::InceptionMercury2,
5329        Self::InclusionaiLing261t,
5330        Self::InclusionaiLing26Flash,
5331        Self::InclusionaiLing30FlashFree,
5332        Self::InclusionaiRing261t,
5333        Self::KwaipilotKatCoderAirV25,
5334        Self::KwaipilotKatCoderProV2,
5335        Self::KwaipilotKatCoderProV25,
5336        Self::MeituanLongcat20,
5337        Self::MetaLlamaLlama3170bInstruct,
5338        Self::MetaLlamaLlama318bInstruct,
5339        Self::MetaLlamaLlama3370bInstruct,
5340        Self::MetaLlamaLlama4Maverick,
5341        Self::MetaLlamaLlama4Scout,
5342        Self::MetaMuseSpark11,
5343        Self::MinimaxMinimaxM1,
5344        Self::MinimaxMinimaxM2,
5345        Self::MinimaxMinimaxM21,
5346        Self::MinimaxMinimaxM25,
5347        Self::MinimaxMinimaxM27,
5348        Self::MinimaxMinimaxM3,
5349        Self::MistralaiCodestral2508,
5350        Self::MistralaiDevstral2512,
5351        Self::MistralaiMinistral14b2512,
5352        Self::MistralaiMinistral3b2512,
5353        Self::MistralaiMinistral8b2512,
5354        Self::MistralaiMistralLarge,
5355        Self::MistralaiMistralLarge2407,
5356        Self::MistralaiMistralLarge2512,
5357        Self::MistralaiMistralMedium3,
5358        Self::MistralaiMistralMedium35,
5359        Self::MistralaiMistralMedium31,
5360        Self::MistralaiMistralNemo,
5361        Self::MistralaiMistralSaba,
5362        Self::MistralaiMistralSmall2603,
5363        Self::MistralaiMistralSmall3224bInstruct,
5364        Self::MistralaiMixtral8x22bInstruct,
5365        Self::MistralaiVoxtralSmall24b2507,
5366        Self::MoonshotaiKimiK2,
5367        Self::MoonshotaiKimiK20905,
5368        Self::MoonshotaiKimiK2Thinking,
5369        Self::MoonshotaiKimiK25,
5370        Self::MoonshotaiKimiK26,
5371        Self::MoonshotaiKimiK27Code,
5372        Self::MoonshotaiKimiK3,
5373        Self::NexAgiNexN2Mini,
5374        Self::NexAgiNexN2Pro,
5375        Self::NvidiaNemotron3Nano30bA3b,
5376        Self::NvidiaNemotron3Nano30bA3bFree,
5377        Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree,
5378        Self::NvidiaNemotron3Super120bA12b,
5379        Self::NvidiaNemotron3Super120bA12bFree,
5380        Self::NvidiaNemotron3Ultra550bA55b,
5381        Self::NvidiaNemotron3Ultra550bA55bFree,
5382        Self::NvidiaNemotronNano12bV2VlFree,
5383        Self::NvidiaNemotronNano9bV2Free,
5384        Self::OpenaiGpt35Turbo,
5385        Self::OpenaiGpt35Turbo0613,
5386        Self::OpenaiGpt35Turbo16k,
5387        Self::OpenaiGpt4,
5388        Self::OpenaiGpt4Turbo,
5389        Self::OpenaiGpt4TurboPreview,
5390        Self::OpenaiGpt41,
5391        Self::OpenaiGpt41Mini,
5392        Self::OpenaiGpt41Nano,
5393        Self::OpenaiGpt4o,
5394        Self::OpenaiGpt4o20240513,
5395        Self::OpenaiGpt4o20240806,
5396        Self::OpenaiGpt4o20241120,
5397        Self::OpenaiGpt4oMini,
5398        Self::OpenaiGpt4oMini20240718,
5399        Self::OpenaiGpt5,
5400        Self::OpenaiGpt5Codex,
5401        Self::OpenaiGpt5Mini,
5402        Self::OpenaiGpt5Nano,
5403        Self::OpenaiGpt5Pro,
5404        Self::OpenaiGpt51,
5405        Self::OpenaiGpt51Chat,
5406        Self::OpenaiGpt51Codex,
5407        Self::OpenaiGpt51CodexMax,
5408        Self::OpenaiGpt51CodexMini,
5409        Self::OpenaiGpt52,
5410        Self::OpenaiGpt52Chat,
5411        Self::OpenaiGpt52Codex,
5412        Self::OpenaiGpt52Pro,
5413        Self::OpenaiGpt53Chat,
5414        Self::OpenaiGpt53Codex,
5415        Self::OpenaiGpt54,
5416        Self::OpenaiGpt54Mini,
5417        Self::OpenaiGpt54Nano,
5418        Self::OpenaiGpt54Pro,
5419        Self::OpenaiGpt55,
5420        Self::OpenaiGpt55Pro,
5421        Self::OpenaiGpt56Luna,
5422        Self::OpenaiGpt56LunaPro,
5423        Self::OpenaiGpt56Sol,
5424        Self::OpenaiGpt56SolPro,
5425        Self::OpenaiGpt56Terra,
5426        Self::OpenaiGpt56TerraPro,
5427        Self::OpenaiGptAudio,
5428        Self::OpenaiGptAudioMini,
5429        Self::OpenaiGptOss120b,
5430        Self::OpenaiGptOss20b,
5431        Self::OpenaiGptOss20bFree,
5432        Self::OpenaiGptOssSafeguard20b,
5433        Self::OpenaiO1,
5434        Self::OpenaiO3,
5435        Self::OpenaiO3DeepResearch,
5436        Self::OpenaiO3Mini,
5437        Self::OpenaiO3MiniHigh,
5438        Self::OpenaiO3Pro,
5439        Self::OpenaiO4Mini,
5440        Self::OpenaiO4MiniDeepResearch,
5441        Self::OpenaiO4MiniHigh,
5442        Self::OpenrouterAuto,
5443        Self::OpenrouterFree,
5444        Self::PoolsideLagunaM1,
5445        Self::PoolsideLagunaM1Free,
5446        Self::PoolsideLagunaS21,
5447        Self::PoolsideLagunaS21Free,
5448        Self::PoolsideLagunaXs21,
5449        Self::PoolsideLagunaXs21Free,
5450        Self::QwenQwen2572bInstruct,
5451        Self::QwenQwen257bInstruct,
5452        Self::QwenQwenPlus,
5453        Self::QwenQwenPlus20250728,
5454        Self::QwenQwenPlus20250728Thinking,
5455        Self::QwenQwen314b,
5456        Self::QwenQwen3235bA22b,
5457        Self::QwenQwen3235bA22b2507,
5458        Self::QwenQwen3235bA22bThinking2507,
5459        Self::QwenQwen330bA3b,
5460        Self::QwenQwen330bA3bInstruct2507,
5461        Self::QwenQwen330bA3bThinking2507,
5462        Self::QwenQwen332b,
5463        Self::QwenQwen38b,
5464        Self::QwenQwen3Coder,
5465        Self::QwenQwen3Coder30bA3bInstruct,
5466        Self::QwenQwen3CoderFlash,
5467        Self::QwenQwen3CoderNext,
5468        Self::QwenQwen3CoderPlus,
5469        Self::QwenQwen3Max,
5470        Self::QwenQwen3MaxThinking,
5471        Self::QwenQwen3Next80bA3bInstruct,
5472        Self::QwenQwen3Next80bA3bThinking,
5473        Self::QwenQwen3Vl235bA22bInstruct,
5474        Self::QwenQwen3Vl235bA22bThinking,
5475        Self::QwenQwen3Vl30bA3bInstruct,
5476        Self::QwenQwen3Vl30bA3bThinking,
5477        Self::QwenQwen3Vl32bInstruct,
5478        Self::QwenQwen3Vl8bInstruct,
5479        Self::QwenQwen3Vl8bThinking,
5480        Self::QwenQwen35122bA10b,
5481        Self::QwenQwen3527b,
5482        Self::QwenQwen3535bA3b,
5483        Self::QwenQwen35397bA17b,
5484        Self::QwenQwen359b,
5485        Self::QwenQwen35Flash0223,
5486        Self::QwenQwen35Plus0215,
5487        Self::QwenQwen35Plus20260420,
5488        Self::QwenQwen3627b,
5489        Self::QwenQwen3635bA3b,
5490        Self::QwenQwen36Flash,
5491        Self::QwenQwen36MaxPreview,
5492        Self::QwenQwen36Plus,
5493        Self::QwenQwen37Max,
5494        Self::QwenQwen37Plus,
5495        Self::RekaaiRekaEdge,
5496        Self::RelaceRelaceSearch,
5497        Self::SakanaFuguUltra,
5498        Self::Sao10kL31Euryale70b,
5499        Self::StepfunStep35Flash,
5500        Self::StepfunStep37Flash,
5501        Self::TencentHy3,
5502        Self::TencentHy3Preview,
5503        Self::ThedrummerUnslopnemo12b,
5504        Self::ThinkingmachinesInkling,
5505        Self::UpstageSolarPro3,
5506        Self::XAiGrok420,
5507        Self::XAiGrok43,
5508        Self::XAiGrok45,
5509        Self::XAiGrokBuild01,
5510        Self::XiaomiMimoV25,
5511        Self::XiaomiMimoV25Pro,
5512        Self::ZAiGlm45,
5513        Self::ZAiGlm45Air,
5514        Self::ZAiGlm45v,
5515        Self::ZAiGlm46,
5516        Self::ZAiGlm46v,
5517        Self::ZAiGlm47,
5518        Self::ZAiGlm47Flash,
5519        Self::ZAiGlm5,
5520        Self::ZAiGlm5Turbo,
5521        Self::ZAiGlm51,
5522        Self::ZAiGlm52,
5523        Self::ZAiGlm5vTurbo,
5524    ];
5525}
5526impl std::str::FromStr for OpenRouterModel {
5527    type Err = String;
5528    #[allow(clippy::too_many_lines)]
5529    fn from_str(s: &str) -> Result<Self, Self::Err> {
5530        match s {
5531            "ai21/jamba-large-1.7" => Ok(Self::Ai21JambaLarge17),
5532            "aion-labs/aion-2.0" => Ok(Self::AionLabsAion20),
5533            "aion-labs/aion-3.0" => Ok(Self::AionLabsAion30),
5534            "aion-labs/aion-3.0-mini" => Ok(Self::AionLabsAion30Mini),
5535            "amazon/nova-2-lite-v1" => Ok(Self::AmazonNova2LiteV1),
5536            "amazon/nova-lite-v1" => Ok(Self::AmazonNovaLiteV1),
5537            "amazon/nova-micro-v1" => Ok(Self::AmazonNovaMicroV1),
5538            "amazon/nova-premier-v1" => Ok(Self::AmazonNovaPremierV1),
5539            "amazon/nova-pro-v1" => Ok(Self::AmazonNovaProV1),
5540            "anthropic/claude-3-haiku" => Ok(Self::AnthropicClaude3Haiku),
5541            "anthropic/claude-fable-5" => Ok(Self::AnthropicClaudeFable5),
5542            "anthropic/claude-haiku-4.5" => Ok(Self::AnthropicClaudeHaiku45),
5543            "anthropic/claude-opus-4" => Ok(Self::AnthropicClaudeOpus4),
5544            "anthropic/claude-opus-4.1" => Ok(Self::AnthropicClaudeOpus41),
5545            "anthropic/claude-opus-4.5" => Ok(Self::AnthropicClaudeOpus45),
5546            "anthropic/claude-opus-4.6" => Ok(Self::AnthropicClaudeOpus46),
5547            "anthropic/claude-opus-4.7" => Ok(Self::AnthropicClaudeOpus47),
5548            "anthropic/claude-opus-4.7-fast" => Ok(Self::AnthropicClaudeOpus47Fast),
5549            "anthropic/claude-opus-4.8" => Ok(Self::AnthropicClaudeOpus48),
5550            "anthropic/claude-opus-4.8-fast" => Ok(Self::AnthropicClaudeOpus48Fast),
5551            "anthropic/claude-opus-5" => Ok(Self::AnthropicClaudeOpus5),
5552            "anthropic/claude-opus-5-fast" => Ok(Self::AnthropicClaudeOpus5Fast),
5553            "anthropic/claude-sonnet-4" => Ok(Self::AnthropicClaudeSonnet4),
5554            "anthropic/claude-sonnet-4.5" => Ok(Self::AnthropicClaudeSonnet45),
5555            "anthropic/claude-sonnet-4.6" => Ok(Self::AnthropicClaudeSonnet46),
5556            "anthropic/claude-sonnet-5" => Ok(Self::AnthropicClaudeSonnet5),
5557            "arcee-ai/trinity-large-thinking" => Ok(Self::ArceeAiTrinityLargeThinking),
5558            "arcee-ai/virtuoso-large" => Ok(Self::ArceeAiVirtuosoLarge),
5559            "bytedance-seed/seed-1.6" => Ok(Self::BytedanceSeedSeed16),
5560            "bytedance-seed/seed-1.6-flash" => Ok(Self::BytedanceSeedSeed16Flash),
5561            "bytedance-seed/seed-2.0-lite" => Ok(Self::BytedanceSeedSeed20Lite),
5562            "bytedance-seed/seed-2.0-mini" => Ok(Self::BytedanceSeedSeed20Mini),
5563            "cohere/command-r-08-2024" => Ok(Self::CohereCommandR082024),
5564            "cohere/command-r-plus-08-2024" => Ok(Self::CohereCommandRPlus082024),
5565            "cohere/north-mini-code:free" => Ok(Self::CohereNorthMiniCodeFree),
5566            "deepseek/deepseek-chat" => Ok(Self::DeepseekDeepseekChat),
5567            "deepseek/deepseek-chat-v3-0324" => Ok(Self::DeepseekDeepseekChatV30324),
5568            "deepseek/deepseek-chat-v3.1" => Ok(Self::DeepseekDeepseekChatV31),
5569            "deepseek/deepseek-r1" => Ok(Self::DeepseekDeepseekR1),
5570            "deepseek/deepseek-r1-0528" => Ok(Self::DeepseekDeepseekR10528),
5571            "deepseek/deepseek-v3.1-terminus" => Ok(Self::DeepseekDeepseekV31Terminus),
5572            "deepseek/deepseek-v3.2" => Ok(Self::DeepseekDeepseekV32),
5573            "deepseek/deepseek-v3.2-exp" => Ok(Self::DeepseekDeepseekV32Exp),
5574            "deepseek/deepseek-v4-flash" => Ok(Self::DeepseekDeepseekV4Flash),
5575            "deepseek/deepseek-v4-pro" => Ok(Self::DeepseekDeepseekV4Pro),
5576            "google/gemini-2.5-flash" => Ok(Self::GoogleGemini25Flash),
5577            "google/gemini-2.5-flash-lite" => Ok(Self::GoogleGemini25FlashLite),
5578            "google/gemini-2.5-pro" => Ok(Self::GoogleGemini25Pro),
5579            "google/gemini-2.5-pro-preview" => Ok(Self::GoogleGemini25ProPreview),
5580            "google/gemini-2.5-pro-preview-05-06" => {
5581                Ok(Self::GoogleGemini25ProPreview0506)
5582            }
5583            "google/gemini-3-flash-preview" => Ok(Self::GoogleGemini3FlashPreview),
5584            "google/gemini-3-pro-image" => Ok(Self::GoogleGemini3ProImage),
5585            "google/gemini-3.1-flash-lite" => Ok(Self::GoogleGemini31FlashLite),
5586            "google/gemini-3.1-flash-lite-preview" => {
5587                Ok(Self::GoogleGemini31FlashLitePreview)
5588            }
5589            "google/gemini-3.1-pro-preview" => Ok(Self::GoogleGemini31ProPreview),
5590            "google/gemini-3.1-pro-preview-customtools" => {
5591                Ok(Self::GoogleGemini31ProPreviewCustomtools)
5592            }
5593            "google/gemini-3.5-flash" => Ok(Self::GoogleGemini35Flash),
5594            "google/gemini-3.5-flash-lite" => Ok(Self::GoogleGemini35FlashLite),
5595            "google/gemini-3.6-flash" => Ok(Self::GoogleGemini36Flash),
5596            "google/gemma-3-12b-it" => Ok(Self::GoogleGemma312bIt),
5597            "google/gemma-3-27b-it" => Ok(Self::GoogleGemma327bIt),
5598            "google/gemma-4-26b-a4b-it" => Ok(Self::GoogleGemma426bA4bIt),
5599            "google/gemma-4-26b-a4b-it:free" => Ok(Self::GoogleGemma426bA4bItFree),
5600            "google/gemma-4-31b-it" => Ok(Self::GoogleGemma431bIt),
5601            "google/gemma-4-31b-it:free" => Ok(Self::GoogleGemma431bItFree),
5602            "ibm-granite/granite-4.1-8b" => Ok(Self::IbmGraniteGranite418b),
5603            "inception/mercury-2" => Ok(Self::InceptionMercury2),
5604            "inclusionai/ling-2.6-1t" => Ok(Self::InclusionaiLing261t),
5605            "inclusionai/ling-2.6-flash" => Ok(Self::InclusionaiLing26Flash),
5606            "inclusionai/ling-3.0-flash:free" => Ok(Self::InclusionaiLing30FlashFree),
5607            "inclusionai/ring-2.6-1t" => Ok(Self::InclusionaiRing261t),
5608            "kwaipilot/kat-coder-air-v2.5" => Ok(Self::KwaipilotKatCoderAirV25),
5609            "kwaipilot/kat-coder-pro-v2" => Ok(Self::KwaipilotKatCoderProV2),
5610            "kwaipilot/kat-coder-pro-v2.5" => Ok(Self::KwaipilotKatCoderProV25),
5611            "meituan/longcat-2.0" => Ok(Self::MeituanLongcat20),
5612            "meta-llama/llama-3.1-70b-instruct" => Ok(Self::MetaLlamaLlama3170bInstruct),
5613            "meta-llama/llama-3.1-8b-instruct" => Ok(Self::MetaLlamaLlama318bInstruct),
5614            "meta-llama/llama-3.3-70b-instruct" => Ok(Self::MetaLlamaLlama3370bInstruct),
5615            "meta-llama/llama-4-maverick" => Ok(Self::MetaLlamaLlama4Maverick),
5616            "meta-llama/llama-4-scout" => Ok(Self::MetaLlamaLlama4Scout),
5617            "meta/muse-spark-1.1" => Ok(Self::MetaMuseSpark11),
5618            "minimax/minimax-m1" => Ok(Self::MinimaxMinimaxM1),
5619            "minimax/minimax-m2" => Ok(Self::MinimaxMinimaxM2),
5620            "minimax/minimax-m2.1" => Ok(Self::MinimaxMinimaxM21),
5621            "minimax/minimax-m2.5" => Ok(Self::MinimaxMinimaxM25),
5622            "minimax/minimax-m2.7" => Ok(Self::MinimaxMinimaxM27),
5623            "minimax/minimax-m3" => Ok(Self::MinimaxMinimaxM3),
5624            "mistralai/codestral-2508" => Ok(Self::MistralaiCodestral2508),
5625            "mistralai/devstral-2512" => Ok(Self::MistralaiDevstral2512),
5626            "mistralai/ministral-14b-2512" => Ok(Self::MistralaiMinistral14b2512),
5627            "mistralai/ministral-3b-2512" => Ok(Self::MistralaiMinistral3b2512),
5628            "mistralai/ministral-8b-2512" => Ok(Self::MistralaiMinistral8b2512),
5629            "mistralai/mistral-large" => Ok(Self::MistralaiMistralLarge),
5630            "mistralai/mistral-large-2407" => Ok(Self::MistralaiMistralLarge2407),
5631            "mistralai/mistral-large-2512" => Ok(Self::MistralaiMistralLarge2512),
5632            "mistralai/mistral-medium-3" => Ok(Self::MistralaiMistralMedium3),
5633            "mistralai/mistral-medium-3-5" => Ok(Self::MistralaiMistralMedium35),
5634            "mistralai/mistral-medium-3.1" => Ok(Self::MistralaiMistralMedium31),
5635            "mistralai/mistral-nemo" => Ok(Self::MistralaiMistralNemo),
5636            "mistralai/mistral-saba" => Ok(Self::MistralaiMistralSaba),
5637            "mistralai/mistral-small-2603" => Ok(Self::MistralaiMistralSmall2603),
5638            "mistralai/mistral-small-3.2-24b-instruct" => {
5639                Ok(Self::MistralaiMistralSmall3224bInstruct)
5640            }
5641            "mistralai/mixtral-8x22b-instruct" => Ok(Self::MistralaiMixtral8x22bInstruct),
5642            "mistralai/voxtral-small-24b-2507" => Ok(Self::MistralaiVoxtralSmall24b2507),
5643            "moonshotai/kimi-k2" => Ok(Self::MoonshotaiKimiK2),
5644            "moonshotai/kimi-k2-0905" => Ok(Self::MoonshotaiKimiK20905),
5645            "moonshotai/kimi-k2-thinking" => Ok(Self::MoonshotaiKimiK2Thinking),
5646            "moonshotai/kimi-k2.5" => Ok(Self::MoonshotaiKimiK25),
5647            "moonshotai/kimi-k2.6" => Ok(Self::MoonshotaiKimiK26),
5648            "moonshotai/kimi-k2.7-code" => Ok(Self::MoonshotaiKimiK27Code),
5649            "moonshotai/kimi-k3" => Ok(Self::MoonshotaiKimiK3),
5650            "nex-agi/nex-n2-mini" => Ok(Self::NexAgiNexN2Mini),
5651            "nex-agi/nex-n2-pro" => Ok(Self::NexAgiNexN2Pro),
5652            "nvidia/nemotron-3-nano-30b-a3b" => Ok(Self::NvidiaNemotron3Nano30bA3b),
5653            "nvidia/nemotron-3-nano-30b-a3b:free" => {
5654                Ok(Self::NvidiaNemotron3Nano30bA3bFree)
5655            }
5656            "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free" => {
5657                Ok(Self::NvidiaNemotron3NanoOmni30bA3bReasoningFree)
5658            }
5659            "nvidia/nemotron-3-super-120b-a12b" => Ok(Self::NvidiaNemotron3Super120bA12b),
5660            "nvidia/nemotron-3-super-120b-a12b:free" => {
5661                Ok(Self::NvidiaNemotron3Super120bA12bFree)
5662            }
5663            "nvidia/nemotron-3-ultra-550b-a55b" => Ok(Self::NvidiaNemotron3Ultra550bA55b),
5664            "nvidia/nemotron-3-ultra-550b-a55b:free" => {
5665                Ok(Self::NvidiaNemotron3Ultra550bA55bFree)
5666            }
5667            "nvidia/nemotron-nano-12b-v2-vl:free" => {
5668                Ok(Self::NvidiaNemotronNano12bV2VlFree)
5669            }
5670            "nvidia/nemotron-nano-9b-v2:free" => Ok(Self::NvidiaNemotronNano9bV2Free),
5671            "openai/gpt-3.5-turbo" => Ok(Self::OpenaiGpt35Turbo),
5672            "openai/gpt-3.5-turbo-0613" => Ok(Self::OpenaiGpt35Turbo0613),
5673            "openai/gpt-3.5-turbo-16k" => Ok(Self::OpenaiGpt35Turbo16k),
5674            "openai/gpt-4" => Ok(Self::OpenaiGpt4),
5675            "openai/gpt-4-turbo" => Ok(Self::OpenaiGpt4Turbo),
5676            "openai/gpt-4-turbo-preview" => Ok(Self::OpenaiGpt4TurboPreview),
5677            "openai/gpt-4.1" => Ok(Self::OpenaiGpt41),
5678            "openai/gpt-4.1-mini" => Ok(Self::OpenaiGpt41Mini),
5679            "openai/gpt-4.1-nano" => Ok(Self::OpenaiGpt41Nano),
5680            "openai/gpt-4o" => Ok(Self::OpenaiGpt4o),
5681            "openai/gpt-4o-2024-05-13" => Ok(Self::OpenaiGpt4o20240513),
5682            "openai/gpt-4o-2024-08-06" => Ok(Self::OpenaiGpt4o20240806),
5683            "openai/gpt-4o-2024-11-20" => Ok(Self::OpenaiGpt4o20241120),
5684            "openai/gpt-4o-mini" => Ok(Self::OpenaiGpt4oMini),
5685            "openai/gpt-4o-mini-2024-07-18" => Ok(Self::OpenaiGpt4oMini20240718),
5686            "openai/gpt-5" => Ok(Self::OpenaiGpt5),
5687            "openai/gpt-5-codex" => Ok(Self::OpenaiGpt5Codex),
5688            "openai/gpt-5-mini" => Ok(Self::OpenaiGpt5Mini),
5689            "openai/gpt-5-nano" => Ok(Self::OpenaiGpt5Nano),
5690            "openai/gpt-5-pro" => Ok(Self::OpenaiGpt5Pro),
5691            "openai/gpt-5.1" => Ok(Self::OpenaiGpt51),
5692            "openai/gpt-5.1-chat" => Ok(Self::OpenaiGpt51Chat),
5693            "openai/gpt-5.1-codex" => Ok(Self::OpenaiGpt51Codex),
5694            "openai/gpt-5.1-codex-max" => Ok(Self::OpenaiGpt51CodexMax),
5695            "openai/gpt-5.1-codex-mini" => Ok(Self::OpenaiGpt51CodexMini),
5696            "openai/gpt-5.2" => Ok(Self::OpenaiGpt52),
5697            "openai/gpt-5.2-chat" => Ok(Self::OpenaiGpt52Chat),
5698            "openai/gpt-5.2-codex" => Ok(Self::OpenaiGpt52Codex),
5699            "openai/gpt-5.2-pro" => Ok(Self::OpenaiGpt52Pro),
5700            "openai/gpt-5.3-chat" => Ok(Self::OpenaiGpt53Chat),
5701            "openai/gpt-5.3-codex" => Ok(Self::OpenaiGpt53Codex),
5702            "openai/gpt-5.4" => Ok(Self::OpenaiGpt54),
5703            "openai/gpt-5.4-mini" => Ok(Self::OpenaiGpt54Mini),
5704            "openai/gpt-5.4-nano" => Ok(Self::OpenaiGpt54Nano),
5705            "openai/gpt-5.4-pro" => Ok(Self::OpenaiGpt54Pro),
5706            "openai/gpt-5.5" => Ok(Self::OpenaiGpt55),
5707            "openai/gpt-5.5-pro" => Ok(Self::OpenaiGpt55Pro),
5708            "openai/gpt-5.6-luna" => Ok(Self::OpenaiGpt56Luna),
5709            "openai/gpt-5.6-luna-pro" => Ok(Self::OpenaiGpt56LunaPro),
5710            "openai/gpt-5.6-sol" => Ok(Self::OpenaiGpt56Sol),
5711            "openai/gpt-5.6-sol-pro" => Ok(Self::OpenaiGpt56SolPro),
5712            "openai/gpt-5.6-terra" => Ok(Self::OpenaiGpt56Terra),
5713            "openai/gpt-5.6-terra-pro" => Ok(Self::OpenaiGpt56TerraPro),
5714            "openai/gpt-audio" => Ok(Self::OpenaiGptAudio),
5715            "openai/gpt-audio-mini" => Ok(Self::OpenaiGptAudioMini),
5716            "openai/gpt-oss-120b" => Ok(Self::OpenaiGptOss120b),
5717            "openai/gpt-oss-20b" => Ok(Self::OpenaiGptOss20b),
5718            "openai/gpt-oss-20b:free" => Ok(Self::OpenaiGptOss20bFree),
5719            "openai/gpt-oss-safeguard-20b" => Ok(Self::OpenaiGptOssSafeguard20b),
5720            "openai/o1" => Ok(Self::OpenaiO1),
5721            "openai/o3" => Ok(Self::OpenaiO3),
5722            "openai/o3-deep-research" => Ok(Self::OpenaiO3DeepResearch),
5723            "openai/o3-mini" => Ok(Self::OpenaiO3Mini),
5724            "openai/o3-mini-high" => Ok(Self::OpenaiO3MiniHigh),
5725            "openai/o3-pro" => Ok(Self::OpenaiO3Pro),
5726            "openai/o4-mini" => Ok(Self::OpenaiO4Mini),
5727            "openai/o4-mini-deep-research" => Ok(Self::OpenaiO4MiniDeepResearch),
5728            "openai/o4-mini-high" => Ok(Self::OpenaiO4MiniHigh),
5729            "openrouter/auto" => Ok(Self::OpenrouterAuto),
5730            "openrouter/free" => Ok(Self::OpenrouterFree),
5731            "poolside/laguna-m.1" => Ok(Self::PoolsideLagunaM1),
5732            "poolside/laguna-m.1:free" => Ok(Self::PoolsideLagunaM1Free),
5733            "poolside/laguna-s-2.1" => Ok(Self::PoolsideLagunaS21),
5734            "poolside/laguna-s-2.1:free" => Ok(Self::PoolsideLagunaS21Free),
5735            "poolside/laguna-xs-2.1" => Ok(Self::PoolsideLagunaXs21),
5736            "poolside/laguna-xs-2.1:free" => Ok(Self::PoolsideLagunaXs21Free),
5737            "qwen/qwen-2.5-72b-instruct" => Ok(Self::QwenQwen2572bInstruct),
5738            "qwen/qwen-2.5-7b-instruct" => Ok(Self::QwenQwen257bInstruct),
5739            "qwen/qwen-plus" => Ok(Self::QwenQwenPlus),
5740            "qwen/qwen-plus-2025-07-28" => Ok(Self::QwenQwenPlus20250728),
5741            "qwen/qwen-plus-2025-07-28:thinking" => {
5742                Ok(Self::QwenQwenPlus20250728Thinking)
5743            }
5744            "qwen/qwen3-14b" => Ok(Self::QwenQwen314b),
5745            "qwen/qwen3-235b-a22b" => Ok(Self::QwenQwen3235bA22b),
5746            "qwen/qwen3-235b-a22b-2507" => Ok(Self::QwenQwen3235bA22b2507),
5747            "qwen/qwen3-235b-a22b-thinking-2507" => {
5748                Ok(Self::QwenQwen3235bA22bThinking2507)
5749            }
5750            "qwen/qwen3-30b-a3b" => Ok(Self::QwenQwen330bA3b),
5751            "qwen/qwen3-30b-a3b-instruct-2507" => Ok(Self::QwenQwen330bA3bInstruct2507),
5752            "qwen/qwen3-30b-a3b-thinking-2507" => Ok(Self::QwenQwen330bA3bThinking2507),
5753            "qwen/qwen3-32b" => Ok(Self::QwenQwen332b),
5754            "qwen/qwen3-8b" => Ok(Self::QwenQwen38b),
5755            "qwen/qwen3-coder" => Ok(Self::QwenQwen3Coder),
5756            "qwen/qwen3-coder-30b-a3b-instruct" => Ok(Self::QwenQwen3Coder30bA3bInstruct),
5757            "qwen/qwen3-coder-flash" => Ok(Self::QwenQwen3CoderFlash),
5758            "qwen/qwen3-coder-next" => Ok(Self::QwenQwen3CoderNext),
5759            "qwen/qwen3-coder-plus" => Ok(Self::QwenQwen3CoderPlus),
5760            "qwen/qwen3-max" => Ok(Self::QwenQwen3Max),
5761            "qwen/qwen3-max-thinking" => Ok(Self::QwenQwen3MaxThinking),
5762            "qwen/qwen3-next-80b-a3b-instruct" => Ok(Self::QwenQwen3Next80bA3bInstruct),
5763            "qwen/qwen3-next-80b-a3b-thinking" => Ok(Self::QwenQwen3Next80bA3bThinking),
5764            "qwen/qwen3-vl-235b-a22b-instruct" => Ok(Self::QwenQwen3Vl235bA22bInstruct),
5765            "qwen/qwen3-vl-235b-a22b-thinking" => Ok(Self::QwenQwen3Vl235bA22bThinking),
5766            "qwen/qwen3-vl-30b-a3b-instruct" => Ok(Self::QwenQwen3Vl30bA3bInstruct),
5767            "qwen/qwen3-vl-30b-a3b-thinking" => Ok(Self::QwenQwen3Vl30bA3bThinking),
5768            "qwen/qwen3-vl-32b-instruct" => Ok(Self::QwenQwen3Vl32bInstruct),
5769            "qwen/qwen3-vl-8b-instruct" => Ok(Self::QwenQwen3Vl8bInstruct),
5770            "qwen/qwen3-vl-8b-thinking" => Ok(Self::QwenQwen3Vl8bThinking),
5771            "qwen/qwen3.5-122b-a10b" => Ok(Self::QwenQwen35122bA10b),
5772            "qwen/qwen3.5-27b" => Ok(Self::QwenQwen3527b),
5773            "qwen/qwen3.5-35b-a3b" => Ok(Self::QwenQwen3535bA3b),
5774            "qwen/qwen3.5-397b-a17b" => Ok(Self::QwenQwen35397bA17b),
5775            "qwen/qwen3.5-9b" => Ok(Self::QwenQwen359b),
5776            "qwen/qwen3.5-flash-02-23" => Ok(Self::QwenQwen35Flash0223),
5777            "qwen/qwen3.5-plus-02-15" => Ok(Self::QwenQwen35Plus0215),
5778            "qwen/qwen3.5-plus-20260420" => Ok(Self::QwenQwen35Plus20260420),
5779            "qwen/qwen3.6-27b" => Ok(Self::QwenQwen3627b),
5780            "qwen/qwen3.6-35b-a3b" => Ok(Self::QwenQwen3635bA3b),
5781            "qwen/qwen3.6-flash" => Ok(Self::QwenQwen36Flash),
5782            "qwen/qwen3.6-max-preview" => Ok(Self::QwenQwen36MaxPreview),
5783            "qwen/qwen3.6-plus" => Ok(Self::QwenQwen36Plus),
5784            "qwen/qwen3.7-max" => Ok(Self::QwenQwen37Max),
5785            "qwen/qwen3.7-plus" => Ok(Self::QwenQwen37Plus),
5786            "rekaai/reka-edge" => Ok(Self::RekaaiRekaEdge),
5787            "relace/relace-search" => Ok(Self::RelaceRelaceSearch),
5788            "sakana/fugu-ultra" => Ok(Self::SakanaFuguUltra),
5789            "sao10k/l3.1-euryale-70b" => Ok(Self::Sao10kL31Euryale70b),
5790            "stepfun/step-3.5-flash" => Ok(Self::StepfunStep35Flash),
5791            "stepfun/step-3.7-flash" => Ok(Self::StepfunStep37Flash),
5792            "tencent/hy3" => Ok(Self::TencentHy3),
5793            "tencent/hy3-preview" => Ok(Self::TencentHy3Preview),
5794            "thedrummer/unslopnemo-12b" => Ok(Self::ThedrummerUnslopnemo12b),
5795            "thinkingmachines/inkling" => Ok(Self::ThinkingmachinesInkling),
5796            "upstage/solar-pro-3" => Ok(Self::UpstageSolarPro3),
5797            "x-ai/grok-4.20" => Ok(Self::XAiGrok420),
5798            "x-ai/grok-4.3" => Ok(Self::XAiGrok43),
5799            "x-ai/grok-4.5" => Ok(Self::XAiGrok45),
5800            "x-ai/grok-build-0.1" => Ok(Self::XAiGrokBuild01),
5801            "xiaomi/mimo-v2.5" => Ok(Self::XiaomiMimoV25),
5802            "xiaomi/mimo-v2.5-pro" => Ok(Self::XiaomiMimoV25Pro),
5803            "z-ai/glm-4.5" => Ok(Self::ZAiGlm45),
5804            "z-ai/glm-4.5-air" => Ok(Self::ZAiGlm45Air),
5805            "z-ai/glm-4.5v" => Ok(Self::ZAiGlm45v),
5806            "z-ai/glm-4.6" => Ok(Self::ZAiGlm46),
5807            "z-ai/glm-4.6v" => Ok(Self::ZAiGlm46v),
5808            "z-ai/glm-4.7" => Ok(Self::ZAiGlm47),
5809            "z-ai/glm-4.7-flash" => Ok(Self::ZAiGlm47Flash),
5810            "z-ai/glm-5" => Ok(Self::ZAiGlm5),
5811            "z-ai/glm-5-turbo" => Ok(Self::ZAiGlm5Turbo),
5812            "z-ai/glm-5.1" => Ok(Self::ZAiGlm51),
5813            "z-ai/glm-5.2" => Ok(Self::ZAiGlm52),
5814            "z-ai/glm-5v-turbo" => Ok(Self::ZAiGlm5vTurbo),
5815            _ => Err(format!("Unknown openrouter model: '{s}'")),
5816        }
5817    }
5818}
5819impl ZAiModel {
5820    #[allow(clippy::too_many_lines)]
5821    fn model_id(self) -> &'static str {
5822        match self {
5823            Self::Glm45 => "glm-4.5",
5824            Self::Glm45Air => "glm-4.5-air",
5825            Self::Glm45Flash => "glm-4.5-flash",
5826            Self::Glm45v => "glm-4.5v",
5827            Self::Glm46 => "glm-4.6",
5828            Self::Glm46v => "glm-4.6v",
5829            Self::Glm47 => "glm-4.7",
5830            Self::Glm47Flash => "glm-4.7-flash",
5831            Self::Glm47Flashx => "glm-4.7-flashx",
5832            Self::Glm5 => "glm-5",
5833            Self::Glm5Turbo => "glm-5-turbo",
5834            Self::Glm51 => "glm-5.1",
5835            Self::Glm52 => "glm-5.2",
5836            Self::Glm5vTurbo => "glm-5v-turbo",
5837        }
5838    }
5839    #[allow(clippy::too_many_lines)]
5840    fn display_name(self) -> &'static str {
5841        match self {
5842            Self::Glm45 => "GLM-4.5",
5843            Self::Glm45Air => "GLM-4.5-Air",
5844            Self::Glm45Flash => "GLM-4.5-Flash",
5845            Self::Glm45v => "GLM-4.5V",
5846            Self::Glm46 => "GLM-4.6",
5847            Self::Glm46v => "GLM-4.6V",
5848            Self::Glm47 => "GLM-4.7",
5849            Self::Glm47Flash => "GLM-4.7-Flash",
5850            Self::Glm47Flashx => "GLM-4.7-FlashX",
5851            Self::Glm5 => "GLM-5",
5852            Self::Glm5Turbo => "GLM-5-Turbo",
5853            Self::Glm51 => "GLM-5.1",
5854            Self::Glm52 => "GLM-5.2",
5855            Self::Glm5vTurbo => "GLM-5V-Turbo",
5856        }
5857    }
5858    #[allow(clippy::too_many_lines)]
5859    fn context_window(self) -> u32 {
5860        match self {
5861            Self::Glm45v => 64_000,
5862            Self::Glm46v => 128_000,
5863            Self::Glm45 | Self::Glm45Air | Self::Glm45Flash => 131_072,
5864            Self::Glm47Flash
5865            | Self::Glm47Flashx
5866            | Self::Glm5Turbo
5867            | Self::Glm51
5868            | Self::Glm5vTurbo => 200_000,
5869            Self::Glm46 | Self::Glm47 | Self::Glm5 => 204_800,
5870            Self::Glm52 => 1_000_000,
5871        }
5872    }
5873    #[allow(clippy::too_many_lines)]
5874    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
5875        match self {
5876            Self::Glm52 => &[ReasoningEffort::High, ReasoningEffort::Max],
5877            Self::Glm45
5878            | Self::Glm45Air
5879            | Self::Glm45Flash
5880            | Self::Glm45v
5881            | Self::Glm46
5882            | Self::Glm46v
5883            | Self::Glm47
5884            | Self::Glm47Flash
5885            | Self::Glm47Flashx
5886            | Self::Glm5
5887            | Self::Glm5Turbo
5888            | Self::Glm51
5889            | Self::Glm5vTurbo => {
5890                &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
5891            }
5892        }
5893    }
5894    pub fn supports_reasoning(self) -> bool {
5895        !self.reasoning_levels().is_empty()
5896    }
5897    #[allow(clippy::too_many_lines)]
5898    pub fn supports_prompt_caching(self) -> bool {
5899        match self {
5900            Self::Glm45v | Self::Glm46v => false,
5901            Self::Glm45
5902            | Self::Glm45Air
5903            | Self::Glm45Flash
5904            | Self::Glm46
5905            | Self::Glm47
5906            | Self::Glm47Flash
5907            | Self::Glm47Flashx
5908            | Self::Glm5
5909            | Self::Glm5Turbo
5910            | Self::Glm51
5911            | Self::Glm52
5912            | Self::Glm5vTurbo => true,
5913        }
5914    }
5915    #[allow(clippy::too_many_lines)]
5916    pub fn supports_image(self) -> bool {
5917        match self {
5918            Self::Glm45
5919            | Self::Glm45Air
5920            | Self::Glm45Flash
5921            | Self::Glm46
5922            | Self::Glm47
5923            | Self::Glm47Flash
5924            | Self::Glm47Flashx
5925            | Self::Glm5
5926            | Self::Glm5Turbo
5927            | Self::Glm51
5928            | Self::Glm52 => false,
5929            Self::Glm45v | Self::Glm46v | Self::Glm5vTurbo => true,
5930        }
5931    }
5932    #[allow(clippy::too_many_lines)]
5933    pub fn supports_audio(self) -> bool {
5934        match self {
5935            Self::Glm45
5936            | Self::Glm45Air
5937            | Self::Glm45Flash
5938            | Self::Glm45v
5939            | Self::Glm46
5940            | Self::Glm46v
5941            | Self::Glm47
5942            | Self::Glm47Flash
5943            | Self::Glm47Flashx
5944            | Self::Glm5
5945            | Self::Glm5Turbo
5946            | Self::Glm51
5947            | Self::Glm52
5948            | Self::Glm5vTurbo => false,
5949        }
5950    }
5951    #[allow(clippy::too_many_lines)]
5952    pub fn transport(self) -> Option<ModelTransport> {
5953        match self {
5954            Self::Glm45
5955            | Self::Glm45Air
5956            | Self::Glm45Flash
5957            | Self::Glm45v
5958            | Self::Glm46
5959            | Self::Glm46v
5960            | Self::Glm47
5961            | Self::Glm47Flash
5962            | Self::Glm47Flashx
5963            | Self::Glm5
5964            | Self::Glm5Turbo
5965            | Self::Glm51
5966            | Self::Glm52
5967            | Self::Glm5vTurbo => None,
5968        }
5969    }
5970    const ALL: &[ZAiModel] = &[
5971        Self::Glm45,
5972        Self::Glm45Air,
5973        Self::Glm45Flash,
5974        Self::Glm45v,
5975        Self::Glm46,
5976        Self::Glm46v,
5977        Self::Glm47,
5978        Self::Glm47Flash,
5979        Self::Glm47Flashx,
5980        Self::Glm5,
5981        Self::Glm5Turbo,
5982        Self::Glm51,
5983        Self::Glm52,
5984        Self::Glm5vTurbo,
5985    ];
5986}
5987impl std::str::FromStr for ZAiModel {
5988    type Err = String;
5989    #[allow(clippy::too_many_lines)]
5990    fn from_str(s: &str) -> Result<Self, Self::Err> {
5991        match s {
5992            "glm-4.5" => Ok(Self::Glm45),
5993            "glm-4.5-air" => Ok(Self::Glm45Air),
5994            "glm-4.5-flash" => Ok(Self::Glm45Flash),
5995            "glm-4.5v" => Ok(Self::Glm45v),
5996            "glm-4.6" => Ok(Self::Glm46),
5997            "glm-4.6v" => Ok(Self::Glm46v),
5998            "glm-4.7" => Ok(Self::Glm47),
5999            "glm-4.7-flash" => Ok(Self::Glm47Flash),
6000            "glm-4.7-flashx" => Ok(Self::Glm47Flashx),
6001            "glm-5" => Ok(Self::Glm5),
6002            "glm-5-turbo" => Ok(Self::Glm5Turbo),
6003            "glm-5.1" => Ok(Self::Glm51),
6004            "glm-5.2" => Ok(Self::Glm52),
6005            "glm-5v-turbo" => Ok(Self::Glm5vTurbo),
6006            _ => Err(format!("Unknown zai model: '{s}'")),
6007        }
6008    }
6009}
6010impl BedrockFoundationModel {
6011    #[allow(clippy::too_many_lines)]
6012    fn model_id(self) -> &'static str {
6013        match self {
6014            Self::AmazonNova2LiteV10 => "amazon.nova-2-lite-v1:0",
6015            Self::AmazonNovaLiteV10 => "amazon.nova-lite-v1:0",
6016            Self::AmazonNovaMicroV10 => "amazon.nova-micro-v1:0",
6017            Self::AmazonNovaProV10 => "amazon.nova-pro-v1:0",
6018            Self::AnthropicClaudeFable5 => "anthropic.claude-fable-5",
6019            Self::AnthropicClaudeHaiku4520251001V10 => {
6020                "anthropic.claude-haiku-4-5-20251001-v1:0"
6021            }
6022            Self::AnthropicClaudeOpus4120250805V10 => {
6023                "anthropic.claude-opus-4-1-20250805-v1:0"
6024            }
6025            Self::AnthropicClaudeOpus4520251101V10 => {
6026                "anthropic.claude-opus-4-5-20251101-v1:0"
6027            }
6028            Self::AnthropicClaudeOpus46V1 => "anthropic.claude-opus-4-6-v1",
6029            Self::AnthropicClaudeOpus47 => "anthropic.claude-opus-4-7",
6030            Self::AnthropicClaudeOpus48 => "anthropic.claude-opus-4-8",
6031            Self::AnthropicClaudeOpus5 => "anthropic.claude-opus-5",
6032            Self::AnthropicClaudeSonnet4520250929V10 => {
6033                "anthropic.claude-sonnet-4-5-20250929-v1:0"
6034            }
6035            Self::AnthropicClaudeSonnet46 => "anthropic.claude-sonnet-4-6",
6036            Self::AnthropicClaudeSonnet5 => "anthropic.claude-sonnet-5",
6037            Self::AuAnthropicClaudeHaiku4520251001V10 => {
6038                "au.anthropic.claude-haiku-4-5-20251001-v1:0"
6039            }
6040            Self::AuAnthropicClaudeOpus46V1 => "au.anthropic.claude-opus-4-6-v1",
6041            Self::AuAnthropicClaudeOpus48 => "au.anthropic.claude-opus-4-8",
6042            Self::AuAnthropicClaudeOpus5 => "au.anthropic.claude-opus-5",
6043            Self::AuAnthropicClaudeSonnet4520250929V10 => {
6044                "au.anthropic.claude-sonnet-4-5-20250929-v1:0"
6045            }
6046            Self::AuAnthropicClaudeSonnet46 => "au.anthropic.claude-sonnet-4-6",
6047            Self::AuAnthropicClaudeSonnet5 => "au.anthropic.claude-sonnet-5",
6048            Self::DeepseekR1V10 => "deepseek.r1-v1:0",
6049            Self::DeepseekV3V10 => "deepseek.v3-v1:0",
6050            Self::DeepseekV32 => "deepseek.v3.2",
6051            Self::EuAnthropicClaudeFable5 => "eu.anthropic.claude-fable-5",
6052            Self::EuAnthropicClaudeHaiku4520251001V10 => {
6053                "eu.anthropic.claude-haiku-4-5-20251001-v1:0"
6054            }
6055            Self::EuAnthropicClaudeOpus4520251101V10 => {
6056                "eu.anthropic.claude-opus-4-5-20251101-v1:0"
6057            }
6058            Self::EuAnthropicClaudeOpus46V1 => "eu.anthropic.claude-opus-4-6-v1",
6059            Self::EuAnthropicClaudeOpus47 => "eu.anthropic.claude-opus-4-7",
6060            Self::EuAnthropicClaudeOpus48 => "eu.anthropic.claude-opus-4-8",
6061            Self::EuAnthropicClaudeOpus5 => "eu.anthropic.claude-opus-5",
6062            Self::EuAnthropicClaudeSonnet4520250929V10 => {
6063                "eu.anthropic.claude-sonnet-4-5-20250929-v1:0"
6064            }
6065            Self::EuAnthropicClaudeSonnet46 => "eu.anthropic.claude-sonnet-4-6",
6066            Self::EuAnthropicClaudeSonnet5 => "eu.anthropic.claude-sonnet-5",
6067            Self::GlobalAnthropicClaudeFable5 => "global.anthropic.claude-fable-5",
6068            Self::GlobalAnthropicClaudeHaiku4520251001V10 => {
6069                "global.anthropic.claude-haiku-4-5-20251001-v1:0"
6070            }
6071            Self::GlobalAnthropicClaudeOpus4520251101V10 => {
6072                "global.anthropic.claude-opus-4-5-20251101-v1:0"
6073            }
6074            Self::GlobalAnthropicClaudeOpus46V1 => "global.anthropic.claude-opus-4-6-v1",
6075            Self::GlobalAnthropicClaudeOpus47 => "global.anthropic.claude-opus-4-7",
6076            Self::GlobalAnthropicClaudeOpus48 => "global.anthropic.claude-opus-4-8",
6077            Self::GlobalAnthropicClaudeOpus5 => "global.anthropic.claude-opus-5",
6078            Self::GlobalAnthropicClaudeSonnet4520250929V10 => {
6079                "global.anthropic.claude-sonnet-4-5-20250929-v1:0"
6080            }
6081            Self::GlobalAnthropicClaudeSonnet46 => "global.anthropic.claude-sonnet-4-6",
6082            Self::GlobalAnthropicClaudeSonnet5 => "global.anthropic.claude-sonnet-5",
6083            Self::GoogleGemma327bIt => "google.gemma-3-27b-it",
6084            Self::GoogleGemma34bIt => "google.gemma-3-4b-it",
6085            Self::JpAnthropicClaudeHaiku4520251001V10 => {
6086                "jp.anthropic.claude-haiku-4-5-20251001-v1:0"
6087            }
6088            Self::JpAnthropicClaudeOpus47 => "jp.anthropic.claude-opus-4-7",
6089            Self::JpAnthropicClaudeOpus48 => "jp.anthropic.claude-opus-4-8",
6090            Self::JpAnthropicClaudeOpus5 => "jp.anthropic.claude-opus-5",
6091            Self::JpAnthropicClaudeSonnet4520250929V10 => {
6092                "jp.anthropic.claude-sonnet-4-5-20250929-v1:0"
6093            }
6094            Self::JpAnthropicClaudeSonnet46 => "jp.anthropic.claude-sonnet-4-6",
6095            Self::JpAnthropicClaudeSonnet5 => "jp.anthropic.claude-sonnet-5",
6096            Self::MetaLlama3170bInstructV10 => "meta.llama3-1-70b-instruct-v1:0",
6097            Self::MetaLlama318bInstructV10 => "meta.llama3-1-8b-instruct-v1:0",
6098            Self::MetaLlama3370bInstructV10 => "meta.llama3-3-70b-instruct-v1:0",
6099            Self::MetaLlama4Maverick17bInstructV10 => {
6100                "meta.llama4-maverick-17b-instruct-v1:0"
6101            }
6102            Self::MetaLlama4Scout17bInstructV10 => "meta.llama4-scout-17b-instruct-v1:0",
6103            Self::MinimaxMinimaxM2 => "minimax.minimax-m2",
6104            Self::MinimaxMinimaxM21 => "minimax.minimax-m2.1",
6105            Self::MinimaxMinimaxM25 => "minimax.minimax-m2.5",
6106            Self::MistralDevstral2123b => "mistral.devstral-2-123b",
6107            Self::MistralMagistralSmall2509 => "mistral.magistral-small-2509",
6108            Self::MistralMinistral314bInstruct => "mistral.ministral-3-14b-instruct",
6109            Self::MistralMinistral33bInstruct => "mistral.ministral-3-3b-instruct",
6110            Self::MistralMinistral38bInstruct => "mistral.ministral-3-8b-instruct",
6111            Self::MistralMistralLarge3675bInstruct => {
6112                "mistral.mistral-large-3-675b-instruct"
6113            }
6114            Self::MistralPixtralLarge2502V10 => "mistral.pixtral-large-2502-v1:0",
6115            Self::MistralVoxtralMini3b2507 => "mistral.voxtral-mini-3b-2507",
6116            Self::MistralVoxtralSmall24b2507 => "mistral.voxtral-small-24b-2507",
6117            Self::MoonshotKimiK2Thinking => "moonshot.kimi-k2-thinking",
6118            Self::MoonshotaiKimiK25 => "moonshotai.kimi-k2.5",
6119            Self::NvidiaNemotronNano12bV2 => "nvidia.nemotron-nano-12b-v2",
6120            Self::NvidiaNemotronNano330b => "nvidia.nemotron-nano-3-30b",
6121            Self::NvidiaNemotronNano9bV2 => "nvidia.nemotron-nano-9b-v2",
6122            Self::NvidiaNemotronSuper3120b => "nvidia.nemotron-super-3-120b",
6123            Self::OpenaiGpt54 => "openai.gpt-5.4",
6124            Self::OpenaiGpt55 => "openai.gpt-5.5",
6125            Self::OpenaiGpt56Luna => "openai.gpt-5.6-luna",
6126            Self::OpenaiGpt56Sol => "openai.gpt-5.6-sol",
6127            Self::OpenaiGpt56Terra => "openai.gpt-5.6-terra",
6128            Self::OpenaiGptOss120b => "openai.gpt-oss-120b",
6129            Self::OpenaiGptOss120b10 => "openai.gpt-oss-120b-1:0",
6130            Self::OpenaiGptOss20b => "openai.gpt-oss-20b",
6131            Self::OpenaiGptOss20b10 => "openai.gpt-oss-20b-1:0",
6132            Self::OpenaiGptOssSafeguard120b => "openai.gpt-oss-safeguard-120b",
6133            Self::OpenaiGptOssSafeguard20b => "openai.gpt-oss-safeguard-20b",
6134            Self::QwenQwen3235bA22b2507V10 => "qwen.qwen3-235b-a22b-2507-v1:0",
6135            Self::QwenQwen332bV10 => "qwen.qwen3-32b-v1:0",
6136            Self::QwenQwen3Coder30bA3bV10 => "qwen.qwen3-coder-30b-a3b-v1:0",
6137            Self::QwenQwen3Coder480bA35bV10 => "qwen.qwen3-coder-480b-a35b-v1:0",
6138            Self::QwenQwen3CoderNext => "qwen.qwen3-coder-next",
6139            Self::QwenQwen3Next80bA3b => "qwen.qwen3-next-80b-a3b",
6140            Self::QwenQwen3Vl235bA22b => "qwen.qwen3-vl-235b-a22b",
6141            Self::UsAnthropicClaudeFable5 => "us.anthropic.claude-fable-5",
6142            Self::UsAnthropicClaudeHaiku4520251001V10 => {
6143                "us.anthropic.claude-haiku-4-5-20251001-v1:0"
6144            }
6145            Self::UsAnthropicClaudeOpus4120250805V10 => {
6146                "us.anthropic.claude-opus-4-1-20250805-v1:0"
6147            }
6148            Self::UsAnthropicClaudeOpus4520251101V10 => {
6149                "us.anthropic.claude-opus-4-5-20251101-v1:0"
6150            }
6151            Self::UsAnthropicClaudeOpus46V1 => "us.anthropic.claude-opus-4-6-v1",
6152            Self::UsAnthropicClaudeOpus47 => "us.anthropic.claude-opus-4-7",
6153            Self::UsAnthropicClaudeOpus48 => "us.anthropic.claude-opus-4-8",
6154            Self::UsAnthropicClaudeOpus5 => "us.anthropic.claude-opus-5",
6155            Self::UsAnthropicClaudeSonnet4520250929V10 => {
6156                "us.anthropic.claude-sonnet-4-5-20250929-v1:0"
6157            }
6158            Self::UsAnthropicClaudeSonnet46 => "us.anthropic.claude-sonnet-4-6",
6159            Self::UsAnthropicClaudeSonnet5 => "us.anthropic.claude-sonnet-5",
6160            Self::UsDeepseekR1V10 => "us.deepseek.r1-v1:0",
6161            Self::UsMetaLlama4Maverick17bInstructV10 => {
6162                "us.meta.llama4-maverick-17b-instruct-v1:0"
6163            }
6164            Self::UsMetaLlama4Scout17bInstructV10 => {
6165                "us.meta.llama4-scout-17b-instruct-v1:0"
6166            }
6167            Self::WriterPalmyraX4V10 => "writer.palmyra-x4-v1:0",
6168            Self::WriterPalmyraX5V10 => "writer.palmyra-x5-v1:0",
6169            Self::XaiGrok43 => "xai.grok-4.3",
6170            Self::ZaiGlm47 => "zai.glm-4.7",
6171            Self::ZaiGlm47Flash => "zai.glm-4.7-flash",
6172            Self::ZaiGlm5 => "zai.glm-5",
6173        }
6174    }
6175    #[allow(clippy::too_many_lines)]
6176    fn display_name(self) -> &'static str {
6177        match self {
6178            Self::AuAnthropicClaudeOpus46V1 => "AU Anthropic Claude Opus 4.6",
6179            Self::AuAnthropicClaudeSonnet46 => "AU Anthropic Claude Sonnet 4.6",
6180            Self::AnthropicClaudeFable5 => "Claude Fable 5",
6181            Self::EuAnthropicClaudeFable5 => "Claude Fable 5 (EU)",
6182            Self::GlobalAnthropicClaudeFable5 => "Claude Fable 5 (Global)",
6183            Self::UsAnthropicClaudeFable5 => "Claude Fable 5 (US)",
6184            Self::AnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5",
6185            Self::AuAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (AU)",
6186            Self::EuAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (EU)",
6187            Self::GlobalAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (Global)",
6188            Self::JpAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (JP)",
6189            Self::UsAnthropicClaudeHaiku4520251001V10 => "Claude Haiku 4.5 (US)",
6190            Self::AnthropicClaudeOpus4120250805V10 => "Claude Opus 4.1",
6191            Self::UsAnthropicClaudeOpus4120250805V10 => "Claude Opus 4.1 (US)",
6192            Self::AnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5",
6193            Self::EuAnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5 (EU)",
6194            Self::GlobalAnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5 (Global)",
6195            Self::UsAnthropicClaudeOpus4520251101V10 => "Claude Opus 4.5 (US)",
6196            Self::AnthropicClaudeOpus46V1 => "Claude Opus 4.6",
6197            Self::EuAnthropicClaudeOpus46V1 => "Claude Opus 4.6 (EU)",
6198            Self::GlobalAnthropicClaudeOpus46V1 => "Claude Opus 4.6 (Global)",
6199            Self::UsAnthropicClaudeOpus46V1 => "Claude Opus 4.6 (US)",
6200            Self::AnthropicClaudeOpus47 => "Claude Opus 4.7",
6201            Self::EuAnthropicClaudeOpus47 => "Claude Opus 4.7 (EU)",
6202            Self::GlobalAnthropicClaudeOpus47 => "Claude Opus 4.7 (Global)",
6203            Self::JpAnthropicClaudeOpus47 => "Claude Opus 4.7 (JP)",
6204            Self::UsAnthropicClaudeOpus47 => "Claude Opus 4.7 (US)",
6205            Self::AnthropicClaudeOpus48 => "Claude Opus 4.8",
6206            Self::AuAnthropicClaudeOpus48 => "Claude Opus 4.8 (AU)",
6207            Self::EuAnthropicClaudeOpus48 => "Claude Opus 4.8 (EU)",
6208            Self::GlobalAnthropicClaudeOpus48 => "Claude Opus 4.8 (Global)",
6209            Self::JpAnthropicClaudeOpus48 => "Claude Opus 4.8 (JP)",
6210            Self::UsAnthropicClaudeOpus48 => "Claude Opus 4.8 (US)",
6211            Self::AnthropicClaudeOpus5 => "Claude Opus 5",
6212            Self::AuAnthropicClaudeOpus5 => "Claude Opus 5 (AU)",
6213            Self::EuAnthropicClaudeOpus5 => "Claude Opus 5 (EU)",
6214            Self::GlobalAnthropicClaudeOpus5 => "Claude Opus 5 (Global)",
6215            Self::JpAnthropicClaudeOpus5 => "Claude Opus 5 (JP)",
6216            Self::UsAnthropicClaudeOpus5 => "Claude Opus 5 (US)",
6217            Self::AnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5",
6218            Self::AuAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (AU)",
6219            Self::EuAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (EU)",
6220            Self::GlobalAnthropicClaudeSonnet4520250929V10 => {
6221                "Claude Sonnet 4.5 (Global)"
6222            }
6223            Self::JpAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (JP)",
6224            Self::UsAnthropicClaudeSonnet4520250929V10 => "Claude Sonnet 4.5 (US)",
6225            Self::AnthropicClaudeSonnet46 => "Claude Sonnet 4.6",
6226            Self::EuAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (EU)",
6227            Self::GlobalAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (Global)",
6228            Self::JpAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (JP)",
6229            Self::UsAnthropicClaudeSonnet46 => "Claude Sonnet 4.6 (US)",
6230            Self::AnthropicClaudeSonnet5 => "Claude Sonnet 5",
6231            Self::AuAnthropicClaudeSonnet5 => "Claude Sonnet 5 (AU)",
6232            Self::EuAnthropicClaudeSonnet5 => "Claude Sonnet 5 (EU)",
6233            Self::GlobalAnthropicClaudeSonnet5 => "Claude Sonnet 5 (Global)",
6234            Self::JpAnthropicClaudeSonnet5 => "Claude Sonnet 5 (JP)",
6235            Self::UsAnthropicClaudeSonnet5 => "Claude Sonnet 5 (US)",
6236            Self::DeepseekR1V10 => "DeepSeek-R1",
6237            Self::UsDeepseekR1V10 => "DeepSeek-R1 (US)",
6238            Self::DeepseekV3V10 => "DeepSeek-V3.1",
6239            Self::DeepseekV32 => "DeepSeek-V3.2",
6240            Self::MistralDevstral2123b => "Devstral 2 123B",
6241            Self::ZaiGlm47 => "GLM-4.7",
6242            Self::ZaiGlm47Flash => "GLM-4.7-Flash",
6243            Self::ZaiGlm5 => "GLM-5",
6244            Self::OpenaiGptOssSafeguard120b => "GPT OSS Safeguard 120B",
6245            Self::OpenaiGptOssSafeguard20b => "GPT OSS Safeguard 20B",
6246            Self::OpenaiGpt54 => "GPT-5.4",
6247            Self::OpenaiGpt55 => "GPT-5.5",
6248            Self::OpenaiGpt56Luna => "GPT-5.6 Luna",
6249            Self::OpenaiGpt56Sol => "GPT-5.6 Sol",
6250            Self::OpenaiGpt56Terra => "GPT-5.6 Terra",
6251            Self::GoogleGemma34bIt => "Gemma 3 4B IT",
6252            Self::GoogleGemma327bIt => "Google Gemma 3 27B Instruct",
6253            Self::XaiGrok43 => "Grok 4.3",
6254            Self::MoonshotKimiK2Thinking => "Kimi K2 Thinking",
6255            Self::MoonshotaiKimiK25 => "Kimi K2.5",
6256            Self::MetaLlama3170bInstructV10 => "Llama 3.1 70B Instruct",
6257            Self::MetaLlama318bInstructV10 => "Llama 3.1 8B Instruct",
6258            Self::MetaLlama3370bInstructV10 => "Llama 3.3 70B Instruct",
6259            Self::MetaLlama4Maverick17bInstructV10 => "Llama 4 Maverick 17B Instruct",
6260            Self::UsMetaLlama4Maverick17bInstructV10 => {
6261                "Llama 4 Maverick 17B Instruct (US)"
6262            }
6263            Self::MetaLlama4Scout17bInstructV10 => "Llama 4 Scout 17B Instruct",
6264            Self::UsMetaLlama4Scout17bInstructV10 => "Llama 4 Scout 17B Instruct (US)",
6265            Self::MistralMagistralSmall2509 => "Magistral Small 1.2",
6266            Self::MinimaxMinimaxM2 => "MiniMax M2",
6267            Self::MinimaxMinimaxM21 => "MiniMax M2.1",
6268            Self::MinimaxMinimaxM25 => "MiniMax M2.5",
6269            Self::MistralMinistral314bInstruct => "Ministral 14B 3.0",
6270            Self::MistralMinistral33bInstruct => "Ministral 3 3B",
6271            Self::MistralMinistral38bInstruct => "Ministral 3 8B",
6272            Self::MistralMistralLarge3675bInstruct => "Mistral Large 3",
6273            Self::NvidiaNemotronSuper3120b => "NVIDIA Nemotron 3 Super 120B A12B",
6274            Self::NvidiaNemotronNano12bV2 => "NVIDIA Nemotron Nano 12B v2 VL BF16",
6275            Self::NvidiaNemotronNano330b => "NVIDIA Nemotron Nano 3 30B",
6276            Self::NvidiaNemotronNano9bV2 => "NVIDIA Nemotron Nano 9B v2",
6277            Self::AmazonNova2LiteV10 => "Nova 2 Lite",
6278            Self::AmazonNovaLiteV10 => "Nova Lite",
6279            Self::AmazonNovaMicroV10 => "Nova Micro",
6280            Self::AmazonNovaProV10 => "Nova Pro",
6281            Self::WriterPalmyraX4V10 => "Palmyra X4",
6282            Self::WriterPalmyraX5V10 => "Palmyra X5",
6283            Self::MistralPixtralLarge2502V10 => "Pixtral Large (25.02)",
6284            Self::QwenQwen3Next80bA3b => "Qwen/Qwen3-Next-80B-A3B-Instruct",
6285            Self::QwenQwen3Vl235bA22b => "Qwen/Qwen3-VL-235B-A22B-Instruct",
6286            Self::QwenQwen3235bA22b2507V10 => "Qwen3 235B A22B 2507",
6287            Self::QwenQwen332bV10 => "Qwen3 32B (dense)",
6288            Self::QwenQwen3Coder30bA3bV10 => "Qwen3 Coder 30B A3B Instruct",
6289            Self::QwenQwen3Coder480bA35bV10 => "Qwen3 Coder 480B A35B Instruct",
6290            Self::QwenQwen3CoderNext => "Qwen3 Coder Next",
6291            Self::MistralVoxtralMini3b2507 => "Voxtral Mini 3B 2507",
6292            Self::MistralVoxtralSmall24b2507 => "Voxtral Small 24B 2507",
6293            Self::OpenaiGptOss120b | Self::OpenaiGptOss120b10 => "gpt-oss-120b",
6294            Self::OpenaiGptOss20b | Self::OpenaiGptOss20b10 => "gpt-oss-20b",
6295        }
6296    }
6297    #[allow(clippy::too_many_lines)]
6298    fn context_window(self) -> u32 {
6299        match self {
6300            Self::QwenQwen332bV10 => 16_384,
6301            Self::MistralVoxtralSmall24b2507 => 32_000,
6302            Self::WriterPalmyraX4V10 => 122_880,
6303            Self::AmazonNova2LiteV10
6304            | Self::AmazonNovaMicroV10
6305            | Self::DeepseekR1V10
6306            | Self::GoogleGemma34bIt
6307            | Self::MetaLlama3170bInstructV10
6308            | Self::MetaLlama318bInstructV10
6309            | Self::MetaLlama3370bInstructV10
6310            | Self::MistralMagistralSmall2509
6311            | Self::MistralMinistral314bInstruct
6312            | Self::MistralMinistral38bInstruct
6313            | Self::MistralPixtralLarge2502V10
6314            | Self::MistralVoxtralMini3b2507
6315            | Self::NvidiaNemotronNano12bV2
6316            | Self::NvidiaNemotronNano330b
6317            | Self::NvidiaNemotronNano9bV2
6318            | Self::OpenaiGptOss120b
6319            | Self::OpenaiGptOss120b10
6320            | Self::OpenaiGptOss20b
6321            | Self::OpenaiGptOss20b10
6322            | Self::OpenaiGptOssSafeguard120b
6323            | Self::OpenaiGptOssSafeguard20b
6324            | Self::UsDeepseekR1V10 => 128_000,
6325            Self::QwenQwen3Coder480bA35bV10 | Self::QwenQwen3CoderNext => 131_072,
6326            Self::DeepseekV3V10 | Self::DeepseekV32 => 163_840,
6327            Self::MinimaxMinimaxM25 => 196_608,
6328            Self::AnthropicClaudeHaiku4520251001V10
6329            | Self::AnthropicClaudeOpus4120250805V10
6330            | Self::AnthropicClaudeOpus4520251101V10
6331            | Self::AnthropicClaudeSonnet4520250929V10
6332            | Self::AuAnthropicClaudeHaiku4520251001V10
6333            | Self::AuAnthropicClaudeSonnet4520250929V10
6334            | Self::EuAnthropicClaudeHaiku4520251001V10
6335            | Self::EuAnthropicClaudeOpus4520251101V10
6336            | Self::EuAnthropicClaudeSonnet4520250929V10
6337            | Self::GlobalAnthropicClaudeHaiku4520251001V10
6338            | Self::GlobalAnthropicClaudeOpus4520251101V10
6339            | Self::GlobalAnthropicClaudeSonnet4520250929V10
6340            | Self::JpAnthropicClaudeHaiku4520251001V10
6341            | Self::JpAnthropicClaudeSonnet4520250929V10
6342            | Self::UsAnthropicClaudeHaiku4520251001V10
6343            | Self::UsAnthropicClaudeOpus4120250805V10
6344            | Self::UsAnthropicClaudeOpus4520251101V10
6345            | Self::UsAnthropicClaudeSonnet4520250929V10
6346            | Self::ZaiGlm47Flash => 200_000,
6347            Self::GoogleGemma327bIt | Self::ZaiGlm5 => 202_752,
6348            Self::MinimaxMinimaxM2 => 204_608,
6349            Self::MinimaxMinimaxM21 | Self::ZaiGlm47 => 204_800,
6350            Self::MistralDevstral2123b
6351            | Self::MistralMinistral33bInstruct
6352            | Self::MistralMistralLarge3675bInstruct => 256_000,
6353            Self::QwenQwen3Next80bA3b | Self::QwenQwen3Vl235bA22b => 262_000,
6354            Self::MoonshotKimiK2Thinking | Self::MoonshotaiKimiK25 => 262_143,
6355            Self::NvidiaNemotronSuper3120b
6356            | Self::QwenQwen3235bA22b2507V10
6357            | Self::QwenQwen3Coder30bA3bV10 => 262_144,
6358            Self::OpenaiGpt54
6359            | Self::OpenaiGpt55
6360            | Self::OpenaiGpt56Luna
6361            | Self::OpenaiGpt56Sol
6362            | Self::OpenaiGpt56Terra => 272_000,
6363            Self::AmazonNovaLiteV10 | Self::AmazonNovaProV10 => 300_000,
6364            Self::AnthropicClaudeFable5
6365            | Self::AnthropicClaudeOpus46V1
6366            | Self::AnthropicClaudeOpus47
6367            | Self::AnthropicClaudeOpus48
6368            | Self::AnthropicClaudeOpus5
6369            | Self::AnthropicClaudeSonnet46
6370            | Self::AnthropicClaudeSonnet5
6371            | Self::AuAnthropicClaudeOpus46V1
6372            | Self::AuAnthropicClaudeOpus48
6373            | Self::AuAnthropicClaudeOpus5
6374            | Self::AuAnthropicClaudeSonnet46
6375            | Self::AuAnthropicClaudeSonnet5
6376            | Self::EuAnthropicClaudeFable5
6377            | Self::EuAnthropicClaudeOpus46V1
6378            | Self::EuAnthropicClaudeOpus47
6379            | Self::EuAnthropicClaudeOpus48
6380            | Self::EuAnthropicClaudeOpus5
6381            | Self::EuAnthropicClaudeSonnet46
6382            | Self::EuAnthropicClaudeSonnet5
6383            | Self::GlobalAnthropicClaudeFable5
6384            | Self::GlobalAnthropicClaudeOpus46V1
6385            | Self::GlobalAnthropicClaudeOpus47
6386            | Self::GlobalAnthropicClaudeOpus48
6387            | Self::GlobalAnthropicClaudeOpus5
6388            | Self::GlobalAnthropicClaudeSonnet46
6389            | Self::GlobalAnthropicClaudeSonnet5
6390            | Self::JpAnthropicClaudeOpus47
6391            | Self::JpAnthropicClaudeOpus48
6392            | Self::JpAnthropicClaudeOpus5
6393            | Self::JpAnthropicClaudeSonnet46
6394            | Self::JpAnthropicClaudeSonnet5
6395            | Self::MetaLlama4Maverick17bInstructV10
6396            | Self::UsAnthropicClaudeFable5
6397            | Self::UsAnthropicClaudeOpus46V1
6398            | Self::UsAnthropicClaudeOpus47
6399            | Self::UsAnthropicClaudeOpus48
6400            | Self::UsAnthropicClaudeOpus5
6401            | Self::UsAnthropicClaudeSonnet46
6402            | Self::UsAnthropicClaudeSonnet5
6403            | Self::UsMetaLlama4Maverick17bInstructV10
6404            | Self::XaiGrok43 => 1_000_000,
6405            Self::WriterPalmyraX5V10 => 1_040_000,
6406            Self::MetaLlama4Scout17bInstructV10
6407            | Self::UsMetaLlama4Scout17bInstructV10 => 3_500_000,
6408        }
6409    }
6410    #[allow(clippy::too_many_lines)]
6411    pub fn reasoning_levels(self) -> &'static [ReasoningEffort] {
6412        match self {
6413            Self::AmazonNovaLiteV10
6414            | Self::AmazonNovaMicroV10
6415            | Self::AmazonNovaProV10
6416            | Self::GoogleGemma327bIt
6417            | Self::GoogleGemma34bIt
6418            | Self::MetaLlama3170bInstructV10
6419            | Self::MetaLlama318bInstructV10
6420            | Self::MetaLlama3370bInstructV10
6421            | Self::MetaLlama4Maverick17bInstructV10
6422            | Self::MetaLlama4Scout17bInstructV10
6423            | Self::MistralDevstral2123b
6424            | Self::MistralMinistral314bInstruct
6425            | Self::MistralMinistral33bInstruct
6426            | Self::MistralMinistral38bInstruct
6427            | Self::MistralMistralLarge3675bInstruct
6428            | Self::MistralPixtralLarge2502V10
6429            | Self::MistralVoxtralMini3b2507
6430            | Self::MistralVoxtralSmall24b2507
6431            | Self::NvidiaNemotronNano12bV2
6432            | Self::NvidiaNemotronNano9bV2
6433            | Self::OpenaiGptOssSafeguard120b
6434            | Self::OpenaiGptOssSafeguard20b
6435            | Self::QwenQwen3235bA22b2507V10
6436            | Self::QwenQwen3Coder30bA3bV10
6437            | Self::QwenQwen3Coder480bA35bV10
6438            | Self::QwenQwen3Next80bA3b
6439            | Self::QwenQwen3Vl235bA22b
6440            | Self::UsMetaLlama4Maverick17bInstructV10
6441            | Self::UsMetaLlama4Scout17bInstructV10 => &[],
6442            Self::AmazonNova2LiteV10
6443            | Self::AnthropicClaudeHaiku4520251001V10
6444            | Self::AnthropicClaudeOpus4120250805V10
6445            | Self::AnthropicClaudeOpus4520251101V10
6446            | Self::AnthropicClaudeSonnet4520250929V10
6447            | Self::AuAnthropicClaudeHaiku4520251001V10
6448            | Self::AuAnthropicClaudeSonnet4520250929V10
6449            | Self::DeepseekR1V10
6450            | Self::DeepseekV3V10
6451            | Self::DeepseekV32
6452            | Self::EuAnthropicClaudeHaiku4520251001V10
6453            | Self::EuAnthropicClaudeOpus4520251101V10
6454            | Self::EuAnthropicClaudeSonnet4520250929V10
6455            | Self::GlobalAnthropicClaudeHaiku4520251001V10
6456            | Self::GlobalAnthropicClaudeOpus4520251101V10
6457            | Self::GlobalAnthropicClaudeSonnet4520250929V10
6458            | Self::JpAnthropicClaudeHaiku4520251001V10
6459            | Self::JpAnthropicClaudeSonnet4520250929V10
6460            | Self::MinimaxMinimaxM2
6461            | Self::MinimaxMinimaxM21
6462            | Self::MinimaxMinimaxM25
6463            | Self::MistralMagistralSmall2509
6464            | Self::MoonshotKimiK2Thinking
6465            | Self::MoonshotaiKimiK25
6466            | Self::NvidiaNemotronNano330b
6467            | Self::NvidiaNemotronSuper3120b
6468            | Self::OpenaiGptOss120b
6469            | Self::OpenaiGptOss120b10
6470            | Self::OpenaiGptOss20b
6471            | Self::OpenaiGptOss20b10
6472            | Self::QwenQwen332bV10
6473            | Self::QwenQwen3CoderNext
6474            | Self::UsAnthropicClaudeHaiku4520251001V10
6475            | Self::UsAnthropicClaudeOpus4120250805V10
6476            | Self::UsAnthropicClaudeOpus4520251101V10
6477            | Self::UsAnthropicClaudeSonnet4520250929V10
6478            | Self::UsDeepseekR1V10
6479            | Self::WriterPalmyraX4V10
6480            | Self::WriterPalmyraX5V10
6481            | Self::XaiGrok43
6482            | Self::ZaiGlm47
6483            | Self::ZaiGlm47Flash
6484            | Self::ZaiGlm5 => {
6485                &[ReasoningEffort::Low, ReasoningEffort::Medium, ReasoningEffort::High]
6486            }
6487            Self::AnthropicClaudeOpus46V1
6488            | Self::AnthropicClaudeSonnet46
6489            | Self::AuAnthropicClaudeOpus46V1
6490            | Self::AuAnthropicClaudeSonnet46
6491            | Self::EuAnthropicClaudeOpus46V1
6492            | Self::EuAnthropicClaudeSonnet46
6493            | Self::GlobalAnthropicClaudeOpus46V1
6494            | Self::GlobalAnthropicClaudeSonnet46
6495            | Self::JpAnthropicClaudeSonnet46
6496            | Self::UsAnthropicClaudeOpus46V1
6497            | Self::UsAnthropicClaudeSonnet46 => {
6498                &[
6499                    ReasoningEffort::Low,
6500                    ReasoningEffort::Medium,
6501                    ReasoningEffort::High,
6502                    ReasoningEffort::Max,
6503                ]
6504            }
6505            Self::OpenaiGpt54 | Self::OpenaiGpt55 => {
6506                &[
6507                    ReasoningEffort::Low,
6508                    ReasoningEffort::Medium,
6509                    ReasoningEffort::High,
6510                    ReasoningEffort::Xhigh,
6511                ]
6512            }
6513            Self::AnthropicClaudeFable5
6514            | Self::AnthropicClaudeOpus47
6515            | Self::AnthropicClaudeOpus48
6516            | Self::AnthropicClaudeOpus5
6517            | Self::AnthropicClaudeSonnet5
6518            | Self::AuAnthropicClaudeOpus48
6519            | Self::AuAnthropicClaudeOpus5
6520            | Self::AuAnthropicClaudeSonnet5
6521            | Self::EuAnthropicClaudeFable5
6522            | Self::EuAnthropicClaudeOpus47
6523            | Self::EuAnthropicClaudeOpus48
6524            | Self::EuAnthropicClaudeOpus5
6525            | Self::EuAnthropicClaudeSonnet5
6526            | Self::GlobalAnthropicClaudeFable5
6527            | Self::GlobalAnthropicClaudeOpus47
6528            | Self::GlobalAnthropicClaudeOpus48
6529            | Self::GlobalAnthropicClaudeOpus5
6530            | Self::GlobalAnthropicClaudeSonnet5
6531            | Self::JpAnthropicClaudeOpus47
6532            | Self::JpAnthropicClaudeOpus48
6533            | Self::JpAnthropicClaudeOpus5
6534            | Self::JpAnthropicClaudeSonnet5
6535            | Self::OpenaiGpt56Luna
6536            | Self::OpenaiGpt56Sol
6537            | Self::OpenaiGpt56Terra
6538            | Self::UsAnthropicClaudeFable5
6539            | Self::UsAnthropicClaudeOpus47
6540            | Self::UsAnthropicClaudeOpus48
6541            | Self::UsAnthropicClaudeOpus5
6542            | Self::UsAnthropicClaudeSonnet5 => {
6543                &[
6544                    ReasoningEffort::Low,
6545                    ReasoningEffort::Medium,
6546                    ReasoningEffort::High,
6547                    ReasoningEffort::Xhigh,
6548                    ReasoningEffort::Max,
6549                ]
6550            }
6551        }
6552    }
6553    pub fn supports_reasoning(self) -> bool {
6554        !self.reasoning_levels().is_empty()
6555    }
6556    #[allow(clippy::too_many_lines)]
6557    pub fn supports_prompt_caching(self) -> bool {
6558        match self {
6559            Self::AmazonNova2LiteV10
6560            | Self::DeepseekR1V10
6561            | Self::DeepseekV3V10
6562            | Self::DeepseekV32
6563            | Self::GoogleGemma327bIt
6564            | Self::GoogleGemma34bIt
6565            | Self::MetaLlama3170bInstructV10
6566            | Self::MetaLlama318bInstructV10
6567            | Self::MetaLlama3370bInstructV10
6568            | Self::MetaLlama4Maverick17bInstructV10
6569            | Self::MetaLlama4Scout17bInstructV10
6570            | Self::MinimaxMinimaxM2
6571            | Self::MinimaxMinimaxM21
6572            | Self::MinimaxMinimaxM25
6573            | Self::MistralDevstral2123b
6574            | Self::MistralMagistralSmall2509
6575            | Self::MistralMinistral314bInstruct
6576            | Self::MistralMinistral33bInstruct
6577            | Self::MistralMinistral38bInstruct
6578            | Self::MistralMistralLarge3675bInstruct
6579            | Self::MistralPixtralLarge2502V10
6580            | Self::MistralVoxtralMini3b2507
6581            | Self::MistralVoxtralSmall24b2507
6582            | Self::MoonshotKimiK2Thinking
6583            | Self::MoonshotaiKimiK25
6584            | Self::NvidiaNemotronNano12bV2
6585            | Self::NvidiaNemotronNano330b
6586            | Self::NvidiaNemotronNano9bV2
6587            | Self::NvidiaNemotronSuper3120b
6588            | Self::OpenaiGptOss120b
6589            | Self::OpenaiGptOss120b10
6590            | Self::OpenaiGptOss20b
6591            | Self::OpenaiGptOss20b10
6592            | Self::OpenaiGptOssSafeguard120b
6593            | Self::OpenaiGptOssSafeguard20b
6594            | Self::QwenQwen3235bA22b2507V10
6595            | Self::QwenQwen332bV10
6596            | Self::QwenQwen3Coder30bA3bV10
6597            | Self::QwenQwen3Coder480bA35bV10
6598            | Self::QwenQwen3CoderNext
6599            | Self::QwenQwen3Next80bA3b
6600            | Self::QwenQwen3Vl235bA22b
6601            | Self::UsDeepseekR1V10
6602            | Self::UsMetaLlama4Maverick17bInstructV10
6603            | Self::UsMetaLlama4Scout17bInstructV10
6604            | Self::WriterPalmyraX4V10
6605            | Self::WriterPalmyraX5V10
6606            | Self::ZaiGlm47
6607            | Self::ZaiGlm47Flash
6608            | Self::ZaiGlm5 => false,
6609            Self::AmazonNovaLiteV10
6610            | Self::AmazonNovaMicroV10
6611            | Self::AmazonNovaProV10
6612            | Self::AnthropicClaudeFable5
6613            | Self::AnthropicClaudeHaiku4520251001V10
6614            | Self::AnthropicClaudeOpus4120250805V10
6615            | Self::AnthropicClaudeOpus4520251101V10
6616            | Self::AnthropicClaudeOpus46V1
6617            | Self::AnthropicClaudeOpus47
6618            | Self::AnthropicClaudeOpus48
6619            | Self::AnthropicClaudeOpus5
6620            | Self::AnthropicClaudeSonnet4520250929V10
6621            | Self::AnthropicClaudeSonnet46
6622            | Self::AnthropicClaudeSonnet5
6623            | Self::AuAnthropicClaudeHaiku4520251001V10
6624            | Self::AuAnthropicClaudeOpus46V1
6625            | Self::AuAnthropicClaudeOpus48
6626            | Self::AuAnthropicClaudeOpus5
6627            | Self::AuAnthropicClaudeSonnet4520250929V10
6628            | Self::AuAnthropicClaudeSonnet46
6629            | Self::AuAnthropicClaudeSonnet5
6630            | Self::EuAnthropicClaudeFable5
6631            | Self::EuAnthropicClaudeHaiku4520251001V10
6632            | Self::EuAnthropicClaudeOpus4520251101V10
6633            | Self::EuAnthropicClaudeOpus46V1
6634            | Self::EuAnthropicClaudeOpus47
6635            | Self::EuAnthropicClaudeOpus48
6636            | Self::EuAnthropicClaudeOpus5
6637            | Self::EuAnthropicClaudeSonnet4520250929V10
6638            | Self::EuAnthropicClaudeSonnet46
6639            | Self::EuAnthropicClaudeSonnet5
6640            | Self::GlobalAnthropicClaudeFable5
6641            | Self::GlobalAnthropicClaudeHaiku4520251001V10
6642            | Self::GlobalAnthropicClaudeOpus4520251101V10
6643            | Self::GlobalAnthropicClaudeOpus46V1
6644            | Self::GlobalAnthropicClaudeOpus47
6645            | Self::GlobalAnthropicClaudeOpus48
6646            | Self::GlobalAnthropicClaudeOpus5
6647            | Self::GlobalAnthropicClaudeSonnet4520250929V10
6648            | Self::GlobalAnthropicClaudeSonnet46
6649            | Self::GlobalAnthropicClaudeSonnet5
6650            | Self::JpAnthropicClaudeHaiku4520251001V10
6651            | Self::JpAnthropicClaudeOpus47
6652            | Self::JpAnthropicClaudeOpus48
6653            | Self::JpAnthropicClaudeOpus5
6654            | Self::JpAnthropicClaudeSonnet4520250929V10
6655            | Self::JpAnthropicClaudeSonnet46
6656            | Self::JpAnthropicClaudeSonnet5
6657            | Self::OpenaiGpt54
6658            | Self::OpenaiGpt55
6659            | Self::OpenaiGpt56Luna
6660            | Self::OpenaiGpt56Sol
6661            | Self::OpenaiGpt56Terra
6662            | Self::UsAnthropicClaudeFable5
6663            | Self::UsAnthropicClaudeHaiku4520251001V10
6664            | Self::UsAnthropicClaudeOpus4120250805V10
6665            | Self::UsAnthropicClaudeOpus4520251101V10
6666            | Self::UsAnthropicClaudeOpus46V1
6667            | Self::UsAnthropicClaudeOpus47
6668            | Self::UsAnthropicClaudeOpus48
6669            | Self::UsAnthropicClaudeOpus5
6670            | Self::UsAnthropicClaudeSonnet4520250929V10
6671            | Self::UsAnthropicClaudeSonnet46
6672            | Self::UsAnthropicClaudeSonnet5
6673            | Self::XaiGrok43 => true,
6674        }
6675    }
6676    #[allow(clippy::too_many_lines)]
6677    pub fn supports_image(self) -> bool {
6678        match self {
6679            Self::AmazonNovaMicroV10
6680            | Self::DeepseekR1V10
6681            | Self::DeepseekV3V10
6682            | Self::DeepseekV32
6683            | Self::MetaLlama3170bInstructV10
6684            | Self::MetaLlama318bInstructV10
6685            | Self::MetaLlama3370bInstructV10
6686            | Self::MinimaxMinimaxM2
6687            | Self::MinimaxMinimaxM21
6688            | Self::MinimaxMinimaxM25
6689            | Self::MistralDevstral2123b
6690            | Self::MistralMinistral314bInstruct
6691            | Self::MistralMinistral38bInstruct
6692            | Self::MistralVoxtralMini3b2507
6693            | Self::MistralVoxtralSmall24b2507
6694            | Self::MoonshotKimiK2Thinking
6695            | Self::NvidiaNemotronNano330b
6696            | Self::NvidiaNemotronNano9bV2
6697            | Self::NvidiaNemotronSuper3120b
6698            | Self::OpenaiGptOss120b
6699            | Self::OpenaiGptOss120b10
6700            | Self::OpenaiGptOss20b
6701            | Self::OpenaiGptOss20b10
6702            | Self::OpenaiGptOssSafeguard120b
6703            | Self::OpenaiGptOssSafeguard20b
6704            | Self::QwenQwen3235bA22b2507V10
6705            | Self::QwenQwen332bV10
6706            | Self::QwenQwen3Coder30bA3bV10
6707            | Self::QwenQwen3Coder480bA35bV10
6708            | Self::QwenQwen3CoderNext
6709            | Self::QwenQwen3Next80bA3b
6710            | Self::UsDeepseekR1V10
6711            | Self::WriterPalmyraX4V10
6712            | Self::WriterPalmyraX5V10
6713            | Self::ZaiGlm47
6714            | Self::ZaiGlm47Flash
6715            | Self::ZaiGlm5 => false,
6716            Self::AmazonNova2LiteV10
6717            | Self::AmazonNovaLiteV10
6718            | Self::AmazonNovaProV10
6719            | Self::AnthropicClaudeFable5
6720            | Self::AnthropicClaudeHaiku4520251001V10
6721            | Self::AnthropicClaudeOpus4120250805V10
6722            | Self::AnthropicClaudeOpus4520251101V10
6723            | Self::AnthropicClaudeOpus46V1
6724            | Self::AnthropicClaudeOpus47
6725            | Self::AnthropicClaudeOpus48
6726            | Self::AnthropicClaudeOpus5
6727            | Self::AnthropicClaudeSonnet4520250929V10
6728            | Self::AnthropicClaudeSonnet46
6729            | Self::AnthropicClaudeSonnet5
6730            | Self::AuAnthropicClaudeHaiku4520251001V10
6731            | Self::AuAnthropicClaudeOpus46V1
6732            | Self::AuAnthropicClaudeOpus48
6733            | Self::AuAnthropicClaudeOpus5
6734            | Self::AuAnthropicClaudeSonnet4520250929V10
6735            | Self::AuAnthropicClaudeSonnet46
6736            | Self::AuAnthropicClaudeSonnet5
6737            | Self::EuAnthropicClaudeFable5
6738            | Self::EuAnthropicClaudeHaiku4520251001V10
6739            | Self::EuAnthropicClaudeOpus4520251101V10
6740            | Self::EuAnthropicClaudeOpus46V1
6741            | Self::EuAnthropicClaudeOpus47
6742            | Self::EuAnthropicClaudeOpus48
6743            | Self::EuAnthropicClaudeOpus5
6744            | Self::EuAnthropicClaudeSonnet4520250929V10
6745            | Self::EuAnthropicClaudeSonnet46
6746            | Self::EuAnthropicClaudeSonnet5
6747            | Self::GlobalAnthropicClaudeFable5
6748            | Self::GlobalAnthropicClaudeHaiku4520251001V10
6749            | Self::GlobalAnthropicClaudeOpus4520251101V10
6750            | Self::GlobalAnthropicClaudeOpus46V1
6751            | Self::GlobalAnthropicClaudeOpus47
6752            | Self::GlobalAnthropicClaudeOpus48
6753            | Self::GlobalAnthropicClaudeOpus5
6754            | Self::GlobalAnthropicClaudeSonnet4520250929V10
6755            | Self::GlobalAnthropicClaudeSonnet46
6756            | Self::GlobalAnthropicClaudeSonnet5
6757            | Self::GoogleGemma327bIt
6758            | Self::GoogleGemma34bIt
6759            | Self::JpAnthropicClaudeHaiku4520251001V10
6760            | Self::JpAnthropicClaudeOpus47
6761            | Self::JpAnthropicClaudeOpus48
6762            | Self::JpAnthropicClaudeOpus5
6763            | Self::JpAnthropicClaudeSonnet4520250929V10
6764            | Self::JpAnthropicClaudeSonnet46
6765            | Self::JpAnthropicClaudeSonnet5
6766            | Self::MetaLlama4Maverick17bInstructV10
6767            | Self::MetaLlama4Scout17bInstructV10
6768            | Self::MistralMagistralSmall2509
6769            | Self::MistralMinistral33bInstruct
6770            | Self::MistralMistralLarge3675bInstruct
6771            | Self::MistralPixtralLarge2502V10
6772            | Self::MoonshotaiKimiK25
6773            | Self::NvidiaNemotronNano12bV2
6774            | Self::OpenaiGpt54
6775            | Self::OpenaiGpt55
6776            | Self::OpenaiGpt56Luna
6777            | Self::OpenaiGpt56Sol
6778            | Self::OpenaiGpt56Terra
6779            | Self::QwenQwen3Vl235bA22b
6780            | Self::UsAnthropicClaudeFable5
6781            | Self::UsAnthropicClaudeHaiku4520251001V10
6782            | Self::UsAnthropicClaudeOpus4120250805V10
6783            | Self::UsAnthropicClaudeOpus4520251101V10
6784            | Self::UsAnthropicClaudeOpus46V1
6785            | Self::UsAnthropicClaudeOpus47
6786            | Self::UsAnthropicClaudeOpus48
6787            | Self::UsAnthropicClaudeOpus5
6788            | Self::UsAnthropicClaudeSonnet4520250929V10
6789            | Self::UsAnthropicClaudeSonnet46
6790            | Self::UsAnthropicClaudeSonnet5
6791            | Self::UsMetaLlama4Maverick17bInstructV10
6792            | Self::UsMetaLlama4Scout17bInstructV10
6793            | Self::XaiGrok43 => true,
6794        }
6795    }
6796    #[allow(clippy::too_many_lines)]
6797    pub fn supports_audio(self) -> bool {
6798        match self {
6799            Self::AmazonNova2LiteV10
6800            | Self::AmazonNovaLiteV10
6801            | Self::AmazonNovaMicroV10
6802            | Self::AmazonNovaProV10
6803            | Self::AnthropicClaudeFable5
6804            | Self::AnthropicClaudeHaiku4520251001V10
6805            | Self::AnthropicClaudeOpus4120250805V10
6806            | Self::AnthropicClaudeOpus4520251101V10
6807            | Self::AnthropicClaudeOpus46V1
6808            | Self::AnthropicClaudeOpus47
6809            | Self::AnthropicClaudeOpus48
6810            | Self::AnthropicClaudeOpus5
6811            | Self::AnthropicClaudeSonnet4520250929V10
6812            | Self::AnthropicClaudeSonnet46
6813            | Self::AnthropicClaudeSonnet5
6814            | Self::AuAnthropicClaudeHaiku4520251001V10
6815            | Self::AuAnthropicClaudeOpus46V1
6816            | Self::AuAnthropicClaudeOpus48
6817            | Self::AuAnthropicClaudeOpus5
6818            | Self::AuAnthropicClaudeSonnet4520250929V10
6819            | Self::AuAnthropicClaudeSonnet46
6820            | Self::AuAnthropicClaudeSonnet5
6821            | Self::DeepseekR1V10
6822            | Self::DeepseekV3V10
6823            | Self::DeepseekV32
6824            | Self::EuAnthropicClaudeFable5
6825            | Self::EuAnthropicClaudeHaiku4520251001V10
6826            | Self::EuAnthropicClaudeOpus4520251101V10
6827            | Self::EuAnthropicClaudeOpus46V1
6828            | Self::EuAnthropicClaudeOpus47
6829            | Self::EuAnthropicClaudeOpus48
6830            | Self::EuAnthropicClaudeOpus5
6831            | Self::EuAnthropicClaudeSonnet4520250929V10
6832            | Self::EuAnthropicClaudeSonnet46
6833            | Self::EuAnthropicClaudeSonnet5
6834            | Self::GlobalAnthropicClaudeFable5
6835            | Self::GlobalAnthropicClaudeHaiku4520251001V10
6836            | Self::GlobalAnthropicClaudeOpus4520251101V10
6837            | Self::GlobalAnthropicClaudeOpus46V1
6838            | Self::GlobalAnthropicClaudeOpus47
6839            | Self::GlobalAnthropicClaudeOpus48
6840            | Self::GlobalAnthropicClaudeOpus5
6841            | Self::GlobalAnthropicClaudeSonnet4520250929V10
6842            | Self::GlobalAnthropicClaudeSonnet46
6843            | Self::GlobalAnthropicClaudeSonnet5
6844            | Self::GoogleGemma327bIt
6845            | Self::GoogleGemma34bIt
6846            | Self::JpAnthropicClaudeHaiku4520251001V10
6847            | Self::JpAnthropicClaudeOpus47
6848            | Self::JpAnthropicClaudeOpus48
6849            | Self::JpAnthropicClaudeOpus5
6850            | Self::JpAnthropicClaudeSonnet4520250929V10
6851            | Self::JpAnthropicClaudeSonnet46
6852            | Self::JpAnthropicClaudeSonnet5
6853            | Self::MetaLlama3170bInstructV10
6854            | Self::MetaLlama318bInstructV10
6855            | Self::MetaLlama3370bInstructV10
6856            | Self::MetaLlama4Maverick17bInstructV10
6857            | Self::MetaLlama4Scout17bInstructV10
6858            | Self::MinimaxMinimaxM2
6859            | Self::MinimaxMinimaxM21
6860            | Self::MinimaxMinimaxM25
6861            | Self::MistralDevstral2123b
6862            | Self::MistralMagistralSmall2509
6863            | Self::MistralMinistral314bInstruct
6864            | Self::MistralMinistral33bInstruct
6865            | Self::MistralMinistral38bInstruct
6866            | Self::MistralMistralLarge3675bInstruct
6867            | Self::MistralPixtralLarge2502V10
6868            | Self::MoonshotKimiK2Thinking
6869            | Self::MoonshotaiKimiK25
6870            | Self::NvidiaNemotronNano12bV2
6871            | Self::NvidiaNemotronNano330b
6872            | Self::NvidiaNemotronNano9bV2
6873            | Self::NvidiaNemotronSuper3120b
6874            | Self::OpenaiGpt54
6875            | Self::OpenaiGpt55
6876            | Self::OpenaiGpt56Luna
6877            | Self::OpenaiGpt56Sol
6878            | Self::OpenaiGpt56Terra
6879            | Self::OpenaiGptOss120b
6880            | Self::OpenaiGptOss120b10
6881            | Self::OpenaiGptOss20b
6882            | Self::OpenaiGptOss20b10
6883            | Self::OpenaiGptOssSafeguard120b
6884            | Self::OpenaiGptOssSafeguard20b
6885            | Self::QwenQwen3235bA22b2507V10
6886            | Self::QwenQwen332bV10
6887            | Self::QwenQwen3Coder30bA3bV10
6888            | Self::QwenQwen3Coder480bA35bV10
6889            | Self::QwenQwen3CoderNext
6890            | Self::QwenQwen3Next80bA3b
6891            | Self::QwenQwen3Vl235bA22b
6892            | Self::UsAnthropicClaudeFable5
6893            | Self::UsAnthropicClaudeHaiku4520251001V10
6894            | Self::UsAnthropicClaudeOpus4120250805V10
6895            | Self::UsAnthropicClaudeOpus4520251101V10
6896            | Self::UsAnthropicClaudeOpus46V1
6897            | Self::UsAnthropicClaudeOpus47
6898            | Self::UsAnthropicClaudeOpus48
6899            | Self::UsAnthropicClaudeOpus5
6900            | Self::UsAnthropicClaudeSonnet4520250929V10
6901            | Self::UsAnthropicClaudeSonnet46
6902            | Self::UsAnthropicClaudeSonnet5
6903            | Self::UsDeepseekR1V10
6904            | Self::UsMetaLlama4Maverick17bInstructV10
6905            | Self::UsMetaLlama4Scout17bInstructV10
6906            | Self::WriterPalmyraX4V10
6907            | Self::WriterPalmyraX5V10
6908            | Self::XaiGrok43
6909            | Self::ZaiGlm47
6910            | Self::ZaiGlm47Flash
6911            | Self::ZaiGlm5 => false,
6912            Self::MistralVoxtralMini3b2507 | Self::MistralVoxtralSmall24b2507 => true,
6913        }
6914    }
6915    #[allow(clippy::too_many_lines)]
6916    pub fn transport(self) -> Option<ModelTransport> {
6917        match self {
6918            Self::AmazonNova2LiteV10
6919            | Self::AmazonNovaLiteV10
6920            | Self::AmazonNovaMicroV10
6921            | Self::AmazonNovaProV10
6922            | Self::AnthropicClaudeFable5
6923            | Self::AnthropicClaudeHaiku4520251001V10
6924            | Self::AnthropicClaudeOpus4120250805V10
6925            | Self::AnthropicClaudeOpus4520251101V10
6926            | Self::AnthropicClaudeOpus46V1
6927            | Self::AnthropicClaudeOpus47
6928            | Self::AnthropicClaudeOpus48
6929            | Self::AnthropicClaudeOpus5
6930            | Self::AnthropicClaudeSonnet4520250929V10
6931            | Self::AnthropicClaudeSonnet46
6932            | Self::AnthropicClaudeSonnet5
6933            | Self::AuAnthropicClaudeHaiku4520251001V10
6934            | Self::AuAnthropicClaudeOpus46V1
6935            | Self::AuAnthropicClaudeOpus48
6936            | Self::AuAnthropicClaudeOpus5
6937            | Self::AuAnthropicClaudeSonnet4520250929V10
6938            | Self::AuAnthropicClaudeSonnet46
6939            | Self::AuAnthropicClaudeSonnet5
6940            | Self::DeepseekR1V10
6941            | Self::DeepseekV3V10
6942            | Self::DeepseekV32
6943            | Self::EuAnthropicClaudeFable5
6944            | Self::EuAnthropicClaudeHaiku4520251001V10
6945            | Self::EuAnthropicClaudeOpus4520251101V10
6946            | Self::EuAnthropicClaudeOpus46V1
6947            | Self::EuAnthropicClaudeOpus47
6948            | Self::EuAnthropicClaudeOpus48
6949            | Self::EuAnthropicClaudeOpus5
6950            | Self::EuAnthropicClaudeSonnet4520250929V10
6951            | Self::EuAnthropicClaudeSonnet46
6952            | Self::EuAnthropicClaudeSonnet5
6953            | Self::GlobalAnthropicClaudeFable5
6954            | Self::GlobalAnthropicClaudeHaiku4520251001V10
6955            | Self::GlobalAnthropicClaudeOpus4520251101V10
6956            | Self::GlobalAnthropicClaudeOpus46V1
6957            | Self::GlobalAnthropicClaudeOpus47
6958            | Self::GlobalAnthropicClaudeOpus48
6959            | Self::GlobalAnthropicClaudeOpus5
6960            | Self::GlobalAnthropicClaudeSonnet4520250929V10
6961            | Self::GlobalAnthropicClaudeSonnet46
6962            | Self::GlobalAnthropicClaudeSonnet5
6963            | Self::GoogleGemma327bIt
6964            | Self::GoogleGemma34bIt
6965            | Self::JpAnthropicClaudeHaiku4520251001V10
6966            | Self::JpAnthropicClaudeOpus47
6967            | Self::JpAnthropicClaudeOpus48
6968            | Self::JpAnthropicClaudeOpus5
6969            | Self::JpAnthropicClaudeSonnet4520250929V10
6970            | Self::JpAnthropicClaudeSonnet46
6971            | Self::JpAnthropicClaudeSonnet5
6972            | Self::MetaLlama3170bInstructV10
6973            | Self::MetaLlama318bInstructV10
6974            | Self::MetaLlama3370bInstructV10
6975            | Self::MetaLlama4Maverick17bInstructV10
6976            | Self::MetaLlama4Scout17bInstructV10
6977            | Self::MinimaxMinimaxM2
6978            | Self::MinimaxMinimaxM21
6979            | Self::MinimaxMinimaxM25
6980            | Self::MistralDevstral2123b
6981            | Self::MistralMagistralSmall2509
6982            | Self::MistralMinistral314bInstruct
6983            | Self::MistralMinistral33bInstruct
6984            | Self::MistralMinistral38bInstruct
6985            | Self::MistralMistralLarge3675bInstruct
6986            | Self::MistralPixtralLarge2502V10
6987            | Self::MistralVoxtralMini3b2507
6988            | Self::MistralVoxtralSmall24b2507
6989            | Self::MoonshotKimiK2Thinking
6990            | Self::MoonshotaiKimiK25
6991            | Self::NvidiaNemotronNano12bV2
6992            | Self::NvidiaNemotronNano330b
6993            | Self::NvidiaNemotronNano9bV2
6994            | Self::NvidiaNemotronSuper3120b
6995            | Self::OpenaiGptOss120b10
6996            | Self::OpenaiGptOss20b10
6997            | Self::OpenaiGptOssSafeguard120b
6998            | Self::OpenaiGptOssSafeguard20b
6999            | Self::QwenQwen3235bA22b2507V10
7000            | Self::QwenQwen332bV10
7001            | Self::QwenQwen3Coder30bA3bV10
7002            | Self::QwenQwen3Coder480bA35bV10
7003            | Self::QwenQwen3CoderNext
7004            | Self::QwenQwen3Next80bA3b
7005            | Self::QwenQwen3Vl235bA22b
7006            | Self::UsAnthropicClaudeFable5
7007            | Self::UsAnthropicClaudeHaiku4520251001V10
7008            | Self::UsAnthropicClaudeOpus4120250805V10
7009            | Self::UsAnthropicClaudeOpus4520251101V10
7010            | Self::UsAnthropicClaudeOpus46V1
7011            | Self::UsAnthropicClaudeOpus47
7012            | Self::UsAnthropicClaudeOpus48
7013            | Self::UsAnthropicClaudeOpus5
7014            | Self::UsAnthropicClaudeSonnet4520250929V10
7015            | Self::UsAnthropicClaudeSonnet46
7016            | Self::UsAnthropicClaudeSonnet5
7017            | Self::UsDeepseekR1V10
7018            | Self::UsMetaLlama4Maverick17bInstructV10
7019            | Self::UsMetaLlama4Scout17bInstructV10
7020            | Self::WriterPalmyraX4V10
7021            | Self::WriterPalmyraX5V10
7022            | Self::ZaiGlm47
7023            | Self::ZaiGlm47Flash
7024            | Self::ZaiGlm5 => None,
7025            Self::OpenaiGpt54
7026            | Self::OpenaiGpt55
7027            | Self::OpenaiGpt56Luna
7028            | Self::OpenaiGpt56Sol
7029            | Self::OpenaiGpt56Terra
7030            | Self::XaiGrok43 => {
7031                Some(ModelTransport::OpenAiResponses {
7032                    base_url_template: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1",
7033                })
7034            }
7035            Self::OpenaiGptOss120b | Self::OpenaiGptOss20b => {
7036                Some(ModelTransport::OpenAiResponses {
7037                    base_url_template: "https://bedrock-mantle.${AWS_REGION}.api.aws/v1",
7038                })
7039            }
7040        }
7041    }
7042    const ALL: &[BedrockFoundationModel] = &[
7043        Self::AmazonNova2LiteV10,
7044        Self::AmazonNovaLiteV10,
7045        Self::AmazonNovaMicroV10,
7046        Self::AmazonNovaProV10,
7047        Self::AnthropicClaudeFable5,
7048        Self::AnthropicClaudeHaiku4520251001V10,
7049        Self::AnthropicClaudeOpus4120250805V10,
7050        Self::AnthropicClaudeOpus4520251101V10,
7051        Self::AnthropicClaudeOpus46V1,
7052        Self::AnthropicClaudeOpus47,
7053        Self::AnthropicClaudeOpus48,
7054        Self::AnthropicClaudeOpus5,
7055        Self::AnthropicClaudeSonnet4520250929V10,
7056        Self::AnthropicClaudeSonnet46,
7057        Self::AnthropicClaudeSonnet5,
7058        Self::AuAnthropicClaudeHaiku4520251001V10,
7059        Self::AuAnthropicClaudeOpus46V1,
7060        Self::AuAnthropicClaudeOpus48,
7061        Self::AuAnthropicClaudeOpus5,
7062        Self::AuAnthropicClaudeSonnet4520250929V10,
7063        Self::AuAnthropicClaudeSonnet46,
7064        Self::AuAnthropicClaudeSonnet5,
7065        Self::DeepseekR1V10,
7066        Self::DeepseekV3V10,
7067        Self::DeepseekV32,
7068        Self::EuAnthropicClaudeFable5,
7069        Self::EuAnthropicClaudeHaiku4520251001V10,
7070        Self::EuAnthropicClaudeOpus4520251101V10,
7071        Self::EuAnthropicClaudeOpus46V1,
7072        Self::EuAnthropicClaudeOpus47,
7073        Self::EuAnthropicClaudeOpus48,
7074        Self::EuAnthropicClaudeOpus5,
7075        Self::EuAnthropicClaudeSonnet4520250929V10,
7076        Self::EuAnthropicClaudeSonnet46,
7077        Self::EuAnthropicClaudeSonnet5,
7078        Self::GlobalAnthropicClaudeFable5,
7079        Self::GlobalAnthropicClaudeHaiku4520251001V10,
7080        Self::GlobalAnthropicClaudeOpus4520251101V10,
7081        Self::GlobalAnthropicClaudeOpus46V1,
7082        Self::GlobalAnthropicClaudeOpus47,
7083        Self::GlobalAnthropicClaudeOpus48,
7084        Self::GlobalAnthropicClaudeOpus5,
7085        Self::GlobalAnthropicClaudeSonnet4520250929V10,
7086        Self::GlobalAnthropicClaudeSonnet46,
7087        Self::GlobalAnthropicClaudeSonnet5,
7088        Self::GoogleGemma327bIt,
7089        Self::GoogleGemma34bIt,
7090        Self::JpAnthropicClaudeHaiku4520251001V10,
7091        Self::JpAnthropicClaudeOpus47,
7092        Self::JpAnthropicClaudeOpus48,
7093        Self::JpAnthropicClaudeOpus5,
7094        Self::JpAnthropicClaudeSonnet4520250929V10,
7095        Self::JpAnthropicClaudeSonnet46,
7096        Self::JpAnthropicClaudeSonnet5,
7097        Self::MetaLlama3170bInstructV10,
7098        Self::MetaLlama318bInstructV10,
7099        Self::MetaLlama3370bInstructV10,
7100        Self::MetaLlama4Maverick17bInstructV10,
7101        Self::MetaLlama4Scout17bInstructV10,
7102        Self::MinimaxMinimaxM2,
7103        Self::MinimaxMinimaxM21,
7104        Self::MinimaxMinimaxM25,
7105        Self::MistralDevstral2123b,
7106        Self::MistralMagistralSmall2509,
7107        Self::MistralMinistral314bInstruct,
7108        Self::MistralMinistral33bInstruct,
7109        Self::MistralMinistral38bInstruct,
7110        Self::MistralMistralLarge3675bInstruct,
7111        Self::MistralPixtralLarge2502V10,
7112        Self::MistralVoxtralMini3b2507,
7113        Self::MistralVoxtralSmall24b2507,
7114        Self::MoonshotKimiK2Thinking,
7115        Self::MoonshotaiKimiK25,
7116        Self::NvidiaNemotronNano12bV2,
7117        Self::NvidiaNemotronNano330b,
7118        Self::NvidiaNemotronNano9bV2,
7119        Self::NvidiaNemotronSuper3120b,
7120        Self::OpenaiGpt54,
7121        Self::OpenaiGpt55,
7122        Self::OpenaiGpt56Luna,
7123        Self::OpenaiGpt56Sol,
7124        Self::OpenaiGpt56Terra,
7125        Self::OpenaiGptOss120b,
7126        Self::OpenaiGptOss120b10,
7127        Self::OpenaiGptOss20b,
7128        Self::OpenaiGptOss20b10,
7129        Self::OpenaiGptOssSafeguard120b,
7130        Self::OpenaiGptOssSafeguard20b,
7131        Self::QwenQwen3235bA22b2507V10,
7132        Self::QwenQwen332bV10,
7133        Self::QwenQwen3Coder30bA3bV10,
7134        Self::QwenQwen3Coder480bA35bV10,
7135        Self::QwenQwen3CoderNext,
7136        Self::QwenQwen3Next80bA3b,
7137        Self::QwenQwen3Vl235bA22b,
7138        Self::UsAnthropicClaudeFable5,
7139        Self::UsAnthropicClaudeHaiku4520251001V10,
7140        Self::UsAnthropicClaudeOpus4120250805V10,
7141        Self::UsAnthropicClaudeOpus4520251101V10,
7142        Self::UsAnthropicClaudeOpus46V1,
7143        Self::UsAnthropicClaudeOpus47,
7144        Self::UsAnthropicClaudeOpus48,
7145        Self::UsAnthropicClaudeOpus5,
7146        Self::UsAnthropicClaudeSonnet4520250929V10,
7147        Self::UsAnthropicClaudeSonnet46,
7148        Self::UsAnthropicClaudeSonnet5,
7149        Self::UsDeepseekR1V10,
7150        Self::UsMetaLlama4Maverick17bInstructV10,
7151        Self::UsMetaLlama4Scout17bInstructV10,
7152        Self::WriterPalmyraX4V10,
7153        Self::WriterPalmyraX5V10,
7154        Self::XaiGrok43,
7155        Self::ZaiGlm47,
7156        Self::ZaiGlm47Flash,
7157        Self::ZaiGlm5,
7158    ];
7159}
7160impl std::str::FromStr for BedrockFoundationModel {
7161    type Err = String;
7162    #[allow(clippy::too_many_lines)]
7163    fn from_str(s: &str) -> Result<Self, Self::Err> {
7164        match s {
7165            "amazon.nova-2-lite-v1:0" => Ok(Self::AmazonNova2LiteV10),
7166            "amazon.nova-lite-v1:0" => Ok(Self::AmazonNovaLiteV10),
7167            "amazon.nova-micro-v1:0" => Ok(Self::AmazonNovaMicroV10),
7168            "amazon.nova-pro-v1:0" => Ok(Self::AmazonNovaProV10),
7169            "anthropic.claude-fable-5" => Ok(Self::AnthropicClaudeFable5),
7170            "anthropic.claude-haiku-4-5-20251001-v1:0" => {
7171                Ok(Self::AnthropicClaudeHaiku4520251001V10)
7172            }
7173            "anthropic.claude-opus-4-1-20250805-v1:0" => {
7174                Ok(Self::AnthropicClaudeOpus4120250805V10)
7175            }
7176            "anthropic.claude-opus-4-5-20251101-v1:0" => {
7177                Ok(Self::AnthropicClaudeOpus4520251101V10)
7178            }
7179            "anthropic.claude-opus-4-6-v1" => Ok(Self::AnthropicClaudeOpus46V1),
7180            "anthropic.claude-opus-4-7" => Ok(Self::AnthropicClaudeOpus47),
7181            "anthropic.claude-opus-4-8" => Ok(Self::AnthropicClaudeOpus48),
7182            "anthropic.claude-opus-5" => Ok(Self::AnthropicClaudeOpus5),
7183            "anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7184                Ok(Self::AnthropicClaudeSonnet4520250929V10)
7185            }
7186            "anthropic.claude-sonnet-4-6" => Ok(Self::AnthropicClaudeSonnet46),
7187            "anthropic.claude-sonnet-5" => Ok(Self::AnthropicClaudeSonnet5),
7188            "au.anthropic.claude-haiku-4-5-20251001-v1:0" => {
7189                Ok(Self::AuAnthropicClaudeHaiku4520251001V10)
7190            }
7191            "au.anthropic.claude-opus-4-6-v1" => Ok(Self::AuAnthropicClaudeOpus46V1),
7192            "au.anthropic.claude-opus-4-8" => Ok(Self::AuAnthropicClaudeOpus48),
7193            "au.anthropic.claude-opus-5" => Ok(Self::AuAnthropicClaudeOpus5),
7194            "au.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7195                Ok(Self::AuAnthropicClaudeSonnet4520250929V10)
7196            }
7197            "au.anthropic.claude-sonnet-4-6" => Ok(Self::AuAnthropicClaudeSonnet46),
7198            "au.anthropic.claude-sonnet-5" => Ok(Self::AuAnthropicClaudeSonnet5),
7199            "deepseek.r1-v1:0" => Ok(Self::DeepseekR1V10),
7200            "deepseek.v3-v1:0" => Ok(Self::DeepseekV3V10),
7201            "deepseek.v3.2" => Ok(Self::DeepseekV32),
7202            "eu.anthropic.claude-fable-5" => Ok(Self::EuAnthropicClaudeFable5),
7203            "eu.anthropic.claude-haiku-4-5-20251001-v1:0" => {
7204                Ok(Self::EuAnthropicClaudeHaiku4520251001V10)
7205            }
7206            "eu.anthropic.claude-opus-4-5-20251101-v1:0" => {
7207                Ok(Self::EuAnthropicClaudeOpus4520251101V10)
7208            }
7209            "eu.anthropic.claude-opus-4-6-v1" => Ok(Self::EuAnthropicClaudeOpus46V1),
7210            "eu.anthropic.claude-opus-4-7" => Ok(Self::EuAnthropicClaudeOpus47),
7211            "eu.anthropic.claude-opus-4-8" => Ok(Self::EuAnthropicClaudeOpus48),
7212            "eu.anthropic.claude-opus-5" => Ok(Self::EuAnthropicClaudeOpus5),
7213            "eu.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7214                Ok(Self::EuAnthropicClaudeSonnet4520250929V10)
7215            }
7216            "eu.anthropic.claude-sonnet-4-6" => Ok(Self::EuAnthropicClaudeSonnet46),
7217            "eu.anthropic.claude-sonnet-5" => Ok(Self::EuAnthropicClaudeSonnet5),
7218            "global.anthropic.claude-fable-5" => Ok(Self::GlobalAnthropicClaudeFable5),
7219            "global.anthropic.claude-haiku-4-5-20251001-v1:0" => {
7220                Ok(Self::GlobalAnthropicClaudeHaiku4520251001V10)
7221            }
7222            "global.anthropic.claude-opus-4-5-20251101-v1:0" => {
7223                Ok(Self::GlobalAnthropicClaudeOpus4520251101V10)
7224            }
7225            "global.anthropic.claude-opus-4-6-v1" => {
7226                Ok(Self::GlobalAnthropicClaudeOpus46V1)
7227            }
7228            "global.anthropic.claude-opus-4-7" => Ok(Self::GlobalAnthropicClaudeOpus47),
7229            "global.anthropic.claude-opus-4-8" => Ok(Self::GlobalAnthropicClaudeOpus48),
7230            "global.anthropic.claude-opus-5" => Ok(Self::GlobalAnthropicClaudeOpus5),
7231            "global.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7232                Ok(Self::GlobalAnthropicClaudeSonnet4520250929V10)
7233            }
7234            "global.anthropic.claude-sonnet-4-6" => {
7235                Ok(Self::GlobalAnthropicClaudeSonnet46)
7236            }
7237            "global.anthropic.claude-sonnet-5" => Ok(Self::GlobalAnthropicClaudeSonnet5),
7238            "google.gemma-3-27b-it" => Ok(Self::GoogleGemma327bIt),
7239            "google.gemma-3-4b-it" => Ok(Self::GoogleGemma34bIt),
7240            "jp.anthropic.claude-haiku-4-5-20251001-v1:0" => {
7241                Ok(Self::JpAnthropicClaudeHaiku4520251001V10)
7242            }
7243            "jp.anthropic.claude-opus-4-7" => Ok(Self::JpAnthropicClaudeOpus47),
7244            "jp.anthropic.claude-opus-4-8" => Ok(Self::JpAnthropicClaudeOpus48),
7245            "jp.anthropic.claude-opus-5" => Ok(Self::JpAnthropicClaudeOpus5),
7246            "jp.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7247                Ok(Self::JpAnthropicClaudeSonnet4520250929V10)
7248            }
7249            "jp.anthropic.claude-sonnet-4-6" => Ok(Self::JpAnthropicClaudeSonnet46),
7250            "jp.anthropic.claude-sonnet-5" => Ok(Self::JpAnthropicClaudeSonnet5),
7251            "meta.llama3-1-70b-instruct-v1:0" => Ok(Self::MetaLlama3170bInstructV10),
7252            "meta.llama3-1-8b-instruct-v1:0" => Ok(Self::MetaLlama318bInstructV10),
7253            "meta.llama3-3-70b-instruct-v1:0" => Ok(Self::MetaLlama3370bInstructV10),
7254            "meta.llama4-maverick-17b-instruct-v1:0" => {
7255                Ok(Self::MetaLlama4Maverick17bInstructV10)
7256            }
7257            "meta.llama4-scout-17b-instruct-v1:0" => {
7258                Ok(Self::MetaLlama4Scout17bInstructV10)
7259            }
7260            "minimax.minimax-m2" => Ok(Self::MinimaxMinimaxM2),
7261            "minimax.minimax-m2.1" => Ok(Self::MinimaxMinimaxM21),
7262            "minimax.minimax-m2.5" => Ok(Self::MinimaxMinimaxM25),
7263            "mistral.devstral-2-123b" => Ok(Self::MistralDevstral2123b),
7264            "mistral.magistral-small-2509" => Ok(Self::MistralMagistralSmall2509),
7265            "mistral.ministral-3-14b-instruct" => Ok(Self::MistralMinistral314bInstruct),
7266            "mistral.ministral-3-3b-instruct" => Ok(Self::MistralMinistral33bInstruct),
7267            "mistral.ministral-3-8b-instruct" => Ok(Self::MistralMinistral38bInstruct),
7268            "mistral.mistral-large-3-675b-instruct" => {
7269                Ok(Self::MistralMistralLarge3675bInstruct)
7270            }
7271            "mistral.pixtral-large-2502-v1:0" => Ok(Self::MistralPixtralLarge2502V10),
7272            "mistral.voxtral-mini-3b-2507" => Ok(Self::MistralVoxtralMini3b2507),
7273            "mistral.voxtral-small-24b-2507" => Ok(Self::MistralVoxtralSmall24b2507),
7274            "moonshot.kimi-k2-thinking" => Ok(Self::MoonshotKimiK2Thinking),
7275            "moonshotai.kimi-k2.5" => Ok(Self::MoonshotaiKimiK25),
7276            "nvidia.nemotron-nano-12b-v2" => Ok(Self::NvidiaNemotronNano12bV2),
7277            "nvidia.nemotron-nano-3-30b" => Ok(Self::NvidiaNemotronNano330b),
7278            "nvidia.nemotron-nano-9b-v2" => Ok(Self::NvidiaNemotronNano9bV2),
7279            "nvidia.nemotron-super-3-120b" => Ok(Self::NvidiaNemotronSuper3120b),
7280            "openai.gpt-5.4" => Ok(Self::OpenaiGpt54),
7281            "openai.gpt-5.5" => Ok(Self::OpenaiGpt55),
7282            "openai.gpt-5.6-luna" => Ok(Self::OpenaiGpt56Luna),
7283            "openai.gpt-5.6-sol" => Ok(Self::OpenaiGpt56Sol),
7284            "openai.gpt-5.6-terra" => Ok(Self::OpenaiGpt56Terra),
7285            "openai.gpt-oss-120b" => Ok(Self::OpenaiGptOss120b),
7286            "openai.gpt-oss-120b-1:0" => Ok(Self::OpenaiGptOss120b10),
7287            "openai.gpt-oss-20b" => Ok(Self::OpenaiGptOss20b),
7288            "openai.gpt-oss-20b-1:0" => Ok(Self::OpenaiGptOss20b10),
7289            "openai.gpt-oss-safeguard-120b" => Ok(Self::OpenaiGptOssSafeguard120b),
7290            "openai.gpt-oss-safeguard-20b" => Ok(Self::OpenaiGptOssSafeguard20b),
7291            "qwen.qwen3-235b-a22b-2507-v1:0" => Ok(Self::QwenQwen3235bA22b2507V10),
7292            "qwen.qwen3-32b-v1:0" => Ok(Self::QwenQwen332bV10),
7293            "qwen.qwen3-coder-30b-a3b-v1:0" => Ok(Self::QwenQwen3Coder30bA3bV10),
7294            "qwen.qwen3-coder-480b-a35b-v1:0" => Ok(Self::QwenQwen3Coder480bA35bV10),
7295            "qwen.qwen3-coder-next" => Ok(Self::QwenQwen3CoderNext),
7296            "qwen.qwen3-next-80b-a3b" => Ok(Self::QwenQwen3Next80bA3b),
7297            "qwen.qwen3-vl-235b-a22b" => Ok(Self::QwenQwen3Vl235bA22b),
7298            "us.anthropic.claude-fable-5" => Ok(Self::UsAnthropicClaudeFable5),
7299            "us.anthropic.claude-haiku-4-5-20251001-v1:0" => {
7300                Ok(Self::UsAnthropicClaudeHaiku4520251001V10)
7301            }
7302            "us.anthropic.claude-opus-4-1-20250805-v1:0" => {
7303                Ok(Self::UsAnthropicClaudeOpus4120250805V10)
7304            }
7305            "us.anthropic.claude-opus-4-5-20251101-v1:0" => {
7306                Ok(Self::UsAnthropicClaudeOpus4520251101V10)
7307            }
7308            "us.anthropic.claude-opus-4-6-v1" => Ok(Self::UsAnthropicClaudeOpus46V1),
7309            "us.anthropic.claude-opus-4-7" => Ok(Self::UsAnthropicClaudeOpus47),
7310            "us.anthropic.claude-opus-4-8" => Ok(Self::UsAnthropicClaudeOpus48),
7311            "us.anthropic.claude-opus-5" => Ok(Self::UsAnthropicClaudeOpus5),
7312            "us.anthropic.claude-sonnet-4-5-20250929-v1:0" => {
7313                Ok(Self::UsAnthropicClaudeSonnet4520250929V10)
7314            }
7315            "us.anthropic.claude-sonnet-4-6" => Ok(Self::UsAnthropicClaudeSonnet46),
7316            "us.anthropic.claude-sonnet-5" => Ok(Self::UsAnthropicClaudeSonnet5),
7317            "us.deepseek.r1-v1:0" => Ok(Self::UsDeepseekR1V10),
7318            "us.meta.llama4-maverick-17b-instruct-v1:0" => {
7319                Ok(Self::UsMetaLlama4Maverick17bInstructV10)
7320            }
7321            "us.meta.llama4-scout-17b-instruct-v1:0" => {
7322                Ok(Self::UsMetaLlama4Scout17bInstructV10)
7323            }
7324            "writer.palmyra-x4-v1:0" => Ok(Self::WriterPalmyraX4V10),
7325            "writer.palmyra-x5-v1:0" => Ok(Self::WriterPalmyraX5V10),
7326            "xai.grok-4.3" => Ok(Self::XaiGrok43),
7327            "zai.glm-4.7" => Ok(Self::ZaiGlm47),
7328            "zai.glm-4.7-flash" => Ok(Self::ZaiGlm47Flash),
7329            "zai.glm-5" => Ok(Self::ZaiGlm5),
7330            _ => Err(format!("Unknown bedrock model: '{s}'")),
7331        }
7332    }
7333}
7334/// A model from a specific provider
7335#[derive(Debug, Clone, PartialEq, Eq, Hash)]
7336pub enum LlmModel {
7337    Anthropic(AnthropicModel),
7338    AzureFoundry(AzureFoundryModel),
7339    Codex(CodexModel),
7340    DeepSeek(DeepSeekModel),
7341    Fireworks(FireworksModel),
7342    Gemini(GeminiModel),
7343    Moonshot(MoonshotModel),
7344    Openai(OpenaiModel),
7345    OpenRouter(OpenRouterModel),
7346    ZAi(ZAiModel),
7347    Bedrock(BedrockModel),
7348    Ollama(String),
7349    LlamaCpp(String),
7350}
7351impl From<AnthropicModel> for LlmModel {
7352    fn from(m: AnthropicModel) -> Self {
7353        LlmModel::Anthropic(m)
7354    }
7355}
7356impl From<AzureFoundryModel> for LlmModel {
7357    fn from(m: AzureFoundryModel) -> Self {
7358        LlmModel::AzureFoundry(m)
7359    }
7360}
7361impl From<CodexModel> for LlmModel {
7362    fn from(m: CodexModel) -> Self {
7363        LlmModel::Codex(m)
7364    }
7365}
7366impl From<DeepSeekModel> for LlmModel {
7367    fn from(m: DeepSeekModel) -> Self {
7368        LlmModel::DeepSeek(m)
7369    }
7370}
7371impl From<FireworksModel> for LlmModel {
7372    fn from(m: FireworksModel) -> Self {
7373        LlmModel::Fireworks(m)
7374    }
7375}
7376impl From<GeminiModel> for LlmModel {
7377    fn from(m: GeminiModel) -> Self {
7378        LlmModel::Gemini(m)
7379    }
7380}
7381impl From<MoonshotModel> for LlmModel {
7382    fn from(m: MoonshotModel) -> Self {
7383        LlmModel::Moonshot(m)
7384    }
7385}
7386impl From<OpenaiModel> for LlmModel {
7387    fn from(m: OpenaiModel) -> Self {
7388        LlmModel::Openai(m)
7389    }
7390}
7391impl From<OpenRouterModel> for LlmModel {
7392    fn from(m: OpenRouterModel) -> Self {
7393        LlmModel::OpenRouter(m)
7394    }
7395}
7396impl From<ZAiModel> for LlmModel {
7397    fn from(m: ZAiModel) -> Self {
7398        LlmModel::ZAi(m)
7399    }
7400}
7401impl From<BedrockModel> for LlmModel {
7402    fn from(m: BedrockModel) -> Self {
7403        LlmModel::Bedrock(m)
7404    }
7405}
7406impl LlmModel {
7407    /// Raw model ID (e.g. `claude-opus-4-6`, `llama3.2`)
7408    pub fn model_id(&self) -> Cow<'static, str> {
7409        match self {
7410            Self::Anthropic(m) => Cow::Borrowed(m.model_id()),
7411            Self::AzureFoundry(m) => Cow::Borrowed(m.model_id()),
7412            Self::Codex(m) => Cow::Borrowed(m.model_id()),
7413            Self::DeepSeek(m) => Cow::Borrowed(m.model_id()),
7414            Self::Fireworks(m) => Cow::Borrowed(m.model_id()),
7415            Self::Gemini(m) => Cow::Borrowed(m.model_id()),
7416            Self::Moonshot(m) => Cow::Borrowed(m.model_id()),
7417            Self::Openai(m) => Cow::Borrowed(m.model_id()),
7418            Self::OpenRouter(m) => Cow::Borrowed(m.model_id()),
7419            Self::ZAi(m) => Cow::Borrowed(m.model_id()),
7420            Self::Bedrock(m) => m.model_id(),
7421            Self::Ollama(s) | Self::LlamaCpp(s) => Cow::Owned(s.clone()),
7422        }
7423    }
7424    /// Human-readable display name (e.g. `Claude Opus 4.6`)
7425    pub fn display_name(&self) -> Cow<'static, str> {
7426        match self {
7427            Self::Anthropic(m) => Cow::Borrowed(m.display_name()),
7428            Self::AzureFoundry(m) => Cow::Borrowed(m.display_name()),
7429            Self::Codex(m) => Cow::Borrowed(m.display_name()),
7430            Self::DeepSeek(m) => Cow::Borrowed(m.display_name()),
7431            Self::Fireworks(m) => Cow::Borrowed(m.display_name()),
7432            Self::Gemini(m) => Cow::Borrowed(m.display_name()),
7433            Self::Moonshot(m) => Cow::Borrowed(m.display_name()),
7434            Self::Openai(m) => Cow::Borrowed(m.display_name()),
7435            Self::OpenRouter(m) => Cow::Borrowed(m.display_name()),
7436            Self::ZAi(m) => Cow::Borrowed(m.display_name()),
7437            Self::Bedrock(m) => m.display_name(),
7438            Self::Ollama(s) => Cow::Owned(format!("Ollama {s}")),
7439            Self::LlamaCpp(s) => Cow::Owned(format!("LlamaCpp {s}")),
7440        }
7441    }
7442    /// Provider identifier (e.g. `anthropic`)
7443    pub fn provider(&self) -> &'static str {
7444        match self {
7445            Self::Anthropic(_) => "anthropic",
7446            Self::AzureFoundry(_) => "azure-foundry",
7447            Self::Codex(_) => "codex",
7448            Self::DeepSeek(_) => "deepseek",
7449            Self::Fireworks(_) => "fireworks",
7450            Self::Gemini(_) => "gemini",
7451            Self::Moonshot(_) => "moonshot",
7452            Self::Openai(_) => "openai",
7453            Self::OpenRouter(_) => "openrouter",
7454            Self::ZAi(_) => "zai",
7455            Self::Bedrock(_) => "bedrock",
7456            Self::Ollama(_) => "ollama",
7457            Self::LlamaCpp(_) => "llamacpp",
7458        }
7459    }
7460    /// Typed provider identifier.
7461    pub fn provider_enum(&self) -> Provider {
7462        match self {
7463            Self::Anthropic(_) => Provider::Anthropic,
7464            Self::AzureFoundry(_) => Provider::AzureFoundry,
7465            Self::Codex(_) => Provider::Codex,
7466            Self::DeepSeek(_) => Provider::DeepSeek,
7467            Self::Fireworks(_) => Provider::Fireworks,
7468            Self::Gemini(_) => Provider::Gemini,
7469            Self::Moonshot(_) => Provider::Moonshot,
7470            Self::Openai(_) => Provider::Openai,
7471            Self::OpenRouter(_) => Provider::OpenRouter,
7472            Self::ZAi(_) => Provider::ZAi,
7473            Self::Bedrock(_) => Provider::Bedrock,
7474            Self::Ollama(_) => Provider::Ollama,
7475            Self::LlamaCpp(_) => Provider::LlamaCpp,
7476        }
7477    }
7478    /// Human-readable provider name (e.g. `AWS Bedrock`)
7479    pub fn provider_display_name(&self) -> &'static str {
7480        match self {
7481            Self::Anthropic(_) => "Anthropic",
7482            Self::AzureFoundry(_) => "Microsoft Foundry",
7483            Self::Codex(_) => "Codex",
7484            Self::DeepSeek(_) => "DeepSeek",
7485            Self::Fireworks(_) => "Fireworks AI",
7486            Self::Gemini(_) => "Gemini",
7487            Self::Moonshot(_) => "Moonshot",
7488            Self::Openai(_) => "OpenAI",
7489            Self::OpenRouter(_) => "OpenRouter",
7490            Self::ZAi(_) => "ZAI",
7491            Self::Bedrock(_) => "AWS Bedrock",
7492            Self::Ollama(_) => "Ollama",
7493            Self::LlamaCpp(_) => "LlamaCpp",
7494        }
7495    }
7496    /// Context window size in tokens (None for dynamic providers)
7497    pub fn context_window(&self) -> Option<u32> {
7498        match self {
7499            Self::Anthropic(m) => Some(m.context_window()),
7500            Self::AzureFoundry(m) => Some(m.context_window()),
7501            Self::Codex(m) => Some(m.context_window()),
7502            Self::DeepSeek(m) => Some(m.context_window()),
7503            Self::Fireworks(m) => Some(m.context_window()),
7504            Self::Gemini(m) => Some(m.context_window()),
7505            Self::Moonshot(m) => Some(m.context_window()),
7506            Self::Openai(m) => Some(m.context_window()),
7507            Self::OpenRouter(m) => Some(m.context_window()),
7508            Self::ZAi(m) => Some(m.context_window()),
7509            Self::Bedrock(m) => m.context_window(),
7510            Self::Ollama(_) | Self::LlamaCpp(_) => None,
7511        }
7512    }
7513    /// Required env var for this model's provider (None for local providers)
7514    pub fn required_env_var(&self) -> Option<&'static str> {
7515        match self {
7516            Self::Anthropic(_) => Some("ANTHROPIC_API_KEY"),
7517            Self::AzureFoundry(_) => Some("AZURE_OPENAI_API_KEY"),
7518            Self::DeepSeek(_) => Some("DEEPSEEK_API_KEY"),
7519            Self::Fireworks(_) => Some("FIREWORKS_API_KEY"),
7520            Self::Gemini(_) => Some("GEMINI_API_KEY"),
7521            Self::Moonshot(_) => Some("MOONSHOT_API_KEY"),
7522            Self::Openai(_) => Some("OPENAI_API_KEY"),
7523            Self::OpenRouter(_) => Some("OPENROUTER_API_KEY"),
7524            Self::ZAi(_) => Some("ZAI_API_KEY"),
7525            Self::Codex(_) | Self::Bedrock(_) | Self::Ollama(_) | Self::LlamaCpp(_) => {
7526                None
7527            }
7528        }
7529    }
7530    /// All provider API key env var names (deduplicated, static)
7531    pub const ALL_REQUIRED_ENV_VARS: &[&str] = &[
7532        "ANTHROPIC_API_KEY",
7533        "AZURE_OPENAI_API_KEY",
7534        "DEEPSEEK_API_KEY",
7535        "FIREWORKS_API_KEY",
7536        "GEMINI_API_KEY",
7537        "MOONSHOT_API_KEY",
7538        "OPENAI_API_KEY",
7539        "OPENROUTER_API_KEY",
7540        "ZAI_API_KEY",
7541    ];
7542    /// OAuth provider ID if this model requires OAuth login (e.g. `"codex"`)
7543    pub fn oauth_provider_id(&self) -> Option<&'static str> {
7544        match self {
7545            Self::Codex(_) => Some("codex"),
7546            Self::Anthropic(_)
7547            | Self::AzureFoundry(_)
7548            | Self::DeepSeek(_)
7549            | Self::Fireworks(_)
7550            | Self::Gemini(_)
7551            | Self::Moonshot(_)
7552            | Self::Openai(_)
7553            | Self::OpenRouter(_)
7554            | Self::ZAi(_)
7555            | Self::Bedrock(_)
7556            | Self::Ollama(_)
7557            | Self::LlamaCpp(_) => None,
7558        }
7559    }
7560    /// Reasoning levels supported by this model (empty if not a reasoning model)
7561    pub fn reasoning_levels(&self) -> &'static [ReasoningEffort] {
7562        match self {
7563            Self::Anthropic(m) => m.reasoning_levels(),
7564            Self::AzureFoundry(m) => m.reasoning_levels(),
7565            Self::Codex(m) => m.reasoning_levels(),
7566            Self::DeepSeek(m) => m.reasoning_levels(),
7567            Self::Fireworks(m) => m.reasoning_levels(),
7568            Self::Gemini(m) => m.reasoning_levels(),
7569            Self::Moonshot(m) => m.reasoning_levels(),
7570            Self::Openai(m) => m.reasoning_levels(),
7571            Self::OpenRouter(m) => m.reasoning_levels(),
7572            Self::ZAi(m) => m.reasoning_levels(),
7573            Self::Bedrock(m) => m.reasoning_levels(),
7574            Self::Ollama(_) | Self::LlamaCpp(_) => &[],
7575        }
7576    }
7577    /// Whether this model supports reasoning/extended thinking
7578    pub fn supports_reasoning(&self) -> bool {
7579        !self.reasoning_levels().is_empty()
7580    }
7581    /// Whether this model supports provider-side prompt caching
7582    pub fn supports_prompt_caching(&self) -> bool {
7583        match self {
7584            Self::Anthropic(m) => m.supports_prompt_caching(),
7585            Self::AzureFoundry(m) => m.supports_prompt_caching(),
7586            Self::Codex(m) => m.supports_prompt_caching(),
7587            Self::DeepSeek(m) => m.supports_prompt_caching(),
7588            Self::Fireworks(m) => m.supports_prompt_caching(),
7589            Self::Gemini(m) => m.supports_prompt_caching(),
7590            Self::Moonshot(m) => m.supports_prompt_caching(),
7591            Self::Openai(m) => m.supports_prompt_caching(),
7592            Self::OpenRouter(m) => m.supports_prompt_caching(),
7593            Self::ZAi(m) => m.supports_prompt_caching(),
7594            Self::Bedrock(m) => m.supports_prompt_caching(),
7595            Self::Ollama(_) | Self::LlamaCpp(_) => false,
7596        }
7597    }
7598    /// Whether this model supports image input
7599    pub fn supports_image(&self) -> bool {
7600        match self {
7601            Self::Anthropic(m) => m.supports_image(),
7602            Self::AzureFoundry(m) => m.supports_image(),
7603            Self::Codex(m) => m.supports_image(),
7604            Self::DeepSeek(m) => m.supports_image(),
7605            Self::Fireworks(m) => m.supports_image(),
7606            Self::Gemini(m) => m.supports_image(),
7607            Self::Moonshot(m) => m.supports_image(),
7608            Self::Openai(m) => m.supports_image(),
7609            Self::OpenRouter(m) => m.supports_image(),
7610            Self::ZAi(m) => m.supports_image(),
7611            Self::Bedrock(m) => m.supports_image(),
7612            Self::Ollama(_) | Self::LlamaCpp(_) => false,
7613        }
7614    }
7615    /// Whether this model supports audio input
7616    pub fn supports_audio(&self) -> bool {
7617        match self {
7618            Self::Anthropic(m) => m.supports_audio(),
7619            Self::AzureFoundry(m) => m.supports_audio(),
7620            Self::Codex(m) => m.supports_audio(),
7621            Self::DeepSeek(m) => m.supports_audio(),
7622            Self::Fireworks(m) => m.supports_audio(),
7623            Self::Gemini(m) => m.supports_audio(),
7624            Self::Moonshot(m) => m.supports_audio(),
7625            Self::Openai(m) => m.supports_audio(),
7626            Self::OpenRouter(m) => m.supports_audio(),
7627            Self::ZAi(m) => m.supports_audio(),
7628            Self::Bedrock(m) => m.supports_audio(),
7629            Self::Ollama(_) | Self::LlamaCpp(_) => false,
7630        }
7631    }
7632    /// Per-model transport override, when the model does not use its
7633    /// provider's default endpoint and wire protocol.
7634    pub fn transport(&self) -> Option<ModelTransport> {
7635        match self {
7636            Self::Anthropic(m) => m.transport(),
7637            Self::AzureFoundry(m) => m.transport(),
7638            Self::Codex(m) => m.transport(),
7639            Self::DeepSeek(m) => m.transport(),
7640            Self::Fireworks(m) => m.transport(),
7641            Self::Gemini(m) => m.transport(),
7642            Self::Moonshot(m) => m.transport(),
7643            Self::Openai(m) => m.transport(),
7644            Self::OpenRouter(m) => m.transport(),
7645            Self::ZAi(m) => m.transport(),
7646            Self::Bedrock(m) => m.transport(),
7647            Self::Ollama(_) | Self::LlamaCpp(_) => None,
7648        }
7649    }
7650    /// All catalog models (excludes dynamic providers)
7651    pub fn all() -> &'static [LlmModel] {
7652        static ALL: LazyLock<Vec<LlmModel>> = LazyLock::new(|| {
7653            let mut v = Vec::new();
7654            v.extend(AnthropicModel::ALL.iter().copied().map(LlmModel::Anthropic));
7655            v.extend(AzureFoundryModel::ALL.iter().copied().map(LlmModel::AzureFoundry));
7656            v.extend(CodexModel::ALL.iter().copied().map(LlmModel::Codex));
7657            v.extend(DeepSeekModel::ALL.iter().copied().map(LlmModel::DeepSeek));
7658            v.extend(FireworksModel::ALL.iter().copied().map(LlmModel::Fireworks));
7659            v.extend(GeminiModel::ALL.iter().copied().map(LlmModel::Gemini));
7660            v.extend(MoonshotModel::ALL.iter().copied().map(LlmModel::Moonshot));
7661            v.extend(OpenaiModel::ALL.iter().copied().map(LlmModel::Openai));
7662            v.extend(OpenRouterModel::ALL.iter().copied().map(LlmModel::OpenRouter));
7663            v.extend(ZAiModel::ALL.iter().copied().map(LlmModel::ZAi));
7664            v.extend(
7665                BedrockFoundationModel::ALL
7666                    .iter()
7667                    .copied()
7668                    .map(BedrockModel::Foundation)
7669                    .map(LlmModel::Bedrock),
7670            );
7671            v
7672        });
7673        &ALL
7674    }
7675}
7676impl std::fmt::Display for LlmModel {
7677    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7678        write!(f, "{}:{}", self.provider(), self.model_id())
7679    }
7680}
7681impl std::str::FromStr for LlmModel {
7682    type Err = String;
7683    /// Parse a `provider:model` string into an `LlmModel`
7684    fn from_str(s: &str) -> Result<Self, Self::Err> {
7685        let (provider_str, model_str) = s.split_once(':').unwrap_or((s, ""));
7686        match provider_str {
7687            "anthropic" => model_str.parse::<AnthropicModel>().map(Self::Anthropic),
7688            "azure-foundry" => {
7689                model_str.parse::<AzureFoundryModel>().map(Self::AzureFoundry)
7690            }
7691            "codex" => model_str.parse::<CodexModel>().map(Self::Codex),
7692            "deepseek" => model_str.parse::<DeepSeekModel>().map(Self::DeepSeek),
7693            "fireworks" => model_str.parse::<FireworksModel>().map(Self::Fireworks),
7694            "gemini" => model_str.parse::<GeminiModel>().map(Self::Gemini),
7695            "moonshot" => model_str.parse::<MoonshotModel>().map(Self::Moonshot),
7696            "openai" => model_str.parse::<OpenaiModel>().map(Self::Openai),
7697            "openrouter" => model_str.parse::<OpenRouterModel>().map(Self::OpenRouter),
7698            "zai" => model_str.parse::<ZAiModel>().map(Self::ZAi),
7699            "bedrock" => model_str.parse::<BedrockModel>().map(Self::Bedrock),
7700            "ollama" => Ok(Self::Ollama(model_str.to_string())),
7701            "llamacpp" => Ok(Self::LlamaCpp(model_str.to_string())),
7702            _ => Err(format!("Unknown provider: '{provider_str}'")),
7703        }
7704    }
7705}