File size: 4,921 Bytes
ce5b5d6
 
 
 
 
 
 
8d44be7
ce5b5d6
 
 
 
 
 
527cad7
 
 
97e8a1b
 
 
527cad7
 
97e8a1b
 
527cad7
 
 
97e8a1b
 
527cad7
 
 
97e8a1b
 
527cad7
 
 
97e8a1b
 
527cad7
 
 
97e8a1b
527cad7
 
 
 
 
8d44be7
ce5b5d6
 
 
 
 
 
 
 
 
8d44be7
 
 
ce5b5d6
 
 
 
 
 
97e8a1b
527cad7
 
97e8a1b
 
527cad7
 
 
ce5b5d6
527cad7
 
 
 
 
 
 
ce5b5d6
527cad7
 
ce5b5d6
 
 
8d44be7
ce5b5d6
8d44be7
ce5b5d6
8d44be7
ce5b5d6
8d44be7
ce5b5d6
 
 
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
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

# Load OpenAI API Key from .env file
if os.path.exists(".env"):
    load_dotenv(".env")

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=OPENAI_API_KEY)

# Define sequential reflection steps
REFLECTION_STEPS = [
    {
        "title": "Observing Creativity-Directed Practices",
        "question": "Now that you've watched the video, let's start with **Observing Creativity-Directed Practices.**\n\nWhat stood out to you the most about how the teacher encouraged student creativity?",
        "follow_up": "Interesting! You mentioned **{response}**. Can you explain why that strategy is effective in fostering creativity?"
    },
    {
        "title": "Small Group Interactions",
        "question": "Let's move to **Small Group Interactions.**\n\nWhat did you notice about how the teacher guided student discussions?",
        "follow_up": "You noted **{response}**. How do you think that influenced students' understanding of the problem?"
    },
    {
        "title": "Student Reasoning and Connections",
        "question": "Next, let’s analyze **Student Reasoning and Connections.**\n\nHow did students reason through the task? What connections did they make between percent relationships and fractions?",
        "follow_up": "That’s a great point about **{response}**. Can you explain why this was significant in their problem-solving process?"
    },
    {
        "title": "Common Core Practice Standards",
        "question": "Now, let’s discuss **Common Core Practice Standards.**\n\nWhich Common Core practice standards do you think the teacher emphasized during the lesson?",
        "follow_up": "You mentioned **{response}**. How do you see this practice supporting students' proportional reasoning?"
    },
    {
        "title": "Problem Posing Activity",
        "question": "Let’s engage in a **Problem-Posing Activity.**\n\nBased on what you observed, pose a problem that encourages students to use visuals and proportional reasoning.",
        "follow_up": "That's an interesting problem! Does it allow for multiple solution paths? How does it connect to the Common Core practices we discussed?"
    },
    {
        "title": "Final Reflection",
        "question": "📚 **Final Reflection**\n\nWhat’s one change you will make in your own teaching based on this module?",
        "follow_up": "That’s a great insight! How do you think implementing **{response}** will impact student learning?"
    }
]

def gpt_call(history, user_message, model="gpt-4o-mini", max_tokens=1024, temperature=0.7, top_p=0.95):
    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)
    
    return completion.choices[0].message.content

def respond(user_message, history):
    if not user_message:
        return "", history

    # Determine the current step in the reflection process
    reflection_index = len([h for h in history if "Reflection Step" in h[1]])  
    if reflection_index < len(REFLECTION_STEPS):
        current_step = REFLECTION_STEPS[reflection_index]
        next_reflection = current_step["question"]
    else:
        next_reflection = "You've completed the reflections. Would you like to discuss anything further?"

    assistant_reply = gpt_call(history, user_message)

    # Adjust AI response to guide sequential discussion
    if reflection_index > 0:
        follow_up_prompt = REFLECTION_STEPS[reflection_index - 1]["follow_up"].format(response=user_message)
        assistant_reply += f"\n\n{follow_up_prompt}"

    # Append the assistant's response and next reflection question
    history.append((user_message, assistant_reply))
    history.append(("", f"**Reflection Step {reflection_index + 1}:** {next_reflection}"))
    
    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)