mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-06 16:07:01 +08:00
fix: resume agent after choice callback
This commit is contained in:
+22
-12
@@ -522,6 +522,7 @@ class MessageChain(ChainBase):
|
|||||||
username=username,
|
username=username,
|
||||||
original_message_id=original_message_id,
|
original_message_id=original_message_id,
|
||||||
original_chat_id=original_chat_id,
|
original_chat_id=original_chat_id,
|
||||||
|
processing_status=processing_status,
|
||||||
):
|
):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -1168,6 +1169,7 @@ class MessageChain(ChainBase):
|
|||||||
images: Optional[List[CommingMessage.MessageImage]] = None,
|
images: Optional[List[CommingMessage.MessageImage]] = None,
|
||||||
files: Optional[List[CommingMessage.MessageAttachment]] = None,
|
files: Optional[List[CommingMessage.MessageAttachment]] = None,
|
||||||
session_id: Optional[str] = None,
|
session_id: Optional[str] = None,
|
||||||
|
processing_status: Optional[_ProcessingStatus] = None,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
"""
|
"""
|
||||||
处理AI智能体消息
|
处理AI智能体消息
|
||||||
@@ -1267,20 +1269,28 @@ class MessageChain(ChainBase):
|
|||||||
)
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
process_kwargs = {
|
||||||
|
"session_id": session_id,
|
||||||
|
"user_id": str(userid),
|
||||||
|
"message": user_message,
|
||||||
|
"images": images,
|
||||||
|
"files": prepared_files,
|
||||||
|
"channel": channel.value if channel else None,
|
||||||
|
"source": source,
|
||||||
|
"username": username,
|
||||||
|
"original_message_id": str(original_message_id)
|
||||||
|
if original_message_id
|
||||||
|
else None,
|
||||||
|
"original_chat_id": original_chat_id,
|
||||||
|
}
|
||||||
|
# 回调消息的处理状态已由入口层创建,需要交给 Agent worker 结束;
|
||||||
|
# 普通 Agent 消息仍不传入,让 worker 在真正开始处理时自行启动状态。
|
||||||
|
if processing_status:
|
||||||
|
process_kwargs["processing_status"] = processing_status.to_dict()
|
||||||
|
|
||||||
# 在事件循环中处理
|
# 在事件循环中处理
|
||||||
asyncio.run_coroutine_threadsafe(
|
asyncio.run_coroutine_threadsafe(
|
||||||
agent_manager.process_message(
|
agent_manager.process_message(**process_kwargs),
|
||||||
session_id=session_id,
|
|
||||||
user_id=str(userid),
|
|
||||||
message=user_message,
|
|
||||||
images=images,
|
|
||||||
files=prepared_files,
|
|
||||||
channel=channel.value if channel else None,
|
|
||||||
source=source,
|
|
||||||
username=username,
|
|
||||||
original_message_id=str(original_message_id) if original_message_id else None,
|
|
||||||
original_chat_id=original_chat_id,
|
|
||||||
),
|
|
||||||
global_vars.loop,
|
global_vars.loop,
|
||||||
)
|
)
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import unittest
|
import unittest
|
||||||
from unittest.mock import AsyncMock, patch
|
from unittest.mock import AsyncMock, Mock, patch
|
||||||
|
|
||||||
from app.agent.prompt import prompt_manager
|
from app.agent.prompt import prompt_manager
|
||||||
from app.agent.tools.factory import MoviePilotToolFactory
|
from app.agent.tools.factory import MoviePilotToolFactory
|
||||||
@@ -13,6 +13,7 @@ from app.helper.interaction import (
|
|||||||
agent_interaction_manager,
|
agent_interaction_manager,
|
||||||
)
|
)
|
||||||
from app.chain.message import MessageChain
|
from app.chain.message import MessageChain
|
||||||
|
from app.core.config import settings
|
||||||
from app.schemas.types import MessageChannel
|
from app.schemas.types import MessageChannel
|
||||||
|
|
||||||
|
|
||||||
@@ -149,12 +150,20 @@ class TestAgentInteraction(unittest.TestCase):
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
with patch.object(chain, "_handle_ai_message") as handle_ai_message, patch.object(
|
with patch.object(settings, "AI_AGENT_ENABLE", True), patch.object(
|
||||||
chain.messagehelper, "put"
|
chain.messagehelper, "put"
|
||||||
) as message_put, patch.object(chain.messageoper, "add") as message_add, patch.object(
|
) as message_put, patch.object(
|
||||||
|
chain.messageoper, "add"
|
||||||
|
) as message_add, patch.object(
|
||||||
chain, "edit_message", return_value=True
|
chain, "edit_message", return_value=True
|
||||||
) as edit_message:
|
) as edit_message, patch(
|
||||||
chain._handle_callback(
|
"app.chain.message.agent_manager.process_message",
|
||||||
|
new_callable=AsyncMock,
|
||||||
|
) as process_message, patch(
|
||||||
|
"app.chain.message.asyncio.run_coroutine_threadsafe",
|
||||||
|
side_effect=lambda coro, _loop: (coro.close(), Mock())[1],
|
||||||
|
):
|
||||||
|
handled = chain._handle_callback(
|
||||||
text=f"CALLBACK:agent_interaction:choice:{request.request_id}:1",
|
text=f"CALLBACK:agent_interaction:choice:{request.request_id}:1",
|
||||||
channel=MessageChannel.Telegram,
|
channel=MessageChannel.Telegram,
|
||||||
source="telegram-test",
|
source="telegram-test",
|
||||||
@@ -164,7 +173,7 @@ class TestAgentInteraction(unittest.TestCase):
|
|||||||
original_chat_id="456",
|
original_chat_id="456",
|
||||||
)
|
)
|
||||||
|
|
||||||
handle_ai_message.assert_called_once()
|
self.assertTrue(handled)
|
||||||
edit_message.assert_called_once_with(
|
edit_message.assert_called_once_with(
|
||||||
channel=MessageChannel.Telegram,
|
channel=MessageChannel.Telegram,
|
||||||
source="telegram-test",
|
source="telegram-test",
|
||||||
@@ -173,9 +182,13 @@ class TestAgentInteraction(unittest.TestCase):
|
|||||||
title="需要你的选择",
|
title="需要你的选择",
|
||||||
text="请选择\n\n已选择:电影",
|
text="请选择\n\n已选择:电影",
|
||||||
)
|
)
|
||||||
kwargs = handle_ai_message.call_args.kwargs
|
process_message.assert_called_once()
|
||||||
self.assertEqual(kwargs["text"], "我选择电影")
|
kwargs = process_message.call_args.kwargs
|
||||||
|
self.assertEqual(kwargs["message"], "我选择电影")
|
||||||
self.assertEqual(kwargs["session_id"], "session-choice")
|
self.assertEqual(kwargs["session_id"], "session-choice")
|
||||||
|
self.assertEqual(kwargs["channel"], MessageChannel.Telegram.value)
|
||||||
|
self.assertEqual(kwargs["source"], "telegram-test")
|
||||||
|
self.assertNotIn("processing_status", kwargs)
|
||||||
message_put.assert_called_once()
|
message_put.assert_called_once()
|
||||||
message_add.assert_called_once()
|
message_add.assert_called_once()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user