a8926764 commited on
Commit
6719409
·
verified ·
1 Parent(s): 1a5b8b3

Rename memory_sync.py.py to memory_sync.py

Browse files
Files changed (2) hide show
  1. memory_sync.py +114 -0
  2. memory_sync.py.py +0 -66
memory_sync.py ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ OpenClaw 记忆同步脚本
4
+ 将本地记忆文件同步至 Hugging Face Dataset,并从 Dataset 恢复。
5
+ """
6
+
7
+ import os
8
+ import sys
9
+ import time
10
+ import logging
11
+ from pathlib import Path
12
+ from huggingface_hub import HfApi, hf_hub_download, upload_file, list_repo_files
13
+
14
+ # 配置日志
15
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
16
+ logger = logging.getLogger(__name__)
17
+
18
+ class MemorySync:
19
+ def __init__(self):
20
+ self.hf_token = os.getenv('HF_TOKEN')
21
+ # 请将下面的 'your-username/openclaw-memory' 替换成你实际创建的 Dataset 名字
22
+ self.hf_dataset = os.getenv('HF_MEMORY_DATASET', 'a8926764/openclaw-memory')
23
+ # 确保这个路径和启动脚本中设置的 OPENCLAW_MEMORY_DIR 一致
24
+ self.local_memory_dir = Path(os.getenv('OPENCLAW_MEMORY_DIR', '/root/.openclaw/memory'))
25
+ self.api = HfApi(token=self.hf_token)
26
+
27
+ def ensure_memory_dir(self):
28
+ """确保本地记忆目录存在"""
29
+ self.local_memory_dir.mkdir(parents=True, exist_ok=True)
30
+ logger.info(f"Memory directory ensured: {self.local_memory_dir}")
31
+
32
+ def download_memory(self):
33
+ """从 Dataset 拉取所有记忆文件(.md 文件)"""
34
+ self.ensure_memory_dir()
35
+ try:
36
+ logger.info(f'开始从 Dataset 下载记忆文件: {self.hf_dataset}')
37
+ files = list_repo_files(repo_id=self.hf_dataset, repo_type="dataset")
38
+ downloaded_count = 0
39
+ for file_name in files:
40
+ if file_name.endswith('.md'):
41
+ try:
42
+ local_path = hf_hub_download(
43
+ repo_id=self.hf_dataset,
44
+ filename=file_name,
45
+ repo_type="dataset",
46
+ token=self.hf_token,
47
+ local_dir=self.local_memory_dir
48
+ )
49
+ logger.info(f'已下载记忆文件: {file_name}')
50
+ downloaded_count += 1
51
+ except Exception as e:
52
+ logger.error(f'下载文件 {file_name} 失败: {e}')
53
+ continue
54
+ if downloaded_count == 0:
55
+ logger.info('Dataset 中未找到记忆文件,将使用新记忆。')
56
+ else:
57
+ logger.info(f'记忆文件下载完成,共下载 {downloaded_count} 个文件。')
58
+ return True
59
+ except Exception as e:
60
+ logger.error(f'从 Dataset 拉取记忆失败: {e}')
61
+ # 首次运行时 Dataset 可能为空,这不一定是错误,返回 True 允许流程继续
62
+ return True
63
+
64
+ def upload_memory(self):
65
+ """推送本地所有 .md 记忆文件到 Dataset"""
66
+ self.ensure_memory_dir()
67
+ try:
68
+ logger.info(f'开始推送记忆文件到 Dataset: {self.hf_dataset}')
69
+ memory_files = list(self.local_memory_dir.glob('*.md'))
70
+ if not memory_files:
71
+ logger.warning('本地没有找到 .md 格式的记忆文件,跳过上传。')
72
+ return False
73
+
74
+ uploaded_count = 0
75
+ for mem_file in memory_files:
76
+ try:
77
+ upload_file(
78
+ path_or_fileobj=str(mem_file),
79
+ path_in_repo=mem_file.name,
80
+ repo_id=self.hf_dataset,
81
+ repo_type="dataset",
82
+ token=self.hf_token,
83
+ commit_message=f"自动同步记忆: {mem_file.name} - {time.strftime('%Y-%m-%d %H:%M:%S')}"
84
+ )
85
+ logger.info(f'已上传记忆文件: {mem_file.name}')
86
+ uploaded_count += 1
87
+ except Exception as e:
88
+ logger.error(f'上传文件 {mem_file.name} 失败: {e}')
89
+ continue
90
+
91
+ logger.info(f'记忆文件上传完成,共上传 {uploaded_count} 个文件。')
92
+ return uploaded_count > 0
93
+ except Exception as e:
94
+ logger.error(f'推送记忆到 Dataset 失败: {e}')
95
+ return False
96
+
97
+ def main():
98
+ """主函数,处理命令行参数"""
99
+ if len(sys.argv) != 2 or sys.argv[1] not in ['download', 'upload']:
100
+ print('用法: python memory_sync.py [download|upload]')
101
+ sys.exit(1)
102
+
103
+ sync = MemorySync()
104
+ mode = sys.argv[1]
105
+
106
+ if mode == 'download':
107
+ success = sync.download_memory()
108
+ sys.exit(0 if success else 1)
109
+ elif mode == 'upload':
110
+ success = sync.upload_memory()
111
+ sys.exit(0 if success else 1)
112
+
113
+ if __name__ == '__main__':
114
+ main()
memory_sync.py.py DELETED
@@ -1,66 +0,0 @@
1
- # memory_sync.py
2
- import os
3
- import time
4
- import logging
5
- from pathlib import Path
6
- from huggingface_hub import HfApi, hf_hub_download, upload_file
7
-
8
- class MemorySync:
9
- def __init__(self):
10
- self.hf_token = os.getenv('HF_TOKEN')
11
- # 使用专门存储记忆的Dataset
12
- self.hf_dataset = os.getenv('HF_MEMORY_DATASET', 'a8926764/openclaw-memory')
13
- # OpenClaw记忆存储的本地目录(关键!需要与配置一致)
14
- self.local_memory_dir = Path(os.getenv('OPENCLAW_MEMORY_DIR', '/root/.openclaw/memory'))
15
- self.api = HfApi(token=self.hf_token)
16
-
17
- def ensure_memory_dir(self):
18
- self.local_memory_dir.mkdir(parents=True, exist_ok=True)
19
-
20
- def download_memory(self):
21
- """从Dataset拉取所有记忆文件"""
22
- self.ensure_memory_dir()
23
- try:
24
- # 这里需要根据你Dataset里文件的实际情况来获取文件列表
25
- # 例如,假设所有.md文件都是记忆文件
26
- from huggingface_hub import list_repo_files
27
- files = list_repo_files(repo_id=self.hf_dataset, repo_type="dataset")
28
- for file in files:
29
- if file.endswith('.md'): # 或其他记忆文件格式
30
- local_path = hf_hub_download(
31
- repo_id=self.hf_dataset,
32
- filename=file,
33
- repo_type="dataset",
34
- local_dir=self.local_memory_dir
35
- )
36
- print(f"Downloaded memory: {file}")
37
- return True
38
- except Exception as e:
39
- print(f"Download memory failed: {e}")
40
- return False
41
-
42
- def upload_memory(self):
43
- """推送所有记忆文件到Dataset"""
44
- try:
45
- memory_files = list(self.local_memory_dir.glob('*.md'))
46
- for mem_file in memory_files:
47
- upload_file(
48
- path_or_fileobj=str(mem_file),
49
- path_in_repo=mem_file.name,
50
- repo_id=self.hf_dataset,
51
- repo_type="dataset",
52
- commit_message=f"Update memory: {mem_file.name}"
53
- )
54
- print(f"Uploaded memory: {mem_file.name}")
55
- return True
56
- except Exception as e:
57
- print(f"Upload memory failed: {e}")
58
- return False
59
-
60
- if __name__ == '__main__':
61
- import sys
62
- sync = MemorySync()
63
- if len(sys.argv) > 1 and sys.argv[1] == 'upload':
64
- sync.upload_memory()
65
- else:
66
- sync.download_memory()