|
import os |
|
import gradio as gr |
|
from dotenv import load_dotenv |
|
from openai import OpenAI |
|
from prompts.initial_prompt import INITIAL_PROMPT |
|
from prompts.main_prompt import MAIN_PROMPT |
|
|
|
|
|
if os.path.exists(".env"): |
|
load_dotenv(".env") |
|
|
|
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") |
|
client = OpenAI(api_key=OPENAI_API_KEY) |
|
|
|
def gpt_call(history, user_message, |
|
model="gpt-4o-mini", |
|
max_tokens=1024, |
|
temperature=0.7, |
|
top_p=0.95): |
|
""" |
|
Calls OpenAI Chat API to generate responses. |
|
- history: [(user_text, assistant_text), ...] |
|
- user_message: latest message from user |
|
""" |
|
messages = [{"role": "system", "content": MAIN_PROMPT}] |
|
|
|
|
|
for user_text, assistant_text in history: |
|
if user_text: |
|
messages.append({"role": "user", "content": user_text}) |
|
if assistant_text: |
|
messages.append({"role": "assistant", "content": assistant_text}) |
|
|
|
messages.append({"role": "user", "content": user_message}) |
|
|
|
|
|
completion = client.chat.completions.create( |
|
model=model, |
|
messages=messages, |
|
max_tokens=max_tokens, |
|
temperature=temperature, |
|
top_p=top_p |
|
) |
|
|
|
response = completion.choices[0].message.content |
|
|
|
|
|
if any(keyword in user_message.lower() for keyword in ["yes", "no", "next question"]): |
|
response = "Before we move forward, let's take a step back. What do you think about the problem? Why do you believe your answer or method is correct? Can you explain your reasoning step by step? Let's make sure we fully understand before proceeding.\n\n" + response |
|
|
|
|
|
if any(keyword in user_message.lower() for keyword in ["solve", "explain", "why", "reasoning"]): |
|
response = "Great thinking! Now, explain your reasoning step by step. What patterns do you notice? Let's walk through it together.\n\n" + response |
|
|
|
|
|
if any(keyword in user_message.lower() for keyword in ["hint", "stuck", "help"]): |
|
response = "Here's a hint: What key properties or relationships can help you solve this? Try breaking it down further. What happens if we adjust one of the variables?\n\n" + response |
|
|
|
|
|
if "pose a problem" in user_message.lower(): |
|
response += "\n\nNow that you've explored this concept, try creating a problem similar to the ones we discussed. What elements would you include to ensure it is non-proportional?" |
|
|
|
|
|
if "summary" in user_message.lower(): |
|
response += "\n\nReflection time! Which Common Core practice standards did we apply? How did creativity shape your approach to solving this problem? What strategies would help students build deeper mathematical reasoning?" |
|
|
|
return response |
|
|
|
def respond(user_message, history): |
|
""" |
|
Handles user input and chatbot responses. |
|
""" |
|
if not user_message: |
|
return "", history |
|
|
|
assistant_reply = gpt_call(history, user_message) |
|
history.append((user_message, assistant_reply)) |
|
return "", history |
|
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("## AI-Guided Math PD Chatbot") |
|
|
|
chatbot = gr.Chatbot( |
|
value=[("", INITIAL_PROMPT)], |
|
height=600 |
|
) |
|
|
|
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) |
|
|