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)