mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-29 06:31:32 +00:00
Remove unused imports (F401) and duplicate/shadowed import redefinitions (F811) across the codebase using ruff's safe autofixes. No behavioral changes -- imports only. - ~1400 safe autofixes applied across 644 files (net -1072 lines) - __init__.py re-exports preserved (excluded from F401 removal so public re-export surfaces stay intact) - Re-exports that are imported or monkeypatched by tests but look unused in their defining module are kept with explicit # noqa: F401 (gateway/run.py load_dotenv; run_agent re-exports from agent.message_sanitization, agent.context_compressor, agent.retry_utils, agent.prompt_builder, agent.process_bootstrap, agent.codex_responses_adapter) - Unsafe F841 (unused-variable) fixes deliberately skipped -- those can change behavior when the RHS has side effects - ruff lints remain disabled in pyproject.toml (only PLW1514 is selected); this is a one-time cleanup, not a config change Verification: - python -m compileall: clean - pytest --collect-only: all 27161 tests collect (zero import errors) - core entry points import clean (run_agent, model_tools, cli, toolsets, hermes_state, batch_runner, gateway) - static scan: every name any test imports directly from an edited module still resolves
65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
"""Tests for agent.api_max_retries config surface.
|
|
|
|
Closes #11616 — make the hardcoded ``max_retries = 3`` in the agent's API
|
|
retry loop user-configurable so fallback-provider setups can fail over
|
|
faster on flaky primaries instead of burning ~3x180s on the same stall.
|
|
"""
|
|
from unittest.mock import patch
|
|
|
|
from run_agent import AIAgent
|
|
|
|
|
|
def _make_agent(api_max_retries=None):
|
|
"""Build an AIAgent with a mocked config.load_config that returns a
|
|
config tree containing the given agent.api_max_retries (or default)."""
|
|
cfg = {"agent": {}}
|
|
if api_max_retries is not None:
|
|
cfg["agent"]["api_max_retries"] = api_max_retries
|
|
|
|
with patch("run_agent.OpenAI"), \
|
|
patch("hermes_cli.config.load_config", return_value=cfg):
|
|
return AIAgent(
|
|
api_key="test-key",
|
|
base_url="https://openrouter.ai/api/v1",
|
|
model="test/model",
|
|
quiet_mode=True,
|
|
skip_context_files=True,
|
|
skip_memory=True,
|
|
)
|
|
|
|
|
|
def test_default_api_max_retries_is_three():
|
|
"""No config override → legacy default of 3 retries preserved."""
|
|
agent = _make_agent()
|
|
assert agent._api_max_retries == 3
|
|
|
|
|
|
def test_api_max_retries_honors_config_override():
|
|
"""Setting agent.api_max_retries in config propagates to the agent."""
|
|
agent = _make_agent(api_max_retries=1)
|
|
assert agent._api_max_retries == 1
|
|
|
|
agent2 = _make_agent(api_max_retries=5)
|
|
assert agent2._api_max_retries == 5
|
|
|
|
|
|
def test_api_max_retries_clamps_below_one_to_one():
|
|
"""0 or negative values would disable the retry loop entirely
|
|
(the ``while retry_count < max_retries`` guard would never execute),
|
|
so clamp to 1 = single attempt, no retry."""
|
|
agent = _make_agent(api_max_retries=0)
|
|
assert agent._api_max_retries == 1
|
|
|
|
agent2 = _make_agent(api_max_retries=-3)
|
|
assert agent2._api_max_retries == 1
|
|
|
|
|
|
def test_api_max_retries_falls_back_on_invalid_value():
|
|
"""Garbage values in config don't crash agent init — fall back to 3."""
|
|
agent = _make_agent(api_max_retries="not-a-number")
|
|
assert agent._api_max_retries == 3
|
|
|
|
agent2 = _make_agent(api_max_retries=None)
|
|
# None with dict.get default fires → default(3), then int(None) raises
|
|
# TypeError → except branch sets to 3.
|
|
assert agent2._api_max_retries == 3
|