""" Test amélioré avec formats de prompts optimisés pour modèles spécialisés MCP """ import sys import os import json import time from llama_cpp import Llama def test_mcp_formats(model_path, model_name): """Tester différents formats de prompt pour les modèles MCP""" print(f"\n🧪 TEST AVEC FORMATS OPTIMISÉS: {model_name}") print("=" * 60) if not os.path.exists(model_path): print(f"❌ Fichier modèle non trouvé: {model_path}") return try: # Initialiser avec différents paramètres pour modèles MCP llm = Llama( model_path=model_path, n_ctx=2048, # Plus grand contexte pour modèles MCP n_threads=1, verbose=False, n_gpu_layers=0, temperature=0.3, # Température légèrement plus élevée top_p=0.9 ) test_command = "show game state" # Formats de prompt optimisés basés sur les standards MCP prompt_formats = [ { 'name': 'Format MCP structuré complet', 'template': '''[INST] You are an MCP (Model Context Protocol) assistant for an RTS game. Your task is to respond ONLY with JSON format. Available tools: - get_game_state(): Returns current game state information - move_units(unit_ids, target_x, target_y): Move specified units to coordinates - attack_unit(attacker_ids, target_id): Attack target unit with attackers - build_building(building_type, position_x, position_y): Construct building at position User command: "{command}" Respond with ONLY JSON in this format: {{"tool": "tool_name", "args": {{}}}} Do not include any explanations, comments, or additional text. Only JSON. [/INST]''' }, { 'name': 'Format MCP instruct simple', 'template': '''<|system|> You are an MCP assistant for an RTS game. Respond with ONLY JSON. Available tools: get_game_state, move_units, attack_unit, build_building <|user|> {command} <|assistant|>''' }, { 'name': 'Format JSON strict', 'template': '''Your role: MCP assistant for RTS game Tools: get_game_state(), move_units(), attack_unit(), build_building() Command: {command} JSON Response:''' }, { 'name': 'Format conversation MCP', 'template': '''User: {command} Assistant: {{"tool": "get_game_state", "args": {{}}}}''' }, { 'name': 'Format code-oriented', 'template': '''// MCP assistant for RTS game // Available functions: // - get_game_state() // - move_units(unit_ids, target_x, target_y) // - attack_unit(attacker_ids, target_id) // - build_building(building_type, position_x, position_y) // User: {command} // Response (JSON only):''' } ] for i, format_info in enumerate(prompt_formats, 1): print(f"\n{i}. {format_info['name']}:") prompt = format_info['template'].format(command=test_command) try: # Essayer avec différents paramètres response = llm( prompt, max_tokens=100, temperature=0.3, stop=["", "<|im_end|>", "```", "\n\n", "User:"] ) # Extraire la réponse selon le format retourné if hasattr(response, 'choices') and len(response.choices) > 0: response_text = response.choices[0].text.strip() elif isinstance(response, dict) and 'choices' in response: response_text = response['choices'][0]['text'].strip() else: response_text = str(response) print(f" Prompt (début): {prompt[:80]}...") print(f" Réponse: {response_text[:150]}") # Vérifier JSON try: parsed = json.loads(response_text) print(f" ✅ JSON VALIDE: {parsed}") except json.JSONDecodeError: # Essayer d'extraire JSON import re json_match = re.search(r'\{[^{}]*\{[^{}]*\}[^{}]*\}|\{[^{}]*\}', response_text) if json_match: try: parsed = json.loads(json_match.group()) print(f" ✅ JSON EXTRACTÉ: {parsed}") except: print(f" ❌ JSON INVALIDE") else: print(f" ❌ PAS DE JSON DÉTECTÉ") except Exception as e: print(f" ❌ Erreur: {e}") except Exception as e: print(f"❌ Erreur de chargement: {e}") def test_model_capabilities(model_path, model_name): """Tester les capacités de base du modèle""" print(f"\n🔍 TEST DE CAPACITÉS: {model_name}") print("=" * 60) if not os.path.exists(model_path): print(f"❌ Fichier modèle non trouvé: {model_path}") return try: llm = Llama( model_path=model_path, n_ctx=2048, n_threads=1, verbose=False, n_gpu_layers=0 ) # Test de génération de base test_prompts = [ "Hello", "What is your name?", "Write JSON", "{\"test\": \"value\"}" ] for prompt in test_prompts: try: response = llm( prompt, max_tokens=20, temperature=0.1 ) response_text = response['choices'][0]['text'].strip() print(f" '{prompt}' → '{response_text}'") except Exception as e: print(f" '{prompt}' → Erreur: {e}") except Exception as e: print(f"❌ Erreur de chargement: {e}") def main(): """Test des modèles problématiques avec formats améliorés""" print("🚀 TEST AMÉLIORÉ DES MODÈLES SPÉCIALISÉS MCP") print("=" * 70) models_to_test = [ { 'name': 'MCP-Instruct-v1', 'path': 'mcp-instruct-v1.Q4_K_M.gguf', 'type': 'mcp_specialized' }, { 'name': 'MCPR L-3B-Exa', 'path': 'mcprl-3b-exa.Q2_K.gguf', 'type': 'mcp_specialized' }, { 'name': 'Gemma-3n-E2B-it', 'path': 'gemma-3n-E2B-it-UD-IQ2_XXS.gguf', 'type': 'mcp_specialized' }, { 'name': 'Qwen2.5-Coder-0.5B (référence)', 'path': 'qwen2.5-coder-0.5b-instruct-q4_0.gguf', 'type': 'code_specialized' } ] for model in models_to_test: if os.path.exists(model['path']): test_model_capabilities(model['path'], model['name']) test_mcp_formats(model['path'], model['name']) else: print(f"\n❌ Modèle non trouvé: {model['path']}") print("\n" + "=" * 70) print("📊 RÉCAPITULATIF DES PROBLÈMES:") print(""" 1. **MCP-Instruct-v1**: Erreur technique (llama_decode=-1) - probablement incompatible 2. **MCPR L-3B-Exa**: Génération de texte corrompu - mauvaise quantisation ou format 3. **Gemma-3n-E2B-it**: Réponses vides - format de prompt incompatible 4. **Modèles code-spécialisés**: Fonctionnent mieux car habitués au JSON """) if __name__ == "__main__": main()