diff --git a/hermes_cli/setup.py b/hermes_cli/setup.py index 0bc9acc0a3..89551f7b76 100644 --- a/hermes_cli/setup.py +++ b/hermes_cli/setup.py @@ -395,11 +395,14 @@ def run_setup_wizard(args): # a template, so it always exists after install. We need an actual # inference provider to consider it "existing" (otherwise quick mode # would skip provider selection, leaving hermes non-functional). + # NOTE: Use bool() not `is not None` — the .env template has empty + # values (e.g. OPENROUTER_API_KEY=) that load_dotenv sets to "", which + # passes `is not None` but isn't a real configured provider. from hermes_cli.auth import get_active_provider active_provider = get_active_provider() is_existing = ( - get_env_value("OPENROUTER_API_KEY") is not None - or get_env_value("OPENAI_BASE_URL") is not None + bool(get_env_value("OPENROUTER_API_KEY")) + or bool(get_env_value("OPENAI_BASE_URL")) or active_provider is not None ) diff --git a/scripts/install.sh b/scripts/install.sh index 0e2cf92a65..69b5f43fc6 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -848,8 +848,11 @@ run_setup_wizard() { return 0 fi - if [ "$IS_INTERACTIVE" = false ]; then - log_info "Setup wizard skipped (non-interactive). Run 'hermes setup' after install." + # The setup wizard reads from /dev/tty, so it works even when the + # install script itself is piped (curl | bash). Only skip if no + # terminal is available at all (e.g. Docker build, CI). + if ! [ -e /dev/tty ]; then + log_info "Setup wizard skipped (no terminal available). Run 'hermes setup' after install." return 0 fi