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:
root
2026-03-30 03:01:34 +08:00
parent 0247020c82
commit 0227d525f9
11 changed files with 793 additions and 0 deletions

114
scripts/daily_learning.sh Executable file
View 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 "完成!"