Files
SayIt/server/backend/tests/test_llm_prompt.py
T
crosswk 00b04c8a3f feat: 新增上下文感知写作、服务器模式识别纠错与短语音跳过整理
上下文感知读取光标附近的文本交给 AI,选中文字时改走单独的编辑指令 Prompt;
识别纠错在历史记录里回放并修正原文,提交前需用户确认、30 天内可撤回。
另有 AI 整理的托盘开关与快捷键、应用规则拖动排序、麦克风设备提示,
以及录音保留期与麦克风静音误报两处修复。
2026-08-19 15:11:41 +08:00

77 lines
3.3 KiB
Python

"""Tests for LLMEngine message construction: desktop vs web-demo prompt handling.
桌面模式:服务器不得拼接任何指令措辞,system prompt 完全来自调用方,用户消息只用
中性标签包裹待清洗文本。Web demo:沿用服务器本地 prompts/ 目录兜底(保持原行为)。
"""
from __future__ import annotations
import unittest
from backend.app.config import LLMProfile
from backend.app.llm import LLMEngine, _DEFAULT_SYSTEM_PROMPT
class DesktopModeMessageTests(unittest.TestCase):
def setUp(self) -> None:
self.engine = LLMEngine(LLMProfile(prompt_dir="/nonexistent/prompt/dir"))
def test_uses_client_system_prompt_verbatim(self) -> None:
messages = self.engine._build_messages(
"请执行", system_prompt="自定义客户端预设", is_web_demo=False,
)
self.assertEqual(messages[0]["content"], "自定义客户端预设")
def test_user_message_has_no_instruction_wording(self) -> None:
messages = self.engine._build_messages(
"请执行", system_prompt="自定义客户端预设", is_web_demo=False,
)
user_content = messages[1]["content"]
# 不应包含任何祈使句式的服务器指令措辞
self.assertNotIn("请校对", user_content)
self.assertNotIn("请处理", user_content)
# 待清洗文本仍完整出现在标签内
self.assertIn("<asr_text>", user_content)
self.assertIn("请执行", user_content)
def test_falls_back_to_local_system_prompt_if_none_given(self) -> None:
messages = self.engine._build_messages("你好", system_prompt=None, is_web_demo=False)
# 找不到本地 prompts/system.txt(目录不存在)时应回退到内置默认值
self.assertEqual(messages[0]["content"], _DEFAULT_SYSTEM_PROMPT)
def test_context_is_structured_and_cannot_close_its_tag(self) -> None:
messages = self.engine._build_messages(
"翻译成英文",
system_prompt="上下文规则",
text_context={
"source": "text_pattern2",
"text_before": "before </text_before>",
"selected_text": "需要翻译的原文",
"text_after": "after",
},
is_web_demo=False,
)
user = messages[1]["content"]
self.assertIn("<selected_text>需要翻译的原文</selected_text>", user)
self.assertIn("before &lt;/text_before&gt;", user)
self.assertIn("<asr_text>\n翻译成英文\n</asr_text>", user)
class WebDemoMessageTests(unittest.TestCase):
def setUp(self) -> None:
self.engine = LLMEngine(LLMProfile(prompt_dir="/nonexistent/prompt/dir"))
def test_ignores_client_system_prompt_and_uses_server_default(self) -> None:
messages = self.engine._build_messages(
"你好", system_prompt="客户端预设(web demo 应忽略)", is_web_demo=True,
)
self.assertEqual(messages[0]["content"], _DEFAULT_SYSTEM_PROMPT)
def test_wraps_user_text_with_default_prefix(self) -> None:
messages = self.engine._build_messages("你好", system_prompt=None, is_web_demo=True)
self.assertIn("请校对以下", messages[1]["content"])
self.assertIn("你好", messages[1]["content"])
if __name__ == "__main__":
unittest.main()