Spaces:
Sleeping
Sleeping
import gradio as gr | |
from Bio import Entrez | |
import os # For environment variables and file paths | |
from components import federated_learning | |
# ---------------------------- Configuration ---------------------------- | |
ENTREZ_EMAIL = os.environ.get("ENTREZ_EMAIL", "ENTREZ_EMAIL") # Use environment variable, default fallback | |
HUGGINGFACE_API_TOKEN = os.environ.get("HUGGINGFACE_API_TOKEN", "HUGGINGFACE_API_TOKEN") # Use environment variable, default fallback | |
# ---------------------------- 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 presents abstract.""" | |
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}" | |
# ---------------------------- Gradio Interface ---------------------------- | |
def launch_gradio(): | |
"""Launches the Gradio interface.""" | |
# 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") | |
gr.Markdown("Enter a medical query to retrieve abstracts from PubMed.") | |
query_input = gr.Textbox(lines=3, placeholder="Enter your medical query to get abstract from PubMed.") | |
submit_button = gr.Button("Submit") | |
output_results = gr.HTML() # Use HTML for formatted output | |
federated_learning_output = gr.HTML() | |
# Get data | |
submit_button.click(medai_agent, inputs=query_input, outputs=output_results) | |
run_fl_button = gr.Button("Run Federated Learning (Conceptual)") | |
run_fl_button.click(federated_learning.run_federated_learning, outputs = federated_learning_output) | |
iface.launch() | |
# ---------------------------- Main Execution ---------------------------- | |
if __name__ == "__main__": | |
launch_gradio() |