local_copilot / app /performance_tracker.py
Kash6's picture
Deploy AI Coding Assistant
04653e2
"""Performance monitoring and metrics tracking."""
import time
import json
from datetime import datetime
from typing import Dict, List
from pathlib import Path
class PerformanceTracker:
"""Track and analyze performance metrics for the coding assistant."""
def __init__(self, metrics_file: str = "metrics.json"):
self.metrics_file = Path(metrics_file)
self.current_session = {
"queries": [],
"start_time": datetime.now().isoformat()
}
self.baseline_latency = None
def start_query(self) -> float:
"""Start timing a query."""
return time.time()
def end_query(self, start_time: float, query: str, tokens_generated: int = 0) -> Dict:
"""End timing and record metrics."""
latency = time.time() - start_time
metric = {
"timestamp": datetime.now().isoformat(),
"query": query[:100], # Truncate for storage
"latency_seconds": latency,
"tokens_generated": tokens_generated,
"tokens_per_second": tokens_generated / latency if latency > 0 else 0
}
self.current_session["queries"].append(metric)
return metric
def calculate_improvement(self) -> Dict:
"""Calculate performance improvements."""
if len(self.current_session["queries"]) < 2:
return {"improvement": 0, "message": "Insufficient data"}
latencies = [q["latency_seconds"] for q in self.current_session["queries"]]
# Use first query as baseline if not set
if self.baseline_latency is None:
self.baseline_latency = latencies[0]
avg_current = sum(latencies[1:]) / len(latencies[1:])
improvement = ((self.baseline_latency - avg_current) / self.baseline_latency) * 100
return {
"baseline_latency": self.baseline_latency,
"current_avg_latency": avg_current,
"improvement_percentage": improvement,
"total_queries": len(latencies)
}
def save_metrics(self):
"""Save metrics to file."""
self.current_session["end_time"] = datetime.now().isoformat()
self.current_session["summary"] = self.calculate_improvement()
# Load existing metrics
existing = []
if self.metrics_file.exists():
with open(self.metrics_file, 'r') as f:
existing = json.load(f)
existing.append(self.current_session)
with open(self.metrics_file, 'w') as f:
json.dump(existing, f, indent=2)
def get_summary_stats(self) -> Dict:
"""Get summary statistics."""
if not self.current_session["queries"]:
return {}
latencies = [q["latency_seconds"] for q in self.current_session["queries"]]
tokens_per_sec = [q["tokens_per_second"] for q in self.current_session["queries"]]
return {
"total_queries": len(latencies),
"avg_latency": sum(latencies) / len(latencies),
"min_latency": min(latencies),
"max_latency": max(latencies),
"avg_tokens_per_sec": sum(tokens_per_sec) / len(tokens_per_sec) if tokens_per_sec else 0,
"improvement": self.calculate_improvement()
}