feat: add daily learning summary script with cron task
- Create scripts/daily_learning.sh for daily chat review - Set up cron task at 3 AM daily - Log file: logs/daily_learning.log - Learning records: memory/daily_learning.md
This commit is contained in:
114
scripts/daily_learning.sh
Executable file
114
scripts/daily_learning.sh
Executable file
@@ -0,0 +1,114 @@
|
||||
#!/bin/bash
|
||||
# 每日学习总结脚本
|
||||
# 每天凌晨3点执行,回顾当天聊天内容,总结学习记录
|
||||
|
||||
LOG_FILE="/root/.openclaw/workspace-assistant/logs/daily_learning.log"
|
||||
MEMORY_FILE="/root/.openclaw/workspace-assistant/memory/daily_learning.md"
|
||||
SESSION_FILE="/root/.openclaw/agents/dingtalk-assistant/sessions/e89452e7-59d0-46a3-9dec-983cb7863ac5.jsonl"
|
||||
|
||||
echo "=== $(date '+%Y-%m-%d %H:%M:%S') 每日学习总结开始 ===" >> "$LOG_FILE"
|
||||
|
||||
# 提取聊天记录中的关键内容
|
||||
python3 << 'PYEOF' >> "$LOG_FILE"
|
||||
import sys
|
||||
import json
|
||||
from datetime import datetime, timezone, timedelta
|
||||
|
||||
LOG_FILE = "/root/.openclaw/workspace-assistant/logs/daily_learning.log"
|
||||
SESSION_FILE = "/root/.openclaw/agents/dingtalk-assistant/sessions/e89452e7-59d0-46a3-9dec-983cb7863ac5.jsonl"
|
||||
|
||||
# 北京时区
|
||||
bj_tz = timezone(timedelta(hours=8))
|
||||
# 计算24小时前的时间
|
||||
one_day_ago = datetime.now(bj_tz).timestamp() - 86400
|
||||
|
||||
messages = []
|
||||
try:
|
||||
with open(SESSION_FILE, 'r') as f:
|
||||
for line in f:
|
||||
try:
|
||||
obj = json.loads(line.strip())
|
||||
if obj.get('type') == 'message' and obj.get('timestamp'):
|
||||
ts_str = obj.get('timestamp', '')
|
||||
try:
|
||||
if 'T' in ts_str:
|
||||
ts = datetime.fromisoformat(ts_str.replace('Z', '+00:00')).timestamp()
|
||||
else:
|
||||
ts = float(ts_str)
|
||||
except:
|
||||
continue
|
||||
|
||||
if ts > one_day_ago:
|
||||
msg = obj.get('message', {})
|
||||
role = msg.get('role', '')
|
||||
content = msg.get('content', [])
|
||||
if isinstance(content, list):
|
||||
for c in content:
|
||||
if isinstance(c, dict) and c.get('type') == 'text':
|
||||
text = c.get('text', '')[:500]
|
||||
if text:
|
||||
if 'HEARTBEAT_OK' not in text and 'System:' not in text[:50] and 'Exec completed' not in text[:50] and 'conversation' not in text[:50].lower():
|
||||
messages.append(f'[{role}] {text[:300]}')
|
||||
except:
|
||||
pass
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
|
||||
# 去重
|
||||
seen = set()
|
||||
unique_messages = []
|
||||
for m in messages:
|
||||
key = m[:100]
|
||||
if key not in seen:
|
||||
seen.add(key)
|
||||
unique_messages.append(m)
|
||||
|
||||
if not unique_messages:
|
||||
print("没有发现新的聊天内容")
|
||||
else:
|
||||
print(f"发现 {len(unique_messages)} 条消息")
|
||||
|
||||
# 检测关键主题
|
||||
topics = []
|
||||
keywords = ['mcp', 'api', 'skill', '脚本', '配置', '钉钉', '邮件', '日程', '日历', '语音', 'whisper', 'tts', '日志', '周报', '待办', '文档', '审批']
|
||||
|
||||
for m in unique_messages:
|
||||
lower = m.lower()
|
||||
for kw in keywords:
|
||||
if kw in lower and kw not in topics:
|
||||
topics.append(kw)
|
||||
|
||||
today = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
summary = f"""
|
||||
## 每日学习总结 - {today}
|
||||
|
||||
### 涉及的主题
|
||||
{', '.join(topics) if topics else '无特定主题'}
|
||||
|
||||
### 关键对话记录
|
||||
"""
|
||||
for m in unique_messages[:50]:
|
||||
summary += m[:200] + "\n\n"
|
||||
|
||||
# 输出到日志
|
||||
print(summary)
|
||||
|
||||
# 保存到记忆文件
|
||||
MEMORY_FILE = "/root/.openclaw/workspace-assistant/memory/daily_learning.md"
|
||||
try:
|
||||
with open(MEMORY_FILE, 'r') as f:
|
||||
existing = f.read()
|
||||
except:
|
||||
existing = ''
|
||||
|
||||
if today not in existing:
|
||||
with open(MEMORY_FILE, 'a') as f:
|
||||
f.write('\n' + summary)
|
||||
print("\n已更新学习记录")
|
||||
else:
|
||||
print("\n今日已记录,跳过")
|
||||
PYEOF
|
||||
|
||||
echo "=== 完成 ===" >> "$LOG_FILE"
|
||||
echo "完成!"
|
||||
Reference in New Issue
Block a user