Follows up the #585 merge: the schema now lives next to the catalog it
validates, and the workflow/test/docs no longer reference the removed
root data/ copies.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
data/hf_models.json and data/benchmark_cache.json were byte-identical
copies of the files in llmfit-core/data/ (the ones actually embedded via
include_str!), adding ~11 MB of redundant git-tracked data that could
silently drift. Scrapers now write only the canonical llmfit-core/data/
path; scripts and docs updated to match.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The catalog on main now contains models with the 'audio' capability
(added by the audio-ASR work), which the strict enum rejected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Regenerated the embedded catalogs against current upstream:
- HF models: 5458 -> 5473 (+15 added, 0 removed; purely additive). New
entries include GLM-5.2 variants, Gemma-4-26B, Jan-nano-128k,
Llama-3.3-Swallow-70B, Mellum2-12B, VibeThinker-3B, and others.
- localmaxxing benchmark cache: 384 results across 13 hardware presets.
Both repo-root and embedded (llmfit-core/data) copies are byte-identical
and valid JSON. Full test suite passes with the new embedded data (383
core incl. embedded-database invariants + 51 TUI). Scraped without
HF_TOKEN, so gated models (Phi-3-medium, LongCat-Flash, …) are skipped as
usual.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Regenerate the embedded model database after adding cardData to discovery queries. This increases populated license metadata while preserving existing GGUF source entries.
Populate model license metadata from Hugging Face card data and license tags. Prefer named licenses when Hugging Face reports a generic other license, and preserve existing license and GGUF source metadata when a refresh response omits it.
Re-scraped community benchmark data (scraped_at 2026-06-12), 344 results
across 13 hardware presets.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add MiniMaxAI/MiniMax-M3 to the curated model list (512K context, 128K max output, image input)
- Keep MiniMaxAI/MiniMax-M2.7 as a previous-generation option
- Remove MiniMaxAI/MiniMax-M2.5 from the curated target list
- Update scripts/scrape_hf_models.py to match the new curated order
Co-Authored-By: Octopus <liyuan851277048@icloud.com>
data/hf_models.json — append 4 automatic-speech-recognition entries:
- openai/whisper-large-v3 (1.5 B, RTF 0.04 GPU / 0.6 CPU, 2.5 GB VRAM)
- openai/whisper-large-v3-turbo (809 M, RTF 0.007 / 0.12, 1.5 GB VRAM)
- distil-whisper/distil-large-v3 (756 M, RTF 0.004 / 0.08, 1.2 GB VRAM)
- openai/whisper-medium (307 M, RTF 0.003 / 0.05, 0.6 GB VRAM)
New fields use _audio_ prefix with serde(default) so existing
deserialization is not affected:
_audio_rtf_gpu / _audio_rtf_cpu Real-Time Factor (lower = faster)
_audio_vram_gb GPU memory required at F16
_audio_backends compatible server implementations
AUDIO_SUPPORT.md — roadmap for Rust integration:
UseCase::Audio, AudioFit RTF-based scoring,
MlxWhisperProvider + FasterWhisperProvider in providers.rs,
--kind audio CLI filter.
Motivation: projects like TLDR need to pick the right Whisper
backend for their hardware. RTF on GTX 1660 Ti vs Apple M3 Pro
differs by 15x — llmfit already has the hardware detection to
make this choice automatic.
* feat: rescrape model catalog and expand Ollama mappings
- Full rescrape of hf_models.json (1852 -> 5341 models)
- Added 9 curated models to TARGET_MODELS: Devstral, Cohere Command A/R+,
Falcon3-3B, Nemotron-Super-49B, EXAONE-Deep-2.4B/32B
- Added 21 Ollama mappings for Mistral, Qwen, DeepSeek, Falcon, Cohere,
SmolLM2, NVIDIA Nemotron, EXAONE Deep, and OLMo 2
- Preserved gguf_sources from previous data where the rescrape missed them
Supersedes #316.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* style: cargo fmt
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat(scoring): add generation-aware quality scoring
Newer model generations (e.g. Qwen3.6, Llama 4, DeepSeek V4) now receive
a quality bonus that reflects their improved quality-per-parameter over
older generations. Previously, quality scoring was based purely on parameter
count, which caused newer/smaller models to rank below older/larger ones
even when benchmarks show the opposite.
The implementation adds:
- `architecture` field to LlmModel (already present in scraped JSON, now
deserialized)
- `parse_generation()` function that extracts generation from architecture
strings and model names (covers Qwen, Llama, DeepSeek, Gemma, Phi,
Mistral, Falcon, Granite families)
- Additive generation bonus in quality_score(): +3 per generation above
1.0, capped at +9
Validated against 5312 models scraped from HuggingFace:
- 58% of models have parseable generation info
- 6 families with multiple generations correctly differentiated
- Key ranking fixes confirmed (e.g. Qwen3-8B now scores above Qwen2.5-7B)
- Models without generation info are unchanged
Fixes#552
* fix: add architecture field to LlmModel literals in TUI crate
Missed these struct literals in display.rs and main.rs during the
initial change.
The Rust fit engine already had a precise KV cache formula and an
architecture-aware MoE speed estimator (Tier 1), but both were starved
for data — only 78/1520 models had the required fields, and hidden_size,
vocab_size, and moe_intermediate_size were never populated from the
scraper.
Scraper changes:
- Add extract_arch_metadata() helper that extracts num_hidden_layers,
num_attention_heads, num_key_value_heads, head_dim, hidden_size,
vocab_size, moe_intermediate_size, and shared_expert_intermediate_size
from config.json with text_config fallback for multimodal models
- Apply to both scrape_model() (curated) and _build_discovered_model()
(auto-discovered), fixing the gap where discovered models had no
architecture fields
- Fall back from moe_intermediate_size to intermediate_size for
Mixtral-style models that use a single key for per-expert FFN dim
- Add estimate_params_from_arch() to detect and correct wrong
parameters_raw from FP8/INT4/INT8 repos that report quantized element
counts instead of true parameter count (e.g. unsloth/Qwen3-Coder-Next-FP8
reported 2.1B instead of 79.7B)
- Handle list-type config values (e.g. ERNIE-4.5-VL)
Rust changes:
- Add hidden_size, vocab_size, moe_intermediate_size, and
shared_expert_intermediate_size to HfModelEntry deserialization
- Wire through to LlmModel instead of hardcoded None, enabling the
existing moe_bandwidth_decomposition() Tier 1 path
Results:
- Architecture metadata: 78/1520 (5%) → 1597/1852 (86%)
- MoE Tier 1 speed estimation: 0% → 353/356 (99%)
- Fixes wildly optimistic MoE speed estimates (e.g. Qwen3-Coder-Next-FP8
went from 1606 tok/s to 43 tok/s)
- Model count: 1520 → 1852 (10K min-downloads discovery)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The HuggingFace model scraper was silently broken — the `offset` parameter
is ignored by the HF API, so pagination only ever fetched the first page.
This switches to cursor-based pagination via the Link header, adds multiple
sort strategies (downloads, trendingScore, likes30d), makes the database
additive so historical models are never lost, and allows quantization/repack
orgs (bartowski, unsloth, etc.) since users actually run those variants.
Key changes:
- Fix pagination: use HF API cursor-based pagination (Link header)
- Multi-strategy discovery: downloads + trendingScore + likes30d, merged
- Additive database: existing models retained, fresh data updates in place
- Allow repack orgs: only trl-internal-testing is blocked now
- Config.json fallback: estimate params when safetensors metadata missing
- Discovery enabled by default with 1000 model limit
- Add feature-extraction pipeline for embedding models
- Filter statistics printed every run for transparency
Result: 1520 models (up from 1023), including 364 retained historical.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add four RWKV7 G1f series models from shoumenchougou GGUF repos.
These are pure RNN/SSM models with no KV cache, 8192 context,
and full llama.cpp compatibility. Architecture "rwkv" is already
handled in models.rs as pure SSM.
Closes#515
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- New scripts/scrape_benchmarks.py scrapes all 27 hardware presets from
localmaxxing.com and writes data/benchmark_cache.json (+ llmfit-core copy)
- Cache is embedded at compile time via include_str! and parsed lazily
- TUI falls back to cached data when the API is unreachable, showing
"Using cached data (API unreachable)" instead of an empty error
- Initial cache contains 115 results across RTX 5090/4090/3090,
RX 7900 XTX/XT, and Apple M4 Max
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add DeepSeek-V4-Pro, V4-Pro-Base, V4-Flash, and V4-Flash-Base to the
model database. Also fix MoE detection to handle the n_routed_experts
config key used by DeepSeek V4.
Closes#500
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add Qwen3.6-27B (dense, 27.8B) and Qwen3.6-35B-A3B (MoE, 36B/3B active)
to the curated model list with GGUF sources from unsloth and ggml-org.
Add hybrid attention layout inference for Qwen3.5/3.6 architectures.
Full re-scrape with --discover -n 2000 brings total to 962 models with
422 GGUF-sourced entries.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixes#445
- Maverick num_experts was 16 (from generic llama4 fallback), now 128
matching the model name (17B-128E)
- Maverick context_length was 4096 (bare max_position_embeddings),
now 1048576 after applying RoPE scaling factor
- MODELS.md listed both Scout/Maverick as 128k; corrected to 10M/1M
- Scraper detect_moe() now checks text_config for nested MoE fields
(Llama 4 multimodal models store num_local_experts there)
- Scraper infer_context_length() now applies rope_scaling factor when
present, so models using RoPE extension get correct context values
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Re-ran scraper with discovery and GGUF source enrichment. Adds
gemma-4-E2B-it and gemma-4-E4B-it with unsloth/ggml-org GGUF sources,
plus 22 net new models from HuggingFace discovery.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add MiniMaxAI/MiniMax-M2.7 to curated models list and manual entries
- Add M2.7 active parameter count for MoE calculations
- Add M2.7 entries to both data/hf_models.json and llmfit-core/data/hf_models.json
- M2.7 is placed before M2.5 as the latest flagship model
- All previous MiniMax models (M2, M2.1, M2.5) retained as alternatives
Add ModelFormat enum (Gguf/Awq/Gptq/Mlx/Safetensors) and Vllm inference
runtime. Pre-quantized models are detected from config.json by the scraper
and filtered to CUDA/ROCm only (no Apple Silicon support yet). Dynamic
re-quantization is skipped for fixed-precision formats.
Co-Authored-By: Claude <noreply@anthropic.com>
Add a --gguf-sources flag to the scraper that checks known GGUF providers
(unsloth, bartowski) on HuggingFace for pre-quantized versions of each
model in the database.
Why not add Unsloth as a model provider?
Unsloth publishes repacks/quantizations of existing models, not original
architectures. Adding them as separate model entries would create duplicates
with identical RAM/VRAM requirements. Instead, we link existing models to
their GGUF download sources — this is more actionable for users who want
to actually download and run models locally.
Changes:
- scraper: --gguf-sources flag checks unsloth/ and bartowski/ repos
- models.rs: GgufSource struct + gguf_sources field on LlmModel
- display.rs: show GGUF Downloads section in model info with direct
HuggingFace links and llmfit download command hint
- JSON output: gguf_sources included in fit results
38 models enriched with GGUF sources across both providers.
Signed-off-by: Three Foxes (in a Trenchcoat) <threefoxesyes3inatrenchcoat@gmail.com>
Add a theme system with 6 built-in color schemes:
- Default (original colors)
- Dracula (dark purple with pastel accents)
- Solarized (Solarized Dark palette)
- Nord (cool blue-gray tones)
- Monokai (Monokai Pro colors)
- Gruvbox (warm retro palette)
Press 't' to cycle through themes. The current theme is shown
in the filter bar. All UI elements (table, detail view, system
bar, status bar, popups) use semantic theme colors.
Implementation:
- New theme.rs module with ThemeColors struct mapping semantic
roles (fg, muted, accent, score_high, fit_perfect, etc.)
- Refactored tui_ui.rs to use ThemeColors instead of hardcoded
Color values throughout
- Added theme field to App state and cycle_theme() method
- Wired 't' key in tui_events.rs
Signed-off-by: Three Foxes (in a Trenchcoat) <threefoxesyes3inatrenchcoat@gmail.com>
Restructure single-crate project into Cargo workspace:
- llmfit-core: core library (hardware detection, model fitting, providers)
- llmfit-tui: CLI/TUI binary (unchanged user experience)
- llmfit-desktop: macOS desktop app via Tauri 2
The workspace split enables the desktop app to reuse core logic
while keeping the CLI/TUI as the default build target.
Moved SortColumn to core crate for shared use across frontends.
Desktop app features:
- System specs display (RAM, CPU, GPU)
- Model compatibility table with fit scoring
- Dark theme UI using project icon from assets/icon.svg
- Tauri 2 with minimal permissions
No changes to data files — moved as-is via git mv.
Signed-off-by: Three Foxes (in a Trenchcoat) <threefoxes53235@gmail.com>
Signed-off-by: Three Foxes (in a Trenchcoat) <threefoxesyes3inatrenchcoat@gmail.com>
Expands model database from 33 to 48 models by adding highly popular
models from HuggingFace based on downloads, likes, and community usage.
New models added (15 total):
**Code Models (4):**
- meta-llama/CodeLlama-7b-Instruct-hf (6.7B) - Popular code generation
- meta-llama/CodeLlama-13b-Instruct-hf (13.0B) - Larger code model
- meta-llama/CodeLlama-34b-Instruct-hf (33.7B) - Professional code generation
- WizardLMTeam/WizardCoder-15B-V1.0 (15B) - Code specialist (fallback)
**Small/Edge Models (3):**
- google/gemma-2-2b-it (2.6B) - Smallest Gemma, very popular for edge devices
- microsoft/Phi-3.5-mini-instruct (3.8B) - Newer Phi variant, long context (131K)
- mistralai/Ministral-8B-Instruct-2410 (8.0B) - Smaller Mistral variant
**Reasoning & Chat Models (3):**
- microsoft/Orca-2-7b (7.0B) - Reasoning model, step-by-step solutions
- microsoft/Orca-2-13b (13.0B) - Larger reasoning model
- HuggingFaceH4/zephyr-7b-beta (7.2B) - Very popular fine-tune
**Multilingual Models (2):**
- 01-ai/Yi-6B-Chat (6.1B) - Popular Chinese/English bilingual
- 01-ai/Yi-34B-Chat (34.4B) - Larger Yi variant
**Mid-size Models (2):**
- mistralai/Mistral-Nemo-Instruct-2407 (12.2B) - Mid-size Mistral
- tiiuae/falcon-7b-instruct (7.2B) - TII UAE model
**Multimodal (1):**
- meta-llama/Llama-3.2-11B-Vision-Instruct (10.7B) - Vision + text
**Community Fine-tunes (1):**
- NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO (46.7B) - Popular community model
Changes:
- Updated TARGET_MODELS list with 21 new model repo IDs
- Added fallback entries for 12 gated/auth-required models
- Extended provider mapping for new organizations (01.ai, Upstage, TII,
HuggingFace, OpenChat, LMSYS, NousResearch, WizardLM)
- Regenerated data/hf_models.json with 48 total models
Note: Some models couldn't be scraped due to metadata issues or repository
changes (SOLAR-10.7B, falcon-40b, openchat-3.5, vicuna variants, WizardLM-13B).
These can be added with manual fallback entries if needed.
Addresses community requests for more model coverage, especially:
- Code-specialized models (CodeLlama series)
- Smaller edge models (Gemma 2B)
- Multilingual support (Yi series)
- Reasoning models (Orca 2)
- Popular community fine-tunes (Zephyr, Nous-Hermes)
Signed-off-by: Three Foxes (in a Trenchcoat) <threefoxes53235@gmail.com>