File size: 3,319 Bytes
f7d4054
 
 
 
f242870
f7d4054
 
 
 
b8334dc
f7d4054
 
b8334dc
f7d4054
 
 
 
f242870
f7d4054
 
 
b8334dc
f7d4054
 
 
 
b8334dc
f7d4054
b8334dc
f7d4054
a6a190f
f242870
f7d4054
bf3df8b
 
a6a190f
bf3df8b
 
 
 
a6a190f
f242870
 
 
 
 
 
f7d4054
b8334dc
bf3df8b
f7d4054
b8334dc
c29c9f9
f7d4054
 
bf3df8b
 
f7d4054
 
 
 
 
 
 
 
b8334dc
f7d4054
 
b8334dc
f7d4054
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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"

@app.route('/')
def home():
    return "Serveur Albert Proxy en ligne (Racines Carrées v2) !"

@app.route('/verify', methods=['POST'])
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)