@sigit / siti / commits / 15eef14

Add more models

paydii committed Aug 18, 2026 at 20:11 UTC 15eef1404d510560ad11c68cd0121b9715a8f8c2
2 files changed +134 -6
src-tauri/src/chat/command_list_models.rs
+6 -1
@@ -66,10 +66,15 @@ pub async fn chat_list_models() -> Vec<ModelInfo> {
66
67 // Qwen 3 UQFF models: pre-quantised (Q4K) safetensors loaded via onde's
68 // UQFF path on every inference platform. Not in onde's GGUF catalogue, so
69 - // they're appended here from Siti's own `UQFF_MODELS` table.
69 + // they're appended here from Siti's own `UQFF_MODELS` table. A few ~45 GB
70 + // entries are marked `desktop_only` and skipped on iOS/Android, where
71 + // neither the storage nor the memory budget could realistically fit them.
72 {
73 use super::UQFF_MODELS;
74 for entry in UQFF_MODELS {
75 + if entry.desktop_only && !cfg!(any(target_os = "macos", target_os = "windows")) {
76 + continue;
77 + }
78 models.push(ModelInfo {
79 id: entry.id.to_string(),
80 name: entry.name.to_string(),
src-tauri/src/chat/mod.rs
+128 -5
@@ -238,11 +238,23 @@ pub(crate) fn config_for_model_id(id: &str) -> Option<GgufModelConfig> {
238 // module: a narrower gate here breaks the Windows build, because
239 // `resolve_model_id` and `chat_list_models` reference the table unconditionally.
240 //
241 -// We ship the `mistralrs-community` Qwen 3 UQFF repos: each is self-contained
242 -// (base `config.json` + tokenizer + `residual.safetensors` + the `q4k` shard),
243 -// ungated, and in current (post-1.0) UQFF format. `Qwen3ForCausalLM` is a text
244 -// architecture the UQFF text loader supports, so they load and generate. Only
245 -// the `q4k-0.uqff` shard (plus the small residual) is downloaded per model, so
241 +// We ship the `mistralrs-community` Qwen 3 UQFF repos that use a *text*
242 +// architecture the UQFF text loader (`UqffTextModelBuilder` /
243 +// `NormalLoaderType`) actually supports: `Qwen3ForCausalLM` (dense) and
244 +// `Qwen3MoeForCausalLM` (the 30B-A3B mixture-of-experts family, including its
245 +// Coder variant). Deliberately excluded, even though the repos exist under
246 +// `mistralrs-community`: `Qwen3.5`/`Qwen3.6` (`Qwen3_5(Moe)ForConditionalGeneration`)
247 +// and `Qwen3-VL` (`Qwen3VL(Moe)ForConditionalGeneration`) route through
248 +// mistral.rs's *multimodal* loader, which the text-only UQFF builder can't
249 +// reach; `Qwen3-Embedding` is non-generative; `Qwen3Guard-Gen` emits safety
250 +// labels rather than a chat reply; and `-Base` variants are not
251 +// instruction-tuned, so they're a poor fit for Siti's chat UI even though
252 +// they do carry a chat template and would technically load.
253 +//
254 +// Each repo is self-contained (base `config.json` + tokenizer +
255 +// `residual.safetensors` + the `q4k` shard), ungated, and in current
256 +// (post-1.0) UQFF format, so they load and generate. Only the `q4k-0.uqff`
257 +// shard (plus the small residual) is downloaded per model, so
258 // `expected_size_bytes` counts just those, matching the on-disk footprint.
259
260 /// Static metadata for a Qwen 3 UQFF model offered in Siti's model list.
@@ -265,6 +277,10 @@ pub(crate) struct UqffModelEntry {
277 pub description: &'static str,
278 /// Approximate on-disk download size (the `q4k` shard + `residual`) in bytes.
279 pub expected_size_bytes: u64,
280 + /// Restrict this entry to macOS/Windows. Set for ~40+ GB downloads that
281 + /// cannot realistically fit an iOS/Android device's storage or memory
282 + /// budget; `chat_list_models` filters these out on mobile platforms.
283 + pub desktop_only: bool,
284 }
285
286 /// The Qwen 3 UQFF models Siti can load. Sizes are the measured
@@ -285,6 +301,7 @@ pub(crate) const UQFF_MODELS: &[UqffModelEntry] = &[
301 description: "Qwen 3 0.6B, pre-quantised to 4-bit (UQFF Q4K). Loads directly with no \
302 on-device quantisation step; the lightest UQFF option.",
303 expected_size_bytes: 646_635_509,
304 + desktop_only: false,
305 },
306 UqffModelEntry {
307 id: "mistralrs-community/Qwen3-1.7B-UQFF",
@@ -294,6 +311,7 @@ pub(crate) const UQFF_MODELS: &[UqffModelEntry] = &[
311 description: "Qwen 3 1.7B, pre-quantised to 4-bit (UQFF Q4K). Loads directly with no \
312 on-device quantisation step.",
313 expected_size_bytes: 1_590_429_781,
314 + desktop_only: false,
315 },
316 UqffModelEntry {
317 id: "mistralrs-community/Qwen3-4B-UQFF",
@@ -303,6 +321,7 @@ pub(crate) const UQFF_MODELS: &[UqffModelEntry] = &[
321 description: "Qwen 3 4B, pre-quantised to 4-bit (UQFF Q4K). Loads directly with no \
322 on-device quantisation step.",
323 expected_size_bytes: 3_040_959_629,
324 + desktop_only: false,
325 },
326 UqffModelEntry {
327 id: "mistralrs-community/Qwen3-4B-Instruct-2507-UQFF",
@@ -312,6 +331,7 @@ pub(crate) const UQFF_MODELS: &[UqffModelEntry] = &[
331 description: "Qwen 3 4B Instruct (2507 refresh), pre-quantised to 4-bit (UQFF Q4K). \
332 A non-thinking instruct model that loads directly.",
333 expected_size_bytes: 3_040_959_629,
334 + desktop_only: false,
335 },
336 UqffModelEntry {
337 id: "mistralrs-community/Qwen3-4B-Thinking-2507-UQFF",
@@ -321,6 +341,17 @@ pub(crate) const UQFF_MODELS: &[UqffModelEntry] = &[
341 description: "Qwen 3 4B Thinking (2507 refresh), pre-quantised to 4-bit (UQFF Q4K). \
342 Emits a reasoning block before its reply; loads directly.",
343 expected_size_bytes: 3_040_959_629,
344 + desktop_only: false,
345 + },
346 + UqffModelEntry {
347 + id: "mistralrs-community/Qwen3-4B-SafeRL-UQFF",
348 + name: "Qwen 3 4B SafeRL (UQFF)",
349 + display_name: "Qwen 3 4B SafeRL (UQFF Q4K)",
350 + approx_memory: "~3.0 GB (UQFF Q4K)",
351 + description: "Qwen 3 4B, safety-RL-tuned variant, pre-quantised to 4-bit (UQFF Q4K). \
352 + Loads directly with no on-device quantisation step.",
353 + expected_size_bytes: 3_040_959_629,
354 + desktop_only: false,
355 },
356 UqffModelEntry {
357 id: "mistralrs-community/Qwen3-8B-UQFF",
@@ -330,6 +361,7 @@ pub(crate) const UQFF_MODELS: &[UqffModelEntry] = &[
361 description: "Qwen 3 8B, pre-quantised to 4-bit (UQFF Q4K). Loads directly; needs \
362 roomier memory (12+ GB recommended).",
363 expected_size_bytes: 5_502_458_509,
364 + desktop_only: false,
365 },
366 UqffModelEntry {
367 id: "mistralrs-community/Qwen3-14B-UQFF",
@@ -339,6 +371,97 @@ pub(crate) const UQFF_MODELS: &[UqffModelEntry] = &[
371 description: "Qwen 3 14B, pre-quantised to 4-bit (UQFF Q4K). The largest UQFF option; \
372 desktop-class memory (16+ GB) recommended.",
373 expected_size_bytes: 9_426_174_577,
374 + desktop_only: false,
375 + },
376 + UqffModelEntry {
377 + id: "mistralrs-community/Qwen3-32B-UQFF",
378 + name: "Qwen 3 32B (UQFF)",
379 + display_name: "Qwen 3 32B (UQFF Q4K)",
380 + approx_memory: "~19.5 GB (UQFF Q4K)",
381 + description: "Qwen 3 32B, pre-quantised to 4-bit (UQFF Q4K). Desktop-class memory \
382 + (32+ GB) recommended.",
383 + expected_size_bytes: 19_548_142_977,
384 + desktop_only: false,
385 + },
386 + UqffModelEntry {
387 + id: "mistralrs-community/Qwen3-30B-A3B-UQFF",
388 + name: "Qwen 3 30B-A3B (UQFF)",
389 + display_name: "Qwen 3 30B-A3B (UQFF Q4K)",
390 + approx_memory: "~17.6 GB (UQFF Q4K)",
391 + description: "Qwen 3 30B-A3B, a mixture-of-experts model (3B active params), \
392 + pre-quantised to 4-bit (UQFF Q4K). Desktop-class memory (24+ GB) \
393 + recommended despite the small active-parameter count.",
394 + expected_size_bytes: 17_640_189_769,
395 + desktop_only: false,
396 + },
397 + UqffModelEntry {
398 + id: "mistralrs-community/Qwen3-30B-A3B-Instruct-2507-UQFF",
399 + name: "Qwen 3 30B-A3B Instruct 2507 (UQFF)",
400 + display_name: "Qwen 3 30B-A3B Instruct 2507 (UQFF Q4K)",
401 + approx_memory: "~17.6 GB (UQFF Q4K)",
402 + description: "Qwen 3 30B-A3B Instruct (2507 refresh), mixture-of-experts (3B active \
403 + params), pre-quantised to 4-bit (UQFF Q4K). A non-thinking instruct \
404 + model; desktop-class memory (24+ GB) recommended.",
405 + expected_size_bytes: 17_640_189_769,
406 + desktop_only: false,
407 + },
408 + UqffModelEntry {
409 + id: "mistralrs-community/Qwen3-30B-A3B-Thinking-2507-UQFF",
410 + name: "Qwen 3 30B-A3B Thinking 2507 (UQFF)",
411 + display_name: "Qwen 3 30B-A3B Thinking 2507 (UQFF Q4K)",
412 + approx_memory: "~17.6 GB (UQFF Q4K)",
413 + description: "Qwen 3 30B-A3B Thinking (2507 refresh), mixture-of-experts (3B active \
414 + params), pre-quantised to 4-bit (UQFF Q4K). Emits a reasoning block \
415 + before its reply; desktop-class memory (24+ GB) recommended.",
416 + expected_size_bytes: 17_640_189_769,
417 + desktop_only: false,
418 + },
419 + UqffModelEntry {
420 + id: "mistralrs-community/Qwen3-Coder-30B-A3B-Instruct-UQFF",
421 + name: "Qwen 3 Coder 30B-A3B Instruct (UQFF)",
422 + display_name: "Qwen 3 Coder 30B-A3B Instruct (UQFF Q4K)",
423 + approx_memory: "~17.6 GB (UQFF Q4K)",
424 + description: "Qwen 3 Coder 30B-A3B Instruct, mixture-of-experts (3B active params) \
425 + coding model, pre-quantised to 4-bit (UQFF Q4K). Desktop-class memory \
426 + (24+ GB) recommended.",
427 + expected_size_bytes: 17_640_189_769,
428 + desktop_only: false,
429 + },
430 + // The following three repos are ~45 GB downloads (q4k shard + residual) —
431 + // impractical for iOS/Android storage and memory budgets, so they're
432 + // restricted to macOS/Windows via `desktop_only`.
433 + UqffModelEntry {
434 + id: "mistralrs-community/Qwen3-Coder-Next-UQFF",
435 + name: "Qwen 3 Coder Next (UQFF)",
436 + display_name: "Qwen 3 Coder Next (UQFF Q4K)",
437 + approx_memory: "~45.3 GB (UQFF Q4K)",
438 + description: "Qwen 3 Coder Next, pre-quantised to 4-bit (UQFF Q4K). The largest \
439 + coding UQFF option; desktop-class memory (64+ GB) recommended. \
440 + macOS/Windows only.",
441 + expected_size_bytes: 45_338_887_469,
442 + desktop_only: true,
443 + },
444 + UqffModelEntry {
445 + id: "mistralrs-community/Qwen3-Next-80B-A3B-Instruct-UQFF",
446 + name: "Qwen 3 Next 80B-A3B Instruct (UQFF)",
447 + display_name: "Qwen 3 Next 80B-A3B Instruct (UQFF Q4K)",
448 + approx_memory: "~45.3 GB (UQFF Q4K)",
449 + description: "Qwen 3 Next 80B-A3B Instruct, mixture-of-experts (3B active params), \
450 + pre-quantised to 4-bit (UQFF Q4K). A non-thinking instruct model; \
451 + desktop-class memory (64+ GB) recommended. macOS/Windows only.",
452 + expected_size_bytes: 45_338_887_469,
453 + desktop_only: true,
454 + },
455 + UqffModelEntry {
456 + id: "mistralrs-community/Qwen3-Next-80B-A3B-Thinking-UQFF",
457 + name: "Qwen 3 Next 80B-A3B Thinking (UQFF)",
458 + display_name: "Qwen 3 Next 80B-A3B Thinking (UQFF Q4K)",
459 + approx_memory: "~45.3 GB (UQFF Q4K)",
460 + description: "Qwen 3 Next 80B-A3B Thinking, mixture-of-experts (3B active params), \
461 + pre-quantised to 4-bit (UQFF Q4K). Emits a reasoning block before its \
462 + reply; desktop-class memory (64+ GB) recommended. macOS/Windows only.",
463 + expected_size_bytes: 45_338_887_469,
464 + desktop_only: true,
465 },
466 ];
467