修复导入顺序错误

This commit is contained in:
2026-05-05 19:08:25 +08:00
parent adb59da06d
commit 44df56c8d2
13 changed files with 4249 additions and 131 deletions

129
test_import_export_order.py Normal file
View File

@@ -0,0 +1,129 @@
"""
完整测试预设导入导出的顺序保持
"""
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)