Files
SillyTavern_replica/test_import_export_order.py
2026-05-05 19:08:25 +08:00

130 lines
4.4 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 json
from pathlib import Path
import sys
sys.path.insert(0, 'backend')
from services.preset_service import PresetService
print("=" * 80)
print("预设导入导出顺序完整性测试")
print("=" * 80)
# ==================== 步骤 1: 创建测试预设(模拟 SillyTavern 导出)====================
print("\n[步骤 1] 创建测试预设prompts 乱序)")
print("-" * 80)
test_data = {
"name": "Order_Integrity_Test",
"temperature": 0.8,
"frequency_penalty": 0.3,
"presence_penalty": 0.2,
"top_p": 0.95,
"top_k": 40,
"max_tokens": 2048,
# prompts 是乱序的
"prompts": [
{"identifier": "z_last", "name": "Z Last", "content": "Last", "role": "user", "system_prompt": False, "enabled": True},
{"identifier": "a_first", "name": "A First", "content": "First", "role": "system", "system_prompt": True, "enabled": True},
{"identifier": "m_middle", "name": "M Middle", "content": "Middle", "role": "assistant", "system_prompt": False, "enabled": True}
],
# prompt_order 指定正确顺序
"prompt_order": [{
"character_id": "global",
"order": [
{"identifier": "a_first", "enabled": True},
{"identifier": "m_middle", "enabled": True},
{"identifier": "z_last", "enabled": True}
]
}]
}
print(f"原始 prompts 顺序: {[p['identifier'] for p in test_data['prompts']]}")
print(f"prompt_order 顺序: {[o['identifier'] for o in test_data['prompt_order'][0]['order']]}")
# ==================== 步骤 2: 使用后端保存(模拟导入后保存)====================
print("\n[步骤 2] 使用 PresetService 保存预设")
print("-" * 80)
try:
# 如果已存在则删除
if PresetService._get_preset_path("Order_Integrity_Test").exists():
PresetService.delete_preset("Order_Integrity_Test")
PresetService.create_preset("Order_Integrity_Test", test_data)
print("✅ 保存成功")
except Exception as e:
print(f"❌ 保存失败: {e}")
sys.exit(1)
# ==================== 步骤 3: 读取保存的文件检查顺序====================
print("\n[步骤 3] 读取保存的文件")
print("-" * 80)
saved_file = Path("data/preset/Order_Integrity_Test.json")
with open(saved_file, 'r', encoding='utf-8') as f:
saved_data = json.load(f)
saved_prompts_order = [p['identifier'] for p in saved_data.get('prompts', [])]
saved_order_list = [o['identifier'] for o in saved_data.get('prompt_order', [{}])[0].get('order', [])]
print(f"保存后 prompts 顺序: {saved_prompts_order}")
print(f"保存后 prompt_order 顺序: {saved_order_list}")
if saved_prompts_order == saved_order_list:
print("\n✅ 保存后顺序一致!")
else:
print("\n❌ 保存后顺序不一致!")
# ==================== 步骤 4: 模拟前端加载(从后端读取)====================
print("\n[步骤 4] 模拟前端从后端加载预设")
print("-" * 80)
loaded_data = PresetService.get_preset("Order_Integrity_Test")
loaded_prompts_order = [p['identifier'] for p in loaded_data.get('prompts', [])]
loaded_order_list = [o['identifier'] for o in loaded_data.get('prompt_order', [{}])[0].get('order', [])]
print(f"加载后 prompts 顺序: {loaded_prompts_order}")
print(f"加载后 prompt_order 顺序: {loaded_order_list}")
if loaded_prompts_order == loaded_order_list:
print("\n✅ 加载后顺序一致!")
else:
print("\n❌ 加载后顺序不一致!")
# ==================== 步骤 5: 验证完整流程====================
print("\n[步骤 5] 验证完整流程")
print("-" * 80)
expected_order = ['a_first', 'm_middle', 'z_last']
print(f"期望顺序: {expected_order}")
print(f"原始 prompts: {[p['identifier'] for p in test_data['prompts']]}")
print(f"保存后 prompts: {saved_prompts_order}")
print(f"加载后 prompts: {loaded_prompts_order}")
all_match = (
saved_prompts_order == expected_order and
loaded_prompts_order == expected_order and
saved_prompts_order == loaded_prompts_order
)
if all_match:
print("\n🎉 完整流程顺序保持一致!")
print("✅ 即使原始 prompts 是乱序的,保存和加载后都能按 prompt_order 正确排序")
else:
print("\n❌ 顺序在某个环节出现了问题")
# 清理测试文件
try:
PresetService.delete_preset("Order_Integrity_Test")
print("\n✅ 已清理测试文件")
except:
pass
print("\n" + "=" * 80)