mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
Systematic prune per AGENTS.md test policy, one pass over every major test tree (gateway, hermes_cli, tools, agent, run_agent, plugins, cli, cron, tui_gateway, honcho/openviking, root-level): - DELETE: source-reading tests (read_text/getsource on prod files), change-detector tests (exact catalog counts, model-name snapshots, config version literals), mock-echo tests (assert a mock returns what it was told), assertion-free/trivial tests, near-duplicate parametrizations (boundaries + one representative kept), async/sync twin duplicates, cosmetic within-file variations. - KEEP (mandatory): security/redaction/approval guards, message-role alternation invariants, prompt-caching/deterministic-call-id invariants, issue-number regression tests (deduped), E2E tests. - 6 test files deleted outright (script-style/no-assert or fully redundant); conftest.py, fakes/, fixtures/ untouched. - tests/acp/conftest.py added: autouse fixture stubs the live models.dev/GitHub/Copilot/Anthropic inventory fetches that ACP server tests performed on every session create — test_server.py 147s → 3.4s, and the tests are now genuinely hermetic. - Sleep-based slowness shrunk where safe (codex_ttfb_watchdog, compression_concurrent_fork, etc.); no wall-clock assertion tightened. Verification: full hermetic suite via scripts/run_tests.sh — 2439 files, 31,130 tests passed, 0 failed, 0 flaky retries, 315s wall (baseline: 583s wall, 13,564s subprocess CPU).
71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
"""Tests for sanitize_anthropic_kwargs (#31673).
|
|
|
|
Guards the Anthropic Messages dispatch boundary against Responses-API-only
|
|
kwargs (``instructions``, ``input``, ``store``, ``parallel_tool_calls``)
|
|
leaking in under an api_mode-flip race. The Anthropic SDK raises a
|
|
non-retryable ``TypeError`` on any of them, killing the whole turn.
|
|
"""
|
|
|
|
import logging
|
|
|
|
import pytest
|
|
|
|
from agent.anthropic_adapter import (
|
|
_RESPONSES_ONLY_KWARGS,
|
|
sanitize_anthropic_kwargs,
|
|
)
|
|
|
|
|
|
def _fake_anthropic_call(**kwargs):
|
|
"""Mimic the Anthropic SDK's strict kwarg signature."""
|
|
allowed = {
|
|
"model", "messages", "max_tokens", "system", "tools", "tool_choice",
|
|
"extra_body", "extra_headers", "temperature", "top_p", "top_k",
|
|
"thinking", "timeout",
|
|
}
|
|
bad = set(kwargs) - allowed
|
|
if bad:
|
|
raise TypeError(
|
|
"Messages.stream() got an unexpected keyword argument "
|
|
f"{sorted(bad)[0]!r}"
|
|
)
|
|
return "OK"
|
|
|
|
|
|
def test_bare_leaked_payload_reproduces_the_typeerror():
|
|
"""Without the guard, a Responses-shaped payload raises the issue's error."""
|
|
with pytest.raises(TypeError, match="unexpected keyword argument"):
|
|
_fake_anthropic_call(model="claude-sonnet-4-6", instructions="sys")
|
|
|
|
|
|
def test_strips_all_responses_only_keys():
|
|
payload = {
|
|
"model": "claude-sonnet-4-6",
|
|
"instructions": "You are Hermes.",
|
|
"input": [{"role": "user", "content": "hi"}],
|
|
"store": False,
|
|
"parallel_tool_calls": True,
|
|
}
|
|
out = sanitize_anthropic_kwargs(payload)
|
|
assert out is payload # mutates in place and returns same dict
|
|
assert payload == {"model": "claude-sonnet-4-6"}
|
|
assert _fake_anthropic_call(**payload) == "OK"
|
|
|
|
|
|
|
|
|
|
def test_warns_when_keys_are_stripped(caplog):
|
|
with caplog.at_level(logging.WARNING, logger="agent.anthropic_adapter"):
|
|
sanitize_anthropic_kwargs(
|
|
{"model": "m", "instructions": "sys"}, log_prefix="[pfx] "
|
|
)
|
|
assert any(
|
|
"31673" in r.message and "[pfx] " in r.message
|
|
for r in caplog.records
|
|
), caplog.records
|
|
|
|
|
|
|
|
|
|
|
|
|