""" 测试正则系统集成到聊天流程 """ import asyncio import sys from pathlib import Path # 添加 backend 目录到路径 backend_path = Path(__file__).parent / "backend" sys.path.insert(0, str(backend_path)) from services.regex_service import regex_service from models.regex_rules import RegexRule, RegexPlacement, SubstituteMode async def test_regex_integration(): """测试正则规则在聊天流程中的应用""" print("=" * 80) print("测试1: 用户输入正则处理") print("=" * 80) # 创建一条测试规则:将 [思考] 标签替换为空(仅用于LLM) test_rule = RegexRule( id="test-hide-thinking", scriptName="隐藏思考标签", findRegex=r"\[思考\][\s\S]*?\[/思考\]", replaceString="", placement=[RegexPlacement.USER_INPUT], promptOnly=True, # ✅ 只影响发送给LLM的内容 markdownOnly=False, substituteRegex=SubstituteMode.REPLACE_ALL, disabled=False ) # 手动应用规则(不通过服务) import re user_input = "你好![思考]这是一个内部想法,不应该被看到[/思考] 请问天气如何?" print(f"\n原始输入:\n{user_input}\n") # 模拟 promptOnly=True 的逻辑 pattern = test_rule.findRegex processed_for_llm = re.sub(pattern, test_rule.replaceString, user_input) print(f"处理后(发送给LLM - promptOnly=True):\n{processed_for_llm}\n") # 模拟 promptOnly=False 的情况(不应用规则) processed_for_display = user_input print(f"处理后(显示给用户 - promptOnly=False跳过):\n{processed_for_display}\n") print("\n" + "=" * 80) print("测试2: AI输出正则处理") print("=" * 80) # 模拟AI输出 ai_output = "这是AI的回复。我在思考... 天气很好!" print(f"\n原始输出:\n{ai_output}\n") # 创建一条规则:移除 标签 thinking_rule = RegexRule( id="test-remove-thinking", scriptName="移除思考标签", findRegex=r"[\s\S]*?", replaceString="", placement=[RegexPlacement.AI_OUTPUT], promptOnly=True, # ✅ 只影响发送给LLM的内容(实际是保存时) markdownOnly=False, substituteRegex=SubstituteMode.REPLACE_ALL ) # 应用正则 processed_output = regex_service.apply_rules_by_placement( text=ai_output, placement=RegexPlacement.AI_OUTPUT.value, is_for_llm=False, is_markdown_rendered=False ) print(f"处理后:\n{processed_output}\n") print("\n" + "=" * 80) print("测试3: Markdown渲染规则") print("=" * 80) # 模拟包含 TIPS_DESIGN 标记的文本 tips_text = "TIPS_DESIGN[世界知识] 这是一些说明文字" print(f"\n原始文本:\n{tips_text}\n") # 创建规则:将 TIPS_DESIGN 转换为 HTML details tips_rule = RegexRule( id="test-tips-design", scriptName="美化TIPS显示", findRegex=r"TIPS_DESIGN\[([^\]]+)\]", replaceString=r'
\1点击查看详细说明
', placement=[RegexPlacement.AI_OUTPUT], promptOnly=False, # ✅ 影响显示 markdownOnly=True, # ✅ 只在Markdown渲染后应用 substituteRegex=SubstituteMode.REPLACE_ALL ) # 应用正则(未渲染) processed_unrendered = regex_service.apply_rules_by_placement( text=tips_text, placement=RegexPlacement.AI_OUTPUT.value, is_for_llm=False, is_markdown_rendered=False # ❌ 未渲染,不应应用 ) print(f"处理后(未渲染):\n{processed_unrendered}\n") # 应用正则(已渲染) processed_rendered = regex_service.apply_rules_by_placement( text=tips_text, placement=RegexPlacement.AI_OUTPUT.value, is_for_llm=False, is_markdown_rendered=True # ✅ 已渲染,应该应用 ) print(f"处理后(已渲染):\n{processed_rendered}\n") print("\n" + "=" * 80) print("✅ 所有测试完成!") print("=" * 80) if __name__ == "__main__": asyncio.run(test_regex_integration())