xosski

Ai injection

Dec 4th, 2024
11
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.17 KB | None | 0 0
  1. from flask import Flask, request, jsonify, send_from_directory, render_template
  2. import requests
  3. import json
  4. import subprocess
  5. import os
  6. import re
  7.  
  8. app = Flask(__name__)
  9.  
  10. # Dossier pour stocker les fichiers générés
  11. GENERATED_FILES_DIR = "generated_files"
  12. os.makedirs(GENERATED_FILES_DIR, exist_ok=True)
  13.  
  14. # URLs et clés des APIs
  15. OLLAMA_API_URL = "http://localhost:11434/api/chat"
  16. MISTRAL_API_URL = "https://api.mistral.ai/v1/chat/completions"
  17. MISTRAL_API_KEY = "JCASwm1qYdbfSCd7ilpEgUU0oRv7LcbG"
  18.  
  19. # Modèles disponibles
  20. OLLAMA_MODELS = []
  21. MISTRAL_MODELS = [
  22. "pixtral-large-latest",
  23. "pixtral-medium-latest",
  24. "pixtral-small-latest",
  25. "mistral-large-latest",
  26. "ministral-3b-latest",
  27. "ministral-8b-latest",
  28. "mistral-small-latest",
  29. "codestral-latest",
  30. "mistral-medium",
  31. "mistral-embed",
  32. "mistral-moderation-latest",
  33. "pixtral-12b-2409",
  34. "open-mistral-nemo",
  35. "open-codestral-mamba",
  36. "open-mistral-7b",
  37. "open-mixtral-8x7b",
  38. "open-mixtral-8x22b",
  39.  
  40. ]
  41.  
  42. # Stocker l'historique et la mémoire contextuelle
  43. conversation_history = []
  44. contextual_memory = []
  45.  
  46. # Route pour servir la page HTML
  47. @app.route('/')
  48. def serve_index():
  49. return render_template("index.html")
  50.  
  51. # Route pour interagir avec les APIs Ollama et Mistral
  52. @app.route('/ask', methods=['POST'])
  53. def ask_ai():
  54. global conversation_history, contextual_memory
  55.  
  56. user_message = request.json.get("message", "")
  57. selected_model = request.json.get("model", "llama3.2") # Par défaut Ollama
  58.  
  59. # Ajouter le message utilisateur à l'historique
  60. conversation_history.append({"role": "user", "content": user_message})
  61.  
  62. # Vérifier si le modèle appartient à Ollama ou Mistral
  63. if selected_model in OLLAMA_MODELS:
  64. ai_response, memory_update = query_ollama(selected_model)
  65. elif selected_model in MISTRAL_MODELS:
  66. ai_response, memory_update = query_mistral(selected_model, user_message)
  67. else:
  68. return jsonify({"error": "Modèle non reconnu"}), 400
  69.  
  70. # Ajouter la réponse de l'IA à l'historique
  71. conversation_history.append({"role": "assistant", "content": ai_response})
  72.  
  73. # Si l'IA identifie des informations à mémoriser, les stocker
  74. if memory_update:
  75. contextual_memory.append(memory_update)
  76.  
  77. # Gérer la création de fichiers si du code est généré
  78. create_files_from_response(ai_response)
  79.  
  80. return jsonify({"response": ai_response})
  81.  
  82. # Route pour lister les modèles disponibles
  83. @app.route('/models', methods=['GET'])
  84. def list_models():
  85. global OLLAMA_MODELS
  86. try:
  87. # Récupérer les modèles locaux d’Ollama
  88. result = subprocess.run(['ollama', 'list'], capture_output=True, text=True)
  89. if result.returncode == 0:
  90. OLLAMA_MODELS = [line.split()[0] for line in result.stdout.splitlines() if line]
  91. except Exception as e:
  92. OLLAMA_MODELS = []
  93.  
  94. # Fusionner les modèles Ollama et Mistral
  95. models = {"ollama": OLLAMA_MODELS, "mistral": MISTRAL_MODELS}
  96. return jsonify(models)
  97.  
  98. # Route pour explorer les fichiers générés
  99. @app.route('/explore', methods=['GET'])
  100. def explore_files():
  101. files_structure = {}
  102. for root, dirs, files in os.walk(GENERATED_FILES_DIR):
  103. path = root.split(os.sep)
  104. current_dir = files_structure
  105. for folder in path[1:]:
  106. current_dir = current_dir.setdefault(folder, {})
  107. for file in files:
  108. current_dir[file] = os.path.join(root, file)
  109. return jsonify(files_structure)
  110.  
  111. # Route pour lire un fichier
  112. @app.route('/file', methods=['GET'])
  113. def read_file():
  114. filepath = request.args.get("path")
  115. if not filepath or not os.path.exists(filepath):
  116. return jsonify({"error": "Fichier introuvable"}), 404
  117. with open(filepath, "r", encoding="utf-8") as f:
  118. return jsonify({"content": f.read()})
  119.  
  120. # Route pour modifier un fichier
  121. @app.route('/file', methods=['POST'])
  122. def edit_file():
  123. data = request.json
  124. filepath = data.get("path")
  125. content = data.get("content")
  126. if not filepath or not os.path.exists(filepath):
  127. return jsonify({"error": "Fichier introuvable"}), 404
  128. with open(filepath, "w", encoding="utf-8") as f:
  129. f.write(content)
  130. return jsonify({"message": "Fichier mis à jour avec succès"})
  131.  
  132. # Fonction pour interroger l'API Ollama
  133. def query_ollama(model):
  134. global contextual_memory
  135.  
  136. full_context = contextual_memory + conversation_history
  137. payload = {
  138. "model": model,
  139. "messages": full_context,
  140. "system_prompt": (
  141. "Tu es une IA conversationnelle spécialisée dans l'aide à la programmation. "
  142. "Respecte les consignes et génère des fichiers si nécessaire."
  143. ),
  144. }
  145.  
  146. try:
  147. response = requests.post(OLLAMA_API_URL, json=payload, stream=True)
  148. if response.status_code != 200:
  149. return f"Erreur de l'API Ollama : {response.status_code}", None
  150.  
  151. full_response = ""
  152. memory_update = None
  153.  
  154. for line in response.iter_lines():
  155. if line:
  156. json_part = json.loads(line.decode('utf-8'))
  157. if "memory_update" in json_part:
  158. memory_update = json_part["memory_update"]
  159. full_response += json_part.get("message", {}).get("content", "")
  160.  
  161. return full_response or "Pas de réponse reçue.", memory_update
  162. except Exception as e:
  163. return f"Erreur : {str(e)}", None
  164.  
  165. # Fonction pour interroger l'API Mistral
  166. def query_mistral(model, user_message):
  167. headers = {"Authorization": f"Bearer {MISTRAL_API_KEY}", "Content-Type": "application/json"}
  168. payload = {
  169. "model": model,
  170. "messages": [{"role": "user", "content": user_message}],
  171. }
  172.  
  173. try:
  174. response = requests.post(MISTRAL_API_URL, json=payload, headers=headers)
  175. if response.status_code == 200:
  176. json_response = response.json()
  177. ai_response = json_response.get("choices", [{}])[0].get("message", {}).get("content", "")
  178. return ai_response, None
  179. else:
  180. return f"Erreur de l'API Mistral : {response.status_code}", None
  181. except Exception as e:
  182. return f"Erreur : {str(e)}", None
  183.  
  184. # Fonction pour créer des fichiers à partir d'une réponse
  185. def create_files_from_response(response):
  186. code_blocks = re.findall(r"(?:\/\/\s*file:\s*([\w.\-]+))?\s*```(\w+)?\n(.*?)```", response, re.DOTALL)
  187. for i, (filename_hint, language, code) in enumerate(code_blocks):
  188. extension = {
  189. "html": "html",
  190. "css": "css",
  191. "js": "js",
  192. "python": "py",
  193. "java": "java",
  194. "php": "php",
  195. "json": "json",
  196. "xml": "xml",
  197. "txt": "txt",
  198. }.get(language.lower() if language else "txt", "txt")
  199.  
  200. filename = filename_hint or f"file_{i + 1}.{extension}"
  201. filepath = os.path.join(GENERATED_FILES_DIR, filename)
  202. with open(filepath, "w", encoding="utf-8") as f:
  203. f.write(code.strip())
  204. print(f"Fichier créé : {filepath}")
  205.  
  206. if __name__ == "__main__":
  207. app.run(debug=True)
  208.  
Add Comment
Please, Sign In to add comment