fix(tui): reject fast mode for unsupported live models

Match classic CLI parity by refusing to enable fast mode when the active model cannot produce fast request overrides, avoiding a misleading fast status with no runtime effect.
This commit is contained in:
Brooklyn Nicholson
2026-04-27 12:55:41 -05:00
parent 8bd5d0667a
commit 4a08f1015a
2 changed files with 52 additions and 9 deletions

View File

@@ -747,6 +747,40 @@ def test_config_set_fast_status_is_non_mutating(monkeypatch):
server._sessions.pop("sid", None)
def test_config_set_fast_rejects_unsupported_model(monkeypatch):
writes = []
agent = types.SimpleNamespace(
model="unsupported-model",
request_overrides={},
service_tier=None,
)
server._sessions["sid"] = _session(agent=agent)
monkeypatch.setattr(
server, "_write_config_key", lambda path, value: writes.append((path, value))
)
monkeypatch.setattr(
"hermes_cli.models.resolve_fast_mode_overrides",
lambda _model_id: None,
)
try:
resp = server.handle_request(
{
"id": "1",
"method": "config.set",
"params": {"session_id": "sid", "key": "fast", "value": "fast"},
}
)
assert resp["error"]["code"] == 4002
assert "not available" in resp["error"]["message"]
assert agent.service_tier is None
assert agent.request_overrides == {}
assert writes == []
finally:
server._sessions.pop("sid", None)
def test_config_busy_get_and_set(monkeypatch):
writes = []

View File

@@ -2880,8 +2880,9 @@ def _(rid, params: dict) -> dict:
if key == "fast":
raw = str(value or "").strip().lower()
if session and session.get("agent") is not None:
current_fast = getattr(session["agent"], "service_tier", None) == "priority"
agent = session.get("agent") if session else None
if agent is not None:
current_fast = getattr(agent, "service_tier", None) == "priority"
else:
current_fast = _load_service_tier() == "priority"
@@ -2900,19 +2901,27 @@ def _(rid, params: dict) -> dict:
else:
return _err(rid, 4002, f"unknown fast mode: {value}")
overrides = None
if nv == "fast":
from hermes_cli.models import resolve_fast_mode_overrides
target_model = getattr(agent, "model", None) if agent is not None else _resolve_model()
overrides = resolve_fast_mode_overrides(target_model)
if not overrides:
return _err(
rid,
4002,
"fast mode is not available for this model",
)
_write_config_key("agent.service_tier", nv)
if session and session.get("agent") is not None:
agent = session["agent"]
if agent is not None:
agent.service_tier = "priority" if nv == "fast" else None
current_overrides = dict(getattr(agent, "request_overrides", {}) or {})
current_overrides.pop("service_tier", None)
current_overrides.pop("speed", None)
if nv == "fast":
from hermes_cli.models import resolve_fast_mode_overrides
current_overrides.update(
resolve_fast_mode_overrides(getattr(agent, "model", None)) or {}
)
current_overrides.update(overrides)
agent.request_overrides = current_overrides
_emit(
"session.info",