From e9291cec6a609a3c006b7a15bb02ff66f2484959 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 29 Apr 2026 23:51:03 +0800 Subject: [PATCH] respect output persistence in background agent replies --- app/agent/__init__.py | 9 +++-- tests/test_agent_background_output.py | 54 +++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 tests/test_agent_background_output.py diff --git a/app/agent/__init__.py b/app/agent/__init__.py index 536ded84..ac919e5e 100644 --- a/app/agent/__init__.py +++ b/app/agent/__init__.py @@ -643,10 +643,11 @@ class MoviePilotAgent: and not self._tool_context.get("user_reply_sent") ): if self.is_background: - # 后台任务仅广播最终回复,带标题 - await self.send_agent_message( - final_text, title="MoviePilot助手" - ) + if self.persist_output_message: + # 后台任务仅广播最终回复,带标题 + await self.send_agent_message( + final_text, title="MoviePilot助手" + ) else: # 非流式渠道:发送最终回复 await self.send_agent_message(final_text) diff --git a/tests/test_agent_background_output.py b/tests/test_agent_background_output.py new file mode 100644 index 00000000..ab3b3674 --- /dev/null +++ b/tests/test_agent_background_output.py @@ -0,0 +1,54 @@ +import unittest +from types import SimpleNamespace +from unittest.mock import AsyncMock, patch + +from langchain_core.messages import AIMessage + +from app.agent import MoviePilotAgent +from app.agent.memory import memory_manager + + +class _FakeGraphState: + def __init__(self, messages): + self.values = {"messages": messages} + + +class _FakeAgent: + def __init__(self, messages): + self._messages = messages + + async def ainvoke(self, _payload, config=None): + return None + + def get_state(self, _config): + return _FakeGraphState(self._messages) + + +class AgentBackgroundOutputTest(unittest.IsolatedAsyncioTestCase): + async def test_background_non_streaming_skips_send_when_output_persistence_disabled(self): + agent = MoviePilotAgent(session_id="bg-test", user_id="system") + agent.channel = None + agent.source = None + agent.suppress_user_reply = False + agent.persist_output_message = False + agent._tool_context = {"user_reply_sent": False} + agent._streamed_output = "" + agent.stream_handler = SimpleNamespace( + stop_streaming=AsyncMock(return_value=(False, "")) + ) + agent._should_stream = lambda: False + agent._create_agent = lambda streaming=False: _FakeAgent( + [AIMessage(content="后台结果")] + ) + agent.send_agent_message = AsyncMock() + + with patch.object(memory_manager, "save_agent_messages") as save_messages: + await agent._execute_agent([]) + + agent.send_agent_message.assert_not_awaited() + save_messages.assert_called_once() + self.assertEqual("后台结果", agent._streamed_output) + + +if __name__ == "__main__": + unittest.main()