respect output persistence in background agent replies

This commit is contained in:
jxxghp
2026-04-29 23:51:03 +08:00
parent 7586a2cd42
commit e9291cec6a
2 changed files with 59 additions and 4 deletions

View File

@@ -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)

View File

@@ -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()