use std::path::PathBuf;
use crate::backends::anthropic_messages_provider::{AnthropicConfig, AnthropicMessagesProvider};
use crate::backends::huggingface_gguf_provider::{HuggingFaceGGUFConfig, HuggingFaceGGUFProvider};
use crate::backends::llamacpp::SpeculativeConfig;
use crate::backends::openai_provider::{OpenAIConfig, OpenAIProvider};
use crate::backends::openai_responses_provider::{ResponsesConfig, ResponsesProvider};
use foundation_auth::{AuthCredential, ConfidentialText};
pub const Q3_K_M: &str = "Q3_K_M";
pub const Q4_K_M: &str = "Q4_K_M";
pub const Q5_K_M: &str = "Q5_K_M";
pub const Q8_0: &str = "Q8_0";
fn create_provider(
quantization: &str,
config: Option<HuggingFaceGGUFConfig>,
) -> Result<HuggingFaceGGUFProvider, String> {
let config = config.unwrap_or_else(|| {
HuggingFaceGGUFConfig::builder()
.default_quantization(quantization)
.build()
});
HuggingFaceGGUFProvider::new(config)
.map_err(|e| format!("Failed to create provider: {e}"))
}
#[must_use]
pub fn with_mtp(
base: Option<HuggingFaceGGUFConfig>,
n_max: u32,
mtp_model: Option<PathBuf>,
) -> HuggingFaceGGUFConfig {
let mut config = base.unwrap_or_default();
config.llama_config.speculative = Some(SpeculativeConfig::mtp(mtp_model, n_max));
config
}
pub struct Glm52;
impl Glm52 {
pub const MODEL_ID: &str = "unsloth/GLM-5.2-GGUF";
pub const SUPPORTS_MTP: bool = true;
pub fn q3_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q3_K_M, config)
}
pub fn q4_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q4_K_M, config)
}
pub fn q5_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q5_K_M, config)
}
pub fn q8_0(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q8_0, config)
}
}
pub struct Qwen36;
impl Qwen36 {
pub const MODEL_ID: &str = "unsloth/Qwen3.6-35B-A3B-GGUF";
pub const SUPPORTS_MTP: bool = true;
pub fn q3_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q3_K_M, config)
}
pub fn q4_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q4_K_M, config)
}
pub fn q5_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q5_K_M, config)
}
pub fn q8_0(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q8_0, config)
}
}
pub struct Ornith10;
impl Ornith10 {
pub const MODEL_ID: &str = "LordNeel/Ornith-1.0-35B-GGUF-llamacpp-tp1";
pub const SUPPORTS_MTP: bool = false;
pub fn q3_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q3_K_M, config)
}
pub fn q4_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q4_K_M, config)
}
pub fn q5_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q5_K_M, config)
}
pub fn q8_0(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q8_0, config)
}
}
pub struct Gemma4E4b;
impl Gemma4E4b {
pub const MODEL_ID: &str = "unsloth/gemma-4-E4B-it-GGUF";
pub const SUPPORTS_MTP: bool = true;
pub fn q3_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q3_K_M, config)
}
pub fn q4_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q4_K_M, config)
}
pub fn q5_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q5_K_M, config)
}
pub fn q8_0(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q8_0, config)
}
}
pub struct Gemma4_26b;
impl Gemma4_26b {
pub const MODEL_ID: &str = "unsloth/gemma-4-26B-A4B-it-GGUF";
pub const SUPPORTS_MTP: bool = true;
pub fn q3_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q3_K_M, config)
}
pub fn q4_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q4_K_M, config)
}
pub fn q5_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q5_K_M, config)
}
pub fn q8_0(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q8_0, config)
}
}
pub struct Gemma4E2b;
impl Gemma4E2b {
pub const MODEL_ID: &str = "unsloth/gemma-4-E2B-it-GGUF";
pub const SUPPORTS_MTP: bool = true;
pub fn q3_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q3_K_M, config)
}
pub fn q4_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q4_K_M, config)
}
pub fn q5_k_m(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q5_K_M, config)
}
pub fn q8_0(config: Option<HuggingFaceGGUFConfig>) -> Result<HuggingFaceGGUFProvider, String> {
create_provider(Q8_0, config)
}
}
pub const CLAUDE_OPUS: &str = "claude-opus-4-8";
pub const CLAUDE_SONNET: &str = "claude-sonnet-4-6";
pub const OPENAI_GPT4O: &str = "gpt-4o";
pub const OPENAI_GPT4O_MINI: &str = "gpt-4o-mini";
pub struct CloudPresets;
impl CloudPresets {
pub fn claude_opus(api_key: &str) -> Result<AnthropicMessagesProvider, String> {
let config = AnthropicConfig::new()
.with_auth(AuthCredential::SecretOnly(ConfidentialText::new(api_key.to_string())));
Ok(AnthropicMessagesProvider::with_config(config))
}
pub fn claude_sonnet(api_key: &str) -> Result<AnthropicMessagesProvider, String> {
let config = AnthropicConfig::new()
.with_auth(AuthCredential::SecretOnly(ConfidentialText::new(api_key.to_string())));
Ok(AnthropicMessagesProvider::with_config(config))
}
pub fn openai_gpt4(api_key: &str) -> Result<OpenAIProvider, String> {
let config = OpenAIConfig::new()
.with_auth(AuthCredential::SecretOnly(ConfidentialText::new(api_key.to_string())));
Ok(OpenAIProvider::with_config(config))
}
pub fn openai_gpt4o(api_key: &str) -> Result<OpenAIProvider, String> {
let config = OpenAIConfig::new()
.with_auth(AuthCredential::SecretOnly(ConfidentialText::new(api_key.to_string())));
Ok(OpenAIProvider::with_config(config))
}
pub fn openai_responses(api_key: &str) -> Result<ResponsesProvider, String> {
let config = ResponsesConfig::new()
.with_auth(AuthCredential::SecretOnly(ConfidentialText::new(api_key.to_string())));
Ok(ResponsesProvider::with_config(config))
}
}