130 lines
4.4 KiB
Python
130 lines
4.4 KiB
Python
"""
|
||
完整测试预设导入导出的顺序保持
|
||
"""
|
||
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)
|