import os
import base64
import gradio as gr
from gradio_client import Client, file
import time
import json
import threading
MODEL_NAME = "Qwen"
client_chat = os.environ.get("CHAT_URL")
client_vl = os.environ.get("VL_URL")
def read(filename):
with open(filename) as f:
data = f.read()
return data
SYS_PROMPT = read('system_prompt.txt')
DESCRIPTION = '''
家庭医生demo
🩺一个帮助您分析症状和检验报告的家庭医生(AI诊疗助手)。
🔎 选择您需要咨询的科室医生,在输入框中输入症状描述或者体检信息等;您也可以在图片框中上传检测报告图。
🦕 请注意生成信息可能不准确,且不具备任何实际参考价值,如有需要请联系专业医生。
💾 因网络延迟问题,图片识别未及时出现分析内容,请间隔多次点击重载,手动尝试获取。
'''
css = """
h1 {
text-align: center;
display: block;
}
footer {
display:none !important
}
"""
LICENSE = '当前采用 ' + MODEL_NAME + ' 模型,请主动移除个人信息,注意隐私保护🔔'
local_data = threading.local()
def init_data():
if not hasattr(local_data, 'results'):
local_data.results = ""
def process_text(text_input, unit):
init_data()
client = Client(client_chat)
# print(client.view_api())
job = client.submit(
query=str(text_input),
history=None,
system=f"You are a experienced {unit} doctor AI assistant." + SYS_PROMPT,
api_name="/model_chat"
)
response = job.result()
local_data.results = response[1][0][1]
return local_data.results
'''
def update(json_path: str, event: threading.Event):
init_data()
event.wait()
client = Client(client_vl)
response = client.predict(
json_path,
fn_index=1
)
with open(response, 'r') as f:
data = json.load(f)
local_data.results = data[-1][1]
print(local_data.results)
'''
def process_image(image_input, unit):
init_data()
if image_input is not None:
image = str(image_input)
print(image)
#with open(image_input, "rb") as f:
# base64_image = base64.b64encode(f.read()).decode("utf-8")
client = Client(client_vl)
# print(client.view_api())
prompt = f" You are a experienced {unit} doctor AI assistant." + SYS_PROMPT + "Help me understand what is in this picture and analysis."
res5 = client.predict(
"",
image,
fn_index=5
)
print(res5)
res0 = client.predict(
res5,
prompt,
fn_index=0
)
print(res0)
'''
event = threading.Event()
t = threading.Thread(target=update, args=(res0, event))
t.start()
local_data.results = "正在分析....."
event.set()
'''
job = client.submit(
res0,
fn_index=1
)
response = job.result()
with open(response, 'r') as f:
data = json.load(f)
local_data.results = data[-1][1]
return local_data.results
def fetch_result():
init_data()
return local_data.results
def reset_result():
init_data()
print(local_data.results)
local_data.results = ""
def main(text_input="", image_input=None, unit=""):
reset_result()
if text_input and image_input is None:
return process_text(text_input, unit)
elif image_input is not None:
return process_image(image_input, unit)
with gr.Blocks(css=css, title="家庭医生AI助手", theme="soft") as iface:
with gr.Accordion(""):
gr.Markdown(DESCRIPTION)
unit = gr.Dropdown(label="🩺科室", value='中医科', elem_id="units",
choices=["中医科", "内科", "外科", "妇产科", "儿科", \
"五官科", "男科", "皮肤性病科", "传染科", "精神心理科", \
"整形美容科", "营养科", "生殖中心", "麻醉医学科", "医学影像科", \
"骨科", "肿瘤科", "急诊科", "检验科"])
with gr.Row():
output_box = gr.Textbox(label="分析")
with gr.Row():
image_input = gr.Image(type="filepath", label="上传图片") # Create an image upload button
text_input = gr.Textbox(label="输入") # Create a text input box
with gr.Row():
submit_btn = gr.Button("🚀 发送") # Create a submit button
fresh_btn = gr.Button("✨ 重载")
clear_btn = gr.ClearButton([output_box, image_input, text_input], value="🗑️ 清空") # Create a clear button
# Set up the event listeners
submit_btn.click(main, inputs=[text_input, image_input, unit], outputs=output_box)
fresh_btn.click(fn=fetch_result, outputs=output_box)
gr.Markdown(LICENSE)
#gr.close_all()
iface.queue().launch(show_api=False) # Launch the Gradio interface