From 7493de7fc31420c7814206140cdd6ed1ecceab48 Mon Sep 17 00:00:00 2001 From: teknium1 <127238744+teknium1@users.noreply.github.com> Date: Tue, 16 Jun 2026 12:00:16 -0700 Subject: [PATCH] test(model-switch): cover section-3 no-auth probe; map chimpera author Salvage follow-up for PR #29575: add regression tests for the section-3 no-api_key /v1/models probe (probes bare endpoints, skips when explicit models set) and add the contributor AUTHOR_MAP entry. --- scripts/release.py | 1 + .../test_user_providers_model_switch.py | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/scripts/release.py b/scripts/release.py index d04d864cfa1..30e1351f073 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -417,6 +417,7 @@ AUTHOR_MAP = { "cine.dreamer.one@gmail.com": "LeonSGP43", "david@nutricraft.ca": "cyb0rgk1tty", "214562553+cyb0rgk1tty@users.noreply.github.com": "cyb0rgk1tty", + "11052595+chimpera@users.noreply.github.com": "chimpera", "chris+dora@cmullins.io": "cmullins70", "zjtan1@gmail.com": "zeejaytan", "asslaenn5@gmail.com": "Aslaaen", diff --git a/tests/hermes_cli/test_user_providers_model_switch.py b/tests/hermes_cli/test_user_providers_model_switch.py index dbf4956418c..a4f201a060b 100644 --- a/tests/hermes_cli/test_user_providers_model_switch.py +++ b/tests/hermes_cli/test_user_providers_model_switch.py @@ -1044,3 +1044,81 @@ def test_user_provider_override_rejects_mangled_private_models( assert result.success is False assert result.error_message == "not found" + + +# ============================================================================= +# Section 3 no-auth live discovery (PR #29575) +# ============================================================================= + +def test_section3_probes_no_key_endpoint_without_explicit_models(monkeypatch): + """A providers: entry with no api_key and no explicit models: list should + still probe /v1/models for live discovery — mirroring section 4's policy. + + Regression for #29575: local self-hosted backends (llama.cpp, Ollama, + vLLM) that don't require auth previously showed an empty/minimal model + list because section 3 gated probing on ``api_url and api_key``. + """ + monkeypatch.setattr("agent.models_dev.fetch_models_dev", lambda: {}) + monkeypatch.setattr("hermes_cli.providers.HERMES_OVERLAYS", {}) + + probed = {} + + def _fake_fetch(api_key, api_url): + probed["called"] = True + probed["api_key"] = api_key + probed["api_url"] = api_url + return ["live-model-1", "live-model-2", "live-model-3"] + + monkeypatch.setattr("hermes_cli.models.fetch_api_models", _fake_fetch) + + user_providers = { + "local-llamacpp": { + "name": "Local llama.cpp", + "api": "http://localhost:8080/v1", + # No api_key, no models list — bare local endpoint. + } + } + + providers = list_authenticated_providers( + current_provider="local-llamacpp", + user_providers=user_providers, + custom_providers=[], + max_models=50, + ) + + assert probed.get("called") is True, "no-key bare endpoint should be probed" + assert probed["api_key"] == "" + row = next(p for p in providers if p["slug"] == "local-llamacpp") + assert row["models"] == ["live-model-1", "live-model-2", "live-model-3"] + assert row["total_models"] == 3 + + +def test_section3_skips_probe_when_no_key_but_explicit_models(monkeypatch): + """A no-key endpoint WITH an explicit models: list is the user narrowing a + public endpoint to a subset — skip live discovery and keep the list.""" + monkeypatch.setattr("agent.models_dev.fetch_models_dev", lambda: {}) + monkeypatch.setattr("hermes_cli.providers.HERMES_OVERLAYS", {}) + + def _fail_fetch(api_key, api_url): + raise AssertionError("should not probe when explicit models are set") + + monkeypatch.setattr("hermes_cli.models.fetch_api_models", _fail_fetch) + + user_providers = { + "public-subset": { + "name": "Public Subset", + "api": "https://ollama.com/v1", + "models": ["only-a", "only-b"], + } + } + + providers = list_authenticated_providers( + current_provider="public-subset", + user_providers=user_providers, + custom_providers=[], + max_models=50, + ) + + row = next(p for p in providers if p["slug"] == "public-subset") + assert row["models"] == ["only-a", "only-b"] + assert row["total_models"] == 2