|
import requests |
|
import json |
|
import gradio as gr |
|
|
|
def calculate(course_input, course_profile, course_hour): |
|
url = "https://rd-ai-knowledge-navigator.onrender.com/process" |
|
|
|
headers = { |
|
"Content-Type": "application/json" |
|
} |
|
|
|
data = { |
|
"title": course_input, |
|
"content": course_profile, |
|
"hour": course_hour |
|
} |
|
|
|
try: |
|
response = requests.post(url, json=data, headers=headers, timeout=50) |
|
|
|
if response.status_code == 200: |
|
try: |
|
response_json = response.json() |
|
success = response_json.get("success", False) |
|
title = response_json.get("title", "未知課程") |
|
top_competencies = response_json.get("top_competencies", []) |
|
competencies = response_json.get("competencies", []) |
|
|
|
if success: |
|
competencies_list = [f"{item['item']} ({item['score']})" for item in competencies] |
|
return (f"課程 '{title}' 職能匹配成功!", top_competencies, "\n".join(competencies_list)) |
|
else: |
|
return "匹配失敗,請稍後再試", "無職能項目", "無職能項目" |
|
|
|
except json.JSONDecodeError: |
|
return "錯誤: 伺服器回應非 JSON 格式", "無職能項目", "無職能項目" |
|
|
|
else: |
|
return f"錯誤: 伺服器返回 HTTP {response.status_code}", "無職能項目", "無職能項目" |
|
|
|
except requests.exceptions.Timeout: |
|
return "錯誤: 伺服器回應超時", "無職能項目", "無職能項目" |
|
except requests.exceptions.RequestException as e: |
|
return f"請求失敗: {str(e)}", "無職能項目", "無職能項目" |
|
|
|
|
|
def validate_input(course_input, course_profile, course_hour): |
|
errors = [] |
|
if not course_input.strip(): |
|
errors.append("課程名稱為必填項目") |
|
if not course_profile.strip(): |
|
errors.append("課程簡介為必填項目") |
|
if not course_hour.strip(): |
|
errors.append("課程時數為必填項目") |
|
|
|
if errors: |
|
return "\n".join(errors), "", "" |
|
return None |
|
|
|
def setup_gradio_interface(): |
|
with gr.Blocks() as demo: |
|
with gr.Row(): |
|
course_input = gr.Textbox(label="課程名稱", placeholder="請輸入課程名稱") |
|
course_hour = gr.Textbox(label="課程時數", placeholder="請輸入課程時數") |
|
with gr.Row(): |
|
course_profile = gr.Textbox(label="課程簡介", placeholder="請輸入課程簡介") |
|
with gr.Row(): |
|
submit_button = gr.Button("計算職能項目") |
|
with gr.Row(): |
|
txt_response = gr.Textbox(label="計算狀態", placeholder="計算結果", interactive=False) |
|
course_competencies = gr.Textbox(label="職能項目", placeholder="職能項目", interactive=False) |
|
with gr.Row(): |
|
json_competencies = gr.Textbox(label="JSON內容", placeholder="職能項目", interactive=False) |
|
|
|
|
|
def validate_and_calculate(course_input, course_profile, course_hour): |
|
validation_result = validate_input(course_input, course_profile, course_hour) |
|
if validation_result: |
|
return validation_result |
|
return calculate(course_input, course_profile, course_hour) |
|
|
|
submit_button.click( |
|
validate_and_calculate, |
|
inputs=[course_input, course_profile, course_hour], |
|
outputs=[txt_response, course_competencies, json_competencies] |
|
) |
|
|
|
return demo |
|
|
|
|
|
if __name__ == "__main__": |
|
demo = setup_gradio_interface() |
|
demo.launch() |
|
|