""" 将现有的 SillyTavern 格式世界书转换为内部格式 """ import json from pathlib import Path import sys # 添加backend目录到Python路径 backend_dir = Path(__file__).parent / "backend" sys.path.insert(0, str(backend_dir)) from models.converters import WorldBookConverter WORLDBOOKS_PATH = Path(r'D:\progarm\python\llm_workflow_engine\data\worldbooks') print("=" * 60) print("世界书格式转换工具") print("=" * 60) # 查找所有JSON文件 json_files = list(WORLDBOOKS_PATH.glob("*.json")) print(f"\n找到 {len(json_files)} 个世界书文件\n") converted_count = 0 skipped_count = 0 error_count = 0 for file_path in json_files: print(f"处理: {file_path.name}") try: # 读取文件 with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) # 检测格式 format_type = WorldBookConverter.detect_format(data) print(f" 当前格式: {format_type}") if format_type == "sillytavern": # 需要转换 name = data.get("name", file_path.stem) print(f" 世界书名称: {name}") print(f" 条目数量: {len(data.get('entries', {}))}") # 转换为内部格式 internal_data = WorldBookConverter.st_to_internal(data, name) # 备份原文件 backup_path = file_path.with_suffix('.json.bak') file_path.rename(backup_path) print(f" ✓ 已备份原文件为: {backup_path.name}") # 保存转换后的文件 with open(file_path, 'w', encoding='utf-8') as f: json.dump(internal_data, f, ensure_ascii=False, indent=2) print(f" ✓ 转换完成并保存") print(f" - 新格式: internal") print(f" - 条目数量: {len(internal_data.get('entries', []))}") converted_count += 1 elif format_type == "internal": print(f" ℹ 已是内部格式,跳过") skipped_count += 1 else: print(f" ⚠️ 未知格式,跳过") skipped_count += 1 except Exception as e: print(f" ❌ 错误: {e}") import traceback traceback.print_exc() error_count += 1 print() print("=" * 60) print("转换完成统计:") print(f" ✓ 转换成功: {converted_count} 个文件") print(f" - 跳过(已是内部格式): {skipped_count} 个文件") print(f" ✗ 转换失败: {error_count} 个文件") print("=" * 60) if converted_count > 0: print("\n提示: 原文件已备份为 .bak 后缀,确认无误后可删除")