File size: 2,550 Bytes
676f5d4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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")