Medical_Bot / app.py
epiph1's picture
Upload 2 files
9c65229
raw
history blame
13.4 kB
import os
import openai
import langchain
langchain.debug = False
os.environ["TOKENIZERS_PARALLELISM"] = "false"
os.environ["OPENAI_API_KEY"]
def save_docs(docs):
import shutil
import os
output_dir = "/home/user/app/docs/"
if os.path.exists(output_dir):
shutil.rmtree(output_dir)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for doc in docs:
shutil.copy(doc.name, output_dir)
return "Successful!"
global mdm_value
def process_docs():
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
import os
from docx import Document
global mdm_value
llm = ChatOpenAI(model_name="gpt-3.5-turbo-16k")
agent = ConversationChain(llm=llm, verbose=True)
folder_path = "/home/user/app/docs/"
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith(".docx") or file.endswith(".docx"):
word_file_path = os.path.join(root, file)
doc = Document(word_file_path)
text = []
for paragraph in doc.paragraphs:
text.append(paragraph.text)
doc_content = "\n".join(text)
one_word_propmt = """Classify into "MINIMAL", "LOW", "MODERATE", "HIGH". You should ALWAYS give only ONE option and NOTHING ELSE.
ONLY return ONE option. AWAYS answer in ONLY one word. DO NOT give full sentences.
ALWAYS give the answer in ALL UPPER CASE. DO NOT EVER give answer in any other case."""
#####################################################
instruction1 = """You are an expert at calculating the Risk of Complications and/or Morbidity or Mortality of the Patient Management Decisions Made at Visit (choose highest) You are provided with a detailed medical report. Classify it into "MINIMAL", "LOW", "MODERATE", and "HIGH" on the basis of the Given rules.
MINIMAL
Minimal risk of morbidity from additional diagnostic testing or treatment
Examples only
• Rest
• Gargles
• Elastic bandages
Superficial dressings
LOW
Low risk of morbidity from additional diagnostic testing or treatment
Examples only
OTC drugs
• Minor surgery w/no identified risk factors
• Physical/Occtherapy
MODERATE
MODERATE risk of morbidity from additional diagnostic testing or treatment
Examples only
Prescription drug management
Decision regarding minor surgery with identified patient or procedure risk factors
Decision regarding elective major surgery without identified patient or procedure risk factors
Diagnosis or treatment significantly limited by social determinants of health
HIGH
HIGH risk of morbidity from additional diagnostic testing or treatment
Examples only
Parenteral controlled substances (DEA controlled substance given by route other than digestive tract)
Drug therapy requiring intensive monitoring for toxicity
Decision regarding elective major surgery with identified patient or procedure risk factors
Decision regarding emergency major surgery
Decision regarding hospitalization or escalation of hospital level care (i.e. transfer to ICU)
Decision not to resuscitate or to deescalate care because of poor prognosis
Here is the Report """
instruction1 += "\n\n"
instruction1 += doc_content
instruction1 += "\n\n"
instruction1 += "Study it and just provide your answer"
response1 = agent.predict(input=instruction1)
instruction2 = one_word_propmt
instruction2 += "\n\n"
instruction2 += response1
response2 = agent.predict(input=instruction2) # main
#####################################################
instruction3 = """Calculate Amount and/or Complexity of Data to be Reviewed & Analyzed (choose highest criteria met). You are provided with a detailed medical report. Classify it into "MINIMAL", "LOW", "MODERATE", and "HIGH" on the basis of the Given rules.
CATEGORY 1
1. Review of prior external note(s) from each unique source (each unique source counted once, regardless of # of notes reviewed)
2. Review of the result(s) of each unique test
3. Ordering of each unique test (includes review of result, do not count in #2)
4. Assessment requiring an Independent historian
CATEGORY 2
Independent interpretation of tests performed by another physician/other qualified healthcare professional (not separately reported)
Do not count independent interpretation for a test billed or ordered by a colleague in the same specialty
CATEGORY 3
Discussion of management or test interpretation- with external physician/other qualified health care professional/ appropriate source (not separately reported)
Requires direct interactive exchange (not via intermediaries or notes)
MINIMAL
If Minimal or No Data Reviewed
LOW
if it meets any combination of 2 from items 1-3 Or Meet item 4 (independent historian)
1. Review of prior external note(s) from each unique source (each unique source counted once, regardless of # of notes reviewed)
2. Review of the result(s) of each unique test
3. Ordering of each unique test (includes review of result, do not count in #2)
4. Assessment requiring an Independent historian
MODERATE
Meet 1 of 3 categories below
Category 1: Meet any combination of 3 from items 1-4
Category 2: Independent interpretation of test
Category 3: Discussion management, or test interpretation (external)
HIGH
Meet 2 of 3 categories below
Category 1: Meet any combination of 3 from items 1-4
Category 2: Independent interpretation of test
Category 3: Discussion management, or test interpretation (external)
Here is the Report """
instruction3 += "\n\n"
instruction3 += doc_content
instruction3 += "\n\n"
instruction3 += "Study it and just provide your answer"
response3 = agent.predict(input=instruction3)
instruction4 = one_word_propmt
instruction4 += "\n\n"
instruction4 += response3
response4 = agent.predict(input=instruction4) # main
#####################################################
instruction5 = """You are an expert at calculating the complexity of medical problems based on Medical reports. You are provided with a detailed medical report. Classify it into "MINIMAL", "LOW", "MODERATE", and "HIGH" on the basis of the Given rules.
MINIMAL
1 self- limited or minor problem
(runs a definite or prescribed course, is transient in nature, and is not likely to permanently alter health status)
LOW
2 or more self-limited or minor problems; or
1 stable chronic illness (chronic illness which is at treatment goal for the specific patient); or
1 acute, uncomplicated illness or injury (full recovery w/out functional impairment is expected); or
Stable, acute illness (treatment newly or recently initiated, resolution may not be complete, but condition stable); or
Acute, uncomplicated illness or injury requiring hospital inpatient or observation level care (little to no risk of mortality with treatment, but treatment required is delivered in inpt or obs setting)
MODERATE
1 or more chronic illnesses with ex- acerbation, progression, or side effects of treatment (requires supportive care or attention to treatment for side effects); or
2 or more stable chronic illnesses; or
1 undiagnosed new problem with uncertain prognosis (likely to result in high risk of morbidity w/out tx); or
1 acute illness with systemic symptoms (illness that causes systemic symptoms and has high risk of morbidity without treatment); or
1 acute complicated injury (eval of body systems not part of injured organ, extensive injury, or multiple tx options are multiple and/ or associated with risk of morbidity
HIGH
• 1 or more chronic illness- es with severe exacerbation, progression, or side effects of treatment (significant risk of morbidity: may require escalation in level of care); or
1 acute or chronic illness or injury that poses a threat to life or bodily
function (in the near term without treatment e.g. AMI, pulmonary embolus, severe respiratory distress psychiatric illness with potential threat to self or others, peritonitis, acute renal failure)
Here is the Report """
instruction5 += "\n\n"
instruction5 += doc_content
instruction5 += "\n\n"
instruction5 += "Study it and just provide your answer"
response5 = agent.predict(input=instruction5)
instruction6 = one_word_propmt
instruction6 += "\n\n"
instruction6 += response5
response6 = agent.predict(input=instruction6) # main
######################################################
inputs = [response2, response4, response6]
sorted_inputs = sorted(
inputs, key=lambda x: ["MINIMAL", "LOW", "MODERATE", "HIGH"].index(x)
)
mdm_value = sorted_inputs[1]
print(mdm_value)
return (
"Successful!",
response1,
response2,
response3,
response4,
response5,
response6,
)
def get_code1(input):
global mdm_value
mdm_value = mdm_value
if input == "NEW" and mdm_value == "MINIMAL":
hcpcs_code = "99202"
elif input == "NEW" and mdm_value == "LOW":
hcpcs_code = "99203"
elif input == "NEW" and mdm_value == "MODERATE":
hcpcs_code = "99204"
elif input == "NEW" and mdm_value == "HIGH":
hcpcs_code = "99205"
elif input == "ESTABLISHED" and mdm_value == "MINIMAL":
hcpcs_code = "99212"
elif input == "ESTABLISHED" and mdm_value == "LOW":
hcpcs_code = "99213"
elif input == "ESTABLISHED" and mdm_value == "MODERATE":
hcpcs_code = "99214"
elif input == "ESTABLISHED" and mdm_value == "HIGH":
hcpcs_code = "99215"
return hcpcs_code
def get_code2(input):
if input == "20 min":
hcpcs_code = "99242"
elif input == "30 min":
hcpcs_code = "99243"
elif input == "40 min":
hcpcs_code = "99244"
elif input == "55 min":
hcpcs_code = "99245"
return hcpcs_code
import gradio as gr
css = """
.col{
max-width: 70%;
margin: 0 auto;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
"""
with gr.Blocks(css=css) as demo:
gr.Markdown("## <center>Medical assistant bot</center>")
with gr.Tab("Get help with medical documents"):
with gr.Column(elem_classes="col"):
with gr.Tab("Upload and Process Document"):
with gr.Row():
with gr.Column():
docs_upload_input = gr.Files(label="Upload File")
docs_upload_button = gr.Button("Upload")
docs_upload_output = gr.Textbox(label="Output")
docs_process_button = gr.Button("Process")
docs_process_output = gr.Textbox(label="Output")
gr.ClearButton(
[docs_upload_input, docs_upload_output, docs_process_output]
)
with gr.Column():
ai_output1 = gr.Textbox(label="Output 1")
ai_output2 = gr.Textbox(label="Output 2")
ai_output3 = gr.Textbox(label="Output 3")
ai_output4 = gr.Textbox(label="Output 4")
ai_output5 = gr.Textbox(label="Output 5")
ai_output6 = gr.Textbox(label="Output 6")
gr.ClearButton(
[
ai_output1,
ai_output2,
ai_output3,
ai_output4,
ai_output5,
ai_output6,
]
)
with gr.Tab("Get HCPCS Code (Primary Care Exception)"):
with gr.Column():
code_type_input1 = gr.Dropdown(choices=["NEW", "ESTABLISHED"])
code_type_button1 = gr.Button("Submit")
code_type_output1 = gr.Textbox(label="Output")
gr.ClearButton([code_type_input1, code_type_output1])
with gr.Tab("Get HCPCS Code (CONSULTATION)"):
with gr.Column():
code_type_input2 = gr.Dropdown(
choices=["20 min", "30 min", "40 min", "55 min"]
)
code_type_button2 = gr.Button("Submit")
code_type_output2 = gr.Textbox(label="Output")
gr.ClearButton([code_type_input2, code_type_output2])
#########################################################################################################
docs_upload_button.click(
save_docs, inputs=docs_upload_input, outputs=docs_upload_output
)
docs_process_button.click(
process_docs,
inputs=None,
outputs=[
docs_process_output,
ai_output1,
ai_output2,
ai_output3,
ai_output4,
ai_output5,
ai_output6,
],
)
code_type_button1.click(
get_code1, inputs=code_type_input1, outputs=code_type_output1
)
code_type_button2.click(
get_code2, inputs=code_type_input2, outputs=code_type_output2
)
#########################################################################################################
demo.queue()
demo.launch(debug=True, share=True)