"""Regression tests for #1806 named custom provider routing. The WebUI must treat ``model.provider: `` as the same provider slug the picker emits: ``custom:``. Otherwise a stale agent-side base-url slug such as ``custom:local-(127.0.0.1:11434)`` can win model selection and send runtime auth down an impossible env-var path. """ from __future__ import annotations import json import sys import types import pytest import api.config as config @pytest.fixture(autouse=True) def _isolate_models_cache(tmp_path, monkeypatch): monkeypatch.setattr(config, "_models_cache_path", tmp_path / "models_cache.json") config.invalidate_models_cache() yield config.invalidate_models_cache() def _with_ollama_local_config(): old_cfg = dict(config.cfg) old_mtime = config._cfg_mtime old_path = getattr(config, "_cfg_path", None) config.cfg.clear() config.cfg.update( { "model": { "default": "carnice-9b:latest", "provider": "ollama-local", "base_url": "http://127.0.0.1:11434/v1", "api_key": "ollama", }, "custom_providers": [ { "name": "ollama-local", "base_url": "http://127.0.0.1:11434/v1", "api_key": "ollama", "model": "carnice-9b:latest", } ], } ) try: config._cfg_mtime = config.Path(config._get_config_path()).stat().st_mtime except Exception: config._cfg_mtime = 0.0 config._cfg_path = config._get_config_path() def restore(): config.cfg.clear() config.cfg.update(old_cfg) config._cfg_mtime = old_mtime config._cfg_path = old_path config.invalidate_models_cache() return restore def test_model_provider_name_resolves_to_named_custom_slug(): restore = _with_ollama_local_config() try: model, provider, base_url = config.resolve_model_provider("carnice-9b:latest") finally: restore() assert model == "carnice-9b:latest" assert provider == "custom:ollama-local" assert base_url == "http://127.0.0.1:11434/v1" def test_available_models_drops_base_url_derived_custom_slug(monkeypatch): """A stale agent catalog slug must not create a second local custom group.""" fake_models = types.ModuleType("hermes_cli.models") fake_models.list_available_providers = lambda: [ {"id": "custom:local-(127.0.0.1:11434)", "authenticated": True}, ] fake_auth = types.ModuleType("hermes_cli.auth") fake_auth.get_auth_status = lambda _pid: {"key_source": "config_yaml"} monkeypatch.setitem(sys.modules, "hermes_cli.models", fake_models) monkeypatch.setitem(sys.modules, "hermes_cli.auth", fake_auth) monkeypatch.setattr(config, "_get_auth_store_path", lambda: config.Path("/tmp/does-not-exist-auth.json")) monkeypatch.setattr("socket.getaddrinfo", lambda *a, **k: []) class _Resp: def read(self): return json.dumps( {"data": [{"id": "carnice-9b:latest", "name": "carnice-9b:latest"}]} ).encode("utf-8") def __enter__(self): return self def __exit__(self, exc_type, exc, tb): return False monkeypatch.setattr("urllib.request.urlopen", lambda *a, **k: _Resp()) restore = _with_ollama_local_config() try: result = config.get_available_models() finally: restore() assert result["active_provider"] == "custom:ollama-local" groups_by_id = {g["provider_id"]: g for g in result["groups"]} assert "custom:ollama-local" in groups_by_id assert "custom:local-(127.0.0.1:11434)" not in groups_by_id assert "ollama-local" not in groups_by_id named_models = [m["id"] for m in groups_by_id["custom:ollama-local"]["models"]] assert "carnice-9b:latest" in named_models