fix(provider): honor configured llamacpp endpoint

This commit is contained in:
fangliquan
2026-09-19 22:41:51 +08:00
committed by Teknium
parent 78b5dbfb08
commit ef8222b932
3 changed files with 63 additions and 4 deletions

View File

@@ -480,8 +480,9 @@ def _llamacpp_pdef() -> Optional[ProviderDef]:
one) resolves — reachability is the credential. Without this rung model-switch rejected the very
provider the Local Models 'Use' flow writes to config."""
try:
from hermes_cli.config import load_config_readonly
from hermes_cli.local_runtime.endpoint import resolve_llamacpp_endpoint
endpoint = resolve_llamacpp_endpoint(wait_for_boot_s=0)
endpoint = resolve_llamacpp_endpoint(load_config_readonly(), wait_for_boot_s=0)
except Exception:
endpoint = None
if not endpoint:

View File

@@ -432,7 +432,7 @@ def _resolve_llamacpp_runtime(requested_provider: str, explicit_api_key: Optiona
rp = _rp()
try:
from hermes_cli.local_runtime.endpoint import resolve_llamacpp_endpoint
endpoint = resolve_llamacpp_endpoint()
endpoint = resolve_llamacpp_endpoint(rp.load_config())
except Exception: # noqa: BLE001 — resolution is best-effort
endpoint = None
if endpoint:
@@ -533,13 +533,16 @@ def _resolve_named_custom_runtime(*, requested_provider: str, explicit_api_key:
# treated identically here, so a YAML `provider: ollama` with a LAN/WireGuard `base_url` doesn't
# silently fall through to OpenRouter.
requested_norm = (requested_provider or "").strip().lower()
custom_provider = None
if requested_norm in _LLAMACPP_ALIASES and not explicit_base_url:
return _resolve_llamacpp_runtime(requested_provider, explicit_api_key)
custom_provider = rp._get_named_custom_provider(requested_provider)
if not custom_provider:
return _resolve_llamacpp_runtime(requested_provider, explicit_api_key)
if requested_norm and requested_norm != "custom" and rp._resolves_to_custom(requested_norm):
requested_norm = "custom"
if requested_norm == "custom" and explicit_base_url:
return _resolve_direct_alias_runtime(requested_provider, explicit_api_key, explicit_base_url)
custom_provider = rp._get_named_custom_provider(requested_provider)
custom_provider = custom_provider or rp._get_named_custom_provider(requested_provider)
if not custom_provider:
return None
base_url = ((explicit_base_url or "").strip() or custom_provider.get("base_url", "")).rstrip("/")

View File

@@ -786,6 +786,61 @@ def test_runtime_provider_seam_llamacpp_alias(tmp_path, monkeypatch, stub_server
assert runtime["provider"] == "custom"
def test_configured_llamacpp_provider_wins_over_managed_alias(tmp_path, monkeypatch):
"""A providers.llamacpp endpoint is explicit configuration, not a managed-runtime request."""
monkeypatch.setenv("HERMES_HOME", str(tmp_path / ".hermes"))
monkeypatch.setattr(
"hermes_cli.config.load_config",
lambda: {
"providers": {
"llamacpp": {
"base_url": "http://127.0.0.1:8081/v1",
"default_model": "configured-model",
}
}
},
)
def _managed_alias_must_not_run(*args, **kwargs):
raise AssertionError("configured providers.llamacpp must resolve before managed detection")
monkeypatch.setattr(
"hermes_cli.local_runtime.endpoint.resolve_llamacpp_endpoint",
_managed_alias_must_not_run,
)
from hermes_cli.runtime_provider import _resolve_named_custom_runtime
runtime = _resolve_named_custom_runtime(requested_provider="llamacpp")
assert runtime is not None
assert runtime["base_url"] == "http://127.0.0.1:8081/v1"
assert runtime["model"] == "configured-model"
assert runtime["source"].startswith("custom_provider:")
def test_llamacpp_runtime_forwards_detect_ports_config(monkeypatch):
"""The managed-alias fallback passes local_runtime.detect_ports to endpoint detection."""
config = {"local_runtime": {"enabled": True, "detect_ports": [8081]}}
monkeypatch.setattr("hermes_cli.config.load_config", lambda: config)
seen = []
def _resolve(passed_config, **kwargs):
seen.append(passed_config)
return {"base_url": "http://127.0.0.1:8081/v1", "api_key": ""}
monkeypatch.setattr(
"hermes_cli.local_runtime.endpoint.resolve_llamacpp_endpoint",
_resolve,
)
from hermes_cli.runtime_provider import _resolve_named_custom_runtime
runtime = _resolve_named_custom_runtime(requested_provider="llamacpp")
assert seen == [config]
assert runtime is not None
assert runtime["base_url"] == "http://127.0.0.1:8081/v1"
def test_runtime_provider_seam_explicit_base_url_wins(tmp_path, monkeypatch):
"""A user-specified base_url must never be overridden by the managed
endpoint — pointing at a specific server means that server."""