Files
SillyTavern_replica/test_regex_integration.py
2026-05-06 00:40:18 +08:00

132 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
测试正则系统集成到聊天流程
"""
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的回复。<thinking>我在思考...</thinking> 天气很好!"
print(f"\n原始输出:\n{ai_output}\n")
# 创建一条规则:移除 <thinking> 标签
thinking_rule = RegexRule(
id="test-remove-thinking",
scriptName="移除思考标签",
findRegex=r"<thinking>[\s\S]*?</thinking>",
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'<details><summary>\1</summary>点击查看详细说明</details>',
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())