120 lines
3.7 KiB
Python
120 lines
3.7 KiB
Python
#!/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()
|