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