File size: 6,043 Bytes
fc67835
 
 
 
 
9cf13b4
fc67835
 
 
9cf13b4
fc67835
 
 
9cf13b4
fc67835
 
 
 
 
 
 
 
 
 
 
 
 
9cf13b4
 
 
 
9ff257b
9cf13b4
 
 
 
 
 
 
9ff257b
9cf13b4
 
 
 
c5d9a1c
9cf13b4
 
 
 
43fa314
9cf13b4
 
43fa314
9cf13b4
 
9ff257b
 
9cf13b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a632fa0
c5d9a1c
080d5eb
 
a632fa0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
### 🚀 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)