docker_test / src /ui.py
3v324v23's picture
new1
dd10f90
raw
history blame
7.93 kB
import gradio as gr
import json
import time
from typing import Dict, Any, List, Optional
class EvaluationUI:
"""处理评估服务的Gradio界面"""
def __init__(self, queue_manager):
"""初始化UI
Args:
queue_manager: 队列管理器实例
"""
self.queue_manager = queue_manager
self.app = None
def submit_evaluation(self, input_data):
"""提交评估请求
Args:
input_data: 输入JSON数据
Returns:
dict: 包含请求ID和状态的字典
"""
try:
# 解析JSON
if isinstance(input_data, str):
input_data = json.loads(input_data)
# 提交到队列
request_id = self.queue_manager.enqueue(input_data)
# 返回请求ID
return {"request_id": request_id, "status": "queued"}
except Exception as e:
return {"status": "error", "message": str(e)}
def get_evaluation_result(self, request_id):
"""获取评估结果
Args:
request_id: 请求ID
Returns:
dict: 评估结果
"""
return self.queue_manager.get_result(request_id)
def get_queue_status(self):
"""获取队列状态
Returns:
dict: 队列状态信息
"""
return self.queue_manager.get_queue_status()
def render_queue_status(self):
"""渲染队列状态HTML
Returns:
str: 队列状态的HTML表示
"""
status = self.queue_manager.get_queue_status()
stats = status["stats"]
queue_items = status["queue_items"]
html = f"""
<div style="padding: 10px; background-color: #f5f5f5; border-radius: 5px; margin-bottom: 20px;">
<h3>队列状态</h3>
<div style="display: flex; justify-content: space-between; margin-bottom: 15px;">
<div style="text-align: center; padding: 5px; background-color: #e0f7fa; border-radius: 5px; flex: 1; margin-right: 5px;">
<div style="font-weight: bold; font-size: 24px;">{stats['queued']}</div>
<div>等待中</div>
</div>
<div style="text-align: center; padding: 5px; background-color: #fff9c4; border-radius: 5px; flex: 1; margin-right: 5px;">
<div style="font-weight: bold; font-size: 24px;">{stats['processing']}</div>
<div>处理中</div>
</div>
<div style="text-align: center; padding: 5px; background-color: #c8e6c9; border-radius: 5px; flex: 1; margin-right: 5px;">
<div style="font-weight: bold; font-size: 24px;">{stats['completed']}</div>
<div>已完成</div>
</div>
<div style="text-align: center; padding: 5px; background-color: #ffcdd2; border-radius: 5px; flex: 1;">
<div style="font-weight: bold; font-size: 24px;">{stats['error']}</div>
<div>错误</div>
</div>
</div>
"""
if queue_items:
html += """
<h4>当前队列</h4>
<table style="width: 100%; border-collapse: collapse;">
<tr style="background-color: #e0e0e0;">
<th style="padding: 8px; text-align: left; border: 1px solid #ddd;">ID</th>
<th style="padding: 8px; text-align: left; border: 1px solid #ddd;">状态</th>
<th style="padding: 8px; text-align: left; border: 1px solid #ddd;">等待时间</th>
</tr>
"""
current_time = time.time()
for item in queue_items:
status_color = "#fff9c4" if item["status"] == "processing" else "#e0f7fa"
wait_time = current_time - item["created_at"]
wait_time_str = f"{int(wait_time // 60)}{int(wait_time % 60)}秒"
html += f"""
<tr>
<td style="padding: 8px; text-align: left; border: 1px solid #ddd;">{item['id'][:8]}...</td>
<td style="padding: 8px; text-align: left; border: 1px solid #ddd; background-color: {status_color};">
{"处理中" if item["status"] == "processing" else "等待中"}
</td>
<td style="padding: 8px; text-align: left; border: 1px solid #ddd;">{wait_time_str}</td>
</tr>
"""
html += "</table>"
else:
html += "<p>队列为空</p>"
html += "</div>"
return html
def create_evaluation_interface(self):
"""创建评估接口
Returns:
gr.Interface: Gradio接口
"""
# 创建用于直接提交JSON的接口
with gr.Blocks(title="代码评估服务") as app:
with gr.Row():
with gr.Column(scale=3):
gr.Markdown("# 代码评估服务")
gr.Markdown("支持多种编程语言的代码评估服务,使用消息队列处理并发请求。")
# 输入JSON
json_input = gr.JSON(
label="输入JSON",
value=[{"language": "python", "processed_completions": ["def add(a, b):\n return a + b"], "prompt": "", "tests": "assert add(1, 2) == 3"}]
)
# 提交按钮
submit_btn = gr.Button("提交评估")
# 结果输出
result_output = gr.JSON(label="评估结果")
with gr.Column(scale=2):
# 队列状态
queue_status = gr.HTML(label="队列状态")
refresh_btn = gr.Button("刷新队列状态")
# 获取特定结果
with gr.Row():
request_id_input = gr.Textbox(label="请求ID")
get_result_btn = gr.Button("获取结果")
# 特定结果输出
specific_result = gr.JSON(label="请求结果")
# 事件处理
submit_btn.click(
fn=self.submit_evaluation,
inputs=[json_input],
outputs=[result_output]
)
refresh_btn.click(
fn=self.render_queue_status,
inputs=[],
outputs=[queue_status]
)
get_result_btn.click(
fn=self.get_evaluation_result,
inputs=[request_id_input],
outputs=[specific_result]
)
# 定时更新队列状态
app.load(fn=self.render_queue_status, inputs=None, outputs=queue_status, every=2)
self.app = app
return app
def create_api_interface(self):
"""创建API接口
Returns:
gr.Interface: Gradio接口
"""
return gr.Interface(
fn=self.submit_evaluation,
inputs=gr.JSON(),
outputs=gr.JSON(),
title="代码评估API",
description="API接口用于提交代码评估请求"
)
def get_app(self):
"""获取Gradio应用
Returns:
gr.Blocks: Gradio应用
"""
if self.app is None:
self.create_evaluation_interface()
return self.app