File size: 5,358 Bytes
712eefd
 
393fe1b
 
712eefd
 
 
 
ccf6147
 
 
480f256
 
 
ef7c222
393fe1b
480f256
ccf6147
480f256
3532724
 
 
480f256
 
 
 
 
 
 
 
 
3532724
ccf6147
480f256
ccf6147
3532724
 
2554d32
598d79e
2554d32
598d79e
6fcbd03
077c11a
712eefd
 
1d88ef6
2445961
712eefd
2554d32
56e7657
ccf6147
5b91eaf
712eefd
598d79e
712eefd
 
2554d32
712eefd
598d79e
 
 
 
 
 
 
 
 
 
42ff9fc
 
 
 
 
598d79e
 
 
95a4bda
0489589
598d79e
4cefc88
598d79e
626df00
6fcbd03
598d79e
712eefd
0489589
598d79e
 
 
 
 
 
 
 
712eefd
598d79e
 
 
 
 
 
 
 
712eefd
598d79e
 
 
 
 
42ff9fc
598d79e
 
712eefd
598d79e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
712eefd
95a4bda
 
 
 
 
 
 
 
 
712eefd
2554d32
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
import gradio as gr
from huggingface_hub import InferenceClient
import os 
from sympy import symbols, Eq, solve, latex

# Initialize the Hugging Face Inference Client
client = InferenceClient()



def preprocess_latex(content):
    """
    Preprocess the AI response using sympy to properly format mathematical expressions.
    """
    lines = content.split("\n")  # Split response into lines
    processed_lines = []

    for line in lines:
        if "[" in line and "]" in line:  # Detect mathematical expressions in brackets
            while "[" in line and "]" in line:
                start = line.index("[")
                end = line.index("]") + 1
                math_expr = line[start + 1 : end - 1].strip()
                try:
                    # Parse the math expression and convert to LaTeX
                    sympy_expr = sympify(math_expr)
                    latex_expr = latex(sympy_expr)
                    line = line[:start] + f"$$ {latex_expr} $$" + line[end:]
                except Exception:
                    # Fallback to raw math if parsing fails
                    line = line[:start] + f"$$ {math_expr} $$" + line[end:]
        processed_lines.append(line)

    return "\n".join(processed_lines)



# Function to generate and format AI response
def generate_response(prompt_template, **kwargs):
    # Simulate processing/loading
    prompt = os.getenv(prompt_template).format(**kwargs)
    response = client.chat.completions.create(
        model="Qwen/Qwen2.5-Math-1.5B-Instruct",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.7,
        max_tokens=1024,
        top_p=0.8
    )
    response_content = response.choices[0].message["content"]
    print(response_content)
    formatted_response = preprocess_latex(response_content)
    return gr.update(value=f"{formatted_response}")

# Gradio app interface
with gr.Blocks() as app:
    gr.Markdown("## Mathematical Insight Tutor")
    gr.Markdown("An advanced AI-powered tutor to help you master math concepts with step-by-step explanations.")

    def create_tab(tab_name, prompt_template, inputs):
        with gr.Tab(tab_name):
            input_fields = []
            for inp in inputs:
                if inp["type"] == "textbox":
                    input_fields.append(
                        gr.Textbox(lines=inp.get("lines", 1), label=inp["label"], placeholder=inp["placeholder"])
                    )
                elif inp["type"] == "dropdown":
                    input_fields.append(
                        gr.Dropdown(choices=inp["choices"], label=inp["label"])
                    )
                elif inp["type"] == "value":
                    input_fields.append(
                        gr.Textbox(label=inp["label"], placeholder=inp["placeholder"])
                    )
            # Button and output
            button = gr.Button(f"{tab_name} Execute")
            output = gr.Markdown(label="Output", elem_id="latex-output")
            # Link button to the response wrapper
            button.click(
                fn=lambda *args: generate_response(prompt_template, **dict(zip([inp["key"] for inp in inputs], args))),
                inputs=input_fields,
                outputs=output,
                api_name=f"/{tab_name.lower().replace(' ', '_')}_execute"
            )

    # Tabs for functionalities
    create_tab(
        "Solve a Problem",
        "PROMPT_SOLVE",
        [
            {"key": "problem", "type": "textbox", "label": "Enter Math Problem", "placeholder": "e.g., Solve for x: 2x + 5 = 15"},
            {"key": "difficulty", "type": "dropdown", "label": "Difficulty Level", "choices": ["Beginner", "Intermediate", "Advanced"]}
        ]
    )

    create_tab(
        "Generate a Hint",
        "PROMPT_HINT",
        [
            {"key": "problem", "type": "textbox", "label": "Enter Math Problem for Hint", "placeholder": "e.g., Solve for x: 2x + 5 = 15"},
            {"key": "difficulty", "type": "dropdown", "label": "Difficulty Level", "choices": ["Beginner", "Intermediate", "Advanced"]}
        ]
    )

    create_tab(
        "Verify Solution",
        "PROMPT_VERIFY",
        [
            {"key": "problem", "type": "textbox", "label": "Enter Math Problem", "placeholder": "e.g., Solve for x: 2x + 5 = 15"},
            {"key": "solution", "type": "value", "label": "Enter Your Solution", "placeholder": "e.g., x = 5"}
        ]
    )

    create_tab(
        "Generate Practice Question",
        "PROMPT_GENERATE",
        [
            {"key": "topic", "type": "textbox", "label": "Enter Math Topic", "placeholder": "e.g., Algebra, Calculus"},
            {"key": "difficulty", "type": "dropdown", "label": "Difficulty Level", "choices": ["Beginner", "Intermediate", "Advanced"]}
        ]
    )

    create_tab(
        "Explain Concept",
        "PROMPT_EXPLAIN",
        [
            {"key": "problem", "type": "textbox", "label": "Enter Math Problem", "placeholder": "e.g., Solve for x: 2x + 5 = 15"},
            {"key": "difficulty", "type": "dropdown", "label": "Difficulty Level", "choices": ["Beginner", "Intermediate", "Advanced"]}
        ]
    )

# Add custom CSS for LaTeX rendering
app.css = """
#latex-output {
    font-family: "Computer Modern", serif;
    font-size: 16px;
    line-height: 1.5;
}
"""

# Launch the app
app.launch(debug=True)