diff --git a/scripts/my_models.py b/scripts/my_models.py index 7e38b3d19..444b03bbb 100755 --- a/scripts/my_models.py +++ b/scripts/my_models.py @@ -4,44 +4,88 @@ import json from collections import defaultdict, deque from pathlib import Path -# Get the analytics file path -analytics_path = Path.home() / ".aider" / "analytics.jsonl" -# Dictionary to store model stats -model_stats = defaultdict(int) +def collect_model_stats(n_lines=1000): + """Collect model usage statistics from the analytics file.""" + analytics_path = Path.home() / ".aider" / "analytics.jsonl" + model_stats = defaultdict(int) -# Number of lines to process from the end -N = 1000 + with open(analytics_path) as f: + lines = deque(f, n_lines) + for line in lines: + try: + event = json.loads(line) + if event["event"] == "message_send": + properties = event["properties"] + main_model = properties.get("main_model") + total_tokens = properties.get("total_tokens", 0) + if main_model: + model_stats[main_model] += total_tokens + except json.JSONDecodeError: + continue -# Read and process the last N lines of the file -with open(analytics_path) as f: - # Get last N lines using deque - lines = deque(f, N) - for line in lines: - try: - event = json.loads(line) - # Check if this is a message_send event - if event["event"] == "message_send": - properties = event["properties"] - main_model = properties.get("main_model") - total_tokens = properties.get("total_tokens", 0) - if main_model: - model_stats[main_model] += total_tokens - except json.JSONDecodeError: - continue + return model_stats -# Calculate total for percentages -total_tokens = sum(model_stats.values()) -# Print results -print("\nModel Token Usage Summary:") -print("-" * 80) -print(f"{'Model Name':<40} {'Total Tokens':>15} {'Percent':>10}") -print("-" * 80) +def format_text_table(model_stats): + """Format model statistics as a text table.""" + total_tokens = sum(model_stats.values()) + lines = [] + + lines.append("\nModel Token Usage Summary:") + lines.append("-" * 80) + lines.append(f"{'Model Name':<40} {'Total Tokens':>15} {'Percent':>10}") + lines.append("-" * 80) -for model, tokens in sorted(model_stats.items(), key=lambda x: x[1], reverse=True): - percentage = (tokens / total_tokens) * 100 if total_tokens > 0 else 0 - print(f"{model:<40} {tokens:>15,} {percentage:>9.1f}%") + for model, tokens in sorted(model_stats.items(), key=lambda x: x[1], reverse=True): + percentage = (tokens / total_tokens) * 100 if total_tokens > 0 else 0 + lines.append(f"{model:<40} {tokens:>15,} {percentage:>9.1f}%") -print("-" * 80) -print(f"{'TOTAL':<40} {total_tokens:>15,} {100:>9.1f}%") + lines.append("-" * 80) + lines.append(f"{'TOTAL':<40} {total_tokens:>15,} {100:>9.1f}%") + + return "\n".join(lines) + + +def format_html_table(model_stats): + """Format model statistics as an HTML table.""" + total_tokens = sum(model_stats.values()) + + html = [ + "", + "", + "", + "", + "", + "

Model Token Usage Summary

", + "", + "" + ] + + for model, tokens in sorted(model_stats.items(), key=lambda x: x[1], reverse=True): + percentage = (tokens / total_tokens) * 100 if total_tokens > 0 else 0 + html.append( + f"" + f"" + f"" + ) + + html.append( + f"" + f"" + f"" + ) + + html.extend(["
Model NameTotal TokensPercent
{model}{tokens:,}{percentage:.1f}%
TOTAL{total_tokens:,}100.0%
", "", ""]) + return "\n".join(html) + + +if __name__ == "__main__": + stats = collect_model_stats() + print(format_text_table(stats))