#!/usr/bin/env python3 """ 上下文使用量检测脚本 当任一 session 上下文使用量 >= 90% 时自动保存记忆 """ import subprocess import re import os from datetime import datetime # 加载环境变量 os.environ["SILICONFLOW_API_KEY"] = "sk-fpjdtxbxrhtekshircjhegstloxaodriekotjdyzzktyegcl" def log(msg): timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") print(f"[{timestamp}] {msg}") def main(): log("========== 上下文使用量检测 ==========") # 获取 OpenClaw 状态 result = subprocess.run(["openclaw", "status"], capture_output=True, text=True) status_output = result.stdout # 提取所有上下文使用量百分比 # 格式: "109k/200k (54%)" - 括号内是使用量 max_usage = 0 for line in status_output.split('\n'): # 跳过表头和无关行 if '│ Tokens' in line or '├' in line or '│ Key' in line: continue if 'FAQ:' in line or 'Troubleshooting:' in line: continue if 'Sessions' in line and '200k ctx' in line: continue # 查找类似 "109k/200k (54%)" 的模式 match = re.search(r'(\d+)k/200k \((\d+)%\)', line) if match: usage = int(match.group(2)) if usage > max_usage: max_usage = usage log(f"📊 当前最高上下文使用量: {max_usage}%") if max_usage >= 90: log(f"⚠️ 上下文使用量达到 {max_usage}%,开始保存记忆...") # 1. 保存文件记忆 memory_file = f"{os.path.expanduser('~')}/.openclaw/workspace/memory/{datetime.now().strftime('%Y-%m-%d')}.md" timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") with open(memory_file, "a") as f: f.write(f"\n## 🔄 上下文自动保存 ({timestamp})\n\n") f.write(f"**触发原因**: 上下文使用量达到 {max_usage}%\n\n") log("✅ 文件记忆已更新") # 2. 保存向量记忆 os.chdir(os.path.expanduser("~/openclaw-memory-vector")) subprocess.run([ "python3", "memory_cli.py", "add", f"【自动保存】上下文使用量达到 {max_usage}%,系统自动保存记忆。时间: {timestamp}", "--tag", "auto-save,context-90" ], capture_output=True, text=True) log("✅ 向量记忆已保存") log("✅ 记忆保存完成") else: log(f"✅ 上下文使用量正常 ({max_usage}%),无需保存") log("========== 检测完成 ==========\n") if __name__ == "__main__": main()