From bc3f4ed70fa5380e0102e5c0220604b4eb726c39 Mon Sep 17 00:00:00 2001 From: IAvecilla Date: Fri, 12 Jun 2026 11:59:15 -0300 Subject: [PATCH] Skip redundant model switch --- tests/test_tui_gateway_server.py | 31 +++++++++++++++++++++++++++++++ tui_gateway/server.py | 7 +++++++ 2 files changed, 38 insertions(+) diff --git a/tests/test_tui_gateway_server.py b/tests/test_tui_gateway_server.py index 3ac5c37090f..688fcfed5b3 100644 --- a/tests/test_tui_gateway_server.py +++ b/tests/test_tui_gateway_server.py @@ -1133,6 +1133,37 @@ def test_config_sync_noop_when_config_unchanged(monkeypatch): server._sync_agent_model_with_config("sid", session) +def test_config_sync_adopts_baseline_when_agent_already_on_target(monkeypatch): + # Branched/resumed sessions reach their first sync with no snapshot but + # an agent already built from config; that must not trigger a switch. + _patch_config_model(monkeypatch, "old/model") + session = _sync_test_session() + monkeypatch.setattr( + server, + "_apply_model_switch", + lambda *a, **k: pytest.fail("agent already on target must not switch"), + ) + + server._sync_agent_model_with_config("sid", session) + + assert session["config_model_seen"] == ("old/model", "") + + +def test_config_sync_switches_when_only_provider_differs(monkeypatch): + _patch_config_model(monkeypatch, "old/model", provider="nous") + session = _sync_test_session(config_model_seen=("old/model", "")) + calls = [] + monkeypatch.setattr( + server, + "_apply_model_switch", + lambda sid, sess, raw, **kw: calls.append(raw), + ) + + server._sync_agent_model_with_config("sid", session) + + assert calls == ["old/model --provider nous"] + + def test_config_sync_failure_emits_error_once_per_edit(monkeypatch): _patch_config_model(monkeypatch, "broken/model") session = _sync_test_session(config_model_seen=("old/model", "")) diff --git a/tui_gateway/server.py b/tui_gateway/server.py index c5d87a68a3a..5f9b7e1fb6f 100644 --- a/tui_gateway/server.py +++ b/tui_gateway/server.py @@ -2036,6 +2036,13 @@ def _sync_agent_model_with_config(sid: str, session: dict) -> None: if target == seen: return model, provider = target + # Already running the configured model (branched/resumed session before + # its first sync, or a config revert after a failed switch): adopt the + # baseline without a redundant switch. + if model == getattr(agent, "model", "") and ( + not provider or provider == getattr(agent, "provider", "") + ): + return raw = f"{model} --provider {provider}" if provider else model try: _apply_model_switch(