File size: 4,701 Bytes
fddd5eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35610d2
fddd5eb
 
 
 
 
 
35610d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fddd5eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import os
import base64
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage
from dotenv import load_dotenv

# Load API key from .env file
load_dotenv()
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")

# Initialize the Gemini model
llm = ChatGoogleGenerativeAI(
    model="gemini-2.0-flash",
    max_tokens=4000,
    api_key=GEMINI_API_KEY
)

def encode_file(file):
    return base64.b64encode(file.read()).decode()

def summarize_report(file, file_type):
    encoded_string = encode_file(file)
    
    prompt = """You are a highly advanced medical document analysis AI designed to assist live agents and doctors by extracting and summarizing fluctuating or improper test results from uploaded medical reports. Your task is to carefully parse the document, identify irregularities in test values, highlight trends that indicate instability, and generate a clear, structured summary.
    Ensure the summary includes:
    1) The test names with significant fluctuations or abnormal values.
    2) A brief comparison of fluctuating values over time (if historical data is available).
    3) Possible concerns based on deviations from normal ranges.
    4) A concise, professional summary that can be quickly reviewed by a medical expert or triage bot for primary screening.
    Format the output to be clear, concise, and medically relevant. Do not make any medical diagnosesโ€”only summarize fluctuations and abnormalities in an easily interpretable manner."""
    
    content = [{"type": "text", "text": prompt}]
    
    if file_type in ["image/jpeg", "image/png", "image/webp"]:
        content.append({"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{encoded_string}"}})
    else:
        content.append({"type": "text", "text": encoded_string})
    
    message = HumanMessage(content=content)
    ai_msg = llm.invoke([message])
    return ai_msg.content

# Streamlit UI
st.set_page_config(page_title="Medical Report Summarizer", layout="wide", page_icon="๐Ÿ“„")

# Custom CSS for styling
st.markdown("""
    <style>
        .main {
            background-color: #f5f5f5;
        }
        .stButton>button {
            background-color: #4CAF50;
            color: white;
            border-radius: 8px;
            padding: 10px 20px;
        }
        .stSpinner {
            color: #4CAF50;
        }
    </style>
""", unsafe_allow_html=True)

# Header Section
st.title("๐Ÿ“„ Call on Doc Medical Report Summarizer")
st.markdown("""
    <div style="background-color: #4CAF50; padding: 10px; border-radius: 10px;">
        <h2 style="color: white; text-align: center;">Upload your medical report and get a summarized analysis!</h2>
    </div>
""", unsafe_allow_html=True)

# Add demo images to the app
st.write("### Test with Demo Images:")
demo_images = {
    "Test Report 1": "report1.webp",
    "Test Report 2": "report2.webp",
    "Test Report 3": "report3.webp"
}

# Dropdown to select a demo image
selected_demo = st.selectbox("Choose a demo image to test:", options=["None"] + list(demo_images.keys()))

if selected_demo != "None":
    demo_image_path = demo_images[selected_demo]
    with open(demo_image_path, "rb") as file:
        demo_file = file.read()
    # st.image(demo_image_path, caption=f"Selected Demo: {selected_demo}", use_column_width=True)
    
    # Process the selected demo image
    with st.spinner("๐Ÿ”„ Processing the demo image..."):
        summary = summarize_report(file=open(demo_image_path, "rb"), file_type="image/jpeg")
    
    # Display Summary
    st.success("โœ… Demo image processed successfully!")
    st.subheader("Summarized Report:")
    st.write(summary)

    # Download Button for Summary
    st.download_button(
        label="๐Ÿ“ฅ Download Summary",
        data=summary,
        file_name=f"{selected_demo}_summary.txt",
        mime="text/plain"
    )

# File Upload Section
st.write("### Upload your medical report (image, PDF, or Word document):")
uploaded_file = st.file_uploader("", type=["pdf", "doc", "docx", "jpg", "jpeg", "png", "webp"])

# Process Uploaded File
if uploaded_file is not None:
    file_type = uploaded_file.type
    with st.spinner("๐Ÿ”„ Processing the document..."):
        summary = summarize_report(uploaded_file, file_type)
    
    # Display Summary
    st.success("โœ… Document processed successfully!")
    st.subheader("Summarized Report:")
    st.write(summary)

    # Download Button for Summary
    st.download_button(
        label="๐Ÿ“ฅ Download Summary",
        data=summary,
        file_name="summary.txt",
        mime="text/plain"
    )
else:
    st.info("โ„น๏ธ Please upload a file to get started.")