Spaces:
Build error
Build error
| 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) |