mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-07 08:26:53 +08:00
feat(telegram): support rich Agent messages
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
"""Agent Telegram Rich Message 契约测试。"""
|
||||
|
||||
import asyncio
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
from app.agent.orchestrator import MoviePilotAgent
|
||||
from app.agent.prompt import prompt_manager
|
||||
from app.agent.tools.impl.send_message import SendMessageInput, SendMessageTool
|
||||
from app.chain.agent import AgentChain
|
||||
from app.schemas.types import NotificationChannel
|
||||
|
||||
|
||||
def test_send_message_input_accepts_rich_message_only() -> None:
|
||||
"""Rich Message 本身应能构成完整的工具载荷。"""
|
||||
payload = SendMessageInput(rich_message="# 结果\n\n- 成功")
|
||||
|
||||
assert payload.message is None
|
||||
assert payload.rich_message == "# 结果\n\n- 成功"
|
||||
|
||||
|
||||
def test_send_message_tool_keeps_plain_fallback_for_rich_message() -> None:
|
||||
"""工具应同时保留跨渠道文本回退和 Telegram Rich Markdown。"""
|
||||
|
||||
async def _run():
|
||||
tool = SendMessageTool(session_id="session-1", user_id="10001")
|
||||
tool.set_message_attr(
|
||||
channel=NotificationChannel.Telegram.value,
|
||||
source="telegram-test",
|
||||
username="tester",
|
||||
)
|
||||
tool.set_agent_context(agent_context={})
|
||||
with patch(
|
||||
"app.agent.tools.base.ToolChain.async_post_message",
|
||||
new_callable=AsyncMock,
|
||||
) as async_post_message:
|
||||
result = await tool.run(rich_message="# 结果\n\n- **成功**")
|
||||
return result, async_post_message
|
||||
|
||||
result, async_post_message = asyncio.run(_run())
|
||||
message = async_post_message.await_args.args[0]
|
||||
|
||||
assert result == "消息已发送"
|
||||
assert message.text == "# 结果\n\n- **成功**"
|
||||
assert message.rich_message == "# 结果\n\n- **成功**"
|
||||
assert message.save_history is False
|
||||
|
||||
|
||||
def test_agent_prompt_prefers_rich_message_only_for_telegram() -> None:
|
||||
"""仅 Telegram 会话应收到 Rich Message 优先提示。"""
|
||||
telegram_prompt = prompt_manager.get_agent_prompt(
|
||||
channel=NotificationChannel.Telegram.value
|
||||
)
|
||||
wechat_prompt = prompt_manager.get_agent_prompt(
|
||||
channel=NotificationChannel.Wechat.value
|
||||
)
|
||||
|
||||
assert "`rich_message` argument" in telegram_prompt
|
||||
assert "GitHub-style Markdown" in telegram_prompt
|
||||
assert "`rich_message` argument" not in wechat_prompt
|
||||
|
||||
|
||||
def test_agent_direct_telegram_reply_uses_rich_message() -> None:
|
||||
"""Agent 常规 Telegram 回复也应自动携带 Rich Markdown。"""
|
||||
|
||||
async def _run():
|
||||
agent = MoviePilotAgent(session_id="telegram-session", user_id="10001")
|
||||
agent.channel = NotificationChannel.Telegram.value
|
||||
agent.source = "telegram-test"
|
||||
agent.username = "tester"
|
||||
with patch.object(
|
||||
AgentChain,
|
||||
"async_post_message",
|
||||
new_callable=AsyncMock,
|
||||
) as async_post_message:
|
||||
await agent.send_agent_message("# 结果\n\n- **完成**")
|
||||
return async_post_message
|
||||
|
||||
async_post_message = asyncio.run(_run())
|
||||
message = async_post_message.await_args.args[0]
|
||||
|
||||
assert message.text == "# 结果\n\n- **完成**"
|
||||
assert message.rich_message == "# 结果\n\n- **完成**"
|
||||
Reference in New Issue
Block a user