File size: 4,229 Bytes
10f1481
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import requests
import time
import os
from dotenv import load_dotenv
from huggingface_hub import list_models

load_dotenv()
API_URL = os.getenv("API_URL")
class CreateProfile:
    def __init__(self, _id=None):
        self._id = _id
        self.name = ""
        self.username = ""
        
newprofile = CreateProfile()

def check_active_users():
    response = requests.get(f"{API_URL}/status")
    if response.status_code == 200:
        queue_length = response.json().get("queue_length", 0)
        if queue_length > 2:
            return False, "There's currently a high volume of requests. The server is busy processing these requests. Please try again later."
    return True, ""

def process_ui_image(image, user_task, progress=gr.Progress()):
    progress(0)
    
    # Check the number of active users
    can_proceed, message = check_active_users()
    if not can_proceed:
        return message
    
    # Upload image and user task to the API
    files = {'image': open(image, 'rb')}
    data = {'user_task': user_task, "name": newprofile.name, "username": newprofile.username}
    response = requests.post(f"{API_URL}/process", files=files, data=data)
    
    if response.status_code != 200:
        return f"Error: {response.text}"
    
    # Get the request ID from the response
    request_id = response.json().get("request_id")
    print("request_id",request_id)
    
    if not request_id:
        return "Error: Failed to get request ID from the server."
    
    # Poll the status of the request
    i = 0.01
    while True:
        status_response = requests.get(f"{API_URL}/status/{request_id}")
        status = status_response.json()
        
        if status.get("status") == "completed":
            progress(1)
            break
        elif status.get("status") == "failed":
            return "Error: Processing failed."

        progress(i)
        i += 0.01
        if i >= 0.9:
            i = 0.9
        time.sleep(1)
    
    # Download the final PDF
    final_pdf_response = requests.get(f"{API_URL}/get_file")
    
    if final_pdf_response.status_code == 200:
        with open("UXEva_report.pdf", "wb") as f:
            f.write(final_pdf_response.content)
        return "UXEva_report.pdf"
    else:
        return "Error: Failed to download the PDF."

def update_submit_button(image, user_task):
    if not image or not user_task:
        return gr.update(interactive=False), gr.update(visible=True)
    return gr.update(interactive=True), gr.update(visible=False)


with gr.Blocks(css="""
    .image-preview img {max-height: 400px; max-width: 400px;}
    .disabled {cursor: not-allowed; color: red;}
""") as demo:
    gr.Markdown("""
    <h1 style="text-align: center;">
        <span style="color: green;">UXEva</span>: UI/UX Evaluation Tool Powered by LLM Agent
    </h1>
    """)
    gr.LoginButton()
    
    with gr.Column(visible=False) as main_ui:
        image_input = gr.Image(type="filepath", label="Upload UI Image", elem_classes="image-preview")
        user_task_input = gr.Textbox(label="Enter User Task")
        pdf_output = gr.File(label="Download PDF Report")
        submit_btn = gr.Button("Submit", interactive=False)
        warning = gr.Markdown("<span class='disabled'>Upload image and enter user task</span>", visible=False)
    
    image_input.change(update_submit_button, inputs=[image_input, user_task_input], outputs=[submit_btn, warning])
    user_task_input.change(update_submit_button, inputs=[image_input, user_task_input], outputs=[submit_btn, warning])
    
    submit_btn.click(
        process_ui_image, 
        inputs=[image_input, user_task_input], 
        outputs=[pdf_output]
    )
    def get_profile(profile: gr.OAuthProfile):
        global newprofile
        if profile is None:
            print("unknow user.")
        else:
            newprofile.name = profile.name
            newprofile.username = profile.username
            print("profile name", profile.name)
            print("profile username", profile.username)
            return {main_ui: gr.Column(visible=True)}
            
    demo.load(get_profile, inputs=None, outputs=[main_ui])

demo.queue(default_concurrency_limit=1, max_size=7)
demo.launch()