每日备份 2026-03-27

This commit is contained in:
OpenClaw Backup
2026-03-27 23:38:45 +08:00
parent 4f11cd7b03
commit d09281e48c
827 changed files with 6991 additions and 148648 deletions
-94
View File
@@ -1,94 +0,0 @@
#!/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()
@@ -1,10 +0,0 @@
{
"backup_time": "20260321_145354",
"files": {
"json": "backups/memory_backup_20260321_145354.json",
"markdown": "backups/memory_backup_20260321_145354.md",
"vector": "backups/vector_20260321_145354",
"timestamp": "20260321_145354"
},
"total_memories": 20
}
@@ -1,10 +0,0 @@
{
"backup_time": "20260321_151149",
"files": {
"json": "backups/memory_backup_20260321_151149.json",
"markdown": "backups/memory_backup_20260321_151149.md",
"vector": "backups/vector_20260321_151149",
"timestamp": "20260321_151149"
},
"total_memories": 20
}
@@ -1,10 +0,0 @@
{
"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
}
@@ -1,10 +0,0 @@
{
"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
}
@@ -1,10 +0,0 @@
{
"backup_time": "20260325_030013",
"files": {
"json": "backups/memory_backup_20260325_030013.json",
"markdown": "backups/memory_backup_20260325_030013.md",
"vector": "backups/vector_20260325_030013",
"timestamp": "20260325_030013"
},
"total_memories": 200
}
@@ -1,309 +0,0 @@
{
"version": "1.0",
"export_time": "2026-03-21T14:53:54.981182",
"total_count": 20,
"memories": [
{
"id": "58099dc0-0821-4160-8c0a-2318872d7f97",
"content": "向量记忆系统架构:硅基流动BGE-M3 + Chroma + SQLite",
"metadata": {
"tags": [
"系统",
"向量"
],
"source": "MEMORY.md"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:53:19",
"updated_at": "2026-03-21 06:53:19"
},
{
"id": "19609b85-9301-499d-bfcc-54f80bee70ca",
"content": "潜力股池:中钨高新000657、北方稀土600111、南都电源300068、宁德时代300750、中芯国际688981",
"metadata": {
"tags": [
"股票",
"潜力股"
],
"source": "MEMORY.md"
},
"importance": 3,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "023e98c3-5209-4f9c-aad4-abef1990d80b",
"content": "飞书应用 App ID: cli_a93815b250b9dcb5",
"metadata": {
"tags": [
"配置",
"飞书"
],
"source": "MEMORY.md"
},
"importance": 3,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "f2687443-df55-4e30-9a7e-393fa0482189",
"content": "企业微信Bot ID: aibQ3hBrPtfh1C26UZA-KNdq1CAX_uj9GDW",
"metadata": {
"tags": [
"配置",
"企微"
],
"source": "MEMORY.md"
},
"importance": 3,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "0befb952-a325-4220-a4c0-2e04ba4aa0b1",
"content": "股票监控配置:数据源腾讯财经,监控频率交易时间5分钟/收盘后30分钟",
"metadata": {
"tags": [
"股票",
"监控"
],
"source": "MEMORY.md"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "30bf76a7-d20c-4c5d-95ea-58c4fc48a8ca",
"content": "岩山科技 002195:成本价10.68元,200股,盈利≥5%跑路,目标价11.21元",
"metadata": {
"tags": [
"股票",
"岩山科技"
],
"source": "MEMORY.md"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "69b26384-1c18-42a8-bc72-d5918bde5be0",
"content": "云天化 600096:成本价42.00元,涨跌±5%预警",
"metadata": {
"tags": [
"股票",
"云天化"
],
"source": "MEMORY.md"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "2ccf18a3-bfba-4e4e-a59f-fcdb56c0e903",
"content": "仕佳光子 688313:成本价15.00元,涨跌±5%预警",
"metadata": {
"tags": [
"股票",
"仕佳光子"
],
"source": "MEMORY.md"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "d08bcddc-bb13-4eaa-b278-54096bd806cf",
"content": "铜陵有色 000630:成本价7.90元,1400股,跌破6.80元预警",
"metadata": {
"tags": [
"股票",
"铜陵有色"
],
"source": "MEMORY.md"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "a9aff0cd-2f2e-4c94-8750-5fb00ce6ab71",
"content": "用户档案:称呼欢哥,技术栈Python/JavaScript/Linux,偏好直接答案+可执行代码",
"metadata": {
"tags": [
"用户",
"偏好"
],
"source": "MEMORY.md"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "ea68fe7b-6463-4fe7-abf4-b0f03f3300d8",
"content": "银豹系统采购订单遇到确定按钮无法点击的问题",
"metadata": {
"tags": [
"问题",
"银豹"
],
"状态": "待解决"
},
"importance": 2,
"tier": "hot",
"created_at": "2026-03-21 06:51:36",
"updated_at": "2026-03-21 06:51:36"
},
{
"id": "23f398b5-339a-4ab3-9651-7c48cfa00979",
"content": "学习了在 AMD RX 580 上部署 Ollama 的方案",
"metadata": {
"tags": [
"学习",
"Ollama",
"GPU"
],
"重要性": "中"
},
"importance": 3,
"tier": "hot",
"created_at": "2026-03-21 06:51:36",
"updated_at": "2026-03-21 06:51:36"
},
{
"id": "245ec74a-f16d-4dcd-a993-1caa6fe691c2",
"content": "用户偏好:喜欢直接答案+可执行代码,解释要简练",
"metadata": {
"tags": [
"偏好",
"交互"
],
"来源": "USER.md"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:51:36",
"updated_at": "2026-03-21 06:51:36"
},
{
"id": "86d1b3b0-46f6-4a98-92c2-f01b01195dff",
"content": "关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警",
"metadata": {
"tags": [
"股票",
"铜陵有色"
],
"类型": "投资"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:51:36",
"updated_at": "2026-03-21 06:51:36"
},
{
"id": "574de41e-e3dd-488e-a181-16a4f9b1b1dd",
"content": "2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构",
"metadata": {
"tags": [
"系统部署",
"向量"
],
"项目": "记忆系统"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:51:36",
"updated_at": "2026-03-21 06:51:36"
},
{
"id": "b48b18fa-d12c-43a9-a2e7-a958b1a1c693",
"content": "银豹系统采购订单遇到确定按钮无法点击的问题",
"metadata": {
"tags": [
"问题",
"银豹"
],
"状态": "待解决"
},
"importance": 2,
"tier": "hot",
"created_at": "2026-03-21 06:49:48",
"updated_at": "2026-03-21 06:49:48"
},
{
"id": "ca5d18fd-d298-4e46-83cc-2b2a03264b57",
"content": "学习了在 AMD RX 580 上部署 Ollama 的方案",
"metadata": {
"tags": [
"学习",
"Ollama",
"GPU"
],
"重要性": "中"
},
"importance": 3,
"tier": "hot",
"created_at": "2026-03-21 06:49:48",
"updated_at": "2026-03-21 06:49:48"
},
{
"id": "22a5569c-212f-4a27-8e9f-54baa3ef28c3",
"content": "用户偏好:喜欢直接答案+可执行代码,解释要简练",
"metadata": {
"tags": [
"偏好",
"交互"
],
"来源": "USER.md"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:49:48",
"updated_at": "2026-03-21 06:49:48"
},
{
"id": "2eceba52-a885-43fb-9464-36a03edc15df",
"content": "关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警",
"metadata": {
"tags": [
"股票",
"铜陵有色"
],
"类型": "投资"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:49:48",
"updated_at": "2026-03-21 06:49:48"
},
{
"id": "d91a2f68-76d2-46d5-aa2b-7ee72ee22444",
"content": "2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构",
"metadata": {
"tags": [
"系统部署",
"向量"
],
"项目": "记忆系统"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:49:48",
"updated_at": "2026-03-21 06:49:48"
}
]
}
@@ -1,226 +0,0 @@
# 🧠 OpenClaw 向量记忆备份
> 导出时间: 2026-03-21 14:53:54
> 总数量: 20 条
---
## 1. [⭐⭐⭐⭐] 向量记忆系统架构:硅基流动BGE-M3 + Chroma + SQLite...
- **ID**: `58099dc0-0821-4160-8c0a-2318872d7f97`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 系统, 向量
- **创建时间**: 2026-03-21 06:53:19
- **内容**: 向量记忆系统架构:硅基流动BGE-M3 + Chroma + SQLite
---
## 2. [⭐⭐⭐] 潜力股池:中钨高新000657、北方稀土600111、南都电源300068、宁德时代300750、中芯国际688981...
- **ID**: `19609b85-9301-499d-bfcc-54f80bee70ca`
- **重要性**: 3/5
- **层级**: hot
- **标签**: 股票, 潜力股
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 潜力股池:中钨高新000657、北方稀土600111、南都电源300068、宁德时代300750、中芯国际688981
---
## 3. [⭐⭐⭐] 飞书应用 App ID: cli_a93815b250b9dcb5...
- **ID**: `023e98c3-5209-4f9c-aad4-abef1990d80b`
- **重要性**: 3/5
- **层级**: hot
- **标签**: 配置, 飞书
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 飞书应用 App ID: cli_a93815b250b9dcb5
---
## 4. [⭐⭐⭐] 企业微信Bot ID: aibQ3hBrPtfh1C26UZA-KNdq1CAX_uj9GDW...
- **ID**: `f2687443-df55-4e30-9a7e-393fa0482189`
- **重要性**: 3/5
- **层级**: hot
- **标签**: 配置, 企微
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 企业微信Bot ID: aibQ3hBrPtfh1C26UZA-KNdq1CAX_uj9GDW
---
## 5. [⭐⭐⭐⭐] 股票监控配置:数据源腾讯财经,监控频率交易时间5分钟/收盘后30分钟...
- **ID**: `0befb952-a325-4220-a4c0-2e04ba4aa0b1`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 股票, 监控
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 股票监控配置:数据源腾讯财经,监控频率交易时间5分钟/收盘后30分钟
---
## 6. [⭐⭐⭐⭐⭐] 岩山科技 002195:成本价10.68元,200股,盈利≥5%跑路,目标价11.21元...
- **ID**: `30bf76a7-d20c-4c5d-95ea-58c4fc48a8ca`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 股票, 岩山科技
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 岩山科技 002195:成本价10.68元,200股,盈利≥5%跑路,目标价11.21元
---
## 7. [⭐⭐⭐⭐] 云天化 600096:成本价42.00元,涨跌±5%预警...
- **ID**: `69b26384-1c18-42a8-bc72-d5918bde5be0`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 股票, 云天化
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 云天化 600096:成本价42.00元,涨跌±5%预警
---
## 8. [⭐⭐⭐⭐] 仕佳光子 688313:成本价15.00元,涨跌±5%预警...
- **ID**: `2ccf18a3-bfba-4e4e-a59f-fcdb56c0e903`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 股票, 仕佳光子
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 仕佳光子 688313:成本价15.00元,涨跌±5%预警
---
## 9. [⭐⭐⭐⭐⭐] 铜陵有色 000630:成本价7.90元,1400股,跌破6.80元预警...
- **ID**: `d08bcddc-bb13-4eaa-b278-54096bd806cf`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 股票, 铜陵有色
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 铜陵有色 000630:成本价7.90元,1400股,跌破6.80元预警
---
## 10. [⭐⭐⭐⭐⭐] 用户档案:称呼欢哥,技术栈Python/JavaScript/Linux,偏好直接答案+可执行代码...
- **ID**: `a9aff0cd-2f2e-4c94-8750-5fb00ce6ab71`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 用户, 偏好
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 用户档案:称呼欢哥,技术栈Python/JavaScript/Linux,偏好直接答案+可执行代码
---
## 11. [⭐⭐] 银豹系统采购订单遇到确定按钮无法点击的问题...
- **ID**: `ea68fe7b-6463-4fe7-abf4-b0f03f3300d8`
- **重要性**: 2/5
- **层级**: hot
- **标签**: 问题, 银豹
- **创建时间**: 2026-03-21 06:51:36
- **内容**: 银豹系统采购订单遇到确定按钮无法点击的问题
---
## 12. [⭐⭐⭐] 学习了在 AMD RX 580 上部署 Ollama 的方案...
- **ID**: `23f398b5-339a-4ab3-9651-7c48cfa00979`
- **重要性**: 3/5
- **层级**: hot
- **标签**: 学习, Ollama, GPU
- **创建时间**: 2026-03-21 06:51:36
- **内容**: 学习了在 AMD RX 580 上部署 Ollama 的方案
---
## 13. [⭐⭐⭐⭐⭐] 用户偏好:喜欢直接答案+可执行代码,解释要简练...
- **ID**: `245ec74a-f16d-4dcd-a993-1caa6fe691c2`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 偏好, 交互
- **创建时间**: 2026-03-21 06:51:36
- **内容**: 用户偏好:喜欢直接答案+可执行代码,解释要简练
---
## 14. [⭐⭐⭐⭐⭐] 关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警...
- **ID**: `86d1b3b0-46f6-4a98-92c2-f01b01195dff`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 股票, 铜陵有色
- **创建时间**: 2026-03-21 06:51:36
- **内容**: 关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警
---
## 15. [⭐⭐⭐⭐] 2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构...
- **ID**: `574de41e-e3dd-488e-a181-16a4f9b1b1dd`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 系统部署, 向量
- **创建时间**: 2026-03-21 06:51:36
- **内容**: 2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构
---
## 16. [⭐⭐] 银豹系统采购订单遇到确定按钮无法点击的问题...
- **ID**: `b48b18fa-d12c-43a9-a2e7-a958b1a1c693`
- **重要性**: 2/5
- **层级**: hot
- **标签**: 问题, 银豹
- **创建时间**: 2026-03-21 06:49:48
- **内容**: 银豹系统采购订单遇到确定按钮无法点击的问题
---
## 17. [⭐⭐⭐] 学习了在 AMD RX 580 上部署 Ollama 的方案...
- **ID**: `ca5d18fd-d298-4e46-83cc-2b2a03264b57`
- **重要性**: 3/5
- **层级**: hot
- **标签**: 学习, Ollama, GPU
- **创建时间**: 2026-03-21 06:49:48
- **内容**: 学习了在 AMD RX 580 上部署 Ollama 的方案
---
## 18. [⭐⭐⭐⭐⭐] 用户偏好:喜欢直接答案+可执行代码,解释要简练...
- **ID**: `22a5569c-212f-4a27-8e9f-54baa3ef28c3`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 偏好, 交互
- **创建时间**: 2026-03-21 06:49:48
- **内容**: 用户偏好:喜欢直接答案+可执行代码,解释要简练
---
## 19. [⭐⭐⭐⭐⭐] 关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警...
- **ID**: `2eceba52-a885-43fb-9464-36a03edc15df`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 股票, 铜陵有色
- **创建时间**: 2026-03-21 06:49:48
- **内容**: 关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警
---
## 20. [⭐⭐⭐⭐] 2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构...
- **ID**: `d91a2f68-76d2-46d5-aa2b-7ee72ee22444`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 系统部署, 向量
- **创建时间**: 2026-03-21 06:49:48
- **内容**: 2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构
---
@@ -1,309 +0,0 @@
{
"version": "1.0",
"export_time": "2026-03-21T15:11:49.229443",
"total_count": 20,
"memories": [
{
"id": "58099dc0-0821-4160-8c0a-2318872d7f97",
"content": "向量记忆系统架构:硅基流动BGE-M3 + Chroma + SQLite",
"metadata": {
"tags": [
"系统",
"向量"
],
"source": "MEMORY.md"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:53:19",
"updated_at": "2026-03-21 06:53:19"
},
{
"id": "19609b85-9301-499d-bfcc-54f80bee70ca",
"content": "潜力股池:中钨高新000657、北方稀土600111、南都电源300068、宁德时代300750、中芯国际688981",
"metadata": {
"tags": [
"股票",
"潜力股"
],
"source": "MEMORY.md"
},
"importance": 3,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "023e98c3-5209-4f9c-aad4-abef1990d80b",
"content": "飞书应用 App ID: cli_a93815b250b9dcb5",
"metadata": {
"tags": [
"配置",
"飞书"
],
"source": "MEMORY.md"
},
"importance": 3,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "f2687443-df55-4e30-9a7e-393fa0482189",
"content": "企业微信Bot ID: aibQ3hBrPtfh1C26UZA-KNdq1CAX_uj9GDW",
"metadata": {
"tags": [
"配置",
"企微"
],
"source": "MEMORY.md"
},
"importance": 3,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "0befb952-a325-4220-a4c0-2e04ba4aa0b1",
"content": "股票监控配置:数据源腾讯财经,监控频率交易时间5分钟/收盘后30分钟",
"metadata": {
"tags": [
"股票",
"监控"
],
"source": "MEMORY.md"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "30bf76a7-d20c-4c5d-95ea-58c4fc48a8ca",
"content": "岩山科技 002195:成本价10.68元,200股,盈利≥5%跑路,目标价11.21元",
"metadata": {
"tags": [
"股票",
"岩山科技"
],
"source": "MEMORY.md"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "69b26384-1c18-42a8-bc72-d5918bde5be0",
"content": "云天化 600096:成本价42.00元,涨跌±5%预警",
"metadata": {
"tags": [
"股票",
"云天化"
],
"source": "MEMORY.md"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "2ccf18a3-bfba-4e4e-a59f-fcdb56c0e903",
"content": "仕佳光子 688313:成本价15.00元,涨跌±5%预警",
"metadata": {
"tags": [
"股票",
"仕佳光子"
],
"source": "MEMORY.md"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "d08bcddc-bb13-4eaa-b278-54096bd806cf",
"content": "铜陵有色 000630:成本价7.90元,1400股,跌破6.80元预警",
"metadata": {
"tags": [
"股票",
"铜陵有色"
],
"source": "MEMORY.md"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "a9aff0cd-2f2e-4c94-8750-5fb00ce6ab71",
"content": "用户档案:称呼欢哥,技术栈Python/JavaScript/Linux,偏好直接答案+可执行代码",
"metadata": {
"tags": [
"用户",
"偏好"
],
"source": "MEMORY.md"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:53:18",
"updated_at": "2026-03-21 06:53:18"
},
{
"id": "ea68fe7b-6463-4fe7-abf4-b0f03f3300d8",
"content": "银豹系统采购订单遇到确定按钮无法点击的问题",
"metadata": {
"tags": [
"问题",
"银豹"
],
"状态": "待解决"
},
"importance": 2,
"tier": "hot",
"created_at": "2026-03-21 06:51:36",
"updated_at": "2026-03-21 06:51:36"
},
{
"id": "23f398b5-339a-4ab3-9651-7c48cfa00979",
"content": "学习了在 AMD RX 580 上部署 Ollama 的方案",
"metadata": {
"tags": [
"学习",
"Ollama",
"GPU"
],
"重要性": "中"
},
"importance": 3,
"tier": "hot",
"created_at": "2026-03-21 06:51:36",
"updated_at": "2026-03-21 06:51:36"
},
{
"id": "245ec74a-f16d-4dcd-a993-1caa6fe691c2",
"content": "用户偏好:喜欢直接答案+可执行代码,解释要简练",
"metadata": {
"tags": [
"偏好",
"交互"
],
"来源": "USER.md"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:51:36",
"updated_at": "2026-03-21 06:51:36"
},
{
"id": "86d1b3b0-46f6-4a98-92c2-f01b01195dff",
"content": "关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警",
"metadata": {
"tags": [
"股票",
"铜陵有色"
],
"类型": "投资"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:51:36",
"updated_at": "2026-03-21 06:51:36"
},
{
"id": "574de41e-e3dd-488e-a181-16a4f9b1b1dd",
"content": "2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构",
"metadata": {
"tags": [
"系统部署",
"向量"
],
"项目": "记忆系统"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:51:36",
"updated_at": "2026-03-21 06:51:36"
},
{
"id": "b48b18fa-d12c-43a9-a2e7-a958b1a1c693",
"content": "银豹系统采购订单遇到确定按钮无法点击的问题",
"metadata": {
"tags": [
"问题",
"银豹"
],
"状态": "待解决"
},
"importance": 2,
"tier": "hot",
"created_at": "2026-03-21 06:49:48",
"updated_at": "2026-03-21 06:49:48"
},
{
"id": "ca5d18fd-d298-4e46-83cc-2b2a03264b57",
"content": "学习了在 AMD RX 580 上部署 Ollama 的方案",
"metadata": {
"tags": [
"学习",
"Ollama",
"GPU"
],
"重要性": "中"
},
"importance": 3,
"tier": "hot",
"created_at": "2026-03-21 06:49:48",
"updated_at": "2026-03-21 06:49:48"
},
{
"id": "22a5569c-212f-4a27-8e9f-54baa3ef28c3",
"content": "用户偏好:喜欢直接答案+可执行代码,解释要简练",
"metadata": {
"tags": [
"偏好",
"交互"
],
"来源": "USER.md"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:49:48",
"updated_at": "2026-03-21 06:49:48"
},
{
"id": "2eceba52-a885-43fb-9464-36a03edc15df",
"content": "关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警",
"metadata": {
"tags": [
"股票",
"铜陵有色"
],
"类型": "投资"
},
"importance": 5,
"tier": "hot",
"created_at": "2026-03-21 06:49:48",
"updated_at": "2026-03-21 06:49:48"
},
{
"id": "d91a2f68-76d2-46d5-aa2b-7ee72ee22444",
"content": "2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构",
"metadata": {
"tags": [
"系统部署",
"向量"
],
"项目": "记忆系统"
},
"importance": 4,
"tier": "hot",
"created_at": "2026-03-21 06:49:48",
"updated_at": "2026-03-21 06:49:48"
}
]
}
@@ -1,226 +0,0 @@
# 🧠 OpenClaw 向量记忆备份
> 导出时间: 2026-03-21 15:11:49
> 总数量: 20 条
---
## 1. [⭐⭐⭐⭐] 向量记忆系统架构:硅基流动BGE-M3 + Chroma + SQLite...
- **ID**: `58099dc0-0821-4160-8c0a-2318872d7f97`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 系统, 向量
- **创建时间**: 2026-03-21 06:53:19
- **内容**: 向量记忆系统架构:硅基流动BGE-M3 + Chroma + SQLite
---
## 2. [⭐⭐⭐] 潜力股池:中钨高新000657、北方稀土600111、南都电源300068、宁德时代300750、中芯国际688981...
- **ID**: `19609b85-9301-499d-bfcc-54f80bee70ca`
- **重要性**: 3/5
- **层级**: hot
- **标签**: 股票, 潜力股
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 潜力股池:中钨高新000657、北方稀土600111、南都电源300068、宁德时代300750、中芯国际688981
---
## 3. [⭐⭐⭐] 飞书应用 App ID: cli_a93815b250b9dcb5...
- **ID**: `023e98c3-5209-4f9c-aad4-abef1990d80b`
- **重要性**: 3/5
- **层级**: hot
- **标签**: 配置, 飞书
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 飞书应用 App ID: cli_a93815b250b9dcb5
---
## 4. [⭐⭐⭐] 企业微信Bot ID: aibQ3hBrPtfh1C26UZA-KNdq1CAX_uj9GDW...
- **ID**: `f2687443-df55-4e30-9a7e-393fa0482189`
- **重要性**: 3/5
- **层级**: hot
- **标签**: 配置, 企微
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 企业微信Bot ID: aibQ3hBrPtfh1C26UZA-KNdq1CAX_uj9GDW
---
## 5. [⭐⭐⭐⭐] 股票监控配置:数据源腾讯财经,监控频率交易时间5分钟/收盘后30分钟...
- **ID**: `0befb952-a325-4220-a4c0-2e04ba4aa0b1`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 股票, 监控
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 股票监控配置:数据源腾讯财经,监控频率交易时间5分钟/收盘后30分钟
---
## 6. [⭐⭐⭐⭐⭐] 岩山科技 002195:成本价10.68元,200股,盈利≥5%跑路,目标价11.21元...
- **ID**: `30bf76a7-d20c-4c5d-95ea-58c4fc48a8ca`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 股票, 岩山科技
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 岩山科技 002195:成本价10.68元,200股,盈利≥5%跑路,目标价11.21元
---
## 7. [⭐⭐⭐⭐] 云天化 600096:成本价42.00元,涨跌±5%预警...
- **ID**: `69b26384-1c18-42a8-bc72-d5918bde5be0`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 股票, 云天化
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 云天化 600096:成本价42.00元,涨跌±5%预警
---
## 8. [⭐⭐⭐⭐] 仕佳光子 688313:成本价15.00元,涨跌±5%预警...
- **ID**: `2ccf18a3-bfba-4e4e-a59f-fcdb56c0e903`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 股票, 仕佳光子
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 仕佳光子 688313:成本价15.00元,涨跌±5%预警
---
## 9. [⭐⭐⭐⭐⭐] 铜陵有色 000630:成本价7.90元,1400股,跌破6.80元预警...
- **ID**: `d08bcddc-bb13-4eaa-b278-54096bd806cf`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 股票, 铜陵有色
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 铜陵有色 000630:成本价7.90元,1400股,跌破6.80元预警
---
## 10. [⭐⭐⭐⭐⭐] 用户档案:称呼欢哥,技术栈Python/JavaScript/Linux,偏好直接答案+可执行代码...
- **ID**: `a9aff0cd-2f2e-4c94-8750-5fb00ce6ab71`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 用户, 偏好
- **创建时间**: 2026-03-21 06:53:18
- **内容**: 用户档案:称呼欢哥,技术栈Python/JavaScript/Linux,偏好直接答案+可执行代码
---
## 11. [⭐⭐] 银豹系统采购订单遇到确定按钮无法点击的问题...
- **ID**: `ea68fe7b-6463-4fe7-abf4-b0f03f3300d8`
- **重要性**: 2/5
- **层级**: hot
- **标签**: 问题, 银豹
- **创建时间**: 2026-03-21 06:51:36
- **内容**: 银豹系统采购订单遇到确定按钮无法点击的问题
---
## 12. [⭐⭐⭐] 学习了在 AMD RX 580 上部署 Ollama 的方案...
- **ID**: `23f398b5-339a-4ab3-9651-7c48cfa00979`
- **重要性**: 3/5
- **层级**: hot
- **标签**: 学习, Ollama, GPU
- **创建时间**: 2026-03-21 06:51:36
- **内容**: 学习了在 AMD RX 580 上部署 Ollama 的方案
---
## 13. [⭐⭐⭐⭐⭐] 用户偏好:喜欢直接答案+可执行代码,解释要简练...
- **ID**: `245ec74a-f16d-4dcd-a993-1caa6fe691c2`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 偏好, 交互
- **创建时间**: 2026-03-21 06:51:36
- **内容**: 用户偏好:喜欢直接答案+可执行代码,解释要简练
---
## 14. [⭐⭐⭐⭐⭐] 关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警...
- **ID**: `86d1b3b0-46f6-4a98-92c2-f01b01195dff`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 股票, 铜陵有色
- **创建时间**: 2026-03-21 06:51:36
- **内容**: 关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警
---
## 15. [⭐⭐⭐⭐] 2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构...
- **ID**: `574de41e-e3dd-488e-a181-16a4f9b1b1dd`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 系统部署, 向量
- **创建时间**: 2026-03-21 06:51:36
- **内容**: 2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构
---
## 16. [⭐⭐] 银豹系统采购订单遇到确定按钮无法点击的问题...
- **ID**: `b48b18fa-d12c-43a9-a2e7-a958b1a1c693`
- **重要性**: 2/5
- **层级**: hot
- **标签**: 问题, 银豹
- **创建时间**: 2026-03-21 06:49:48
- **内容**: 银豹系统采购订单遇到确定按钮无法点击的问题
---
## 17. [⭐⭐⭐] 学习了在 AMD RX 580 上部署 Ollama 的方案...
- **ID**: `ca5d18fd-d298-4e46-83cc-2b2a03264b57`
- **重要性**: 3/5
- **层级**: hot
- **标签**: 学习, Ollama, GPU
- **创建时间**: 2026-03-21 06:49:48
- **内容**: 学习了在 AMD RX 580 上部署 Ollama 的方案
---
## 18. [⭐⭐⭐⭐⭐] 用户偏好:喜欢直接答案+可执行代码,解释要简练...
- **ID**: `22a5569c-212f-4a27-8e9f-54baa3ef28c3`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 偏好, 交互
- **创建时间**: 2026-03-21 06:49:48
- **内容**: 用户偏好:喜欢直接答案+可执行代码,解释要简练
---
## 19. [⭐⭐⭐⭐⭐] 关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警...
- **ID**: `2eceba52-a885-43fb-9464-36a03edc15df`
- **重要性**: 5/5
- **层级**: hot
- **标签**: 股票, 铜陵有色
- **创建时间**: 2026-03-21 06:49:48
- **内容**: 关注了铜陵有色股票,成本价 7.90 元,跌破 6.80 元预警
---
## 20. [⭐⭐⭐⭐] 2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构...
- **ID**: `d91a2f68-76d2-46d5-aa2b-7ee72ee22444`
- **重要性**: 4/5
- **层级**: hot
- **标签**: 系统部署, 向量
- **创建时间**: 2026-03-21 06:49:48
- **内容**: 2026-03-21: 部署了向量记忆系统,采用硅基流动 BGE-M3 + Chroma + SQLite 架构
---
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
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
@@ -1,95 +0,0 @@
#!/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
@@ -1,23 +0,0 @@
#!/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"
-221
View File
@@ -1,221 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
向量记忆系统 - 自动备份脚本
支持:
1. 导出到本地 JSON/Markdown
2. 同步到飞书云盘
3. 定时自动备份
"""
import os
import sys
import json
import sqlite3
import shutil
from datetime import datetime
from pathlib import Path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from vector_memory import VectorMemorySystem
class MemoryBackup:
"""记忆备份管理器"""
def __init__(self, backup_dir: str = "./backups"):
self.backup_dir = Path(backup_dir)
self.backup_dir.mkdir(exist_ok=True)
def export_json(self, vm: VectorMemorySystem, filepath: str = None) -> str:
"""导出为 JSON 格式"""
if not filepath:
filepath = self.backup_dir / f"memory_backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
# 从 SQLite 读取全部记忆
conn = sqlite3.connect(vm.db_path)
conn.row_factory = sqlite3.Row
cursor = conn.execute("SELECT * FROM memories ORDER BY created_at DESC")
memories = []
for row in cursor.fetchall():
memories.append({
'id': row['id'],
'content': row['content'],
'metadata': json.loads(row['metadata']) if row['metadata'] else {},
'importance': row['importance'],
'tier': row['tier'],
'created_at': row['created_at'],
'updated_at': row['updated_at']
})
conn.close()
# 写入文件
backup_data = {
'version': '1.0',
'export_time': datetime.now().isoformat(),
'total_count': len(memories),
'memories': memories
}
with open(filepath, 'w', encoding='utf-8') as f:
json.dump(backup_data, f, ensure_ascii=False, indent=2)
print(f"✅ JSON 备份已保存: {filepath}")
return str(filepath)
def export_markdown(self, vm: VectorMemorySystem, filepath: str = None) -> str:
"""导出为 Markdown 格式(可读性好)"""
if not filepath:
filepath = self.backup_dir / f"memory_backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md"
# 从 SQLite 读取
conn = sqlite3.connect(vm.db_path)
conn.row_factory = sqlite3.Row
cursor = conn.execute("SELECT * FROM memories ORDER BY created_at DESC")
rows = cursor.fetchall()
conn.close()
# 生成 Markdown
md_lines = [
"# 🧠 OpenClaw 向量记忆备份",
f"",
f"> 导出时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}",
f"> 总数量: {len(rows)}",
f"",
f"---",
f""
]
for i, row in enumerate(rows, 1):
metadata = json.loads(row['metadata']) if row['metadata'] else {}
tags = metadata.get('tags', [])
md_lines.append(f"## {i}. [{'' * row['importance']}] {row['content'][:60]}...")
md_lines.append(f"")
md_lines.append(f"- **ID**: `{row['id']}`")
md_lines.append(f"- **重要性**: {row['importance']}/5")
md_lines.append(f"- **层级**: {row['tier']}")
md_lines.append(f"- **标签**: {', '.join(tags) if tags else ''}")
md_lines.append(f"- **创建时间**: {row['created_at']}")
md_lines.append(f"- **内容**: {row['content']}")
md_lines.append(f"")
md_lines.append(f"---")
md_lines.append(f"")
with open(filepath, 'w', encoding='utf-8') as f:
f.write('\n'.join(md_lines))
print(f"✅ Markdown 备份已保存: {filepath}")
return str(filepath)
def backup_all(self, vm: VectorMemorySystem) -> dict:
"""执行完整备份"""
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
results = {
'json': None,
'markdown': None,
'vector': None,
'timestamp': timestamp
}
# 1. JSON 备份
results['json'] = self.export_json(vm)
# 2. Markdown 备份
results['markdown'] = self.export_markdown(vm)
# 3. 向量数据库备份(复制整个目录)
vector_backup = self.backup_dir / f"vector_{timestamp}"
shutil.copytree(
os.path.dirname(vm.db_path),
vector_backup,
dirs_exist_ok=True
)
results['vector'] = str(vector_backup)
# 生成备份清单
manifest = {
'backup_time': timestamp,
'files': results,
'total_memories': vm.count()
}
manifest_file = self.backup_dir / f"manifest_{timestamp}.json"
with open(manifest_file, 'w', encoding='utf-8') as f:
json.dump(manifest, f, indent=2)
print(f"\n📋 备份清单: {manifest_file}")
return results
def restore_from_json(self, json_file: str, vm: VectorMemorySystem = None):
"""从 JSON 恢复记忆"""
with open(json_file, 'r', encoding='utf-8') as f:
data = json.load(f)
if not vm:
api_key = os.getenv("SILICONFLOW_API_KEY")
vm = VectorMemorySystem(api_key=api_key)
print(f"📥 开始恢复 {len(data['memories'])} 条记忆...")
for mem in data['memories']:
try:
vm.add_memory(
content=mem['content'],
metadata=mem['metadata'],
importance=mem['importance']
)
except Exception as e:
print(f" ⚠️ 跳过重复: {mem['id']}")
print(f"✅ 恢复完成!")
def main():
import argparse
parser = argparse.ArgumentParser(description="向量记忆备份工具")
subparsers = parser.add_subparsers(dest="command")
# 导出命令
subparsers.add_parser("export-json", help="导出为 JSON")
subparsers.add_parser("export-markdown", help="导出为 Markdown")
subparsers.add_parser("backup", help="完整备份(JSON + Markdown + 向量库)")
# 恢复命令
restore_parser = subparsers.add_parser("restore", help="从 JSON 恢复")
restore_parser.add_argument("file", help="备份文件路径")
args = parser.parse_args()
# 获取 API Key
api_key = os.getenv("SILICONFLOW_API_KEY")
if not api_key:
print("❌ 请设置 SILICONFLOW_API_KEY 环境变量")
sys.exit(1)
# 初始化
vm = VectorMemorySystem(api_key=api_key)
backup = MemoryBackup()
# 执行命令
if args.command == "export-json":
backup.export_json(vm)
elif args.command == "export-markdown":
backup.export_markdown(vm)
elif args.command == "backup":
backup.backup_all(vm)
elif args.command == "restore":
backup.restore_from_json(args.file, vm)
else:
parser.print_help()
if __name__ == "__main__":
main()
-89
View File
@@ -1,89 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
向量记忆系统 - 命令行工具
用法:
python3 memory_cli.py add "记忆内容" --importance 4 --tags tag1,tag2
python3 memory_cli.py search "查询内容"
python3 memory_cli.py recent
python3 memory_cli.py count
"""
import os
import sys
import argparse
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from vector_memory import VectorMemorySystem
def main():
parser = argparse.ArgumentParser(description="OpenClaw 向量记忆系统 CLI")
subparsers = parser.add_subparsers(dest="command", help="命令")
# 添加记忆
add_parser = subparsers.add_parser("add", help="添加记忆")
add_parser.add_argument("content", help="记忆内容")
add_parser.add_argument("--importance", "-i", type=int, default=3,
help="重要性 1-5 (默认: 3)")
add_parser.add_argument("--tags", "-t", type=str, default="",
help="标签,用逗号分隔")
# 搜索
search_parser = subparsers.add_parser("search", help="语义搜索")
search_parser.add_argument("query", help="查询内容")
search_parser.add_argument("--top", "-n", type=int, default=5,
help="返回数量 (默认: 5)")
# 最近
subparsers.add_parser("recent", help="查看最近记忆")
subparsers.add_parser("count", help="统计记忆数量")
# 删除
delete_parser = subparsers.add_parser("delete", help="删除记忆")
delete_parser.add_argument("memory_id", help="记忆 ID")
args = parser.parse_args()
# 获取 API Key
api_key = os.getenv("SILICONFLOW_API_KEY")
if not api_key:
print("❌ 请设置 SILICONFLOW_API_KEY 环境变量")
sys.exit(1)
# 初始化
vm = VectorMemorySystem(api_key=api_key)
# 执行命令
if args.command == "add":
tags = args.tags.split(",") if args.tags else []
metadata = {"tags": tags} if tags else {}
vm.add_memory(args.content, metadata, args.importance)
elif args.command == "search":
results = vm.search(args.query, args.top)
print(f"\n🔍 搜索: '{args.query}' (共 {len(results)} 条)")
for i, r in enumerate(results, 1):
print(f"\n{i}. {r['content']}")
print(f" 相似度: {r['similarity']:.2%} | ID: {r['id']}")
elif args.command == "recent":
recent = vm.get_recent(10)
print(f"\n📅 最近 {len(recent)} 条记忆:")
for i, r in enumerate(recent, 1):
print(f"{i}. {r['content'][:50]}...")
print(f" 创建于: {r['created_at']} | 重要性: {r['importance']}")
elif args.command == "count":
print(f"\n📊 记忆总数: {vm.count()}")
elif args.command == "delete":
vm.delete(args.memory_id)
else:
parser.print_help()
if __name__ == "__main__":
main()
-58
View File
@@ -1,58 +0,0 @@
#!/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
@@ -1,119 +0,0 @@
#!/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
@@ -1,85 +0,0 @@
#!/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()
-229
View File
@@ -1,229 +0,0 @@
# -*- coding: utf-8 -*-
"""
OpenClaw 向量记忆系统 - 核心引擎
基于 硅基流动 BGE-M3 + Chroma + SQLite
"""
import chromadb
from chromadb.config import Settings
from openai import OpenAI
import sqlite3
import json
import os
from datetime import datetime
import uuid
class VectorMemorySystem:
"""向量记忆系统核心类"""
def __init__(self, persist_dir: str = "./data/memory", api_key: str = None):
"""
初始化向量记忆系统
Args:
persist_dir: 数据存储目录
api_key: 硅基流动 API Key
"""
# 1. 初始化硅基流动客户端
if not api_key:
api_key = os.getenv("SILICONFLOW_API_KEY")
if not api_key:
raise ValueError("请设置 SILICONFLOW_API_KEY 环境变量")
self.client = OpenAI(
api_key=api_key,
base_url="https://api.siliconflow.cn/v1"
)
# 2. 初始化 Chroma 向量库
self.chroma = chromadb.Client(Settings(
persist_directory=persist_dir,
anonymized_telemetry=False
))
self.collection = self.chroma.get_or_create_collection(
name="openclaw_memory",
metadata={"description": "OpenClaw long-term memory"}
)
# 3. 初始化 SQLite(用于持久化)
self.db_path = f"{persist_dir}/memory.db"
self._init_sqlite()
print(f"✅ 向量记忆系统初始化完成")
print(f" - 数据目录: {persist_dir}")
print(f" - 向量模型: BAAI/bge-m3")
def _init_sqlite(self):
"""初始化 SQLite 数据库"""
self.conn = sqlite3.connect(self.db_path)
self.conn.execute("""
CREATE TABLE IF NOT EXISTS memories (
id TEXT PRIMARY KEY,
content TEXT NOT NULL,
metadata TEXT,
importance INTEGER DEFAULT 3,
tier TEXT DEFAULT 'hot',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
self.conn.execute("""
CREATE INDEX IF NOT EXISTS idx_importance ON memories(importance)
""")
self.conn.execute("""
CREATE INDEX IF NOT EXISTS idx_created_at ON memories(created_at)
""")
self.conn.commit()
def _get_embedding(self, text: str) -> list:
"""调用 BGE-M3 获取向量"""
response = self.client.embeddings.create(
model="BAAI/bge-m3",
input=text
)
return response.data[0].embedding
def add_memory(self, content: str, metadata: dict = None, importance: int = 3) -> str:
"""
添加记忆(同时写入向量库 + SQLite)
Args:
content: 记忆内容
metadata: 元数据(字典)
importance: 重要性评分 1-5
Returns:
memory_id: 记忆唯一标识
"""
memory_id = str(uuid.uuid4())
# 1. 生成向量并存储到 Chroma
embedding = self._get_embedding(content)
self.collection.add(
ids=[memory_id],
embeddings=[embedding],
documents=[content],
metadatas=[metadata or {"importance": importance}]
)
# 2. 写入 SQLite 持久化
self.conn.execute(
"""INSERT INTO memories (id, content, metadata, importance)
VALUES (?, ?, ?, ?)""",
(memory_id, content, json.dumps(metadata or {}), importance)
)
self.conn.commit()
print(f"✅ 添加记忆: {content[:30]}...")
return memory_id
def search(self, query: str, top_k: int = 5) -> list:
"""
语义搜索
Args:
query: 查询文本
top_k: 返回数量
Returns:
记忆列表(包含 content, distance, metadata
"""
# 1. 查询向量
query_embedding = self._get_embedding(query)
# 2. 向量相似度搜索
results = self.collection.query(
query_embeddings=[query_embedding],
n_results=top_k
)
# 3. 格式化返回
memories = []
for i, doc in enumerate(results['documents'][0]):
memories.append({
'id': results['ids'][0][i],
'content': doc,
'distance': results['distances'][0][i],
'similarity': 1 - results['distances'][0][i],
'metadata': results['metadatas'][0][i]
})
return memories
def get_recent(self, limit: int = 10) -> list:
"""获取最近添加的记忆"""
cursor = self.conn.execute("""
SELECT id, content, metadata, importance, created_at
FROM memories
ORDER BY created_at DESC
LIMIT ?
""", (limit,))
return [{
'id': row[0],
'content': row[1],
'metadata': json.loads(row[2]) if row[2] else {},
'importance': row[3],
'created_at': row[4]
} for row in cursor.fetchall()]
def count(self) -> int:
"""获取记忆总数"""
cursor = self.conn.execute("SELECT COUNT(*) FROM memories")
return cursor.fetchone()[0]
def delete(self, memory_id: str):
"""删除指定记忆"""
self.collection.delete(ids=[memory_id])
self.conn.execute("DELETE FROM memories WHERE id=?", (memory_id,))
self.conn.commit()
print(f"🗑️ 删除记忆: {memory_id}")
# ============ 便捷函数 ============
def get_memory_system(api_key: str = None) -> VectorMemorySystem:
"""获取记忆系统单例(支持传入 API Key)"""
global _memory_system
if '_memory_system' not in globals() or _memory_system is None:
_memory_system = VectorMemorySystem(api_key=api_key)
return _memory_system
# 测试代码
if __name__ == "__main__":
import sys
# 检查 API Key
api_key = os.getenv("SILICONFLOW_API_KEY")
if not api_key and len(sys.argv) > 1:
api_key = sys.argv[1]
if not api_key:
print("❌ 请设置 SILICONFLOW_API_KEY 环境变量或作为参数传入")
print(" export SILICONFLOW_API_KEY='sk-xxx'")
sys.exit(1)
# 初始化
vm = VectorMemorySystem(api_key=api_key)
# 测试添加
print("\n📝 测试添加记忆...")
vm.add_memory(
content="今天学习了向量数据库+语义搜索的方案,采用硅基流动BGE-M3模型",
metadata={"tags": ["学习", "向量"], "source": "test"},
importance=4
)
# 测试搜索
print("\n🔍 测试语义搜索...")
results = vm.search("AI 记忆系统")
for r in results:
print(f" - {r['content'][:50]}... (相似度: {r['similarity']:.2%})")
# 统计
print(f"\n📊 当前记忆总数: {vm.count()}")