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") # Define the model to be used DESCRIPTION = '''

Medster - Medical Diagnostic Assistant

An AI tool that helps you analyze symptoms and test reports.

🔎 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.

🦕 Please note that the generated information may be inaccurate and does not have any actual reference value. Please contact a professional doctor if necessary.

''' css = """ h1 { text-align: center; display: block; } footer { display:none !important } """ LICENSE = '[Medster](https://huggingface.co/spaces/vilarin/Medster)' def read(filename): with open(filename) as f: data = f.read() return data SYS_PROMPT = read('system_prompt.txt') def endpoints(api_key): if api_key is not None: if api_key.startswith('sk-'): model_name = "gpt-4o" endpoint = 'OPENAI' return model_name, endpoint else: model_name = "models/gemini-1.5-pro-latest" endpoint = 'GOOGLE' return model_name, endpoint def process_text(api_key, text_input, unit): model_name, endpoint = endpoints(api_key) if text_input and endpoint == 'OPENAI': client = OpenAI(api_key=api_key) completion = client.chat.completions.create( model=model_name, 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 endpoint == "GOOGLE": genai.configure(api_key=api_key) model = genai.GenerativeModel(model_name=model_name) prompt = f" You are a experienced {unit} doctor." + SYS_PROMPT + f"Could you solve {text_input}?" response = model.generate_content(prompt) return response.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(api_key, image_input, unit): model_name, endpoint = endpoints(api_key) if image_input is not None and endpoint == '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_name, 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 endpoint == "GOOGLE": genai.configure(api_key=api_key) model = genai.GenerativeModel(model_name=model_name) prompt = f" You are a experienced {unit} doctor." + SYS_PROMPT + "Help me understand what is in this picture and analysis." response = model.generate_content([prompt, image_input],request_options={"timeout": 60}) return response.text def main(unit="", api_key="", text_input="", image_input=None): if text_input and image_input is None: return process_text(api_key, text_input, unit) elif image_input is not None: return process_image(api_key, 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", type='password') # 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="Input Text") # 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=[unit, api_key, text_input, image_input], outputs=output_box) gr.Markdown(LICENSE) #gr.close_all() iface.queue().launch(show_api=False) # Launch the Gradio interface