import os import gradio as gr from dotenv import load_dotenv from openai import OpenAI from prompts.main_prompt import MAIN_PROMPT, get_prompt_for_method, get_feedback_for_method from prompts.initial_prompt import INITIAL_PROMPT # ✅ Load API key from .env file if os.path.exists(".env"): load_dotenv(".env") OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") # ✅ Ensure API Key is available if not OPENAI_API_KEY: raise ValueError("🚨 OpenAI API key is missing! Set it in the .env file.") client = OpenAI(api_key=OPENAI_API_KEY) # ✅ Chatbot Response Function def respond(user_message, history): """ Handles user input for the chatbot. - If a method is selected, AI asks for teacher's reasoning first. - AI only provides feedback after hearing the teacher's approach. """ user_message = user_message.strip().lower() # ✅ Check if the last message in history was a method selection prompt if history and history[-1][1] in [ get_prompt_for_method("bar model"), get_prompt_for_method("double number line"), get_prompt_for_method("equation") ]: # ✅ Retrieve the last selected method last_method = history[-1][1].split("**")[1].split(" ")[0].lower() response = get_feedback_for_method(last_method, user_message) history.append((user_message, response)) return "", history # ✅ If user selects a method, ask them to explain their reasoning if user_message in ["bar model", "double number line", "equation"]: response = get_prompt_for_method(user_message) history.append((user_message, response)) return "", history # ✅ Default response if input is unclear and no method has been selected if not history or history[-1][0] not in ["bar model", "double number line", "equation"]: return "I didn’t understand that. Please select a method first (Bar Model, Double Number Line, or Equation).", history return "", history # ✅ Keep the conversation flowing without errors # ✅ Gradio UI Setup with gr.Blocks() as demo: gr.Markdown("## 🤖 AI-Guided Math PD Chatbot") chatbot = gr.Chatbot(value=[(INITIAL_PROMPT, "")], height=500) state_history = gr.State([(INITIAL_PROMPT, "")]) user_input = gr.Textbox(placeholder="Type your message here...", label="Your Input") user_input.submit( respond, inputs=[user_input, state_history], outputs=[user_input, chatbot] ).then( fn=lambda _, h: h, inputs=[user_input, chatbot], outputs=[state_history] ) if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860, share=True)