File size: 5,376 Bytes
1ac84a9
 
 
2a1757f
1ac84a9
56c2a68
1ac84a9
 
572f86e
66ec133
572f86e
1ac84a9
2a1757f
 
1ac84a9
f6fc806
1ac84a9
f6fc806
 
caf315a
572f86e
 
 
f6fc806
 
 
d98c79b
 
 
 
 
 
 
 
 
 
 
 
572f86e
 
2a1757f
 
 
 
 
 
 
 
 
 
 
572f86e
 
 
 
4893c03
 
 
9180e08
2a1757f
 
3c671c6
1ac84a9
 
f6fc806
1ac84a9
 
 
3c671c6
2a1757f
 
 
 
3c671c6
 
5ae861e
84a19ec
24cfdc1
84a19ec
 
1ac84a9
723d90c
2a1757f
 
84a19ec
 
5ae861e
1ac84a9
 
7f990d9
f6fc806
7f990d9
f6fc806
84a19ec
 
 
 
7f990d9
 
 
1ac84a9
84a19ec
1ac84a9
 
2a1757f
 
 
 
3c671c6
1ac84a9
f05ed48
1ac84a9
f05ed48
1ac84a9
f05ed48
1ac84a9
caf315a
f05ed48
f6fc806
caf315a
572f86e
 
 
 
 
 
f05ed48
2a1757f
f05ed48
572f86e
 
f05ed48
572f86e
 
f05ed48
 
20a01bf
f6fc806
 
73b2985
6f4788a
f05ed48
6f4788a
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
import gradio as gr
import openai
from openai import OpenAI
import google.generativeai as genai
import os
import io
import base64

# Set API key
#base_url = os.environ.get("OPENAI_API_BASE")
api_key = ""

endpoints = ''
    
# Define the model to be used
MODEL = os.environ.get("MODEL")

DESCRIPTION = '''
<div>
<h1 style="text-align: center;">Medster - Medical Diagnostic Assistant</h1>
<p>An AI tool that helps you analyze symptoms and test reports.  </p>
<p>🔎 Select the department you need to consult, and enter the symptom description or physical examination information in the input box; you can also upload the test report image in the picture box.  </p>
<p>🦕 Please note that the generated information may be inaccurate and does not have any actual reference value. Please contact a professional doctor if necessary.  </p>
</div>
'''


css = """
h1 {
    text-align: center;
    display: block;
}
footer {
    display:none !important
}
"""


LICENSE = 'MODEL: ' + MODEL + ' LOADED'


def endpoints(api_key):
    if api_key not None:
        if api_key[:3] == "sk-":
            return 'OPENAI'
        else:
            return 'GOOGLE'
    return

endpoints = endpoints(api_key)

def read(filename):
    with open(filename) as f:
        data = f.read()
    return data

SYS_PROMPT = read('system_prompt.txt')

def process_text(text_input, unit):
    if text_input and endpoints == 'OPENAI':
        client = OpenAI(api_key=api_key)
        completion = client.chat.completions.create(
            model=MODEL,
            messages=[
                {"role": "system", "content": f" You are a experienced {unit} doctor." + SYS_PROMPT},
                {"role": "user", "content": f"Hello! Could you solve {text_input}?"}
            ]
        )
        return completion.choices[0].message.content
    elif text_input and endpoints == "GOOGLE":
        genai.configure(api_key=GOOGLE_API_KEY)
        model = genai.GenerativeModel(MODEL),
        return response = model.generate_content(SYS_PROMPT + text_input).text
    return ""

def encode_image_to_base64(image_input):
    buffered = io.BytesIO()
    image_input.save(buffered, format="JPEG")
    img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
    return img_str

def process_image(image_input, unit):
    if image_input is not None and endpoints == 'OPENAI':
        client = OpenAI(api_key=api_key)
        #with open(image_input.name, "rb") as f:
        #    base64_image = base64.b64encode(f.read()).decode("utf-8")
        base64_image = encode_image_to_base64(image_input)
        response = client.chat.completions.create(
            model=MODEL,
            messages=[
                {"role": "system", "content": f" You are a experienced {unit} doctor." + SYS_PROMPT},
                {"role": "user", "content": [
                    {"type": "text", "text": "Help me understand what is in this picture and analysis."},
                    {"type": "image_url", 
                     "image_url": {
                        "url": f"data:image/jpeg;base64,{base64_image}",
                        "detail":"low"}
                    }
                ]}
            ],
            temperature=0.0,
            max_tokens=1024,
        )
        return response.choices[0].message.content
    elif image_input is not None and ENDPOINTS == "GOOGLE":
        genai.configure(api_key=GOOGLE_API_KEY)
        model = genai.GenerativeModel(MODEL),
        return response = model.generate_content(image_input).text


def main(text_input="", image_input=None, unit=""):
    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(theme='shivi/calm_seafoam', css=css, title="Medster - Medical Diagnostic Assistant") as iface:
    with gr.Accordion(""):
        gr.Markdown(DESCRIPTION)
        unit = gr.Dropdown(label="🩺Department", value='Traditional Medicine', elem_id="units",
                             choices=["Traditional Medicine", "Internal Medicine", "Surgery", "Obstetrics and Gynecology", "Pediatrics", \
                                      "Orthodontics", "Andrology", "Dermatology and Venereology", "Infectious Diseases", "Psychiatry", \
                                         "Plastic Surgery Department", "Nutrition Department", "Reproductive Center", "Anesthesiology Department", "Medical Imaging Department", \
                                             "Orthopedics", "Oncology", "Emergency Department", "Laboratory Department"])
    with gr.Row():
        output_box = gr.Markdown(label="Diagnosis")  # Create an output textbox
    with gr.Row():
        api_key = gr.Textbox(label="API Key") # Input API key
    with gr.Row():
        image_input = gr.Image(type="pil", label="Upload Image")  # Create an image upload button
        text_input = gr.Textbox(label="Submit")  # Create a text input box
    with gr.Row():
        submit_btn = gr.Button("🚀 Send")  # Create a submit button
        clear_btn = gr.ClearButton(output_box, value="🗑️ Clear") # Create a clear button

    # Set up the event listeners
    submit_btn.click(main, inputs=[api_key, text_input, image_input, unit], outputs=output_box)

    gr.Markdown(LICENSE)
    
#gr.close_all()

iface.queue().launch(show_api=False)  # Launch the Gradio interface