Studio: hide the llama-server install validation probe from model pickers (#6366)
* Studio: hide the llama-server install validation probe from model pickers The ggml-org/models / stories260K probe (install_llama_prebuilt validates the prebuilt binary against it) can land in the HF cache and, being a 260K toy model, sorts smallest and gets auto-selected for chat. Hide it in _is_hidden_model alongside the RAG embedding model so it never surfaces. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * test: assert the validation probe is hidden across all model pickers _is_hidden_model gates the model list, local, cached-GGUF and cached-models endpoints that feed the picker search, so cover both the repo-id and the on-disk snapshot-path forms callers pass. * Studio: match the validation probe by exact filename, not a bare substring Use the probe's repo id (ggml-org/models) plus its exact filename (stories260K.gguf) so the picker filter does not also hide unrelated repos that merely reference stories260K, e.g. user/stories260K-finetune-GGUF. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
e046fceb73
commit
8da8f91d59
2 changed files with 52 additions and 1 deletions
|
|
@ -41,12 +41,21 @@ def _safe_is_dir(path) -> bool:
|
|||
|
||||
def _is_hidden_model(*values: str | None) -> bool:
|
||||
"""True if any id/path is the RAG embedding model (EMBEDDING_MODEL or
|
||||
EMBED_GGUF_REPO basename), so pickers hide it (GGUF and non-GGUF)."""
|
||||
EMBED_GGUF_REPO basename) or the llama.cpp install validation probe
|
||||
(ggml-org/models / stories260K), so pickers hide them (GGUF and non-GGUF).
|
||||
None are usable chat models; the probe can be cached as a side effect of
|
||||
installing the prebuilt llama-server and otherwise sorts smallest, so it
|
||||
would be auto-selected."""
|
||||
from core.rag import config as rag_config
|
||||
|
||||
needles = (
|
||||
rag_config.EMBEDDING_MODEL.split("/")[-1].lower(),
|
||||
rag_config.EMBED_GGUF_REPO.split("/")[-1].lower(),
|
||||
# The validation probe's repo (matches the cached repo id) and its exact
|
||||
# filename (matches the on-disk path). The filename carries the .gguf so
|
||||
# it does not hide unrelated repos like ``user/stories260K-finetune-GGUF``.
|
||||
"ggml-org/models",
|
||||
"stories260k.gguf",
|
||||
)
|
||||
return any(v and any(n in v.lower() for n in needles) for v in values)
|
||||
|
||||
|
|
|
|||
|
|
@ -107,6 +107,48 @@ def test_list_cached_gguf_matches_extension_case_insensitively(monkeypatch, tmp_
|
|||
]
|
||||
|
||||
|
||||
def test_is_hidden_model_hides_validation_probe_everywhere():
|
||||
"""Every picker (model list, local, cached GGUF, cached models) gates on
|
||||
_is_hidden_model, so hiding the probe here hides it in the search menu too.
|
||||
Cover both forms callers pass: the reconstructed repo id and the on-disk
|
||||
snapshot path."""
|
||||
assert models_route._is_hidden_model("ggml-org/models")
|
||||
assert models_route._is_hidden_model("ggml-org/models/tinyllamas/stories260K.gguf")
|
||||
assert models_route._is_hidden_model(
|
||||
None, "/hf/models--ggml-org--models/snapshots/abc/tinyllamas/stories260K.gguf"
|
||||
)
|
||||
assert not models_route._is_hidden_model("unsloth/gemma-3-270m-it-GGUF")
|
||||
# The exact-filename needle must not hide a real repo that merely
|
||||
# references stories260K in its name.
|
||||
assert not models_route._is_hidden_model("user/stories260K-finetune-GGUF")
|
||||
|
||||
|
||||
def test_list_cached_gguf_hides_llama_validation_probe(monkeypatch, tmp_path):
|
||||
"""The ggml-org/models / stories260K install validation probe can land in
|
||||
the HF cache as a side effect of installing the prebuilt llama-server.
|
||||
It is not a chat model (it sorts smallest and would be auto-selected), so
|
||||
pickers must hide it while keeping real cached models."""
|
||||
probe = _repo(
|
||||
"ggml-org/models",
|
||||
[_file("tinyllamas/stories260K.gguf", 1_000)],
|
||||
tmp_path / "models--ggml-org--models",
|
||||
)
|
||||
real = _repo(
|
||||
"unsloth/gemma-3-270m-it-GGUF",
|
||||
[_file("gemma-3-270m-it-UD-Q4_K_XL.gguf", 200_000)],
|
||||
tmp_path / "models--unsloth--gemma-3-270m-it-GGUF",
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
models_route, "_all_hf_cache_scans", lambda: [SimpleNamespace(repos = [probe, real])]
|
||||
)
|
||||
|
||||
result = asyncio.run(models_route.list_cached_gguf(current_subject = "test-user"))
|
||||
|
||||
repo_ids = [c["repo_id"] for c in result["cached"]]
|
||||
assert "ggml-org/models" not in repo_ids
|
||||
assert "unsloth/gemma-3-270m-it-GGUF" in repo_ids
|
||||
|
||||
|
||||
def test_list_cached_gguf_skips_repos_without_positive_gguf_size(monkeypatch, tmp_path):
|
||||
missing = _repo(
|
||||
"Org/ReadmeOnly",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue