File size: 5,758 Bytes
6cc94b6
 
 
 
 
a99513a
62a1cd3
 
6cc94b6
62a1cd3
6cc94b6
62a1cd3
 
 
 
 
 
 
 
6cc94b6
62a1cd3
 
6cc94b6
 
62a1cd3
 
 
a99513a
 
 
62a1cd3
 
6cc94b6
62a1cd3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6cc94b6
62a1cd3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6cc94b6
 
 
 
 
 
 
62a1cd3
a99513a
 
62a1cd3
 
 
 
 
a99513a
 
62a1cd3
 
 
a99513a
62a1cd3
 
 
a99513a
62a1cd3
 
 
 
 
 
 
 
 
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
import gradio as gr
import os
import tempfile
from pathlib import Path
import secrets
from PIL import Image
import requests
import json

# API key setup
YOUR_API_TOKEN = os.getenv('YOUR_API_TOKEN')

# API Endpoints (Gerçek API URL'lerinizi buraya ekleyin)
IMAGE_DESCRIPTION_API_ENDPOINT = "https://api.actual-qwen-model.com/v1/image-description"
MATH_RESPONSE_API_ENDPOINT = "https://api.actual-qwen-model.com/v1/math-response"

def process_image(image, should_convert=False):
    # Geçici dizin oluşturma
    uploaded_file_dir = os.environ.get("GRADIO_TEMP_DIR") or str(Path(tempfile.gettempdir()) / "gradio")
    os.makedirs(uploaded_file_dir, exist_ok=True)

    # Geçici dosya adı oluşturma
    name = f"tmp{secrets.token_hex(20)}.jpg"
    filename = os.path.join(uploaded_file_dir, name)

    # İsteğe bağlı olarak resmi dönüştürme
    if should_convert:
        new_img = Image.new('RGB', size=(image.width, image.height), color=(255, 255, 255))
        new_img.paste(image, (0, 0), mask=image)
        image = new_img

    # Resmi kaydetme
    image.save(filename)

    # API isteği hazırlama
    headers = {
        "Authorization": f"Bearer {YOUR_API_TOKEN}",
        "Content-Type": "application/json"
    }
    data = {
        "model": "qwen-vl-max-0809",
        "messages": [
            {
                'role': 'system',
                'content': [{'text': 'You are a helpful assistant.'}]
            },
            {
                'role': 'user',
                'content': [
                    {'image': f'file://{filename}'},
                    {'text': 'Please describe the math-related content in this image, ensuring that any LaTeX formulas are correctly transcribed. Non-mathematical details do not need to be described.'}
                ]
            }
        ]
    }

    try:
        # API isteğini gönderme
        response = requests.post(IMAGE_DESCRIPTION_API_ENDPOINT, headers=headers, json=data)
        response.raise_for_status()
        response_data = response.json()

        # Açıklamayı çıkarma
        description = response_data["output"]["choices"][0]["message"]["content"]

    except Exception as e:
        description = f"Error processing image: {str(e)}"

    finally:
        # Geçici dosyayı silme
        os.remove(filename)

    return description

def get_math_response(image_descriptions, user_question):
    if not image_descriptions:
        return "No image descriptions provided."

    # API isteği hazırlama
    headers = {
        "Authorization": f"Bearer {YOUR_API_TOKEN}",
        "Content-Type": "application/json"
    }
    content = "Image descriptions:\n" + "\n".join(image_descriptions) + f"\n\nUser question: {user_question}"
    data = {
        "model": "qwen2.5-math-72b-instruct",
        "messages": [
            {'role': 'system', 'content': 'You are a helpful math assistant.'},
            {'role': 'user', 'content': content}
        ],
        "result_format": "message",
        "stream": False  # Streaming'i kapattık
    }

    try:
        # API isteğini gönderme
        response = requests.post(MATH_RESPONSE_API_ENDPOINT, headers=headers, json=data)
        response.raise_for_status()
        response_data = response.json()

        # Yanıtı çıkarma
        answer = response_data["output"]["choices"][0]["message"]["content"]

    except Exception as e:
        answer = f"Error generating response: {str(e)}"

    return answer

def math_chat_bot(images, sketchpad, question, chat_history):
    image_descriptions = []

    # Yeni resimleri işleme
    if images is not None:
        for image in images:
            if image:
                img = Image.open(image.name) if hasattr(image, 'name') else image
                description = process_image(img)
                image_descriptions.append(description)

    # Sketchpad varsa işle
    if sketchpad and sketchpad["composite"]:
        sketch_image = sketchpad["composite"]
        sketch_description = process_image(sketch_image, should_convert=True)
        image_descriptions.append(sketch_description)

    # Matematik yanıtını al
    math_response = get_math_response(image_descriptions, question)

    # Sohbet geçmişine ekleme
    if chat_history is None:
        chat_history = []
    chat_history.append((question, math_response))

    return chat_history

css = """
#qwen-md .katex-display { display: inline; }
#qwen-md .katex-display>.katex { display: inline; }
#qwen-md .katex-display>.katex>.katex-html { display: inline; }
"""

# Gradio arayüzünü oluşturma
with gr.Blocks(css=css) as demo:
    gr.HTML("""\
    <p align="center"><img src="https://modelscope.oss-cn-beijing.aliyuncs.com/resource/qwen.png" style="height: 60px"/></p>
    <center><font size=8>📖 Qwen2.5-Math Demo</font></center>
    <center><font size=3>This WebUI is based on Qwen2-VL for OCR and Qwen2.5-Math for mathematical reasoning. You can input either images or texts of mathematical or arithmetic problems.</font></center>
    """)

    with gr.Row():
        with gr.Column():
            input_images = gr.File(file_count="multiple", label="Upload Images")
            input_sketchpad = gr.Sketchpad(type="pil", label="Sketch", layers=False)
            input_text = gr.Textbox(label="Input your question")
            with gr.Row():
                clear_btn = gr.ClearButton([input_images, input_sketchpad, input_text])
                submit_btn = gr.Button("Submit", variant="primary")

        with gr.Column():
            chat_output = gr.Chatbot(label="Chat History", elem_id="qwen-md")

    submit_btn.click(
        fn=math_chat_bot,
        inputs=[input_images, input_sketchpad, input_text, chat_output],
        outputs=chat_output
    )

demo.launch()