"""
测试正则系统集成到聊天流程
"""
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())