""" Évaluation complète des capacités MCP de Qwen2.5 0.5B Teste la compréhension des outils MCP, la traduction d'instructions et la planification """ import json import time import sys import os # Ajouter le chemin pour les imports sys.path.append(os.path.dirname(os.path.abspath(__file__))) def test_model_availability(): """Vérifier si le modèle est disponible et fonctionnel""" print("🔍 Vérification de la disponibilité du modèle...") # Vérifier si le fichier modèle existe model_path = "qwen2.5-0.5b-instruct-q4_0.gguf" if os.path.exists(model_path): print(f"✅ Modèle trouvé: {model_path}") file_size = os.path.getsize(model_path) / (1024 * 1024) # MB print(f"📏 Taille du modèle: {file_size:.1f} MB") return True else: print(f"❌ Modèle non trouvé: {model_path}") print(" Le modèle doit être téléchargé pour les tests") return False def test_basic_mcp_comprehension(): """Test de compréhension MCP de base""" print("\n🧪 TEST 1: Compréhension des outils MCP") print("-" * 50) tests = [ { "name": "Outils simples", "prompt": """ Tu es un assistant IA qui contrôle un jeu RTS via MCP. Outils disponibles: - get_game_state(): Obtenir l'état du jeu - move_units(unit_ids, target_x, target_y): Déplacer des unités Commande utilisateur: "Montre-moi l'état du jeu" Réponds avec un objet JSON contenant l'appel d'outil à exécuter. """, "expected_tool": "get_game_state" }, { "name": "Extraction de paramètres", "prompt": """ Tu es un assistant IA qui contrôle un jeu RTS via MCP. Outils disponibles: - move_units(unit_ids, target_x, target_y): Déplacer des unités Commande utilisateur: "Déplace mes tanks vers la position 150, 75" Réponds avec un objet JSON contenant l'appel d'outil avec les paramètres extraits. """, "expected_tool": "move_units", "expected_params": ["unit_ids", "target_x", "target_y"] } ] return tests def test_complex_planning(): """Test de planification complexe""" print("\n🧪 TEST 2: Planification et stratégie") print("-" * 50) tests = [ { "name": "Stratégie multi-étapes", "prompt": """ Tu es un assistant IA qui contrôle un jeu RTS via MCP. Outils disponibles: - get_game_state(): Obtenir l'état du jeu - move_units(): Déplacer des unités - attack_unit(): Attaquer une unité ennemie - build_building(): Construire un bâtiment Commande utilisateur: "Construis une base près du minerai et défends-la" Décompose cette stratégie en une séquence d'appels d'outils MCP. Réponds avec un tableau JSON d'actions. """, "expected_sequence": True }, { "name": "Analyse tactique", "prompt": """ Tu es un assistant IA qui contrôle un jeu RTS via MCP. Outils disponibles: - get_game_state(): Obtenir l'état du jeu - get_ai_analysis(language): Obtenir une analyse tactique Commande utilisateur: "Analyse le champ de bataille et suggère une stratégie" Quels outils MCP utiliserais-tu et dans quel ordre? """, "expected_analysis": True } ] return tests def test_error_handling(): """Test de gestion des erreurs et ambiguïtés""" print("\n🧪 TEST 3: Gestion des erreurs") print("-" * 50) tests = [ { "name": "Instructions ambiguës", "prompt": """ Tu es un assistant IA qui contrôle un jeu RTS via MCP. Outils disponibles: - move_units(unit_ids, target_x, target_y): Déplacer des unités Commande utilisateur: "Déplace mes unités vers la base ennemie" Comment gérerais-tu cette instruction ambiguë? """, "expected_handling": "clarification" }, { "name": "Paramètres manquants", "prompt": """ Tu es un assistant IA qui contrôle un jeu RTS via MCP. Outils disponibles: - attack_unit(attacker_ids, target_id): Attaquer une unité ennemie Commande utilisateur: "Attaque l'ennemi" Que faire si les paramètres nécessaires ne sont pas fournis? """, "expected_handling": "parameter_request" } ] return tests def run_llm_test(prompt, test_name): """Exécuter un test avec le modèle LLM""" try: from ai_analysis import query_llm print(f"\n📋 Test: {test_name}") print(f"Prompt: {prompt[:100]}...") start_time = time.time() response = query_llm( prompt=prompt, max_tokens=300, temperature=0.1, system_message="Tu es un assistant IA spécialisé dans les jeux RTS et le protocole MCP." ) response_time = time.time() - start_time print(f"⏱️ Temps de réponse: {response_time:.2f}s") print(f"📝 Réponse: {response[:200]}...") return { "success": True, "response": response, "response_time": response_time, "error": None } except Exception as e: print(f"❌ Erreur: {e}") return { "success": False, "response": None, "response_time": 0, "error": str(e) } def analyze_response(response, test_config): """Analyser la réponse du modèle""" analysis = { "score": 0, "strengths": [], "weaknesses": [], "details": {} } if not response: analysis["weaknesses"].append("Réponse vide") return analysis # Vérifier la structure JSON try: json.loads(response) analysis["score"] += 3 analysis["strengths"].append("JSON valide") analysis["details"]["json_valid"] = True except: analysis["details"]["json_valid"] = False # Vérifier la présence d'outils MCP mcp_tools = ["get_game_state", "move_units", "attack_unit", "build_building", "get_ai_analysis"] tools_found = [tool for tool in mcp_tools if tool in response] if tools_found: analysis["score"] += 2 analysis["strengths"].append(f"Outils MCP identifiés: {', '.join(tools_found)}") # Vérifier la cohérence sémantique if "game" in response.lower() or "rts" in response.lower() or "mcp" in response.lower(): analysis["score"] += 1 analysis["strengths"].append("Contexte RTS/MCP compris") # Vérifier les paramètres if "unit_ids" in response or "target_x" in response or "target_y" in response: analysis["score"] += 1 analysis["strengths"].append("Paramètres identifiés") analysis["score"] = min(analysis["score"], 10) return analysis def generate_assessment_report(results): """Générer un rapport d'évaluation complet""" print("\n" + "="*70) print("📊 RAPPORT D'ÉVALUATION DES CAPACITÉS MCP") print("="*70) total_score = 0 total_tests = 0 for category, category_results in results.items(): print(f"\n🔍 {category.upper()}:") category_score = 0 category_count = 0 for test_name, result in category_results.items(): if result["success"]: analysis = result["analysis"] score = analysis["score"] category_score += score category_count += 1 print(f" {test_name}: {score}/10") if analysis["strengths"]: print(f" ✅ Points forts: {', '.join(analysis['strengths'][:2])}") if analysis["weaknesses"]: print(f" ⚠️ Points faibles: {', '.join(analysis['weaknesses'][:2])}") else: print(f" {test_name}: ❌ ÉCHEC - {result['error']}") if category_count > 0: avg_score = category_score / category_count total_score += avg_score total_tests += 1 print(f" 📊 Score moyen: {avg_score:.1f}/10") # Score global if total_tests > 0: overall_score = total_score / total_tests print(f"\n🎯 SCORE GLOBAL: {overall_score:.1f}/10") # Recommandations basées sur le score print("\n💡 RECOMMANDATIONS:") if overall_score >= 8: print("✅ EXCELLENT - Qwen2.5 0.5B est très capable pour les tâches MCP") print(" • Utilisez-le avec confiance pour la traduction MCP") print(" • Implémentez une validation légère pour la sécurité") elif overall_score >= 6: print("👍 BON - Qwen2.5 0.5B est capable avec quelques limitations") print(" • Utilisez-le pour les commandes simples") print(" • Ajoutez une validation robuste") print(" • Prévoyez des mécanismes de secours") elif overall_score >= 4: print("⚠️ MODÉRÉ - Limitations significatives") print(" • Utilisez-le uniquement pour des traductions très simples") print(" • Implémentez une validation stricte") print(" • Envisagez un modèle plus grand pour les tâches complexes") else: print("❌ FAIBLE - Pas adapté aux tâches MCP") print(" • Envisagez un modèle plus grand (1.5B+)") print(" • Utilisez des règles fixes pour les commandes simples") def main(): """Fonction principale""" print("🔍 ÉVALUATION DES CAPACITÉS MCP DE QWEN2.5 0.5B") print("=" * 70) # Vérifier la disponibilité du modèle if not test_model_availability(): print("\n❌ Le modèle n'est pas disponible. Téléchargez-le d'abord.") return # Définir les tests basic_tests = test_basic_mcp_comprehension() planning_tests = test_complex_planning() error_tests = test_error_handling() # Exécuter les tests results = {} # Tests de base print("\n🚀 Exécution des tests de capacité MCP...") basic_results = {} for test in basic_tests: result = run_llm_test(test["prompt"], test["name"]) if result["success"]: analysis = analyze_response(result["response"], test) result["analysis"] = analysis basic_results[test["name"]] = result results["compréhension_de_base"] = basic_results # Tests de planification planning_results = {} for test in planning_tests: result = run_llm_test(test["prompt"], test["name"]) if result["success"]: analysis = analyze_response(result["response"], test) result["analysis"] = analysis planning_results[test["name"]] = result results["planification_complexe"] = planning_results # Tests de gestion d'erreurs error_results = {} for test in error_tests: result = run_llm_test(test["prompt"], test["name"]) if result["success"]: analysis = analyze_response(result["response"], test) result["analysis"] = analysis error_results[test["name"]] = result results["gestion_des_erreurs"] = error_results # Générer le rapport generate_assessment_report(results) # Sauvegarder les résultats détaillés with open("qwen_mcp_capability_results.json", "w", encoding="utf-8") as f: json.dump(results, f, indent=2, ensure_ascii=False) print(f"\n📄 Résultats détaillés sauvegardés dans: qwen_mcp_capability_results.json") if __name__ == "__main__": main()