diff --git a/routes/model_routes.py b/routes/model_routes.py index ac025ad..30c6562 100644 --- a/routes/model_routes.py +++ b/routes/model_routes.py @@ -1029,12 +1029,13 @@ def setup_model_routes(model_discovery): for ep in endpoints: base = _normalize_base(ep.base_url) provider = _detect_provider(base) - # Use cached models — background refresh keeps them updated - model_ids = _cached_model_ids(ep) + # Merge cached + pinned models, then filter out hidden ones ep_model_type = getattr(ep, "model_type", None) or "llm" - # Filter out hidden (probe-failed) models - hidden = _hidden_model_ids(ep) - model_ids = [m for m in model_ids if m not in hidden] + model_ids = _visible_models( + _cached_model_ids(ep), + ep.hidden_models, + getattr(ep, "pinned_models", None), + ) # Build correct URL based on provider chat_url = build_chat_url(base) kind = _effective_endpoint_kind(ep, base) @@ -1043,6 +1044,13 @@ def setup_model_routes(model_discovery): if model_ids: curated_key = _match_provider_curated(base, None) curated, extra = _curate_models(model_ids, curated_key) + # Pinned models are admin-selected — they always belong in the + # primary curated list, not buried in extras. + pinned = _normalize_model_ids(getattr(ep, "pinned_models", None)) + for m in pinned: + if m not in curated: + curated.append(m) + extra = [m for m in extra if m not in pinned] items.append({ "host": "custom", "port": 0,