import json from datetime import datetime, timezone from typing import Dict, Any from nc_py_api import Nextcloud import arena_config from leaderboard import load_leaderboard, get_human_readable_name, get_model_size def get_internal_stats() -> Dict[str, Any]: leaderboard = load_leaderboard() total_battles = sum( model_data['wins'] + model_data['losses'] for model_data in leaderboard.values() ) timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") active_models = len(leaderboard) most_battles = max( (model_data['wins'] + model_data['losses'], model) for model, model_data in leaderboard.items() ) highest_win_rate = max( (model_data['wins'] / (model_data['wins'] + model_data['losses']) if (model_data['wins'] + model_data['losses']) > 0 else 0, model) for model, model_data in leaderboard.items() ) most_diverse_opponent = max( (len(model_data['opponents']), model) for model, model_data in leaderboard.items() ) stats = { "timestamp": timestamp, "total_battles": total_battles, "active_models": active_models, "most_battles": { "model": get_human_readable_name(most_battles[1]), "battles": most_battles[0] }, "highest_win_rate": { "model": get_human_readable_name(highest_win_rate[1]), "win_rate": f"{highest_win_rate[0]:.2%}" }, "most_diverse_opponent": { "model": get_human_readable_name(most_diverse_opponent[1]), "unique_opponents": most_diverse_opponent[0] } } return stats def save_internal_stats(stats: Dict[str, Any]) -> bool: nc = Nextcloud( nextcloud_url=arena_config.NEXTCLOUD_URL, nc_auth_user=arena_config.NEXTCLOUD_USERNAME, nc_auth_pass=arena_config.NEXTCLOUD_PASSWORD ) try: json_data = json.dumps(stats, indent=2) nc.files.upload(arena_config.NEXTCLOUD_INTERNAL_STATS_PATH, json_data.encode('utf-8')) return True except Exception as e: print(f"Error saving internal stats to Nextcloud: {str(e)}") return False def save_local_stats(stats: Dict[str, Any], filename: str = "internal_stats.json") -> bool: try: with open(filename, 'w') as f: json.dump(stats, f, indent=2) return True except Exception as e: print(f"Error saving internal stats to local file: {str(e)}") return False def get_fun_stats() -> Dict[str, Any]: leaderboard = load_leaderboard() total_battles = sum( model_data['wins'] + model_data['losses'] for model_data in leaderboard.values() ) timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") active_models = len(leaderboard) most_battles = max( (model_data['wins'] + model_data['losses'], model) for model, model_data in leaderboard.items() ) highest_win_rate = max( (model_data['wins'] / (model_data['wins'] + model_data['losses']) if (model_data['wins'] + model_data['losses']) > 0 else 0, model) for model, model_data in leaderboard.items() ) most_diverse_opponent = max( (len(model_data['opponents']), model) for model, model_data in leaderboard.items() ) # Existing fun stats underdog_champion = min( ((get_model_size(model), model_data['wins'] / (model_data['wins'] + model_data['losses'])) if (model_data['wins'] + model_data['losses']) > 0 else (get_model_size(model), 0), model) for model, model_data in leaderboard.items() ) most_consistent = min( (abs(model_data['wins'] - model_data['losses']), model) for model, model_data in leaderboard.items() if (model_data['wins'] + model_data['losses']) > 10 # Minimum battles threshold ) biggest_rivalry = max( (results['wins'] + results['losses'], (model, opponent)) for model, data in leaderboard.items() for opponent, results in data['opponents'].items() ) # New fun stats david_vs_goliath = max( ((get_model_size(opponent) - get_model_size(model), model_data['opponents'][opponent]['wins']), (model, opponent)) for model, model_data in leaderboard.items() for opponent in model_data['opponents'] if get_model_size(opponent) > get_model_size(model) and model_data['opponents'][opponent]['wins'] > 0 ) comeback_king = max( (model_data['wins'] - model_data['losses'], model) for model, model_data in leaderboard.items() if model_data['losses'] > model_data['wins'] ) pyrrhic_victor = min( (model_data['wins'] / (model_data['wins'] + model_data['losses']) if (model_data['wins'] + model_data['losses']) > 0 else float('inf'), model) for model, model_data in leaderboard.items() if model_data['wins'] > model_data['losses'] and (model_data['wins'] + model_data['losses']) > 10 ) stats = { "timestamp": timestamp, "total_battles": total_battles, "active_models": active_models, "most_battles": { "model": get_human_readable_name(most_battles[1]), "battles": most_battles[0] }, "highest_win_rate": { "model": get_human_readable_name(highest_win_rate[1]), "win_rate": f"{highest_win_rate[0]:.2%}" }, "most_diverse_opponent": { "model": get_human_readable_name(most_diverse_opponent[1]), "unique_opponents": most_diverse_opponent[0] }, "underdog_champion": { "model": get_human_readable_name(underdog_champion[1]), "size": f"{underdog_champion[0][0]}B", "win_rate": f"{underdog_champion[0][1]:.2%}" }, "most_consistent": { "model": get_human_readable_name(most_consistent[1]), "win_loss_difference": most_consistent[0] }, "biggest_rivalry": { "model1": get_human_readable_name(biggest_rivalry[1][0]), "model2": get_human_readable_name(biggest_rivalry[1][1]), "total_battles": biggest_rivalry[0] }, "david_vs_goliath": { "david": get_human_readable_name(david_vs_goliath[1][0]), "goliath": get_human_readable_name(david_vs_goliath[1][1]), "size_difference": f"{david_vs_goliath[0][0]:.1f}B", "wins": david_vs_goliath[0][1] }, "comeback_king": { "model": get_human_readable_name(comeback_king[1]), "comeback_margin": comeback_king[0] }, "pyrrhic_victor": { "model": get_human_readable_name(pyrrhic_victor[1]), "win_rate": f"{pyrrhic_victor[0]:.2%}" } } return stats if __name__ == "__main__": stats = get_internal_stats()