from __future__ import annotations from pathlib import Path from app.config import Settings from app.route import ( Brain, looks_like_gemma, parse_hermes_providers, resolve_brain, ) HERMES = """ custom_providers: - name: qwen38-nvfp4 base_url: http://10.100.10.5:8078/v1 api_key: EMPTY models: - qwen38-nvfp4 - name: gemma4-12b-it base_url: http://10.100.10.4:8080/v1 api_key: EMPTY models: - google/gemma-4-12B-it mcp_servers: slate: command: node """ def test_parse_hermes_finds_gemma_only() -> None: brains = parse_hermes_providers(HERMES) assert len(brains) == 1 assert brains[0].kind == "hermes" assert brains[0].base_url == "http://10.100.10.4:8080/v1" assert brains[0].model == "google/gemma-4-12B-it" assert "gemma4-12b-it" in brains[0].source def test_looks_like_gemma() -> None: assert looks_like_gemma("google/gemma-4-12B-it") assert looks_like_gemma("gemma4-12b-it") assert not looks_like_gemma("qwen38-nvfp4") def test_resolve_direct(settings: Settings) -> None: settings = settings.model_copy(update={"llm_route": "direct"}) brain = resolve_brain(settings, probe=lambda _u: []) assert brain.kind == "direct" assert brain.base_url == "http://llm.test/v1" def test_resolve_hermes(settings: Settings, tmp_path: Path) -> None: cfg = tmp_path / "config.yaml" cfg.write_text(HERMES, encoding="utf-8") settings = settings.model_copy( update={"llm_route": "hermes", "hermes_config_path": cfg, "hermes_base_url": ""} ) brain = resolve_brain( settings, probe=lambda url: ["google/gemma-4-12B-it"] if "8080" in url else [], ) assert brain.kind == "hermes" assert brain.base_url.endswith(":8080/v1") def test_parse_live_hermes_config_does_not_crash() -> None: from app.route import brains_from_hermes_file path = Path.home() / ".hermes" / "config.yaml" brains = brains_from_hermes_file(path) assert all(b.kind == "hermes" for b in brains) for brain in brains: assert "gemma" in brain.model.lower() or "gemma" in brain.source.lower() def test_resolve_auto_studio(settings: Settings) -> None: settings = settings.model_copy( update={"llm_route": "auto", "studio_url": "http://gpu.example:7860"} ) brain = resolve_brain( settings, probe=lambda _u: [], studio_probe=lambda _u: True, ) assert brain == Brain("studio", "http://gpu.example:7860", settings.llm_model, "RECEIPT_STUDIO_URL")