diff --git a/gateway/platforms/telegram.py b/gateway/platforms/telegram.py index 4ab36be4a..c5d0add7d 100644 --- a/gateway/platforms/telegram.py +++ b/gateway/platforms/telegram.py @@ -3126,7 +3126,7 @@ class TelegramAdapter(BasePlatformAdapter): group_id = data[4:] try: from hermes_cli.models import PROVIDER_GROUPS - _label, member_slugs = PROVIDER_GROUPS.get(group_id, ("", [])) + _label, _desc, member_slugs = PROVIDER_GROUPS.get(group_id, ("", "", [])) except Exception: _label, member_slugs = "", [] diff --git a/hermes_cli/main.py b/hermes_cli/main.py index 1941dc2af..9198ece31 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -2434,7 +2434,8 @@ def select_provider_and_model(args=None): for row in grouped_rows: if row["kind"] == "group": gid = row["group_id"] - label = f"{row['label']} ▸" + group_desc = row.get("description", "") + label = f"{row['label']} ▸ ({group_desc})" if group_desc else f"{row['label']} ▸" key = f"group:{gid}" is_active = bool(active_group) and gid == active_group members = row["members"] diff --git a/hermes_cli/models.py b/hermes_cli/models.py index 100e74a38..b7cce1716 100644 --- a/hermes_cli/models.py +++ b/hermes_cli/models.py @@ -969,23 +969,26 @@ _PROVIDER_LABELS["custom"] = "Custom endpoint" # special case: not a named prov # display affordance; ``group_providers()`` is the single fold used by all # three picker surfaces so they stay consistent. # -# group_id -> (display_label, [member_slug, ...]) +# group_id -> (display_label, group_description, [member_slug, ...]) # +# ``group_description`` is a short blurb shown on the collapsed top-level group +# row in the interactive pickers (alongside the label). Member-specific detail +# lives in each member's ``tui_desc`` and shows in the drill-down sub-picker. # Member order is the order shown inside the group submenu. # --------------------------------------------------------------------------- -PROVIDER_GROUPS: dict[str, tuple[str, list[str]]] = { - "kimi": ("Kimi / Moonshot", ["kimi-coding", "kimi-coding-cn"]), - "minimax": ("MiniMax", ["minimax", "minimax-oauth", "minimax-cn"]), - "xai": ("xAI Grok", ["xai", "xai-oauth"]), - "google": ("Google Gemini", ["gemini", "google-gemini-cli"]), - "openai": ("OpenAI", ["openai-codex", "openai-api"]), - "opencode": ("OpenCode", ["opencode-zen", "opencode-go"]), - "copilot": ("GitHub Copilot", ["copilot", "copilot-acp"]), +PROVIDER_GROUPS: dict[str, tuple[str, str, list[str]]] = { + "kimi": ("Kimi / Moonshot", "Coding Plan, Moonshot global & China endpoints", ["kimi-coding", "kimi-coding-cn"]), + "minimax": ("MiniMax", "Global, OAuth Coding Plan & China endpoints", ["minimax", "minimax-oauth", "minimax-cn"]), + "xai": ("xAI Grok", "Direct API or SuperGrok / Premium+ OAuth", ["xai", "xai-oauth"]), + "google": ("Google Gemini", "AI Studio API or OAuth + Code Assist", ["gemini", "google-gemini-cli"]), + "openai": ("OpenAI", "Codex CLI or direct OpenAI API", ["openai-codex", "openai-api"]), + "opencode": ("OpenCode", "Zen pay-as-you-go or Go subscription", ["opencode-zen", "opencode-go"]), + "copilot": ("GitHub Copilot", "GitHub token API or copilot --acp process", ["copilot", "copilot-acp"]), } # Reverse index: member slug -> group_id. Built once at import. _SLUG_TO_GROUP: dict[str, str] = { - slug: gid for gid, (_label, members) in PROVIDER_GROUPS.items() for slug in members + slug: gid for gid, (_label, _desc, members) in PROVIDER_GROUPS.items() for slug in members } @@ -1006,7 +1009,7 @@ def group_providers(slugs): {"kind": "single", "slug": } # ungrouped, or # 1-member group {"kind": "group", "group_id": , "label":