fix(tui): respect max turns config

Co-authored-by: YuShu <24110240104@m.fudan.edu.cn>
This commit is contained in:
Brooklyn Nicholson
2026-04-30 12:24:53 -05:00
parent d499d17271
commit b9d9fa7df8
2 changed files with 141 additions and 3 deletions

View File

@@ -3911,3 +3911,134 @@ def test_reload_env_rpc_surfaces_errors(monkeypatch):
assert "error" in resp
assert "env path locked" in resp["error"]["message"]
# ── max_iterations config reading ─────────────────────────────────────
def _setup_make_agent_mocks(monkeypatch, cfg):
monkeypatch.setattr(server, "_load_cfg", lambda: cfg)
monkeypatch.setattr(server, "_resolve_startup_runtime", lambda: ("test-model", None))
monkeypatch.setattr(
"hermes_cli.runtime_provider.resolve_runtime_provider",
lambda requested=None, target_model=None: {
"provider": None,
"base_url": None,
"api_key": None,
"api_mode": None,
"command": None,
"args": None,
"credential_pool": None,
},
)
monkeypatch.setattr(server, "_load_tool_progress_mode", lambda: "off")
monkeypatch.setattr(server, "_load_reasoning_config", lambda: None)
monkeypatch.setattr(server, "_load_service_tier", lambda: None)
monkeypatch.setattr(server, "_load_enabled_toolsets", lambda: None)
monkeypatch.setattr(server, "_get_db", lambda: None)
monkeypatch.setattr(server, "_agent_cbs", lambda sid: {})
def test_make_agent_reads_nested_max_turns(monkeypatch):
_setup_make_agent_mocks(monkeypatch, {"agent": {"max_turns": 200}})
with patch("run_agent.AIAgent") as mock_agent:
server._make_agent("sid1", "key1")
assert mock_agent.call_args.kwargs["max_iterations"] == 200
def test_make_agent_nested_max_turns_takes_priority(monkeypatch):
_setup_make_agent_mocks(monkeypatch, {"agent": {"max_turns": 500}, "max_turns": 100})
with patch("run_agent.AIAgent") as mock_agent:
server._make_agent("sid1", "key1")
assert mock_agent.call_args.kwargs["max_iterations"] == 500
def test_make_agent_defaults_to_90(monkeypatch):
_setup_make_agent_mocks(monkeypatch, {})
with patch("run_agent.AIAgent") as mock_agent:
server._make_agent("sid1", "key1")
assert mock_agent.call_args.kwargs["max_iterations"] == 90
def test_make_agent_handles_null_agent_config(monkeypatch):
_setup_make_agent_mocks(monkeypatch, {"agent": None, "max_turns": 80})
with patch("run_agent.AIAgent") as mock_agent:
server._make_agent("sid1", "key1")
assert mock_agent.call_args.kwargs["max_iterations"] == 80
class _FakeAgentForBackground:
base_url = None
api_key = None
provider = None
api_mode = None
acp_command = None
acp_args = None
model = "test-model"
enabled_toolsets = None
ephemeral_system_prompt = None
providers_allowed = None
providers_ignored = None
providers_order = None
provider_sort = None
provider_require_parameters = False
provider_data_collection = None
reasoning_config = None
service_tier = None
request_overrides = {}
_fallback_model = None
def test_background_agent_kwargs_reads_nested_max_turns(monkeypatch):
monkeypatch.setattr(server, "_load_cfg", lambda: {"agent": {"max_turns": 300}})
kwargs = server._background_agent_kwargs(_FakeAgentForBackground(), "task_1")
assert kwargs["max_iterations"] == 300
def test_background_agent_kwargs_falls_back_to_root_max_turns(monkeypatch):
monkeypatch.setattr(server, "_load_cfg", lambda: {"max_turns": 50})
kwargs = server._background_agent_kwargs(_FakeAgentForBackground(), "task_1")
assert kwargs["max_iterations"] == 50
def test_background_agent_kwargs_defaults_to_25(monkeypatch):
monkeypatch.setattr(server, "_load_cfg", lambda: {})
kwargs = server._background_agent_kwargs(_FakeAgentForBackground(), "task_1")
assert kwargs["max_iterations"] == 25
def test_background_agent_kwargs_handles_null_agent_config(monkeypatch):
monkeypatch.setattr(server, "_load_cfg", lambda: {"agent": None, "max_turns": 40})
kwargs = server._background_agent_kwargs(_FakeAgentForBackground(), "task_1")
assert kwargs["max_iterations"] == 40
def test_config_show_displays_nested_max_turns(monkeypatch):
monkeypatch.setattr(
server,
"_load_cfg",
lambda: {"agent": {"max_turns": 120}, "enabled_toolsets": [], "verbose": False},
)
monkeypatch.setattr(server, "_resolve_model", lambda: "test-model")
resp = server.handle_request({"id": "1", "method": "config.show", "params": {}})
sections = resp["result"]["sections"]
agent_rows = next(section["rows"] for section in sections if section["title"] == "Agent")
assert ["Max Turns", "120"] in agent_rows