diff --git a/tests/test_tui_gateway_server.py b/tests/test_tui_gateway_server.py index 44a66ae0f2..03d44c057a 100644 --- a/tests/test_tui_gateway_server.py +++ b/tests/test_tui_gateway_server.py @@ -627,7 +627,9 @@ def test_session_create_drops_pending_title_on_valueerror(monkeypatch): monkeypatch.setattr(_approval, "register_gateway_notify", lambda key, cb: None) monkeypatch.setattr(_approval, "load_permanent_allowlist", lambda: None) - resp = server.handle_request({"id": "1", "method": "session.create", "params": {"cols": 80}}) + resp = server.handle_request( + {"id": "1", "method": "session.create", "params": {"cols": 80}} + ) sid = resp["result"]["session_id"] session = server._sessions[sid] session["pending_title"] = "duplicate title" @@ -670,12 +672,22 @@ def test_config_set_yolo_toggles_session_scope(): def test_config_set_fast_updates_live_agent_and_config(monkeypatch): writes = [] emits = [] - agent = types.SimpleNamespace(service_tier=None) + agent = types.SimpleNamespace( + model="openai/gpt-5.4", + request_overrides={"foo": "bar", "speed": "slow"}, + service_tier=None, + ) server._sessions["sid"] = _session(agent=agent) - monkeypatch.setattr(server, "_write_config_key", lambda path, value: writes.append((path, value))) + monkeypatch.setattr( + server, "_write_config_key", lambda path, value: writes.append((path, value)) + ) monkeypatch.setattr(server, "_session_info", lambda _agent: {"model": "x"}) monkeypatch.setattr(server, "_emit", lambda *args: emits.append(args)) + monkeypatch.setattr( + "hermes_cli.models.resolve_fast_mode_overrides", + lambda _model_id: {"service_tier": "priority"}, + ) try: resp = server.handle_request( @@ -687,8 +699,50 @@ def test_config_set_fast_updates_live_agent_and_config(monkeypatch): ) assert resp["result"]["value"] == "fast" assert agent.service_tier == "priority" + assert agent.request_overrides == { + "foo": "bar", + "service_tier": "priority", + } assert ("agent.service_tier", "fast") in writes assert ("session.info", "sid", {"model": "x"}) in emits + + resp_normal = server.handle_request( + { + "id": "2", + "method": "config.set", + "params": {"session_id": "sid", "key": "fast", "value": "normal"}, + } + ) + assert resp_normal["result"]["value"] == "normal" + assert agent.service_tier is None + assert agent.request_overrides == {"foo": "bar"} + assert ("agent.service_tier", "normal") in writes + finally: + server._sessions.pop("sid", None) + + +def test_config_set_fast_status_is_non_mutating(monkeypatch): + writes = [] + emits = [] + agent = types.SimpleNamespace(service_tier="priority") + server._sessions["sid"] = _session(agent=agent) + + monkeypatch.setattr( + server, "_write_config_key", lambda path, value: writes.append((path, value)) + ) + monkeypatch.setattr(server, "_emit", lambda *args: emits.append(args)) + + try: + resp = server.handle_request( + { + "id": "1", + "method": "config.set", + "params": {"session_id": "sid", "key": "fast", "value": "status"}, + } + ) + assert resp["result"]["value"] == "fast" + assert writes == [] + assert emits == [] finally: server._sessions.pop("sid", None) @@ -701,7 +755,9 @@ def test_config_busy_get_and_set(monkeypatch): "_load_cfg", lambda: {"display": {"busy_input_mode": "steer"}}, ) - monkeypatch.setattr(server, "_write_config_key", lambda path, value: writes.append((path, value))) + monkeypatch.setattr( + server, "_write_config_key", lambda path, value: writes.append((path, value)) + ) get_resp = server.handle_request( {"id": "1", "method": "config.get", "params": {"key": "busy"}} diff --git a/tui_gateway/server.py b/tui_gateway/server.py index 68d1cfcaec..a48058674b 100644 --- a/tui_gateway/server.py +++ b/tui_gateway/server.py @@ -2885,10 +2885,14 @@ def _(rid, params: dict) -> dict: else: current_fast = _load_service_tier() == "priority" + if raw in {"status"}: + return _ok( + rid, + {"key": key, "value": "fast" if current_fast else "normal"}, + ) + if raw in ("", "toggle"): nv = "normal" if current_fast else "fast" - elif raw in {"status"}: - nv = "fast" if current_fast else "normal" elif raw in {"fast", "on"}: nv = "fast" elif raw in {"normal", "off"}: @@ -2898,8 +2902,23 @@ def _(rid, params: dict) -> dict: _write_config_key("agent.service_tier", nv) if session and session.get("agent") is not None: - session["agent"].service_tier = "priority" if nv == "fast" else None - _emit("session.info", params.get("session_id", ""), _session_info(session["agent"])) + agent = session["agent"] + 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 {} + ) + agent.request_overrides = current_overrides + _emit( + "session.info", + params.get("session_id", ""), + _session_info(agent), + ) return _ok(rid, {"key": key, "value": nv}) if key == "busy": @@ -3188,13 +3207,12 @@ def _(rid, params: dict) -> dict: return _ok( rid, { - "value": "fast" - if (session := _sessions.get(params.get("session_id", ""))) - and getattr(session.get("agent"), "service_tier", None) == "priority" - else ( + "value": ( "fast" - if _load_service_tier() == "priority" - else "normal" + if (session := _sessions.get(params.get("session_id", ""))) + and getattr(session.get("agent"), "service_tier", None) + == "priority" + else ("fast" if _load_service_tier() == "priority" else "normal") ), }, )