diff --git a/hermes_cli/doctor.py b/hermes_cli/doctor.py index a76a6b390e..f1ef09dc8e 100644 --- a/hermes_cli/doctor.py +++ b/hermes_cli/doctor.py @@ -33,6 +33,26 @@ os.environ.setdefault("MSWEA_SILENT_STARTUP", "1") from hermes_cli.colors import Colors, color from hermes_constants import OPENROUTER_MODELS_URL + +_PROVIDER_ENV_HINTS = ( + "OPENROUTER_API_KEY", + "OPENAI_API_KEY", + "ANTHROPIC_API_KEY", + "OPENAI_BASE_URL", + "GLM_API_KEY", + "ZAI_API_KEY", + "Z_AI_API_KEY", + "KIMI_API_KEY", + "MINIMAX_API_KEY", + "MINIMAX_CN_API_KEY", +) + + +def _has_provider_env_config(content: str) -> bool: + """Return True when ~/.hermes/.env contains provider auth/base URL settings.""" + return any(key in content for key in _PROVIDER_ENV_HINTS) + + def check_ok(text: str, detail: str = ""): print(f" {color('✓', Colors.GREEN)} {text}" + (f" {color(detail, Colors.DIM)}" if detail else "")) @@ -132,12 +152,8 @@ def run_doctor(args): # Check for common issues content = env_path.read_text() - if any(k in content for k in ( - "OPENROUTER_API_KEY", "ANTHROPIC_API_KEY", - "GLM_API_KEY", "ZAI_API_KEY", "Z_AI_API_KEY", - "KIMI_API_KEY", "MINIMAX_API_KEY", "MINIMAX_CN_API_KEY", - )): - check_ok("API key configured") + if _has_provider_env_config(content): + check_ok("API key or custom endpoint configured") else: check_warn("No API key found in ~/.hermes/.env") issues.append("Run 'hermes setup' to configure API keys") diff --git a/tests/hermes_cli/test_doctor.py b/tests/hermes_cli/test_doctor.py new file mode 100644 index 0000000000..6594de4fad --- /dev/null +++ b/tests/hermes_cli/test_doctor.py @@ -0,0 +1,17 @@ +"""Tests for hermes doctor helpers.""" + +from hermes_cli.doctor import _has_provider_env_config + + +class TestProviderEnvDetection: + def test_detects_openai_api_key(self): + content = "OPENAI_BASE_URL=http://localhost:1234/v1\nOPENAI_API_KEY=sk-test-key\n" + assert _has_provider_env_config(content) + + def test_detects_custom_endpoint_without_openrouter_key(self): + content = "OPENAI_BASE_URL=http://localhost:8080/v1\n" + assert _has_provider_env_config(content) + + def test_returns_false_when_no_provider_settings(self): + content = "TERMINAL_ENV=local\n" + assert not _has_provider_env_config(content)