fix: extract custom_provider_slug() helper, harden gateway test

- Add custom_provider_slug() to hermes_cli/providers.py as the single
  source of truth for building 'custom:<name>' slugs.
- Use it in resolve_custom_provider() and list_authenticated_providers()
  instead of duplicated inline slug construction.
- Add _session_model_overrides and _voice_mode to gateway test runner
  for object.__new__() safety.
This commit is contained in:
Teknium
2026-04-10 02:52:56 -07:00
committed by Teknium
parent a2f46e4665
commit 568be71003
3 changed files with 16 additions and 4 deletions

View File

@@ -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

View File

@@ -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:<normalized-name>``). 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(

View File

@@ -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