Full sync - all projects, memory, configs
This commit is contained in:
82
extract_assistant_turns.py
Normal file
82
extract_assistant_turns.py
Normal file
@ -0,0 +1,82 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import json
|
||||
import os
|
||||
import glob
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
def extract_assistant_turns(sessions_dir, max_turns=10):
|
||||
"""Extract the last N assistant turns from session files"""
|
||||
|
||||
# Find all .jsonl files and sort by modification time (newest first)
|
||||
pattern = os.path.join(sessions_dir, "*.jsonl")
|
||||
files = glob.glob(pattern)
|
||||
files.sort(key=lambda x: os.path.getmtime(x), reverse=True)
|
||||
|
||||
turns = []
|
||||
|
||||
for session_file in files[:5]: # Check the 5 most recent sessions
|
||||
try:
|
||||
with open(session_file, 'r') as f:
|
||||
messages = []
|
||||
for line in f:
|
||||
try:
|
||||
data = json.loads(line.strip())
|
||||
if data.get("type") == "message" and "message" in data:
|
||||
messages.append(data["message"])
|
||||
except json.JSONDecodeError:
|
||||
continue
|
||||
|
||||
# Find user-assistant pairs
|
||||
for i in range(len(messages) - 1):
|
||||
current_msg = messages[i]
|
||||
next_msg = messages[i + 1]
|
||||
|
||||
if (current_msg.get("role") == "user" and
|
||||
next_msg.get("role") == "assistant"):
|
||||
|
||||
# Extract text content from user message
|
||||
user_text = ""
|
||||
if current_msg.get("content"):
|
||||
for content in current_msg["content"]:
|
||||
if content.get("type") == "text":
|
||||
user_text += content.get("text", "")
|
||||
|
||||
# Extract text content from assistant message
|
||||
assistant_text = ""
|
||||
if next_msg.get("content"):
|
||||
for content in next_msg["content"]:
|
||||
if content.get("type") == "text":
|
||||
assistant_text += content.get("text", "")
|
||||
|
||||
# Skip if either is empty or if it's a cron message
|
||||
if (user_text and assistant_text and
|
||||
not user_text.startswith("[cron:") and
|
||||
len(assistant_text) > 10): # Filter out very short responses
|
||||
|
||||
turns.append({
|
||||
"user": user_text.strip(),
|
||||
"assistant": assistant_text.strip(),
|
||||
"agent_id": "case",
|
||||
"session": "main"
|
||||
})
|
||||
|
||||
if len(turns) >= max_turns:
|
||||
return turns
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error processing {session_file}: {e}", file=sys.stderr)
|
||||
continue
|
||||
|
||||
return turns
|
||||
|
||||
if __name__ == "__main__":
|
||||
sessions_dir = "/home/wdjones/.openclaw/agents/main/sessions/"
|
||||
turns = extract_assistant_turns(sessions_dir, max_turns=10)
|
||||
|
||||
print(f"Extracted {len(turns)} assistant turns")
|
||||
|
||||
for turn in turns:
|
||||
# Output each turn as JSON for the auto-memory hook
|
||||
print(json.dumps(turn))
|
||||
Reference in New Issue
Block a user