feat: config structure validation — detect malformed YAML at startup (#5426)

Add validate_config_structure() that catches common config.yaml mistakes:
- custom_providers as dict instead of list (missing '-' in YAML)
- fallback_model accidentally nested inside another section
- custom_providers entries missing required fields (name, base_url)
- Missing model section when custom_providers is configured
- Root-level keys that look like misplaced custom_providers fields

Surface these diagnostics at three levels:
1. Startup: print_config_warnings() runs at CLI and gateway module load,
   so users see issues before hitting cryptic errors
2. Error time: 'Unknown provider' errors in auth.py and model_switch.py
   now include config diagnostics with fix suggestions
3. Doctor: 'hermes doctor' shows a Config Structure section with all
   issues and fix hints

Also adds a warning log in runtime_provider.py when custom_providers
is a dict (previously returned None silently).

Motivated by a Discord user who had malformed custom_providers YAML
and got only 'Unknown Provider' with no guidance on what was wrong.

17 new tests covering all validation paths.
This commit is contained in:
Teknium 2026-04-05 23:31:20 -07:00 committed by GitHub
parent 9ca954a274
commit dce5f51c7c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 443 additions and 9 deletions

7
cli.py
View file

@ -453,6 +453,13 @@ def load_cli_config() -> Dict[str, Any]:
# Load configuration at module startup
CLI_CONFIG = load_cli_config()
# Validate config structure early — print warnings before user hits cryptic errors
try:
from hermes_cli.config import print_config_warnings
print_config_warnings()
except Exception:
pass
# Initialize the skin engine from config
try:
from hermes_cli.skin_engine import init_skin_from_config