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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user