migrate_to_postgres.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import json
  2. import logging
  3. import time
  4. from pathlib import Path
  5. from tool_agent.models import ToolMeta, ToolStatus
  6. from tool_agent.tool.tool_store import PostgreSQLToolStore
  7. logging.basicConfig(level=logging.INFO, format='%(message)s')
  8. def migrate():
  9. print("=" * 50)
  10. print(" 开始迁移数据:registry.json -> PostgreSQL Tool Store")
  11. print("=" * 50)
  12. try:
  13. store = PostgreSQLToolStore()
  14. except Exception as e:
  15. print(f"Failed to connect to database: {e}")
  16. return
  17. # Check for legacy groups
  18. groups_path = Path("data/groups.json")
  19. group_map = {}
  20. if groups_path.exists():
  21. try:
  22. gdata = json.loads(groups_path.read_text(encoding="utf-8"))
  23. for g in gdata.get("groups", []):
  24. # Clean up group names if they represent providers
  25. # e.g. runcomfy_lifecycle -> runcomfy
  26. g_id = g.get("group_id", "")
  27. provider_name = g_id.replace("_lifecycle", "").replace("_task", "")
  28. group_map[g_id] = provider_name
  29. # Create tools mapping based on old groupings
  30. for t_id in g.get("tool_ids", []):
  31. # We'll use this if registry doesn't have it directly populated
  32. pass
  33. except Exception:
  34. pass
  35. registry_path = Path("data/registry.json")
  36. if not registry_path.exists():
  37. print("找不到 data/registry.json 文件,无法迁移。")
  38. return
  39. data = json.loads(registry_path.read_text(encoding="utf-8"))
  40. tools_migrated = 0
  41. for item in data.get("tools", []):
  42. try:
  43. tool = ToolMeta(**item)
  44. # Map ToolStatus to Postgres string
  45. status_str = "已接入" if tool.status == ToolStatus.ACTIVE else "未接入"
  46. # Legacy groups serve as providers now
  47. provider_ids = []
  48. for gid in tool.group_ids:
  49. mapped_pid = group_map.get(gid, gid)
  50. if mapped_pid not in provider_ids:
  51. provider_ids.append(mapped_pid)
  52. # 兼容性:自动推断一些已知的裸工具 Provider
  53. if not provider_ids:
  54. if "liblib" in tool.tool_id.lower():
  55. provider_ids.append("liblib")
  56. elif "flux" in tool.tool_id.lower():
  57. provider_ids.append("flux")
  58. tool_dict = {
  59. "id": tool.tool_id,
  60. "name": tool.name,
  61. "version": "1.0.0",
  62. "introduction": tool.description,
  63. "tutorial": "",
  64. "input": tool.input_schema,
  65. "output": tool.output_schema,
  66. "updated_time": int(time.time()),
  67. "status": status_str,
  68. "provider_ids": provider_ids,
  69. }
  70. store.insert_or_update(tool_dict)
  71. print(f"[SUCCESS] 迁移工具: {tool.tool_id} (Provider: {provider_ids})")
  72. tools_migrated += 1
  73. except Exception as e:
  74. print(f"[ERROR] 工具 {item.get('tool_id')} 迁移失败: {e}")
  75. store.close()
  76. print("=" * 50)
  77. print(f" 迁移完成!共成功处理 {tools_migrated} 个工具。")
  78. print(" 现在的 tool_provider 关系表已经建立,可直接从数据库加载!")
  79. print("=" * 50)
  80. if __name__ == "__main__":
  81. migrate()