Medresearch / app.py
mgbam's picture
Update app.py
e7d54ba verified
raw
history blame
5.09 kB
import gradio as gr
from Bio import Entrez
from transformers import pipeline
import os # For environment variables and file paths
# ---------------------------- Configuration ----------------------------
ENTREZ_EMAIL = os.environ.get("ENTREZ_EMAIL", "[email protected]") # Use environment variable, default fallback
HUGGINGFACE_API_TOKEN = os.environ.get("HUGGINGFACE_API_TOKEN", "HUGGINGFACE_API_TOKEN") # Use environment variable, default fallback
SUMMARIZATION_MODEL = "facebook/bart-large-cnn"
# ---------------------------- Global Variables ----------------------------
summarizer = None
initialization_status = "Initializing..." # Track initialization state
# ---------------------------- Helper Functions ----------------------------
def log_error(message: str):
"""Logs an error message to the console and a file (if possible)."""
print(f"ERROR: {message}")
try:
with open("error_log.txt", "a") as f:
f.write(f"{message}\n")
except:
print("Couldn't write to error log file.") #If logging fails, still print to console
# ---------------------------- Tool Functions ----------------------------
def search_pubmed(query: str) -> list:
"""Searches PubMed and returns a list of article IDs."""
try:
Entrez.email = ENTREZ_EMAIL
handle = Entrez.esearch(db="pubmed", term=query, retmax="5")
record = Entrez.read(handle)
handle.close()
return record["IdList"]
except Exception as e:
log_error(f"PubMed search error: {e}")
return [f"Error during PubMed search: {e}"]
def fetch_abstract(article_id: str) -> str:
"""Fetches the abstract for a given PubMed article ID."""
try:
Entrez.email = ENTREZ_EMAIL
handle = Entrez.efetch(db="pubmed", id=article_id, rettype="abstract", retmode="text")
abstract = handle.read()
handle.close()
return abstract
except Exception as e:
log_error(f"Error fetching abstract for {article_id}: {e}")
return f"Error fetching abstract for {article_id}: {e}"
# ---------------------------- Agent Function ----------------------------
def medai_agent(query: str) -> str:
"""Orchestrates the medical literature review and summarization."""
article_ids = search_pubmed(query)
if isinstance(article_ids, list) and article_ids:
results = []
for article_id in article_ids:
abstract = fetch_abstract(article_id)
if "Error" not in abstract:
results.append(f"<div class='article'>\n"
f" <h3 class='article-id'>Article ID: {article_id}</h3>\n"
f" <p class='abstract'><strong>Abstract:</strong> {abstract}</p>\n"
f"</div>\n")
else:
results.append(f"<div class='article error'>\n"
f" <h3 class='article-id'>Article ID: {article_id}</h3>\n"
f" <p class='error-message'>Error processing article: {abstract}</p>\n"
f"</div>\n")
return "\n".join(results)
else:
return f"No articles found or error occurred: {article_ids}"
# ---------------------------- Initialization and Setup ----------------------------
def setup():
"""Initializes the summarization model."""
global summarizer, initialization_status
initialization_status = "Initializing..."
try:
initialization_status = "Model is running. The user is now set to search and obtain abstract articles."
return initialization_status
except Exception as e:
initialization_status = f"Initialization error: {e}"
log_error(initialization_status)
return initialization_status
# ---------------------------- Gradio Interface ----------------------------
def launch_gradio():
"""Launches the Gradio interface."""
global initialization_status
# CSS to style the article output
css = """
.article {
border: 1px solid #ddd;
margin-bottom: 10px;
padding: 10px;
border-radius: 5px;
}
.article.error {
border-color: #f00;
}
.article-id {
font-size: 1.2em;
margin-bottom: 5px;
}
.abstract {
font-style: italic;
}
.error-message {
color: #f00;
}
"""
with gr.Blocks(css=css) as iface:
gr.Markdown("# MedAI: Medical Literature Review and Abstract Finder")
status_display = gr.Textbox(value=initialization_status, interactive=False)
query_input = gr.Textbox(lines=3, placeholder="Enter your medical query (e.g., 'new treatments for diabetes')...")
submit_button = gr.Button("Submit")
output_results = gr.HTML() # Use HTML for formatted output
submit_button.click(medai_agent, inputs=query_input, outputs=output_results)
status_display.value = setup()
iface.launch()
# ---------------------------- Main Execution ----------------------------
if __name__ == "__main__":
launch_gradio()