pathogen-agent / app.py
Sepideh2027's picture
Create app.py
19a7d92 verified
Raw History Blame Contribute Delete
4.85 kB
import gradio as gr
import requests
import time
import re
from Bio import Entrez, SeqIO
from io import StringIO
Entrez.email = "anonymous@pathogenagent.ai"
Entrez.tool = "PathogenAgent-Lite"
HEADERS = {"User-Agent": "PathogenAgent-Lite/1.0"}
def search_pubmed(query, retmax=3):
try:
time.sleep(0.3)
url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi"
params = {"db": "pubmed", "term": query, "retmax": retmax, "retmode": "json"}
resp = requests.get(url, params=params, headers=HEADERS, timeout=10)
ids = resp.json().get("esearchresult", {}).get("idlist", [])
if not ids:
return []
url2 = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi"
params2 = {"db": "pubmed", "id": ",".join(ids), "retmode": "json"}
resp2 = requests.get(url2, params=params2, headers=HEADERS, timeout=10)
data = resp2.json()
results = []
for uid, rec in data.get("result", {}).items():
if uid == "uids":
continue
title = rec.get("title", "")
if title:
results.append(f"- {title}")
return results
except Exception:
return []
def search_genbank(query):
try:
time.sleep(0.5)
# بهبود جستجو: حذف کلمه "genome" و جستجوی نام موجودیت
search_term = query.replace("genome", "").strip()
if not search_term:
search_term = query
# جستجو با نام موجودیت
handle = Entrez.esearch(db="nucleotide", term=f"{search_term}[Organism]", retmax=3)
record = Entrez.read(handle)
handle.close()
if not record.get("IdList"):
return None
# گرفتن اولین نتیجه
seq_id = record["IdList"][0]
handle = Entrez.efetch(db="nucleotide", id=seq_id, rettype="fasta", retmode="text")
seq = SeqIO.read(StringIO(handle.read()), "fasta")
return {
"id": seq.id,
"length": len(seq.seq),
"snippet": str(seq.seq[:200])
}
except Exception:
return None
def search_clinvar(query):
try:
time.sleep(0.3)
url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi"
# برای ClinVar، فقط در صورتی که query شبیه واریانت باشد جستجو کن
if not re.search(r"c\.[0-9]+|rs[0-9]+|del|dup|ins|[A-Z][0-9]+[A-Z]", query):
return []
params = {"db": "clinvar", "term": query, "retmax": 3, "retmode": "json"}
resp = requests.get(url, params=params, headers=HEADERS, timeout=10)
ids = resp.json().get("esearchresult", {}).get("idlist", [])
if not ids:
return []
url2 = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi"
params2 = {"db": "clinvar", "id": ",".join(ids), "retmode": "json"}
resp2 = requests.get(url2, params=params2, headers=HEADERS, timeout=10)
data = resp2.json()
results = []
for uid, rec in data.get("result", {}).items():
if uid == "uids":
continue
title = rec.get("title", "")
if title:
results.append(f"- {title}")
return results
except Exception:
return []
def route_query(query):
q = query.lower()
if re.search(r"c\.[0-9]+|rs[0-9]+|del|dup|ins|[A-Z][0-9]+[A-Z]", q):
return "variant"
if re.search(r"genome|sequence|virus|organism|strain|cov|sars|ebola|influenza|mers|hiv|dengue|zika", q):
return "pathogen"
return "general"
def pathogen_agent(query):
route = route_query(query)
pubmed = search_pubmed(query)
clinvar = search_clinvar(query) if route == "variant" else []
genbank = search_genbank(query) if route == "pathogen" else None
pubmed_text = "\n".join(pubmed) if pubmed else "No PubMed results."
clinvar_text = "\n".join(clinvar) if clinvar else "No ClinVar results."
genbank_text = "Not applicable."
if genbank:
genbank_text = f"ID: {genbank['id']}\nLength: {genbank['length']:,} bp\n{genbank['snippet']}..."
return f"""
# 🧬 PathogenAgent (Lite - Hugging Face)
**Query:** {query}
**Type:** {route}
---
## 📄 PubMed
{pubmed_text}
---
## 🧪 ClinVar
{clinvar_text}
---
## 🧬 GenBank
{genbank_text}
---
Generated by PathogenAgent
"""
def run(query):
if not query.strip():
return "Please enter a query."
return pathogen_agent(query)
demo = gr.Interface(
fn=run,
inputs=gr.Textbox(label="Query", placeholder="e.g., SARS-CoV-2 genome or CFTR F508del"),
outputs=gr.Markdown(),
title="PathogenAgent (Hugging Face)",
description="Agentic AI for Pathogen Genomics"
)
demo.launch()