#!/usr/bin/env python """ Utility to view saved trajectory files Usage: python view_trajectory.py [trajectory_file] """ import json import sys from pathlib import Path from datetime import datetime def format_time(iso_string): """Convert ISO timestamp to readable format""" try: dt = datetime.fromisoformat(iso_string.replace('Z', '+00:00')) return dt.strftime("%Y-%m-%d %H:%M:%S") except (ValueError, TypeError): return iso_string def view_trajectory(file_path="trajectory.json"): """View trajectory file with formatted output""" try: with open(file_path, 'r') as f: data = json.load(f) print("\n" + "="*80) print("TRAJECTORY ANALYSIS") print("="*80) print(f"\nšŸ“… Timestamp: {format_time(data['timestamp'])}") print(f"šŸ¤– Model: {data['model']}") print(f"šŸ”„ Total Iterations: {data['iteration']}") print(f"šŸ’¬ Conversation Messages: {len(data['conversation_history'])}") print(f"šŸ”§ Tool Calls: {len(data['tool_calls'])}") if data['final_answer']: print(f"\nāœ… Task Completed Successfully") print(f"Final Answer Preview: {data['final_answer'][:200]}...") else: print(f"\nāš ļø Task Not Completed") # Show tool calls breakdown if data['tool_calls']: print("\nšŸ“Š Tool Usage Summary:") tool_counts = {} for call in data['tool_calls']: name = call['tool_name'] tool_counts[name] = tool_counts.get(name, 0) + 1 for tool, count in tool_counts.items(): print(f" - {tool}: {count} call(s)") # Show TODO list if present if data['todo_list']: print("\nšŸ“‹ TODO List:") for item in data['todo_list']: status_symbol = { 'pending': 'ā³', 'in_progress': 'šŸ”„', 'completed': 'āœ…', 'cancelled': 'āŒ' }.get(item['status'], 'ā“') print(f" [{item['id']}] {status_symbol} {item['content']}") # Show conversation snippets print("\nšŸ’¬ Conversation Highlights:") for i, msg in enumerate(data['conversation_history'][:5], 1): role = msg['role'] content = msg.get('content', '') if content: preview = content[:100].replace('\n', ' ') if len(content) > 100: preview += "..." print(f" {i}. [{role}] {preview}") if len(data['conversation_history']) > 5: print(f" ... and {len(data['conversation_history']) - 5} more messages") print("\n" + "="*80) print(f"Full trajectory saved in: {file_path}") print(f"File size: {Path(file_path).stat().st_size:,} bytes") print("="*80 + "\n") except FileNotFoundError: print(f"āŒ Error: Trajectory file '{file_path}' not found") print("Run an agent task first to generate a trajectory file.") except json.JSONDecodeError: print(f"āŒ Error: Invalid JSON in '{file_path}'") except Exception as e: print(f"āŒ Error reading trajectory: {e}") if __name__ == "__main__": file_path = sys.argv[1] if len(sys.argv) > 1 else "trajectory.json" view_trajectory(file_path)