� backup: 2026-03-24 04:00

This commit is contained in:
huan
2026-03-24 04:00:48 +08:00
parent 7e143d3ebc
commit 31786dee08
193 changed files with 73520 additions and 1915 deletions
+94
View File
@@ -0,0 +1,94 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
飞书云盘自动上传脚本
功能:将本地备份自动上传到飞书云盘指定文件夹
"""
import os
import sys
import json
import subprocess
from datetime import datetime
from pathlib import Path
# 添加项目路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# 飞书配置
FOLDER_TOKEN = "C9jPf8MVwlvWgldZ7VHcHrLTnCf" # openclaw 文件夹
VECTOR_FOLDER_NAME = "向量记忆系统"
# 导入备份模块
from vector_memory import VectorMemorySystem
from memory_backup import MemoryBackup
def upload_file_to_feishu(file_path: str, folder_token: str) -> dict:
"""上传文件到飞书云盘"""
import requests
# 这个需要飞书开放平台的应用有云空间权限
# 使用用户身份调用 API(需要用户授权)
print(f"📤 准备上传: {file_path}")
# 方案:返回手动上传指引
return {
"success": False,
"message": "需要飞书应用权限",
"file_path": str(file_path)
}
def do_backup_and_upload():
"""执行备份并尝试上传"""
print("=" * 60)
print("🧠 向量记忆系统 - 定时备份")
print("=" * 60)
print(f"⏰ 执行时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
# 1. 获取 API Key
api_key = os.getenv("SILICONFLOW_API_KEY")
if not api_key:
print("❌ 未设置 SILICONFLOW_API_KEY")
return False
# 2. 执行本地备份
try:
vm = VectorMemorySystem(api_key=api_key)
backup = MemoryBackup(backup_dir="./backups")
result = backup.backup_all(vm)
print(f"\n✅ 本地备份完成!")
print(f" - JSON: {result['json']}")
print(f" - Markdown: {result['markdown']}")
except Exception as e:
print(f"❌ 备份失败: {e}")
return False
# 3. 尝试上传到飞书(需要权限)
print(f"\n📤 飞书云盘上传...")
# 这里可以后续添加自动上传逻辑
print(f"\n" + "=" * 60)
print("✅ 定时备份完成!")
print("=" * 60)
return True
def main():
"""主函数"""
# 直接执行备份
success = do_backup_and_upload()
if success:
print("\n🎉 备份成功完成!")
else:
print("\n❌ 备份失败,请检查日志")
sys.exit(1)
if __name__ == "__main__":
main()
@@ -0,0 +1,10 @@
{
"backup_time": "20260322_030028",
"files": {
"json": "backups/memory_backup_20260322_030028.json",
"markdown": "backups/memory_backup_20260322_030028.md",
"vector": "backups/vector_20260322_030028",
"timestamp": "20260322_030028"
},
"total_memories": 197
}
@@ -0,0 +1,10 @@
{
"backup_time": "20260324_030021",
"files": {
"json": "backups/memory_backup_20260324_030021.json",
"markdown": "backups/memory_backup_20260324_030021.md",
"vector": "backups/vector_20260324_030021",
"timestamp": "20260324_030021"
},
"total_memories": 200
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.
+95
View File
@@ -0,0 +1,95 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
向量记忆系统 - 飞书云盘同步脚本
功能:将本地备份自动上传到飞书云盘
"""
import os
import sys
import json
import subprocess
from datetime import datetime
from pathlib import Path
# 飞书云盘配置
FOLDER_TOKEN = "C9jPf8MVwlvWgldZ7VHcHrLTnCf" # openclaw 文件夹
def get_latest_backup():
"""获取最新备份文件"""
backup_dir = Path("./backups")
if not backup_dir.exists():
return None
# 找最新的 JSON 备份
json_files = list(backup_dir.glob("memory_backup_*.json"))
if not json_files:
return None
return max(json_files, key=os.path.getmtime)
def upload_to_feishu(file_path: str):
"""上传文件到飞书云盘"""
try:
# 使用飞书 CLI 或 API 上传
# 这里需要飞书开放平台的应用权限
print(f"📤 准备上传: {file_path}")
print(f"⚠️ 飞书云盘上传需要应用权限,请手动上传")
print(f" 1. 打开飞书云盘")
print(f" 2. 进入 openclaw 文件夹")
print(f" 3. 上传文件: {file_path}")
return False
except Exception as e:
print(f"❌ 上传失败: {e}")
return False
def sync_to_feishu():
"""同步最新备份到飞书"""
print("=" * 50)
print("🧠 向量记忆系统 - 飞书云盘同步")
print("=" * 50)
# 获取最新备份
latest = get_latest_backup()
if not latest:
print("❌ 没有找到备份文件,请先运行: python3 memory_backup.py backup")
return
print(f"\n📦 最新备份: {latest.name}")
print(f" 大小: {latest.stat().st_size / 1024:.1f} KB")
print(f" 时间: {datetime.fromtimestamp(latest.stat().st_mtime)}")
# 提示用户手动上传
print("\n" + "=" * 50)
print("📋 手动上传步骤:")
print("=" * 50)
print(f"1. 打开飞书 → 云空间 → openclaw 文件夹")
print(f"2. 点击「上传」按钮")
print(f"3. 选择文件: {latest.absolute()}")
print(f"4. 完成!")
print("=" * 50)
def main():
import argparse
parser = argparse.ArgumentParser(description="飞书云盘同步工具")
parser.add_argument("command", nargs="?", default="sync",
help="命令: sync(同步), latest(查看最新)")
args = parser.parse_args()
if args.command == "sync":
sync_to_feishu()
elif args.command == "latest":
latest = get_latest_backup()
if latest:
print(f"📦 最新备份: {latest.name}")
print(f" 路径: {latest.absolute()}")
else:
print("❌ 没有找到备份文件")
if __name__ == "__main__":
main()
+23
View File
@@ -0,0 +1,23 @@
#!/bin/bash
# 向量记忆系统安装脚本
echo "🔧 开始安装依赖..."
# 检查是否有 pip
if ! command -v pip &> /dev/null; then
echo "📦 安装 pip..."
sudo apt-get update && sudo apt-get install -y python3-pip
fi
# 安装 Python 依赖
echo "📦 安装 Python 包..."
pip install chromadb openai sqlalchemy
# 创建数据目录
mkdir -p ~/openclaw-memory-vector/data/memory
echo "✅ 安装完成!"
echo ""
echo "下一步:运行测试"
echo " cd ~/openclaw-memory-vector"
echo " python3 test_memory.py"
+58
View File
@@ -0,0 +1,58 @@
#!/bin/bash
# 🚀 向量记忆系统 - 一键部署脚本
echo "=========================================="
echo "🧠 OpenClaw 向量记忆系统 - 快速部署"
echo "=========================================="
# 1. 安装依赖
echo ""
echo "📦 步骤 1: 安装 Python 依赖..."
if ! command -v pip3 &> /dev/null; then
echo " 需要先安装 pip,请运行:"
echo " sudo apt-get update && sudo apt-get install -y python3-pip"
exit 1
fi
pip3 install chromadb openai sqlalchemy
# 2. 设置 API Key
echo ""
echo "🔑 步骤 2: 设置 API Key..."
if [ -z "$SILICONFLOW_API_KEY" ]; then
echo " 请运行以下命令(推荐写入 ~/.bashrc:"
echo ' export SILICONFLOW_API_KEY="sk-fpjdtxbxrhtekshircjhegstloxaodriekotjdyzzktyegcl"'
echo ""
echo " 或者临时运行:"
echo ' SILICONFLOW_API_KEY="sk-fpjdtxbxrhtekshircjhegstloxaodriekotjdyzzktyegcl" python3 test_memory.py'
fi
# 3. 创建目录
echo ""
echo "📁 步骤 3: 创建数据目录..."
mkdir -p ~/openclaw-memory-vector/data/memory
echo ""
echo "=========================================="
echo "✅ 部署完成!"
echo "=========================================="
echo ""
echo "📋 使用方法:"
echo ""
echo "1️⃣ 测试运行:"
echo " cd ~/openclaw-memory-vector"
echo ' export SILICONFLOW_API_KEY="sk-fpjdtxbxrhtekshircjhegstloxaodriekotjdyzzktyegcl"'
echo " python3 test_memory.py"
echo ""
echo "2️⃣ 添加记忆:"
echo ' python3 memory_cli.py add "今天学习了向量数据库" --importance 4 --tags 学习'
echo ""
echo "3️⃣ 搜索记忆:"
echo ' python3 memory_cli.py search "股票"'
echo ""
echo "4️⃣ 查看最近:"
echo " python3 memory_cli.py recent"
echo ""
echo "5️⃣ 统计数量:"
echo " python3 memory_cli.py count"
echo ""
+119
View File
@@ -0,0 +1,119 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
定时保存对话记忆到向量记忆系统
每天 23:40 自动执行
"""
import os
import sys
import json
from datetime import datetime, timedelta
# 添加项目路径
sys.path.insert(0, os.path.expanduser("~/openclaw-memory-vector"))
from vector_memory import VectorMemorySystem
def save_openclaw_sessions():
"""获取 OpenClaw 主会话关键内容"""
print("💬 正在读取 OpenClaw 会话...")
sessions_dir = os.path.expanduser("~/.openclaw/agents/main/sessions")
memories = []
seen_content = set()
if not os.path.exists(sessions_dir):
print(" ⚠️ 会话目录不存在")
return memories
# 获取最近一天的会话文件
yesterday = datetime.now() - timedelta(days=1)
for f in os.listdir(sessions_dir):
if not f.endswith('.jsonl') or '.deleted.' in f or '.reset.' in f:
continue
filepath = os.path.join(sessions_dir, f)
mtime = datetime.fromtimestamp(os.path.getmtime(filepath))
# 只读取昨天修改过的文件
if mtime > yesterday:
try:
with open(filepath, 'r', encoding='utf-8') as file:
lines = file.readlines()
# 取最近 20 条
recent_lines = lines[-20:] if len(lines) > 20 else lines
for line in recent_lines:
if not line.strip():
continue
try:
data = json.loads(line)
# 提取用户消息
if data.get('role') == 'user':
content = data.get('content', '')
# 简化内容
if content and len(content) > 10 and len(content) < 500:
# 取前100字
short = content[:100]
if short not in seen_content:
seen_content.add(short)
memories.append(short)
except:
pass
except Exception as e:
print(f" ⚠️ 读取失败: {e}")
# 去重
unique_memories = list(seen_content)[:10] # 最多10条
print(f" ✅ 提取了 {len(unique_memories)} 条独特对话")
return unique_memories
def main():
"""主函数"""
print(f"\n{'='*60}")
print(f"💾 对话记忆保存任务")
print(f"⏰ 执行时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"{'='*60}")
# 获取 API Key
api_key = os.getenv("SILICONFLOW_API_KEY", "sk-fpjdtxbxrhtekshircjhegstloxaodriekotjdyzzktyegcl")
# 初始化向量记忆
vm = VectorMemorySystem(api_key=api_key)
# 获取 OpenClaw 会话
sessions = save_openclaw_sessions()
# 添加到记忆
if sessions:
count = 0
for msg in sessions:
vm.add_memory(
content=f"[对话记录] {msg}...",
metadata={"source": "auto_save", "type": "conversation"},
importance=3
)
count += 1
print(f"\n✅ 已保存 {count} 条对话记忆")
else:
print("\n📝 暂无新对话记录")
# 记录任务执行
vm.add_memory(
content=f"定时任务: {datetime.now().strftime('%Y-%m-%d %H:%M')} 对话记忆保存",
metadata={"source": "cron", "type": "task"},
importance=2
)
print(f"\n{'='*60}")
print("✅ 任务完成!")
print("=" * 60)
if __name__ == "__main__":
main()
+85
View File
@@ -0,0 +1,85 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
定时备份 + 飞书云盘上传
自动执行备份并尝试上传到飞书
"""
import os
import sys
import json
from datetime import datetime
from pathlib import Path
# 项目路径
PROJECT_DIR = os.path.expanduser("~/openclaw-memory-vector")
sys.path.insert(0, PROJECT_DIR)
# 飞书配置
FEISHU_FOLDER_TOKEN = "GE2hfjECFlSSaedOFNccWhEknUf" # 向量记忆系统文件夹
def upload_to_feishu(file_path: str):
"""上传文件到飞书云盘"""
from feishu_drive_file import upload as feishu_upload
file_name = os.path.basename(file_path)
file_size = os.path.getsize(file_path)
# 读取文件内容
with open(file_path, 'rb') as f:
file_content = f.read()
import base64
file_content_b64 = base64.b64encode(file_content).decode('utf-8')
try:
result = feishu_upload(
file_path=file_path,
parent_node=FEISHU_FOLDER_TOKEN
)
return result
except Exception as e:
print(f"⚠️ 自动上传暂不可用: {e}")
return None
def run_backup():
"""执行备份"""
print(f"\n{'='*60}")
print(f"🧠 定时备份任务 | {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"{'='*60}")
# 切换到项目目录
os.chdir(PROJECT_DIR)
# 设置环境变量
os.environ["SILICONFLOW_API_KEY"] = "sk-fpjdtxbxrhtekshircjhegstloxaodriekotjdyzzktyegcl"
# 导入模块
from vector_memory import VectorMemorySystem
from memory_backup import MemoryBackup
# 执行备份
api_key = os.getenv("SILICONFLOW_API_KEY")
vm = VectorMemorySystem(api_key=api_key)
backup = MemoryBackup()
result = backup.backup_all(vm)
print(f"\n✅ 本地备份完成!")
print(f" - JSON: {result['json']}")
print(f" - Markdown: {result['markdown']}")
# 上传到飞书(尝试)
print(f"\n📤 尝试上传到飞书云盘...")
json_file = result['json']
# 注意:飞书上传需要应用权限,这里只是记录
print(f" 📋 备份文件: {json_file}")
print(f" 💡 如需自动上传,请在飞书云盘手动上传或配置应用权限")
return result
if __name__ == "__main__":
run_backup()