From 3cdc250d52f15d56e2551fca7434ab051a33319f Mon Sep 17 00:00:00 2001 From: inference-bot Date: Fri, 2 Oct 2026 22:30:11 -0600 Subject: [PATCH] =?UTF-8?q?Chat=20model=20picker:=20value-tier=20emoji=20+?= =?UTF-8?q?=20friendly=20names=20in=20/v1/models=20(=F0=9F=94=92=20private?= =?UTF-8?q?=20/=20=F0=9F=8C=B1=20green=20/=20=F0=9F=93=96=20public),=20id?= =?UTF-8?q?=20stays=20canonical?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/main.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/app/main.py b/app/main.py index bd7a40e..db176e8 100644 --- a/app/main.py +++ b/app/main.py @@ -1701,6 +1701,29 @@ async def opencollective_webhook(request: Request, token: str): # --- B. Key injector (proxy) --- +# --- Model picker: value-based naming --- +# The chat model picker displays each model's `name` field. We set it to a +# friendly name prefixed with an emoji for the provider's value tier, so the +# flat picker list clusters by what members care about (privacy / green / +# openness). The `id` field is left untouched — it remains the canonical key +# used for actual API calls. Same emoji as the docs (models.md). +MODEL_VALUE_EMOJI = { + "tinfoil": "🔒", # architecturally private (TEE) + "greenpt": "🌱", # 100% renewable energy + "publicai": "📖", # publicly developed, sovereign open models +} +MODEL_FRIENDLY_NAMES = { + "greenpt/deepseek-v4.1-flash": "DeepSeek V4.1", + "tinfoil/deepseek-v4-1-flash": "DeepSeek V4.1", + "tinfoil/glm-5-3-flash": "GLM-5.3 Flash", + "greenpt/glm-5.3-flash": "GLM-5.3 Flash", + "greenpt/glm-5.3": "GLM-5.3", + "tinfoil/gpt-oss-120b": "GPT-OSS 120B", + "publicai/apertus-v1.5-8b": "Apertus 8B", + "publicai/apertus-v1.5-70b": "Apertus 70B", +} + + @app.get("/v1/models") @limiter.limit("60/minute") async def list_models(request: Request): @@ -1742,6 +1765,16 @@ async def list_models(request: Request): payload["data"] = [m for m in payload.get("data", []) if not is_audio_model(m)] for model in payload.get("data", []): + # Friendly display name: emoji value-tier + short name. The `id` + # stays canonical (Open WebUI keys lookups and requests on it). + mid = model.get("id", "") + provider = mid.split("/", 1)[0] if "/" in mid else "" + emoji = MODEL_VALUE_EMOJI.get(provider, "") + friendly = MODEL_FRIENDLY_NAMES.get( + mid, mid.split("/", 1)[-1] if "/" in mid else mid + ) + model["name"] = f"{emoji} {friendly}".strip() + model.setdefault("info", {}).setdefault("meta", {}) model["info"]["meta"].setdefault("capabilities", {})["web_search"] = True model["info"]["meta"].setdefault("defaultFeatureIds", [])