fix(models): duplicate dropdown entries, stale default model, lowercase injected label (#907 #908 #909) (#918)

Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
This commit is contained in:
nesquena-hermes
2026-04-23 14:41:06 -07:00
committed by GitHub
parent 5b923a9502
commit 1175ee363f
5 changed files with 211 additions and 5 deletions

View File

@@ -1071,6 +1071,39 @@ def invalidate_models_cache():
_available_models_cache_ts = 0.0
def _get_label_for_model(model_id: str, existing_groups: list) -> str:
"""Return a human-friendly label for *model_id*.
Resolution order:
1. If the model already appears in *existing_groups* with a label, use it.
2. Strip @provider: prefix and namespace prefix, then title-case.
This ensures the injected default model entry in the dropdown always shows
the same label as the live-fetched or static-catalog version, rather than
the raw lowercase ID string (#909).
"""
# Strip @provider: prefix for lookup
lookup_id = model_id
if lookup_id.startswith("@") and ":" in lookup_id:
lookup_id = lookup_id.split(":", 1)[1]
# Check existing groups for a matching label
_norm = lambda s: (s.split("/", 1)[-1] if "/" in s else s).replace("-", ".").lower()
norm_lookup = _norm(lookup_id)
for g in existing_groups:
for m in g.get("models", []):
if m.get("label") and _norm(str(m.get("id", ""))) == norm_lookup:
return m["label"]
# Fall back: capitalize each hyphen-separated word, preserve dots in version numbers.
# The catalog lookup above handles well-known models; this only fires for unlisted IDs.
bare = lookup_id.split("/")[-1] if "/" in lookup_id else lookup_id
return " ".join(
w.upper() if (len(w) <= 3 and w.replace(".", "").isalnum() and not w.isdigit()) else w.capitalize()
for w in bare.replace("_", "-").split("-")
)
def get_available_models() -> dict:
"""
Return available models grouped by provider.
@@ -1450,7 +1483,7 @@ def get_available_models() -> dict:
_cp_model = _cp.get("model", "")
_cp_name = (_cp.get("name") or "").strip()
if _cp_model and _cp_model not in _seen_custom_ids:
_cp_label = _cp_model.split("/")[-1] if "/" in _cp_model else _cp_model
_cp_label = _get_label_for_model(_cp_model, [])
_seen_custom_ids.add(_cp_model)
if _cp_name:
# Named custom provider — own group keyed by slug
@@ -1584,7 +1617,7 @@ def get_available_models() -> dict:
# can at least send messages with their current setting. Avoid showing a
# generic multi-provider list — those models wouldn't be routable anyway.
if default_model:
label = default_model.split("/")[-1] if "/" in default_model else default_model
label = _get_label_for_model(default_model, groups)
groups.append(
{"provider": "Default", "provider_id": "default", "models": [{"id": default_model, "label": label}]}
)
@@ -1606,9 +1639,7 @@ def get_available_models() -> dict:
# vs display name 'OpenAI Codex' (hyphen vs. space), which
# silently falls through to groups[0] and lands the model in
# the wrong group.
label = (
default_model.split("/")[-1] if "/" in default_model else default_model
)
label = _get_label_for_model(default_model, groups)
target_display = (
_PROVIDER_DISPLAY.get(active_provider, active_provider or "").lower()
if active_provider