mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-07 02:51:50 +00:00
test: cover max-iterations summary message sanitization
This commit is contained in:
parent
a1cb811cb8
commit
ccb5d87076
1 changed files with 49 additions and 0 deletions
|
|
@ -2181,6 +2181,55 @@ class TestHandleMaxIterations:
|
||||||
kwargs = agent.client.chat.completions.create.call_args.kwargs
|
kwargs = agent.client.chat.completions.create.call_args.kwargs
|
||||||
assert "reasoning" not in kwargs.get("extra_body", {})
|
assert "reasoning" not in kwargs.get("extra_body", {})
|
||||||
|
|
||||||
|
def test_summary_request_removes_orphan_tool_result(self, agent):
|
||||||
|
"""Regression: max-iterations summary request must NOT contain
|
||||||
|
orphan tool results (tool_call_id with no matching assistant tool_call)."""
|
||||||
|
resp = _mock_response(content="Summary of work done.")
|
||||||
|
agent.client.chat.completions.create.return_value = resp
|
||||||
|
agent._cached_system_prompt = "You are helpful."
|
||||||
|
messages = [
|
||||||
|
{"role": "user", "content": "Analyze finance-data-router"},
|
||||||
|
{"role": "assistant", "content": "[Session Arc Summary] ..."},
|
||||||
|
{"role": "tool", "tool_call_id": "call_cfedFhJjGmu1RvRc1OUC38j8", "content": "file content here"},
|
||||||
|
{"role": "assistant", "tool_calls": [{"id": "call_8fXBXsT592Vpvm7wnW4obPEu", "function": {"name": "patch", "arguments": "{}"}}]},
|
||||||
|
{"role": "tool", "tool_call_id": "call_8fXBXsT592Vpvm7wnW4obPEu", "content": "patch result"},
|
||||||
|
{"role": "assistant", "content": "Done."},
|
||||||
|
]
|
||||||
|
|
||||||
|
result = agent._handle_max_iterations(messages, 120)
|
||||||
|
|
||||||
|
assert result == "Summary of work done."
|
||||||
|
kwargs = agent.client.chat.completions.create.call_args.kwargs
|
||||||
|
sent_msgs = kwargs.get("messages", [])
|
||||||
|
orphan_ids = [
|
||||||
|
m.get("tool_call_id") for m in sent_msgs
|
||||||
|
if m.get("role") == "tool" and m.get("tool_call_id") == "call_cfedFhJjGmu1RvRc1OUC38j8"
|
||||||
|
]
|
||||||
|
assert len(orphan_ids) == 0, f"Orphan tool result still present: {orphan_ids}"
|
||||||
|
|
||||||
|
def test_summary_request_inserts_stub_for_missing_tool_result(self, agent):
|
||||||
|
"""If an assistant tool_call has no matching tool result in the
|
||||||
|
summary request, a stub must be inserted to satisfy the API contract."""
|
||||||
|
resp = _mock_response(content="Summary")
|
||||||
|
agent.client.chat.completions.create.return_value = resp
|
||||||
|
agent._cached_system_prompt = "You are helpful."
|
||||||
|
messages = [
|
||||||
|
{"role": "user", "content": "do stuff"},
|
||||||
|
{"role": "assistant", "tool_calls": [{"id": "call_no_result", "function": {"name": "terminal", "arguments": "{}"}}]},
|
||||||
|
{"role": "assistant", "content": "Continuing..."},
|
||||||
|
]
|
||||||
|
|
||||||
|
result = agent._handle_max_iterations(messages, 60)
|
||||||
|
|
||||||
|
assert result == "Summary"
|
||||||
|
kwargs = agent.client.chat.completions.create.call_args.kwargs
|
||||||
|
sent_msgs = kwargs.get("messages", [])
|
||||||
|
stub_ids = [
|
||||||
|
m.get("tool_call_id") for m in sent_msgs
|
||||||
|
if m.get("role") == "tool" and m.get("tool_call_id") == "call_no_result"
|
||||||
|
]
|
||||||
|
assert len(stub_ids) >= 1, f"No stub result for assistant tool_call: {stub_ids}"
|
||||||
|
|
||||||
def test_codex_summary_sanitizes_orphan_tool_results(self, agent):
|
def test_codex_summary_sanitizes_orphan_tool_results(self, agent):
|
||||||
agent.api_mode = "codex_responses"
|
agent.api_mode = "codex_responses"
|
||||||
agent.provider = "openai-codex"
|
agent.provider = "openai-codex"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue