Files
workspace/auto-memory-processor.py

103 lines
3.6 KiB
Python

#!/usr/bin/env python3
import json
import sys
import subprocess
from pathlib import Path
def extract_text_content(content):
"""Extract text from message content, handling various content types."""
if isinstance(content, str):
return content
text_parts = []
if isinstance(content, list):
for item in content:
if isinstance(item, dict):
if item.get('type') == 'text' and 'text' in item:
text_parts.append(item['text'])
elif item.get('type') == 'toolCall':
# Include tool call descriptions for context
tool_name = item.get('name', 'unknown')
text_parts.append(f"[Used tool: {tool_name}]")
elif isinstance(item, str):
text_parts.append(item)
return ' '.join(text_parts).strip()
def process_session_file(filepath):
"""Process session file and extract user-assistant pairs."""
messages = []
try:
with open(filepath, 'r') as f:
for line in f:
try:
data = json.loads(line.strip())
if data.get('type') == 'message' and 'message' in data:
msg = data['message']
role = msg.get('role')
content = msg.get('content', '')
if role in ['user', 'assistant']:
text_content = extract_text_content(content)
if text_content: # Only include non-empty messages
messages.append({
'role': role,
'content': text_content,
'timestamp': data.get('timestamp', '')
})
except json.JSONDecodeError:
continue
except Exception as e:
print(f"Error reading file: {e}", file=sys.stderr)
return []
# Find user-assistant pairs and extract last 10 assistant turns
pairs = []
current_user_msg = None
for msg in messages:
if msg['role'] == 'user':
current_user_msg = msg['content']
elif msg['role'] == 'assistant' and current_user_msg:
pairs.append({
'user': current_user_msg,
'assistant': msg['content']
})
current_user_msg = None
# Return last 10 pairs
return pairs[-10:] if len(pairs) >= 10 else pairs
def main():
if len(sys.argv) != 2:
print("Usage: auto-memory-processor.py <session_file>", file=sys.stderr)
sys.exit(1)
session_file = sys.argv[1]
pairs = process_session_file(session_file)
print(f"Processing {len(pairs)} assistant turns from {session_file}", file=sys.stderr)
# Pipe each pair to the auto-memory hook
for pair in pairs:
entry = {
"user": pair['user'],
"assistant": pair['assistant'],
"agent_id": "case",
"session": "main"
}
try:
proc = subprocess.run([
'python3', '/home/wdjones/.openclaw/workspace/tools/auto-memory-hook.py'
], input=json.dumps(entry), text=True, capture_output=True)
if proc.returncode != 0:
print(f"Warning: auto-memory-hook failed for one entry: {proc.stderr}", file=sys.stderr)
except Exception as e:
print(f"Error calling auto-memory-hook: {e}", file=sys.stderr)
if __name__ == '__main__':
main()