- 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
115 lines
3.8 KiB
Bash
Executable File
115 lines
3.8 KiB
Bash
Executable File
#!/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 "完成!"
|