Spaces:
Sleeping
Sleeping
### 🚀 MAIN PROMPT ### | |
MAIN_PROMPT = """ | |
### **Module 3: Proportional Reasoning Problem Types** | |
#### **Task Introduction** | |
"Welcome to this module on proportional reasoning problem types! | |
Your task is to explore three different problem types foundational to proportional reasoning: | |
1️⃣ **Missing Value Problems** | |
2️⃣ **Numerical Comparison Problems** | |
3️⃣ **Qualitative Reasoning Problems** | |
You will solve and compare these problems, **identify their characteristics**, and finally **create your own problems** for each type. | |
💡 **Throughout this module, I will guide you step by step.** | |
💡 **You will be encouraged to explain your reasoning.** | |
💡 **If you’re unsure, I will provide hints rather than giving direct answers.** | |
🚀 **Let’s get started! Solve each problem and compare them by analyzing your solution process.**" | |
--- | |
### **🚀 Solve the Following Three Problems** | |
📌 **Problem 1: Missing Value Problem** | |
*"The scale on a map is **2 cm represents 25 miles**. If a given measurement on the map is **24 cm**, how many miles are represented?"* | |
📌 **Problem 2: Numerical Comparison Problem** | |
*"Ali and Ahmet purchased pencils. Ali bought **10 pencils for $3.50**, and Ahmet purchased **5 pencils for $1.80**. Who got the better deal?"* | |
📌 **Problem 3: Qualitative Reasoning Problem** | |
*"Kim is mixing paint. Yesterday, she combined **red and white paint** in a certain ratio. Today, she used **more red paint** but kept the **same amount of white paint**. How will today’s mixture compare to yesterday’s in color?"* | |
""" | |
### 🚀 PROBLEM SOLUTIONS ### | |
PROBLEM_SOLUTIONS_PROMPT = """ | |
### **🚀 Step-by-Step Solutions** | |
#### **Problem 1: Missing Value Problem** | |
We set up the proportion: | |
\[ | |
\frac{2 \text{ cm}}{25 \text{ miles}} = \frac{24 \text{ cm}}{x \text{ miles}} | |
\] | |
Cross-multiply: | |
\[ | |
2x = 24 \times 25 | |
\] | |
Solve for \( x \): | |
\[ | |
x = \frac{600}{2} = 300 | |
\] | |
**Conclusion:** *24 cm represents **300 miles**.* | |
--- | |
#### **Problem 2: Numerical Comparison Problem** | |
**Calculate unit prices:** | |
\[ | |
\text{Price per pencil (Ali)} = \frac{\$3.50}{10} = \$0.35 | |
\] | |
\[ | |
\text{Price per pencil (Ahmet)} = \frac{\$1.80}{5} = \$0.36 | |
\] | |
**Comparison:** | |
- Ali: **\$0.35** per pencil | |
- Ahmet: **\$0.36** per pencil | |
**Conclusion:** *Ali got the better deal because he paid **less per pencil**.* | |
--- | |
#### **Problem 3: Qualitative Reasoning Problem** | |
🔹 **Given Situation:** | |
- Yesterday: **Ratio of red to white paint** | |
- Today: **More red, same white** | |
🔹 **Reasoning:** | |
- Since the amount of **white paint stays the same** but **more red paint is added**, the **red-to-white ratio increases**. | |
- This means today’s mixture is **darker (more red)** than yesterday’s. | |
🔹 **Conclusion:** | |
- *The new paint mixture has a **stronger red color** than before.* | |
""" | |
--- | |
### **🚀 Fully Updated `app.py` (Ensuring Proper OpenAI Handling & Math Formatting)** | |
```python | |
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, PROBLEM_SOLUTIONS_PROMPT # Ensure both are imported | |
# Load the API key from the .env file if available | |
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", | |
max_tokens=512, | |
temperature=0.7, | |
top_p=0.95): | |
""" | |
Calls the OpenAI API to generate a response. | |
- history: [(user_text, assistant_text), ...] | |
- user_message: The latest user message | |
""" | |
# 1) Start with the system message (MAIN_PROMPT) for context | |
messages = [{"role": "system", "content": MAIN_PROMPT}] | |
# 2) Append conversation history | |
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}) | |
# 3) Add the user's new message | |
messages.append({"role": "user", "content": user_message}) | |
# 4) Call OpenAI API | |
completion = client.chat.completions.create( | |
model=model, | |
messages=messages, | |
max_tokens=max_tokens, | |
temperature=temperature, | |
top_p=top_p | |
) | |
return completion.choices[0].message.content | |
def respond(user_message, history): | |
""" | |
Handles user input and gets GPT-generated response. | |
- user_message: The message from the user | |
- history: List of (user, assistant) conversation history | |
""" | |
if not user_message: | |
return "", history | |
# If the user asks for a solution, inject PROBLEM_SOLUTIONS_PROMPT | |
if "solution" in user_message.lower(): | |
assistant_reply = gpt_call(history, PROBLEM_SOLUTIONS_PROMPT) | |
else: | |
assistant_reply = gpt_call(history, user_message) | |
# Add conversation turn to history | |
history.append((user_message, assistant_reply)) | |
return "", history | |
############################## | |
# Gradio Blocks UI | |
############################## | |
with gr.Blocks() as demo: | |
gr.Markdown("## AI-Guided Math PD Chatbot") | |
# Chatbot initialization with the first AI message | |
chatbot = gr.Chatbot( | |
value=[("", INITIAL_PROMPT)], # Initial system prompt | |
height=500 | |
) | |
# Stores the chat history | |
state_history = gr.State([("", INITIAL_PROMPT)]) | |
# User input field | |
user_input = gr.Textbox( | |
placeholder="Type your message here...", | |
label="Your Input" | |
) | |
# Submit action | |
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] | |
) | |
# Run the Gradio app | |
if __name__ == "__main__": | |
demo.launch(server_name="0.0.0.0", server_port=7860, share=True) | |