pub const BARTOWSKI_QWEN25_1_5B_INSTRUCT_GGUF: &str = "bartowski/Qwen2.5-1.5B-Instruct-GGUF";
pub const QWEN25_1_5B_GGUF_FILE: &str = "Qwen2.5-1.5B-Instruct-Q4_K_M.gguf";
pub const QWEN25_1_5B_TOK_MODEL_ID: &str = "Qwen/Qwen2.5-1.5B-Instruct";
pub const BARTOWSKI_QWEN25_0_5B_INSTRUCT_GGUF: &str = "bartowski/Qwen2.5-0.5B-Instruct-GGUF";
pub const QWEN25_0_5B_GGUF_FILE: &str = "Qwen2.5-0.5B-Instruct-Q4_K_M.gguf";
pub const QWEN25_0_5B_TOK_MODEL_ID: &str = "Qwen/Qwen2.5-0.5B-Instruct";
pub const BARTOWSKI_QWEN25_CODER_1_5B_INSTRUCT_GGUF: &str =
"bartowski/Qwen2.5-Coder-1.5B-Instruct-GGUF";
pub const QWEN25_CODER_1_5B_GGUF_FILE: &str = "Qwen2.5-Coder-1.5B-Instruct-Q4_K_M.gguf";
pub const QWEN25_CODER_1_5B_TOK_MODEL_ID: &str = "Qwen/Qwen2.5-Coder-1.5B-Instruct";
pub const QWEN25_CODER_7B_INSTRUCT: &str = "Qwen/Qwen2.5-Coder-7B-Instruct";
pub const BARTOWSKI_QWEN25_CODER_3B_INSTRUCT_GGUF: &str =
"bartowski/Qwen2.5-Coder-3B-Instruct-GGUF";
pub const QWEN25_CODER_3B_GGUF_FILE: &str = "Qwen2.5-Coder-3B-Instruct-Q4_K_M.gguf";
pub const QWEN25_CODER_3B_TOK_MODEL_ID: &str = "Qwen/Qwen2.5-Coder-3B-Instruct";
pub const BARTOWSKI_QWEN25_CODER_7B_INSTRUCT_GGUF: &str =
"bartowski/Qwen2.5-Coder-7B-Instruct-GGUF";
pub const QWEN25_CODER_7B_GGUF_FILE: &str = "Qwen2.5-Coder-7B-Instruct-Q4_K_M.gguf";
pub const QWEN25_CODER_7B_TOK_MODEL_ID: &str = "Qwen/Qwen2.5-Coder-7B-Instruct";
pub const BARTOWSKI_QWEN25_3B_INSTRUCT_GGUF: &str = "bartowski/Qwen2.5-3B-Instruct-GGUF";
pub const QWEN25_3B_GGUF_FILE: &str = "Qwen2.5-3B-Instruct-Q4_K_M.gguf";
pub const QWEN25_3B_TOK_MODEL_ID: &str = "Qwen/Qwen2.5-3B-Instruct";
pub const BARTOWSKI_QWEN3_0_6B_GGUF: &str = "bartowski/Qwen_Qwen3-0.6B-GGUF";
pub const QWEN3_0_6B_GGUF_FILE: &str = "Qwen_Qwen3-0.6B-Q4_K_M.gguf";
pub const QWEN3_0_6B_TOK_MODEL_ID: &str = "Qwen/Qwen3-0.6B";
pub const BARTOWSKI_QWEN3_1_7B_GGUF: &str = "bartowski/Qwen_Qwen3-1.7B-GGUF";
pub const QWEN3_1_7B_GGUF_FILE: &str = "Qwen_Qwen3-1.7B-Q4_K_M.gguf";
pub const QWEN3_1_7B_TOK_MODEL_ID: &str = "Qwen/Qwen3-1.7B";
pub const BARTOWSKI_QWEN3_4B_GGUF: &str = "bartowski/Qwen_Qwen3-4B-GGUF";
pub const QWEN3_4B_GGUF_FILE: &str = "Qwen_Qwen3-4B-Q4_K_M.gguf";
pub const QWEN3_4B_TOK_MODEL_ID: &str = "Qwen/Qwen3-4B";
pub const BARTOWSKI_QWEN3_8B_GGUF: &str = "bartowski/Qwen_Qwen3-8B-GGUF";
pub const QWEN3_8B_GGUF_FILE: &str = "Qwen_Qwen3-8B-Q4_K_M.gguf";
pub const QWEN3_8B_TOK_MODEL_ID: &str = "Qwen/Qwen3-8B";
pub const BARTOWSKI_QWEN3_14B_GGUF: &str = "bartowski/Qwen_Qwen3-14B-GGUF";
pub const QWEN3_14B_GGUF_FILE: &str = "Qwen_Qwen3-14B-Q4_K_M.gguf";
pub const QWEN3_14B_TOK_MODEL_ID: &str = "Qwen/Qwen3-14B";
pub const BARTOWSKI_QWEN3_32B_GGUF: &str = "bartowski/Qwen_Qwen3-32B-GGUF";
pub const QWEN3_32B_GGUF_FILE: &str = "Qwen_Qwen3-32B-Q4_K_M.gguf";
pub const QWEN3_32B_TOK_MODEL_ID: &str = "Qwen/Qwen3-32B";
pub const BARTOWSKI_QWEN3_4B_INSTRUCT_2507_GGUF: &str =
"bartowski/Qwen_Qwen3-4B-Instruct-2507-GGUF";
pub const QWEN3_4B_INSTRUCT_2507_GGUF_FILE: &str = "Qwen_Qwen3-4B-Instruct-2507-Q4_K_M.gguf";
pub const QWEN3_4B_INSTRUCT_2507_TOK_MODEL_ID: &str = "Qwen/Qwen3-4B-Instruct-2507";
pub const BARTOWSKI_QWEN3_4B_THINKING_2507_GGUF: &str =
"bartowski/Qwen_Qwen3-4B-Thinking-2507-GGUF";
pub const QWEN3_4B_THINKING_2507_GGUF_FILE: &str = "Qwen_Qwen3-4B-Thinking-2507-Q4_K_M.gguf";
pub const QWEN3_4B_THINKING_2507_TOK_MODEL_ID: &str = "Qwen/Qwen3-4B-Thinking-2507";
pub const BARTOWSKI_QWEN3_30B_A3B_INSTRUCT_2507_GGUF: &str =
"bartowski/Qwen_Qwen3-30B-A3B-Instruct-2507-GGUF";
pub const QWEN3_30B_A3B_INSTRUCT_2507_GGUF_FILE: &str =
"Qwen_Qwen3-30B-A3B-Instruct-2507-Q4_K_M.gguf";
pub const QWEN3_30B_A3B_INSTRUCT_2507_TOK_MODEL_ID: &str = "Qwen/Qwen3-30B-A3B-Instruct-2507";
pub const THEBLOKE_DEEPSEEK_CODER_6_7B_INSTRUCT_GGUF: &str =
"TheBloke/deepseek-coder-6.7B-instruct-GGUF";
pub const DEEPSEEK_CODER_6_7B_GGUF_FILE: &str = "deepseek-coder-6.7b-instruct.Q4_K_M.gguf";
pub const DEEPSEEK_CODER_6_7B_TOK_MODEL_ID: &str = "deepseek-ai/deepseek-coder-6.7b-instruct";
pub const SUPPORTED_MODELS: &[&str] = &[
BARTOWSKI_QWEN25_0_5B_INSTRUCT_GGUF,
BARTOWSKI_QWEN25_1_5B_INSTRUCT_GGUF,
BARTOWSKI_QWEN25_3B_INSTRUCT_GGUF,
BARTOWSKI_QWEN3_0_6B_GGUF,
BARTOWSKI_QWEN3_1_7B_GGUF,
BARTOWSKI_QWEN3_4B_GGUF,
BARTOWSKI_QWEN3_8B_GGUF,
BARTOWSKI_QWEN3_14B_GGUF,
BARTOWSKI_QWEN3_32B_GGUF,
BARTOWSKI_QWEN3_4B_INSTRUCT_2507_GGUF,
BARTOWSKI_QWEN3_4B_THINKING_2507_GGUF,
BARTOWSKI_QWEN3_30B_A3B_INSTRUCT_2507_GGUF,
BARTOWSKI_QWEN25_CODER_7B_INSTRUCT_GGUF,
THEBLOKE_DEEPSEEK_CODER_6_7B_INSTRUCT_GGUF,
];
pub struct SupportedModelInfo {
pub id: &'static str,
pub name: &'static str,
pub org: &'static str,
pub description: &'static str,
pub expected_size_bytes: u64,
}
pub const SUPPORTED_MODEL_INFO: &[SupportedModelInfo] = &[
SupportedModelInfo {
id: BARTOWSKI_QWEN25_0_5B_INSTRUCT_GGUF,
name: "Qwen 2.5 0.5B (GGUF)",
org: "Qwen / Alibaba",
description: "Smallest pre-quantized chat model, used on tvOS Apple TV (~380 MB).",
expected_size_bytes: 397_808_192,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN25_1_5B_INSTRUCT_GGUF,
name: "Qwen 2.5 1.5B (GGUF)",
org: "Qwen / Alibaba",
description: "Lightest pre-quantized chat model — ideal for iOS & Android (~941 MB). \
Fits comfortably within iOS memory limits (iPhone 16e, 8 GB RAM).",
expected_size_bytes: 986_048_768,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN25_3B_INSTRUCT_GGUF,
name: "Qwen 2.5 3B (GGUF)",
org: "Qwen / Alibaba",
description:
"Pre-quantized chat model for macOS & Android — balanced quality and size (~1.93 GB). \
Not recommended as default on iOS due to memory constraints.",
expected_size_bytes: 1_929_903_264,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN3_0_6B_GGUF,
name: "Qwen 3 0.6B (GGUF)",
org: "Qwen / Alibaba",
description: "Smallest Qwen 3 variant with tool calling (~0.5 GB). \
Suitable for tvOS and the most memory-constrained mobile devices.",
expected_size_bytes: 484_220_320,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN3_1_7B_GGUF,
name: "Qwen 3 1.7B (GGUF)",
org: "Qwen / Alibaba",
description: "Lightweight tool-calling model for mobile (~1.3 GB). \
Smallest Qwen 3 variant with comfortable tool calling support.",
expected_size_bytes: 1_282_439_584,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN3_4B_GGUF,
name: "Qwen 3 4B (GGUF)",
org: "Qwen / Alibaba",
description: "Full tool-calling support with extended reasoning mode (~2.7 GB). \
Recommended for siGit Code on macOS, Linux, and Windows.",
expected_size_bytes: 2_497_280_960,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN3_8B_GGUF,
name: "Qwen 3 8B (GGUF)",
org: "Qwen / Alibaba",
description: "Strong tool-calling model with extended thinking (~5 GB). \
Best balance of quality and memory for macOS with 24+ GB RAM.",
expected_size_bytes: 5_027_784_224,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN3_14B_GGUF,
name: "Qwen 3 14B (GGUF)",
org: "Qwen / Alibaba",
description: "Strong reasoning and tool-calling model with extended thinking (~8.4 GB). \
Best all-around model for macOS with 16+ GB RAM.",
expected_size_bytes: 9_001_753_632,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN3_32B_GGUF,
name: "Qwen 3 32B (GGUF)",
org: "Qwen / Alibaba",
description: "Largest dense Qwen 3 model with extended thinking (~19.8 GB). \
Highest-quality dense variant; requires 32+ GB RAM.",
expected_size_bytes: 19_762_149_696,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN3_4B_INSTRUCT_2507_GGUF,
name: "Qwen 3 4B Instruct 2507 (GGUF)",
org: "Qwen / Alibaba",
description: "Latest non-thinking 4B checkpoint — faster, predictable chat and \
tool use (~2.5 GB). Recommended general-purpose Qwen 3 model.",
expected_size_bytes: 2_497_280_736,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN3_4B_THINKING_2507_GGUF,
name: "Qwen 3 4B Thinking 2507 (GGUF)",
org: "Qwen / Alibaba",
description: "Latest reasoning-focused 4B checkpoint with extended thinking (~2.5 GB). \
Stronger reasoning and tool-use accuracy; load with max_tokens ≥ 4096.",
expected_size_bytes: 2_497_280_736,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN3_30B_A3B_INSTRUCT_2507_GGUF,
name: "Qwen 3 30B-A3B Instruct 2507 (GGUF)",
org: "Qwen / Alibaba",
description: "Flagship mixture-of-experts model: 30B total / ~3B active (~18.6 GB). \
Near-dense quality at far lower inference cost; requires 32+ GB RAM.",
expected_size_bytes: 18_632_183_808,
},
SupportedModelInfo {
id: BARTOWSKI_QWEN25_CODER_7B_INSTRUCT_GGUF,
name: "Qwen 2.5 Coder 7B (GGUF)",
org: "Qwen / Alibaba",
description: "Strong coding model with tool calling support (~4.4 GB). \
Trained on 5.5T code tokens. Requires 8+ GB RAM.",
expected_size_bytes: 4_683_074_336,
},
SupportedModelInfo {
id: THEBLOKE_DEEPSEEK_CODER_6_7B_INSTRUCT_GGUF,
name: "DeepSeek Coder 6.7B (GGUF)",
org: "DeepSeek AI",
description: "Strong code generation model using the llama architecture (~3.8 GB). \
Requires 8+ GB RAM. Not recommended for mobile devices.",
expected_size_bytes: 4_083_015_904,
},
];
pub fn tok_model_id_for_repo(hf_repo_id: &str) -> Option<&'static str> {
match hf_repo_id {
BARTOWSKI_QWEN25_0_5B_INSTRUCT_GGUF => Some(QWEN25_0_5B_TOK_MODEL_ID),
BARTOWSKI_QWEN25_1_5B_INSTRUCT_GGUF => Some(QWEN25_1_5B_TOK_MODEL_ID),
BARTOWSKI_QWEN25_3B_INSTRUCT_GGUF => Some(QWEN25_3B_TOK_MODEL_ID),
BARTOWSKI_QWEN25_CODER_1_5B_INSTRUCT_GGUF => Some(QWEN25_CODER_1_5B_TOK_MODEL_ID),
BARTOWSKI_QWEN25_CODER_3B_INSTRUCT_GGUF => Some(QWEN25_CODER_3B_TOK_MODEL_ID),
BARTOWSKI_QWEN25_CODER_7B_INSTRUCT_GGUF => Some(QWEN25_CODER_7B_TOK_MODEL_ID),
BARTOWSKI_QWEN3_0_6B_GGUF => Some(QWEN3_0_6B_TOK_MODEL_ID),
BARTOWSKI_QWEN3_1_7B_GGUF => Some(QWEN3_1_7B_TOK_MODEL_ID),
BARTOWSKI_QWEN3_4B_GGUF => Some(QWEN3_4B_TOK_MODEL_ID),
BARTOWSKI_QWEN3_8B_GGUF => Some(QWEN3_8B_TOK_MODEL_ID),
BARTOWSKI_QWEN3_14B_GGUF => Some(QWEN3_14B_TOK_MODEL_ID),
BARTOWSKI_QWEN3_32B_GGUF => Some(QWEN3_32B_TOK_MODEL_ID),
BARTOWSKI_QWEN3_4B_INSTRUCT_2507_GGUF => Some(QWEN3_4B_INSTRUCT_2507_TOK_MODEL_ID),
BARTOWSKI_QWEN3_4B_THINKING_2507_GGUF => Some(QWEN3_4B_THINKING_2507_TOK_MODEL_ID),
BARTOWSKI_QWEN3_30B_A3B_INSTRUCT_2507_GGUF => {
Some(QWEN3_30B_A3B_INSTRUCT_2507_TOK_MODEL_ID)
}
THEBLOKE_DEEPSEEK_CODER_6_7B_INSTRUCT_GGUF => Some(DEEPSEEK_CODER_6_7B_TOK_MODEL_ID),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_supported_model_has_info() {
for id in SUPPORTED_MODELS {
assert!(
SUPPORTED_MODEL_INFO.iter().any(|info| info.id == *id),
"{id} is in SUPPORTED_MODELS but missing from SUPPORTED_MODEL_INFO"
);
}
}
#[test]
fn qwen3_repos_have_android_tokenizer() {
let qwen3 = SUPPORTED_MODELS.iter().filter(|id| id.contains("Qwen3"));
for id in qwen3 {
assert!(
tok_model_id_for_repo(id).is_some(),
"{id} has no Android tokenizer mapping"
);
}
}
}