tutor / app.py
AngelGabrielTroncoso's picture
Create app.py
39012fa verified
Raw
History Blame Contribute Delete
3.39 kB
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)