� backup: 2026-03-24 04:00
This commit is contained in:
@@ -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.
Binary file not shown.
Binary file not shown.
@@ -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()
|
||||
@@ -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"
|
||||
@@ -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 ""
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user