mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-26 01:01:40 +00:00
fix(gateway): defer background review notifications until after main reply
Background review notifications ("💾 Skill created", "💾 Memory updated")
could race ahead of the main assistant reply in chat, making it look like
the agent stopped after creating a skill.
Gate bg-review notifications behind a threading.Event + pending queue.
Register a release callback on the adapter's _post_delivery_callbacks dict
so base.py's finally block fires it after the main response is delivered.
The queued-message path in _run_agent pops and calls the callback directly
to prevent double-fire.
Co-authored-by: Hermes Agent <hermes@nousresearch.com>
Closes #10541
This commit is contained in:
parent
44941f0ed1
commit
33ff29dfae
3 changed files with 130 additions and 2 deletions
|
|
@ -1,5 +1,6 @@
|
|||
"""Tests for topic-aware gateway progress updates."""
|
||||
|
||||
import asyncio
|
||||
import importlib
|
||||
import sys
|
||||
import time
|
||||
|
|
@ -415,6 +416,21 @@ class QueuedCommentaryAgent:
|
|||
}
|
||||
|
||||
|
||||
class BackgroundReviewAgent:
|
||||
def __init__(self, **kwargs):
|
||||
self.background_review_callback = kwargs.get("background_review_callback")
|
||||
self.tools = []
|
||||
|
||||
def run_conversation(self, message, conversation_history=None, task_id=None):
|
||||
if self.background_review_callback:
|
||||
self.background_review_callback("💾 Skill 'prospect-scanner' created.")
|
||||
return {
|
||||
"final_response": "done",
|
||||
"messages": [],
|
||||
"api_calls": 1,
|
||||
}
|
||||
|
||||
|
||||
class VerboseAgent:
|
||||
"""Agent that emits a tool call with args whose JSON exceeds 200 chars."""
|
||||
LONG_CODE = "x" * 300
|
||||
|
|
@ -668,6 +684,66 @@ async def test_run_agent_queued_message_does_not_treat_commentary_as_final(monke
|
|||
assert "final response 1" in sent_texts
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_run_agent_defers_background_review_notification_until_release(monkeypatch, tmp_path):
|
||||
adapter, result = await _run_with_agent(
|
||||
monkeypatch,
|
||||
tmp_path,
|
||||
BackgroundReviewAgent,
|
||||
session_id="sess-bg-review-order",
|
||||
config_data={"display": {"interim_assistant_messages": True}},
|
||||
)
|
||||
|
||||
assert result["final_response"] == "done"
|
||||
assert adapter.sent == []
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_base_processing_releases_post_delivery_callback_after_main_send():
|
||||
"""Post-delivery callbacks on the adapter fire after the main response."""
|
||||
adapter = ProgressCaptureAdapter()
|
||||
|
||||
async def _handler(event):
|
||||
return "done"
|
||||
|
||||
adapter.set_message_handler(_handler)
|
||||
|
||||
released = []
|
||||
|
||||
def _post_delivery_cb():
|
||||
released.append(True)
|
||||
adapter.sent.append(
|
||||
{
|
||||
"chat_id": "bg-review",
|
||||
"content": "💾 Skill 'prospect-scanner' created.",
|
||||
"reply_to": None,
|
||||
"metadata": None,
|
||||
}
|
||||
)
|
||||
|
||||
source = SessionSource(
|
||||
platform=Platform.TELEGRAM,
|
||||
chat_id="-1001",
|
||||
chat_type="group",
|
||||
thread_id="17585",
|
||||
)
|
||||
event = MessageEvent(
|
||||
text="hello",
|
||||
message_type=MessageType.TEXT,
|
||||
source=source,
|
||||
message_id="msg-1",
|
||||
)
|
||||
session_key = "agent:main:telegram:group:-1001:17585"
|
||||
adapter._active_sessions[session_key] = asyncio.Event()
|
||||
adapter._post_delivery_callbacks[session_key] = _post_delivery_cb
|
||||
|
||||
await adapter._process_message_background(event, session_key)
|
||||
|
||||
sent_texts = [call["content"] for call in adapter.sent]
|
||||
assert sent_texts == ["done", "💾 Skill 'prospect-scanner' created."]
|
||||
assert released == [True]
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_verbose_mode_does_not_truncate_args_by_default(monkeypatch, tmp_path):
|
||||
"""Verbose mode with default tool_preview_length (0) should NOT truncate args.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue