pub struct ModelInfo {
pub id: &'static str,
pub provider: &'static str,
pub name: &'static str,
pub label: &'static str,
}
pub const MODELS: &[ModelInfo] = &[
ModelInfo {
id: "openai/gpt-5.6-sol",
provider: "openai",
name: "gpt-5.6-sol",
label: "GPT-5.6 Sol",
},
ModelInfo {
id: "openai/gpt-5.6-terra",
provider: "openai",
name: "gpt-5.6-terra",
label: "GPT-5.6 Terra",
},
ModelInfo {
id: "openai/gpt-5.6-luna",
provider: "openai",
name: "gpt-5.6-luna",
label: "GPT-5.6 Luna",
},
ModelInfo {
id: "openai/gpt-5.5",
provider: "openai",
name: "gpt-5.5",
label: "GPT-5.5",
},
ModelInfo {
id: "openai/gpt-5.5-pro",
provider: "openai",
name: "gpt-5.5-pro",
label: "GPT-5.5 Pro",
},
ModelInfo {
id: "openai/gpt-5.4",
provider: "openai",
name: "gpt-5.4",
label: "GPT-5.4",
},
ModelInfo {
id: "openai/gpt-5.4-pro",
provider: "openai",
name: "gpt-5.4-pro",
label: "GPT-5.4 Pro",
},
ModelInfo {
id: "openai/gpt-5.4-mini",
provider: "openai",
name: "gpt-5.4-mini",
label: "GPT-5.4 Mini",
},
ModelInfo {
id: "openai/gpt-5.4-nano",
provider: "openai",
name: "gpt-5.4-nano",
label: "GPT-5.4 Nano",
},
ModelInfo {
id: "anthropic/claude-opus-4-8",
provider: "anthropic",
name: "claude-opus-4-8",
label: "Claude Opus 4.8",
},
ModelInfo {
id: "anthropic/claude-sonnet-5",
provider: "anthropic",
name: "claude-sonnet-5",
label: "Claude Sonnet 5",
},
ModelInfo {
id: "anthropic/claude-opus-4-7",
provider: "anthropic",
name: "claude-opus-4-7",
label: "Claude Opus 4.7",
},
ModelInfo {
id: "anthropic/claude-opus-4-6",
provider: "anthropic",
name: "claude-opus-4-6",
label: "Claude Opus 4.6",
},
ModelInfo {
id: "anthropic/claude-sonnet-4-6",
provider: "anthropic",
name: "claude-sonnet-4-6",
label: "Claude Sonnet 4.6",
},
ModelInfo {
id: "anthropic/claude-haiku-4-5-20251001",
provider: "anthropic",
name: "claude-haiku-4-5-20251001",
label: "Claude Haiku 4.5",
},
ModelInfo {
id: "gemini/gemini-3.5-flash",
provider: "gemini",
name: "gemini-3.5-flash",
label: "Gemini 3.5 Flash",
},
ModelInfo {
id: "gemini/gemini-3.1-pro-preview",
provider: "gemini",
name: "gemini-3.1-pro-preview",
label: "Gemini 3.1 Pro",
},
ModelInfo {
id: "gemini/gemini-3.1-flash-lite-preview",
provider: "gemini",
name: "gemini-3.1-flash-lite-preview",
label: "Gemini 3.1 Flash Lite",
},
ModelInfo {
id: "gemini/gemini-3-flash-preview",
provider: "gemini",
name: "gemini-3-flash-preview",
label: "Gemini 3 Flash",
},
ModelInfo {
id: "xai/grok-4.5",
provider: "xai",
name: "grok-4.5",
label: "Grok 4.5",
},
ModelInfo {
id: "xai/grok-4.3",
provider: "xai",
name: "grok-4.3",
label: "Grok 4.3",
},
ModelInfo {
id: "xai/grok-4.20-multi-agent-beta-0309",
provider: "xai",
name: "grok-4.20-multi-agent-beta-0309",
label: "Grok 4.20 Multi-Agent",
},
ModelInfo {
id: "xai/grok-4.20-beta-0309-reasoning",
provider: "xai",
name: "grok-4.20-beta-0309-reasoning",
label: "Grok 4.20 Reasoning",
},
ModelInfo {
id: "xai/grok-4.20-beta-0309-non-reasoning",
provider: "xai",
name: "grok-4.20-beta-0309-non-reasoning",
label: "Grok 4.20",
},
ModelInfo {
id: "xai/grok-4-1-fast-reasoning",
provider: "xai",
name: "grok-4-1-fast-reasoning",
label: "Grok 4.1 Fast Reasoning",
},
ModelInfo {
id: "xai/grok-4-1-fast-non-reasoning",
provider: "xai",
name: "grok-4-1-fast-non-reasoning",
label: "Grok 4.1 Fast",
},
];
pub fn available_models(registered_providers: &[&str]) -> Vec<&'static ModelInfo> {
MODELS
.iter()
.filter(|m| registered_providers.contains(&m.provider))
.collect()
}