Commit graph

69 commits

Author SHA1 Message Date
octo-patch
1854973810
Correct MiniMax M2.7 context window
Signed-off-by: octo-patch <266937838+octo-patch@users.noreply.github.com>
2026-07-13 22:17:33 +08:00
Hajun Lee
8424aba9fd Merge upstream main into add_model 2026-07-11 21:10:56 +09:00
Alex Jones
7b9cc973ae ci: validate community benchmark submissions on PR
Adds the Community Benchmarks workflow: any PR touching
llmfit-core/data/community/ runs scripts/validate_community_benchmarks.py,
which checks JSON schema conformance (schema.json, draft-07),
path/naming conventions (community/<slug>/<timestamp>-<hash>.json), file
size caps, and cross-field sanity the schema can't express (tps
ordering, plausible hardware bounds, submission timestamps within the
feature's lifetime). Whole-directory validation, so repo integrity is
re-checked on every touch; also runs on push to main.

Seeds the directory with the first genuine submission (Intel Arc 140V /
Core Ultra 7 258V, gemma-3 Q8 via llama-server, 3.8 tok/s) — previously
attempted in #713/#716 — which also exercises the workflow on this PR.

Closes the CI-validation follow-up named in #712.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 11:33:44 +01:00
Alex Jones
fb049c210c feat(fit): purge test-stub catalog entries; calibrate estimates from local benchmarks
Step 1 — catalog hygiene: remove 100 CI/test-stub entries from
hf_models.json (tiny-random/*, *-tiny-random, tiny-dummy, ci-random-*,
test-*/testing-* repos). These are randomly initialized micro-models
whose names shadow real families — e.g. tiny-random/gemma-3 (9M params)
captured a local 2.5B gemma-3 GGUF and produced an 880 tok/s estimate
for a model that measures 3.8. The scraper now skips them at discovery
and at scrape time (is_test_stub), so they cannot return.

Step 2 — local calibration: one trustworthy benchmark now corrects the
whole estimate column for this machine. Anchors are locally-benched
fits on real catalog models (>= 1B params, dense); the median
measured/estimated ratio (clamped to [0.05, 3.0]) scales every row's
estimate, recorded in estimate_basis.local_calibration and printed in
the estimate-basis detail. Application is idempotent, so post-bench
refreshes never compound.

Stored runs are now also filtered by hardware fingerprint (CPU + GPU
name): measurements from a previous machine configuration neither
override nor calibrate the current one.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 11:07:42 +01:00
Alex Jones
63b2d3aada fix(data): verify GGUF source provenance; unlink wrong-model quants
GGUF source candidates were matched by bare model name only, so models
sharing a name across orgs got linked to quants of the wrong weights:
tiny-random/gemma-3 (9M test stub) linked to mradermacher/gemma-3-GGUF
(a 2.5B model) — downloading 2.5 GB while llmfit predicted 0.0 GB disk.
tiny-random/phi-4 (3M) pointed at quants of microsoft/phi-4 (14.7B).

Scraper: candidate GGUF repos must now declare a base_model tag matching
the source repo. Mismatches are still accepted when the declared base has
~the same parameter count (safetensors total, +-30%) — that's a mirror or
re-upload of identical weights (e.g. unsloth re-uploads pointing at the
canonical upstream), not a wrong link.

Data: audited all 1,656 linked quant repos against the HF API with the
same rules — 19 wrong-model links removed (14 confirmed by parameter
mismatch, 5 unverifiable), 1,510 verified, 295 mirror links kept.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 08:39:29 +01:00
octo-patch
ac84dcfba1 Update MiniMax M3 context metadata
Align the MiniMax M3 catalog entry and scraper fallback with the provider's 1M context window.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-09 07:09:34 +00:00
Alex Jones
b2b35d60d1 fix: preserve popularity metadata through scraper merge and discovery
Three fixes for metadata loss during catalog regeneration:

- The additive merge with the existing database now backfills
  hf_downloads/hf_likes/release_date/languages from the previous
  catalog when the fresh entry lacks them. Unauthenticated runs
  replace gated models with FALLBACK stubs (0 downloads/likes),
  which previously clobbered real values from earlier scrapes.
- _build_discovered_model now fetches full model info when the
  listing omits downloads/likes (non-download sort strategies like
  trending return listings without these fields), instead of
  writing zeros into the catalog.
- infer_languages derives the language for Meta MMS per-language
  models (facebook/mms-tts-<iso639-3>) from the repo name, since
  these models declare no language metadata via the API.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 16:28:38 +01:00
Kolja Lampe
5ca524e6ea fix: mark TTS models as unsupported runtime 2026-07-05 12:06:39 +02:00
Kolja Lampe
5b55e2c571 fix: keep text generation discovery budget 2026-07-05 12:06:39 +02:00
Kolja Lampe
40a69f6269 feat: add TTS model discovery 2026-07-05 12:06:19 +02:00
Kolja Lampe
784af4d8c1 feat: add model language metadata 2026-07-05 12:06:19 +02:00
Alex Jones
e0a5654538 feat: pin Huihui-Qwen3.6-35B-A3B-abliterated and add GGUF source (#656)
The model was already picked up by catalog auto-discovery, but had no
gguf_sources (so no download path in the TUI) and was not pinned in
TARGET_MODELS, so it could drop out of future scrapes.

- Add huihui-ai/Huihui-Qwen3.6-35B-A3B-abliterated to TARGET_MODELS
- Add MOE_ACTIVE_PARAMS fallback (3B active, matching the base
  Qwen/Qwen3.6-35B-A3B it is finetuned from)
- Enrich the existing catalog entry with the mradermacher GGUF source
  and align active_parameters with the published 3B figure

Closes #656

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 10:39:42 +01:00
Hajun Lee
324413524e Merge upstream main into add_model 2026-07-04 20:12:41 +09:00
Hajun Lee
263e81c99c chore: document VAETKI context override 2026-07-04 20:09:01 +09:00
Alex Jones
cf64a5b415 chore: remove duplicated root data/ copies of catalog and benchmark cache
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>
2026-07-02 21:49:07 +01:00
Alex Jones
5b4a37ef4e
Merge pull request #585 from Romeo-mz/feature/weekly-update
Feature request: Add a weekly ci action to update model database
2026-07-02 21:48:41 +01:00
Hajun Lee
67a5cee975 feat: add NCAI VAETKI model to curated model database 2026-06-27 21:37:24 +09:00
Razze
833506a3f3 Refine Hugging Face license scraping
Request cardData in discovery listings instead of fetching each discovered model again. Keep comma-separated multi-license values in the data and split stored license strings when filtering.
2026-06-19 20:49:40 +02:00
Razze
f4b37b210b Scrape Hugging Face model licenses
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.
2026-06-17 21:51:17 +02:00
romeo-mz
4450e63f37 refactor(workflows): enhance weekly model update script and add note for CI checks 2026-06-17 09:57:12 +02:00
romeo-mz
682d91a985 feat(workflows): update weekly model update workflow and improve schema documentation 2026-06-17 09:50:20 +02:00
romeo-mz
25b0642d6c feat(schema): add JSON schema and weekly github action 2026-06-17 09:50:20 +02:00
romeo-mz
5136eb44ef feat(models): add daily model update workflow and curated models file 2026-06-17 09:50:20 +02:00
Hajun Lee
0e94aa7bae Add NCAI VAETKI models 2026-06-14 01:05:16 +09:00
Octopus
7407d1035e feat: upgrade MiniMax default model to M3
- 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>
2026-06-03 10:28:29 +08:00
Alex Jones
c3e3f0d03f
feat: rescrape model catalog and expand Ollama mappings (#573)
* 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>
2026-05-23 20:11:17 +01:00
Alex Jones
a3e0eb27c5
feat(scoring): add generation-aware quality scoring (#553)
* 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.
2026-05-17 07:28:53 +01:00
Alex Jones
bab8c01277
feat: populate architecture metadata for precise KV cache and MoE speed estimation (#539)
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>
2026-05-10 15:00:28 +01:00
Alex Jones
93e9d673cf
feat: overhaul model discovery with cursor pagination, trending, and additive DB (#537)
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>
2026-05-06 10:29:44 +01:00
Three Foxes (in a Trenchcoat)
8214b1f19b
fix: add AutoRound format detection to prevent misclassification as GGUF (#532)
* fix: add AutoRound format detection to prevent misclassification as GGUF

- Add ModelFormat::Autoround enum variant in models.rs
- Update is_prequantized() to include AutoRound
- Fix bit-per-parameter calculation for AutoRound-4bit
- Update scrape_hf_models.py to detect auto-round quant_method
- Correct 3 misclassified AutoRound models in hf_models.json
- Add AutoRound-4bit to SUPPORTED_QUANTS and parse_quant() in plan.rs
- Update pre-quantization comments in fit.rs
- Update test_model_format_prequantized() assertion

Fixes #526

* style: apply cargo fmt formatting

* ci: use npx for web build/test steps to fix Windows PATH issue

* fix: add AutoRound-8bit to quant metrics in models.rs

Add explicit entries for AutoRound-8bit in quant_speed_multiplier,
quant_bytes_per_param, and quant_quality_penalty. Without these,
an 8-bit AutoRound model would incorrectly fall through to the
4-bit defaults (0.5 bpp, quality penalty -5.0).
2026-05-05 10:00:56 +01:00
Bùi Đức Hải
806923d095
Add Qwen3.5B Claude Opus 4.6 reasoning models, fix cursor navigate, add support for parallel models update and enriching with --threads, marquee effect for model name column (#275)
* chore: Add Qwen3.5 Claude Opus 4.6 reasoning models

* feat: Support parallel models update

* fix: Fix cursor navigate in tui

* feat: Support parallel models enriching

* feat: Support marquee animation for model name column auto if text too long

* chore: Ignore __pycache__

* chore: Remove hf_models backup

* chore: Remove duplicate Qwen3.5-9B-Claude-4.6-Opus-Reasoning-Distilled-GGUF in scrape hf models
2026-04-30 08:15:49 +01:00
Alex Jones
fab2bec907
feat: add RWKV v7 G1f models (1.5B, 2.9B, 7.2B, 13.3B) (#517)
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>
2026-04-29 07:58:11 +01:00
Alex Jones
928390b467 feat: add benchmark cache with offline fallback
- 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>
2026-04-27 15:51:57 +01:00
Alex Jones
0fd800fa1b
feat: add DeepSeek V4 model family (#502)
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>
2026-04-24 15:46:21 +01:00
James Hoctor
149c114112
Move python packaging to the main repo (#444)
* feat(python): scaffold in-repo PyPI packaging

Copied hatch_build.py, src/__init__.py, src/__main__.py, and tests/ from
the external llmfit-pypi repo into llmfit-python/. Created pyproject.toml
at the repo root (adapted from llmfit-pypi) with updated author, paths, and
non-standard source mapping for the gitignore-safe llmfit-python/src/ layout.
Created .github/workflows/pypi.yml to build and publish all 8 platform wheels
on tag push, mirroring the docker.yml trigger pattern.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(python): rewrite hatch_build.py to use in-repo binaries

hatch_build.py previously downloaded release binaries from GitHub at
wheel-build time, verifying SHA256 and fetching license via the GitHub
API (~267 lines). It now expects the pre-compiled binary to already
exist at target/<rust-target>/release/ and reads version and license
directly from Cargo.toml (~174 lines, no network calls).

This enables the new CI split in release.yml: each build matrix job
uploads its binary as a binary-<target> artifact, and a dedicated
publish-python job (ubuntu-latest only) downloads all of them and runs
uv build in a loop over platform tags before publishing to PyPI in a
single step. Wheel failures no longer block binary release assets.

Also removes the now-redundant standalone pypi.yml workflow, adds
license = "MIT" to Cargo.toml workspace.package, and relocates the
Python package source into src/llmfit/ to match hatch layout.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: add Python gitignore entries

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: add Python code quality Makefile targets

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(python): respect LLMFIT_PYTHON_PLATFORM_TAG in editable installs

When the env var is set, look in target/{rust_target}/release/ (via the
renamed _find_binary_for_target) rather than the default host-native
paths (_find_local_binary). Also splits py_target_from_env / py_target
in initialize so the editable branch reuses the already-read value.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci: add Python CI workflow and tighten Rust CI path filters

- Add python-ci.yml with cross-platform pytest job (gated on llmfit-python/
  or pyproject.toml changes via dorny/paths-filter) and a lint/typecheck job
  that also triggers on scripts/**/*.py changes
- Exclude llmfit-python/** from Rust CI path triggers
- Replace cryptic Cargo.*o* glob with explicit Cargo.{lock,toml}

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: remove committed .pyc file from tracking

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: normalise ruff lint exception comment formatting

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Ruff formatted these lines into one line

* Fix import ordering

* Move pyproject.toml and uv.lock into llmfit-python/

* Correct path to tested code

* Run checks without installing llmfit itself (which fails)

* chore: bump setup-python and setup-uv to latest versions

Upgrades actions/setup-python v5 → v6 and astral-sh/setup-uv v5 → v8.1.0
to resolve Node.js 20 deprecation warnings in CI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Disallow setting LLMFIT_PYTHON_PLATFORM_TAG on an editable build

* Improve inline comments in binary selection logic

* Move binary version check out of selection logic

* Always check that binary file exists

* Check all binaries before building wheels

* Set the execute bit that was lost by GitHub Actions

* Python CI downloads latest release binary instead of rebuilding Rust

Replaces the cargo build steps in the test job with a download of the
latest release archive from GitHub Releases, verified via SHA256.
LLMFIT_VERSION is set to the downloaded release version so the wheel
build does not conflict with an unreleased Cargo.toml bump.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* publish-python: use release file downloads instead of GHA artifacts

Removes the binary artifact upload/download mechanism. publish-python
now depends on the release job (not build) and downloads each archive
directly from GitHub Releases, verifying its checksum inline via pipe
before extracting the binary and building the wheel.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix typo in ci.yml comment: worfklows -> workflows

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Accept optional v prefix in binary --version output

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Simplify BinaryNotFoundError to inherit only from LlmfitError

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add fmt-check target; use in check instead of fmt

Avoids `make check` unexpectedly modifying files on disk.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Split up checksum file to work around * in sha file on Windows

* Fix Windows zip extraction in Python CI workflow

Use unzip instead of tar to extract .zip archives on Windows, since
Git Bash's tar does not support the zip format.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Make llmfit binary version visible in CI tests

* Prevent multiline echo-on-Windows weirdness

* Consolidate CI workflows and add path-based job gating

Merges python-ci.yml into ci.yml. Adds a changes job using
dorny/paths-filter to detect whether Rust or Python files changed,
then gates fmt/clippy/check/check-python jobs accordingly via
job-level if conditions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Tell uv where the python project is

* Remove outdated sentence about LLMFIT_VERSION from docstring

* Run Python tests with debug binary in editable mode for max reuse with cargo test

* Control the working dir to control test discovery

* Run Python build system integration test when there are no Python changes

* Update comment

* Always run cargo build on macos

* Show contents of target/ (for debugging)

* Debug production of debug builds by cargo test

* Always run cargo build to get a debug build

* Only build debug binary for subsequent pytest

* Revert "Debug production of debug builds by cargo test"

This reverts commit c88158e5ae.

* Revert "Show contents of target/ (for debugging)"

This reverts commit 947cb39988.

* Update comment with corrected description of work reuse

* Move prerequisite debug build step above uv sync step

* fix(ci): use picomatch extglob to exclude llmfit-python from rust filter

The previous config used a leading-! entry (`!llmfit-python/**`) to try
to exclude the Python directory from the rust filter. In dorny/paths-filter's
default 'some' mode, each entry is OR-ed: a leading ! is passed to picomatch
as a pattern that matches anything *not* in llmfit-python/, but the positive
`llmfit-*/**` entry already matched, so the negation had no effect and
rust-changed was always true for Python-only PRs.

Replace the two entries with a single picomatch extglob pattern
`llmfit-!(python)/**`. The !(python) extglob is evaluated against the
segment between `llmfit-` and the path separator, so llmfit-python/ never
matches while all other llmfit-* directories do.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(python): add rust_integration pytest mark for Rust-triggered CI runs

Marks test_binary_runs with @pytest.mark.rust_integration so it runs
in CI when only Rust code has changed, replacing the uv sync --no-dev
integration test step.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 08:47:42 +01:00
Alex Jones
5397a8ab43 feat: add Qwen3.6 models and refresh model database with discovery
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>
2026-04-22 20:15:47 +01:00
Alex Jones
ac5b115988
fix: correct Llama 4 Maverick metadata (expert count, context length) (#446)
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>
2026-04-15 20:25:09 +01:00
Alex Jones
1f1b6fc25a feat(plan): KV cache fidelity + KV quant flag + TurboQuant gating
Implements all five phases of the roadmap in #417, requested in #411.

Phase 1 (#418): replace the linear KV approximation in models.rs with
a precise per layer formula
  kv_bytes = 2 * n_layers * n_kv_heads * head_dim * ctx * dtype_bytes
when num_hidden_layers and head_dim are known on LlmModel. Falls back
to the old linear formula when metadata is missing so the existing
catalog doesn't regress. New fields num_hidden_layers, head_dim, and
attention_layout added to LlmModel.

Phase 1b (#418): scrape num_hidden_layers, num_attention_heads,
num_key_value_heads, head_dim, and hidden_size from each model's
config.json during llmfit update. Cache version bumped to 2 so old
caches re-fetch. Python scraper updated to write the same fields.

Phase 2 (#419): new KvQuant enum (fp16 / fp8 / q8_0 / q4_0 / tq) with
parse() and bytes_per_element(). New --kv-quant flag on plan, new
PlanRequest.kv_quant, new PlanEstimate.kv_quant, plumbed through
evaluate_current and build_path_estimate. CLI prints the active KV in
the plan header. JSON output exposes kv_quant and kv_alternatives with
snake_case labels matching the flag values.

Phase 3 (#420): new AttentionLayout { full, linear } struct with
compressible_fraction(). infer_attention_layout_from_name covers
Qwen3-Next, Jamba, Zamba, Mamba/RWKV; defaults to all-full for plain
dense transformers. effective_attention_layout prefers explicit
metadata, falls back to the heuristic.

Phase 4 (#421): TurboQuant variant gated to GpuBackend::Cuda in
estimate_model_plan; clear error message points at 0xSero/turboquant
and suggests fp8/q8_0/q4_0 for llama.cpp users. CLI prints a warning
on every --kv-quant tq invocation. KvQuantAlternative.note for the TQ
row always says "Experimental: not in upstream vLLM" plus the layer
split when known. The compression only applies to the full attention
slice; linear layers stay at fp16, so hybrid models see honest savings
(~21% on a 10/40 model, not the headline 83%).

Phase 5 (#422): new KvQuantAlternative rows on PlanEstimate showing
per-quant kv_cache_gb, memory_required_gb, savings_fraction, note,
and supported. Rendered as a "KV Cache Alternatives" table in the CLI
plan output and in the TUI plan view (highlighted active row, n/a
marker for unsupported options, per-row notes).

TUI: PlanField gains a KvQuant variant; new plan_kv_quant_input state,
input handling, and Tab cycle position; KV Quant input row in the
plan editor; Active KV line and KV Cache Alternatives section in the
rendered plan output.

Tests: 16 new unit tests covering KvQuant::parse, the precise formula
matching a hand calc on Llama-3.1-8B, KV scaling across fp16/q8/q4,
fallback when metadata is missing, TurboQuant only compressing full
attention layers, honest hybrid savings landing around 21% (not the
83% headline), AttentionLayout::compressible_fraction, name based
hybrid detection, plan errors on TQ + non-CUDA, plan succeeds on TQ
+ CUDA, and TQ row marked unsupported in alternatives off CUDA. All
301 workspace tests pass; no new clippy warnings.

Closes #418 #419 #420 #421 #422
Refs #417 #411

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 16:27:56 +01:00
Alex Jones
2cb21c36b9 feat: add Google Gemma 4 models and fix Gemma 3 capabilities
Cherry-picked from #310 (credit: @shaal). Adds Gemma 4 models
(E2B-it, E4B-it, 31B-it, 26B-A4B-it), fixes MoE detection for
top_k_experts, adds any-to-any vision pipeline tag, and enables
tool_use + vision for Gemma 3/4 instruction-tuned models.

Version bump to 0.8.8.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 09:05:21 +01:00
Alex Jones
344428ef4f chore: new models
Signed-off-by: Alex Jones <alexsimonjones@gmail.com>
2026-04-01 18:05:18 +04:00
PR Bot
7c16b9d5ee feat: add MiniMax-M2.7 to curated model database
- 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
2026-03-18 15:40:00 +08:00
Alex
2a84138b00 feat: add Docker Model Runner as a runtime provider
Add support for Docker Desktop's built-in Model Runner as a fourth
runtime provider alongside Ollama, llama.cpp, and MLX. Detection probes
the OpenAI-compatible /v1/models endpoint on localhost:12434 (configurable
via DOCKER_MODEL_RUNNER_HOST). Downloads use `docker model pull`.

A new scraper (scripts/scrape_docker_models.py) queries Docker Hub's ai/
namespace and cross-references against the HF model database to produce
an embedded catalog (docker_models.json) of confirmed available models.
Only models verified in the catalog appear as downloadable via Docker.

- Provider: detect, list installed, pull via docker CLI
- TUI: status bar shows Docker availability, 'D' in Inst column,
  provider picker includes Docker Model Runner
- Inst column refactored from enum to bitfield for extensibility
- Makefile: `make update-catalogs` refreshes all scrapers and rebuilds

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:42:58 +00:00
AlexsJones
73f973476a models.rs (5 tests):
- test_gguf_source_deserialization — GgufSource JSON round-trips correctly
  - test_gguf_sources_default_to_empty — models without gguf_sources in JSON default to []
  - test_catalog_popular_models_have_gguf_sources — 5 well-known models (Llama-3.3-70B, Qwen2.5-7B, etc.)
  have non-empty gguf_sources in the catalog
  - test_catalog_gguf_sources_have_valid_repos — every gguf_source in the catalog has owner/repo format,
  non-empty provider, and contains GGUF
  - test_catalog_has_significant_gguf_coverage — at least 25% of catalog models have GGUF sources (currently
  30%)

  providers.rs (7 tests):
  - test_hf_name_to_gguf_candidates_generates_common_patterns — heuristic generates bartowski, ggml-org,
  TheBloke candidates
  - test_hf_name_to_gguf_candidates_strips_owner — strips the Org/ prefix correctly
  - test_lookup_gguf_repo_known_mappings — hardcoded mappings resolve for known models
  - test_lookup_gguf_repo_unknown_returns_none — unknown models return None
  - test_has_gguf_mapping_matches_known_models — boolean check works
  - test_gguf_candidates_fallback_covers_major_providers — fallback covers all 3 providers and all end in
  -GGUF
  - test_gguf_candidates_known_mapping_returns_single — hardcoded mapping returns exactly 1 result

Signed-off-by: AlexsJones <alexsimonjones@gmail.com>
2026-03-12 22:08:00 +00:00
Yuri Khrustalev
6252c9aadb Merge branch 'AlexsJones:main' into ykhrustalev/lfm 2026-03-12 00:02:18 -04:00
Brian Gupta
d7f2f11bb2 feat: add AWQ/GPTQ support with vLLM inference runtime
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>
2026-03-10 00:55:16 -04:00
Yuri Khrustalev
83d038a54e feat: add Liquid AI LFM2/LFM2.5 models
Add 33 LFM2-family models: dense text (350M-2.6B), MoE (8B-A1B,
24B-A2B), LFM2.5 (Base/Instruct/Thinking/JP), Vision-Language,
Audio, Liquid Nanos fine-tunes, and lmstudio-community MLX variants.
2026-03-04 13:02:04 -05:00
Alex
455709f2fb feat: fix for qwen3_5moe
Signed-off-by: Alex <alexsimonjones@gmail.com>
2026-03-04 09:19:25 +00:00
Alex
05768af09d feat: This PR is to add the ability for capabilities to be described
Signed-off-by: Alex <alexsimonjones@gmail.com>
2026-03-04 07:11:41 +00:00
AlexsJones
503229e566 feat: adding serve capabilities
Signed-off-by: AlexsJones <alexsimonjones@gmail.com>
2026-03-03 14:16:31 +00:00
Alexander Silva
226c5c2d80 feat: add Qwen3.5 small model series (0.8B, 2B, 4B, 9B) 2026-03-02 21:21:22 -05:00