fix(auth): keep Spotify logout from resetting model config

This commit is contained in:
LeonSGP43 2026-05-03 19:20:57 +08:00 committed by Teknium
parent 2021c18655
commit 8dcdc3cbc2
2 changed files with 61 additions and 5 deletions

View file

@ -4231,6 +4231,14 @@ def _config_provider_matches(provider_id: Optional[str]) -> bool:
return _get_config_provider() == provider_id.strip().lower()
def _should_reset_config_provider_on_logout(provider_id: Optional[str]) -> bool:
"""Return True when logout should reset the model provider config."""
if not provider_id:
return False
normalized = provider_id.strip().lower()
return normalized in PROVIDER_REGISTRY and _config_provider_matches(normalized)
def _logout_default_provider_from_config() -> Optional[str]:
"""Fallback logout target when auth.json has no active provider.
@ -5316,15 +5324,18 @@ def logout_command(args) -> None:
print("No provider is currently logged in.")
return
config_matches = _config_provider_matches(target)
should_reset_config = _should_reset_config_provider_on_logout(target)
provider_name = get_auth_provider_display_name(target)
if clear_provider_auth(target) or config_matches:
_reset_config_provider()
if clear_provider_auth(target) or should_reset_config:
if should_reset_config:
_reset_config_provider()
print(f"Logged out of {provider_name}.")
if os.getenv("OPENROUTER_API_KEY"):
if should_reset_config and os.getenv("OPENROUTER_API_KEY"):
print("Hermes will use OpenRouter for inference.")
else:
elif should_reset_config:
print("Run `hermes model` or configure an API key to use Hermes.")
else:
print("Model provider configuration was unchanged.")
else:
print(f"No auth state found for {provider_name}.")

View file

@ -88,6 +88,51 @@ def test_auth_spotify_status_command_reports_logged_in(capsys, monkeypatch: pyte
assert "client_id: spotify-client" in output
def test_spotify_logout_does_not_reset_model_provider(
tmp_path,
monkeypatch: pytest.MonkeyPatch,
capsys,
) -> None:
monkeypatch.setenv("HERMES_HOME", str(tmp_path))
config_path = tmp_path / "config.yaml"
config_path.write_text(
"model:\n"
" default: gemini-3-flash\n"
" provider: custom:local\n"
" base_url: http://localhost:11434/v1\n"
" api_key: ${LOCAL_API_KEY}\n",
encoding="utf-8",
)
with auth_mod._auth_store_lock():
store = auth_mod._load_auth_store()
auth_mod._store_provider_state(
store,
"spotify",
{
"client_id": "spotify-client",
"access_token": "access-token",
"refresh_token": "refresh-token",
"expires_at": "2099-01-01T00:00:00+00:00",
},
set_active=False,
)
auth_mod._save_auth_store(store)
auth_mod.logout_command(SimpleNamespace(provider="spotify"))
output = capsys.readouterr().out
assert "Logged out of Spotify." in output
assert "Model provider configuration was unchanged." in output
assert auth_mod.get_provider_auth_state("spotify") is None
assert config_path.read_text(encoding="utf-8") == (
"model:\n"
" default: gemini-3-flash\n"
" provider: custom:local\n"
" base_url: http://localhost:11434/v1\n"
" api_key: ${LOCAL_API_KEY}\n"
)
def test_spotify_interactive_setup_persists_client_id(
tmp_path,