Spaces:
Sleeping
Sleeping
| from flask import Flask, request, jsonify | |
| from flask_cors import CORS | |
| import requests | |
| import os | |
| import re | |
| app = Flask(__name__) | |
| CORS(app) | |
| # Récupération de la clé depuis les secrets Hugging Face | |
| API_KEY = os.environ.get("ALBERT_KEY") | |
| # URL API Albert | |
| ALBERT_URL = "https://albert.api.etalab.gouv.fr/v1/chat/completions" | |
| def home(): | |
| return "Serveur Albert Proxy en ligne (Racines Carrées v2) !" | |
| def verify_math(): | |
| # 1. Récupération des données | |
| data = request.json | |
| user_latex = data.get('userLatex', '') | |
| expected_latex = data.get('expectedLatex', '') | |
| # Vérification présence clé | |
| if not API_KEY: | |
| return jsonify({"error": "Clé API ALBERT_KEY manquante dans les Settings"}), 500 | |
| # 2. Préparation du prompt (Consignes strictes de formatage et de validation) | |
| # CORRECTION : Utilisation explicite de \" pour les guillemets doubles dans les exemples JSON | |
| system_prompt = ( | |
| "Tu es un professeur de mathématiques expert. " | |
| "Ton rôle est de vérifier la simplification d'une expression irrationnelle (type (a√b - √c)²). " | |
| "RÈGLES STRICTES DE VALIDATION :" | |
| "1. ÉQUIVALENCE : La réponse de l'élève doit être mathématiquement égale à la réponse attendue." | |
| "2. FORME : La réponse doit être sous la forme simplifiée 'a + b\\sqrt{c}' ou 'a - b\\sqrt{c}' ou un entier simple." | |
| " - Refuse systématiquement (isCorrect: false) si l'expression contient des parenthèses ou des calculs non effectués (ex: (2\\sqrt{3})^2, 4*3)." | |
| " - Refuse si la racine n'est pas réduite au maximum (ex: \\sqrt{12} au lieu de 2\\sqrt{3})." | |
| "RÈGLES DE RÉPONSE :" | |
| "1. Réponds UNIQUEMENT au format JSON valide (RFC 8259)." | |
| "2. UTILISE EXCLUSIVEMENT DES DOUBLES GUILLEMETS \" POUR LES CLÉS ET LES VALEURS." | |
| "3. LOGIQUE DU FEEDBACK (Pour le tri par l'interface) :" | |
| " - Cas 1 (Juste et simplifié) -> {\"isCorrect\": true, \"feedback\": \"Bravo\"}" | |
| " - Cas 2 (Mathématiquement juste MAIS forme non simplifiée/attendue) -> {\"isCorrect\": false, \"feedback\": \"La réponse est juste mathématiquement mais la forme n'est pas celle demandée (simplification)\"}" | |
| " - Cas 3 (Faux) -> {\"isCorrect\": false, \"feedback\": \"C'est faux\"}" | |
| ) | |
| user_prompt = f"Expression attendue (forme simplifiée) : {expected_latex}. Réponse de l'élève : {user_latex}." | |
| payload = { | |
| "model": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", | |
| "temperature": 0, | |
| "messages": [ | |
| { "role": "system", "content": system_prompt }, | |
| { "role": "user", "content": user_prompt } | |
| ] | |
| } | |
| headers = { | |
| "Authorization": f"Bearer {API_KEY}", | |
| "Content-Type": "application/json" | |
| } | |
| # 3. Appel API | |
| try: | |
| response = requests.post(ALBERT_URL, json=payload, headers=headers) | |
| response.raise_for_status() | |
| albert_data = response.json() | |
| content = albert_data['choices'][0]['message']['content'] | |
| return jsonify({"raw_content": content}) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| if __name__ == '__main__': | |
| app.run(host='0.0.0.0', port=7860) |