Spaces:
Sleeping
Sleeping
from Bio import Entrez | |
import os # For environment variables and file paths | |
# ---------------------------- Configuration ---------------------------- | |
# ---------------------------- 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 = os.environ.get("ENTREZ_EMAIL", "[email protected]") | |
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 = os.environ.get("ENTREZ_EMAIL", "[email protected]") | |
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}" |