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