diff --git a/hermes_cli/model_switch.py b/hermes_cli/model_switch.py index d2cdcc908..cca465856 100644 --- a/hermes_cli/model_switch.py +++ b/hermes_cli/model_switch.py @@ -25,6 +25,7 @@ from dataclasses import dataclass from typing import List, NamedTuple, Optional from hermes_cli.providers import ( + custom_provider_slug, determine_api_mode, get_label, is_aggregator, @@ -887,7 +888,7 @@ def list_authenticated_providers( if not display_name or not api_url: continue - slug = "custom:" + display_name.lower().replace(" ", "-") + slug = custom_provider_slug(display_name) if slug in seen_slugs: continue diff --git a/hermes_cli/providers.py b/hermes_cli/providers.py index 13081fddb..633ff1ccf 100644 --- a/hermes_cli/providers.py +++ b/hermes_cli/providers.py @@ -452,6 +452,16 @@ def resolve_user_provider(name: str, user_config: Dict[str, Any]) -> Optional[Pr ) +def custom_provider_slug(display_name: str) -> str: + """Build a canonical slug for a custom_providers entry. + + Matches the convention used by runtime_provider and credential_pool + (``custom:``). Centralised here so all call-sites + produce identical slugs. + """ + return "custom:" + display_name.strip().lower().replace(" ", "-") + + def resolve_custom_provider( name: str, custom_providers: Optional[List[Dict[str, Any]]], @@ -461,7 +471,6 @@ def resolve_custom_provider( return None requested = (name or "").strip().lower() - canonical = normalize_provider(name) if not requested: return None @@ -479,8 +488,8 @@ def resolve_custom_provider( if not display_name or not api_url: continue - slug = "custom:" + display_name.lower().replace(" ", "-") - if requested not in {display_name.lower(), slug, canonical}: + slug = custom_provider_slug(display_name) + if requested not in {display_name.lower(), slug}: continue return ProviderDef( diff --git a/tests/gateway/test_model_command_custom_providers.py b/tests/gateway/test_model_command_custom_providers.py index f64ce85c2..ed97e527b 100644 --- a/tests/gateway/test_model_command_custom_providers.py +++ b/tests/gateway/test_model_command_custom_providers.py @@ -12,6 +12,8 @@ from gateway.session import SessionSource def _make_runner(): runner = object.__new__(GatewayRunner) runner.adapters = {} + runner._voice_mode = {} + runner._session_model_overrides = {} return runner