use crate::models::Provider;
use hashbrown::HashSet;
use super::ModelId;
impl ModelId {
pub fn openrouter_vendor(&self) -> Option<&'static str> {
self.openrouter_metadata().map(|meta| meta.vendor)
}
pub fn all_models() -> Vec<ModelId> {
let mut models = vec![
ModelId::Gemini31ProPreview,
ModelId::Gemini31ProPreviewCustomTools,
ModelId::Gemini35Flash,
ModelId::GPT55,
ModelId::GPT54,
ModelId::GPT54Pro,
ModelId::GPT54Nano,
ModelId::GPT54Mini,
ModelId::GPT53Codex,
ModelId::OpenAIGptOss20b,
ModelId::OpenAIGptOss120b,
ModelId::ClaudeFable5,
ModelId::ClaudeOpus48,
ModelId::ClaudeSonnet46,
ModelId::ClaudeHaiku45,
ModelId::CopilotAuto,
ModelId::CopilotGPT52Codex,
ModelId::CopilotGPT51CodexMax,
ModelId::CopilotGPT54,
ModelId::CopilotGPT54Mini,
ModelId::CopilotClaudeSonnet46,
ModelId::DeepSeekV4Pro,
ModelId::DeepSeekV4Flash,
ModelId::MistralLarge3,
ModelId::ZaiGlm51,
ModelId::MiMoV25Pro,
ModelId::MiMoV25,
ModelId::MoonshotKimiK27Code,
ModelId::MoonshotKimiK26,
ModelId::OpenCodeZenGPT54,
ModelId::OpenCodeZenGPT54Mini,
ModelId::OpenCodeZenClaudeSonnet46,
ModelId::OpenCodeZenGlm51,
ModelId::OpenCodeGoGlm51,
ModelId::OpenCodeGoMinimaxM27,
ModelId::QwenDeepSeekV4Flash,
ModelId::QwenDeepSeekV4Pro,
ModelId::QwenGlm51,
ModelId::OllamaGptOss20b,
ModelId::OllamaGptOss20bCloud,
ModelId::OllamaGptOss120bCloud,
ModelId::OllamaDeepseekV4FlashCloud,
ModelId::OllamaDeepseekV4ProCloud,
ModelId::OllamaGlm51Cloud,
ModelId::OllamaMinimaxM27Cloud,
ModelId::OllamaMinimaxM3Cloud,
ModelId::OllamaKimiK26Cloud,
ModelId::OllamaNemotron3SuperCloud,
ModelId::OllamaGemma4,
ModelId::OllamaLagunaXs2,
ModelId::LlamaCppGemma426bA4b,
ModelId::LlamaCppGemma4E4b,
ModelId::LlamaCppGptOss20b,
ModelId::LlamaCppStep35Flash,
ModelId::MinimaxM3,
ModelId::MinimaxM27,
ModelId::HuggingFaceOpenAIGptOss20b,
ModelId::HuggingFaceOpenAIGptOss120b,
ModelId::HuggingFaceGlm51ZaiOrg,
ModelId::HuggingFaceKimiK26Novita,
ModelId::HuggingFaceDeepseekV4FlashNovita,
ModelId::HuggingFaceDeepseekV4ProTogether,
ModelId::HuggingFaceStep35Flash,
ModelId::HuggingFaceGlm51Deepinfra,
ModelId::HuggingFaceMinimaxM27Novita,
ModelId::HuggingFaceMinimaxM3Novita,
ModelId::HuggingFaceDeepseekV4ProNovita,
ModelId::StepFun37Flash,
ModelId::EvolinkGpt52,
ModelId::EvolinkGpt55,
ModelId::EvolinkDeepseekV4Pro,
ModelId::EvolinkDeepseekV4Flash,
ModelId::EvolinkDoubaoSeed20Pro,
ModelId::EvolinkGemini31Pro,
ModelId::EvolinkGemini35Flash,
ModelId::EvolinkMinimaxM3,
ModelId::EvolinkClaudeSonnet46,
ModelId::EvolinkClaudeOpus48,
ModelId::EvolinkClaudeHaiku45,
ModelId::OpenRouterNvidiaNemotron3Super120bA12bFree,
ModelId::OpenRouterMoonshotaiKimiK26,
ModelId::OpenRouterMoonshotaiKimiK27Code,
ModelId::OpenRouterZaiGlm51,
ModelId::PoolsideLagunaM1,
ModelId::PoolsideLagunaXs2,
];
models.extend(Self::openrouter_models());
let mut seen = HashSet::new();
models.retain(|model| seen.insert(*model));
models
}
pub fn models_for_provider(provider: Provider) -> Vec<ModelId> {
Self::all_models()
.into_iter()
.filter(|model| model.provider() == provider)
.collect()
}
}