File size: 3,385 Bytes
39012fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
81
82
83
import os
import sympy as sp
from sympy.parsing.sympy_parser import parse_expr
import streamlit as st
from crewai import Agent, Crew, Task, Process
from langchain_openai import ChatOpenAI

# 1. Recuperar la API Key de los Secretos de Hugging Face de forma segura
openai_api_key = os.environ.get("OPENAI_API_KEY")

if not openai_api_key:
    st.error("Por favor, configura la variable OPENAI_API_KEY en los Settings de tu Space.")
    st.stop()

# Configurar el modelo en la nube (GPT-4o mini o similar es r谩pido y econ贸mico)
llm_cloud = ChatOpenAI(
    model="gpt-4o-mini",
    api_key=openai_api_key,
    temperature=0.2
)

# 2. Motor matem谩tico formal (SymPy)
def verificar_equivalencia_simbolica(expresion_estudiante, expresion_correcta):
    try:
        expr_est = expresion_estudiante.replace('^', '**')
        expr_corr = expresion_correcta.replace('^', '**')
        sym_estudiante = parse_expr(expr_est)
        sym_correcta = parse_expr(expr_corr)
        return sp.simplify(sym_correcta - sym_estudiante) == 0
    except:
        return False

# 3. Interfaz de Streamlit
st.title("馃帗 Code-Mentor-AI: Tutor de Matem谩ticas")
st.write("Introduce el problema, la soluci贸n real y tu intento para recibir ayuda socr谩tica.")

problema = st.text_input("Problema:", "Simplifica la expresi贸n: 3*(x - 2) + 4*(2*x + 5)")
solucion_real = st.text_input("Soluci贸n Correcta (para validaci贸n):", "11*x + 14")
respuesta_estudiante = st.text_input("Tu Respuesta:")

if st.button("Evaluar mi respuesta"):
    if verificar_equivalencia_simbolica(respuesta_estudiante, solucion_real):
        st.success("馃帀 隆Excelente trabajo! Tu respuesta es matem谩ticamente correcta.")
    else:
        st.info("馃 Analizando tu respuesta... El enjambre de agentes est谩 trabajando.")
        
        # Agentes
        agente_diagnostico = Agent(
            role="Diagnosticador de Errores de Matem谩ticas",
            goal="Identificar el punto exacto de la falla l贸gica del estudiante.",
            backstory="Eres un analista l贸gico matem谩tico experto en educaci贸n escolar K-12.",
            llm=llm_cloud
        )

        agente_tutor = Agent(
            role="Tutor Pedag贸gico Socr谩tico",
            goal="Guiar al estudiante con pistas amigables sin darle la respuesta final.",
            backstory="Eres un tutor de matem谩ticas emp谩tico. Ofreces andamiaje socr谩tico.",
            llm=llm_cloud
        )

        # Tareas
        tarea_analisis = Task(
            description=f"Problema: '{problema}'. Soluci贸n real: '{solucion_real}'. Respuesta fallida del alumno: '{respuesta_estudiante}'. Identifica el error conceptual.",
            expected_output="An谩lisis detallado de la confusi贸n del estudiante.",
            agent=agente_diagnostico
        )

        tarea_explicacion = Task(
            description="Toma el diagn贸stico y escribe una respuesta directa, emp谩tica y de estilo socr谩tico para el alumno. No reveles la soluci贸n final.",
            expected_output="Mensaje motivador con una pista clave.",
            agent=agente_tutor
        )

        enjambre = Crew(
            agents=[agente_diagnostico, agente_tutor],
            tasks=[tarea_analisis, tarea_explicacion],
            process=Process.sequential
        )

        resultado = enjambre.kickoff()
        st.markdown("### Gu铆a de tu tutor:")
        st.write(resultado)