mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-28 06:51:16 +08:00
* fix(tests): make AIAgent constructor calls self-contained (no env leakage)
Tests in tests/run_agent/ were constructing AIAgent() without passing
both api_key and base_url, then relying on leaked state from other
tests in the same xdist worker (or process-level env vars) to keep
provider resolution happy. Under hermetic conftest + pytest-split,
that state is gone and the tests fail with 'No LLM provider configured'.
Fix: pass both api_key and base_url explicitly on 47 AIAgent()
construction sites across 13 files. AIAgent.__init__ with both set
takes the direct-construction path (line 960 in run_agent.py) and
skips the resolver entirely.
One call site (test_none_base_url_passed_as_none) left alone — that
test asserts behavior for base_url=None specifically.
This is a prerequisite for any future matrix-split or stricter
isolation work, and lands cleanly on its own.
Validation:
- tests/run_agent/ full: 760 passed, 0 failed (local)
- Previously relied on cross-test pollution; now self-contained
* fix(tests): update opencode-go model order assertion to match kimi-k2.5-first
commit 78a74bb promoted kimi-k2.5 to first position in model suggestion
lists but didn't update this test, which has been failing on main since.
Reorder expected list to match the new canonical order.
38 lines
1.5 KiB
Python
38 lines
1.5 KiB
Python
"""Guardrail: _create_openai_client must not mutate its input kwargs.
|
|
|
|
#10933 injected an httpx.Client directly into the caller's ``client_kwargs``.
|
|
When the dict was ``self._client_kwargs``, the shared transport was torn down
|
|
after the first request_complete close and subsequent request-scoped clients
|
|
wrapped a closed transport, raising ``APIConnectionError('Connection error.')``
|
|
with cause ``RuntimeError: Cannot send a request, as the client has been closed``
|
|
on every retry. That PR has since been reverted, but the underlying issue
|
|
(#10324, connections hanging in CLOSE-WAIT) is still open, so another transport
|
|
tweak inside this function is likely. This test pins the contract that the
|
|
function must treat its input dict as read-only.
|
|
"""
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from run_agent import AIAgent
|
|
|
|
|
|
@patch("run_agent.OpenAI")
|
|
def test_create_openai_client_does_not_mutate_input_kwargs(mock_openai):
|
|
mock_openai.return_value = MagicMock()
|
|
agent = 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,
|
|
)
|
|
|
|
kwargs = {"api_key": "test-key", "base_url": "https://api.example.com/v1"}
|
|
snapshot = dict(kwargs)
|
|
|
|
agent._create_openai_client(kwargs, reason="test", shared=False)
|
|
|
|
assert kwargs == snapshot, (
|
|
f"_create_openai_client mutated input kwargs; expected {snapshot}, got {kwargs}"
|
|
)
|