aitxchallenge / src /tools /fda.py
Minoch's picture
AI-Tx Challenge Phase 1 submission
56a6725
Raw
History Blame Contribute Delete
2.31 kB
import httpx
import time
BASE = "https://api.fda.gov/drug/label.json"
async def query_fda_labels(drug_name: str = "", gene: str = "") -> list[dict]:
"""Search FDA drug labels for drug name or gene mentions."""
search_term = drug_name if drug_name else gene
params = {
"search": f'indications_and_usage:"{search_term}"',
"limit": 3,
}
async with httpx.AsyncClient(timeout=15) as client:
r = await client.get(BASE, params=params)
if r.status_code != 200:
return []
results_raw = r.json().get("results", [])
return _parse_labels(results_raw)
async def query_fda_by_drugs(drug_names: list[str]) -> list[dict]:
"""Search FDA labels for specific drug names.
Useful when the question mentions specific drug options.
"""
all_results = []
async with httpx.AsyncClient(timeout=15) as client:
for name in drug_names[:5]:
params = {
"search": f'openfda.generic_name:"{name}" OR openfda.brand_name:"{name}"',
"limit": 1,
}
r = await client.get(BASE, params=params)
if r.status_code == 200:
results_raw = r.json().get("results", [])
all_results.extend(_parse_labels(results_raw))
return all_results
def _parse_labels(results_raw: list[dict]) -> list[dict]:
"""Parse FDA label API results into evidence dicts."""
results = []
for item in results_raw:
brand = item.get("openfda", {}).get("brand_name", [""])[0]
generic = item.get("openfda", {}).get("generic_name", [""])[0]
indication = item.get("indications_and_usage", [""])[0][:400]
app_no = item.get("openfda", {}).get("application_number", [""])[0]
url = (
f"https://www.accessdata.fda.gov/scripts/cder/daf/index.cfm"
f"?event=overview.process&ApplNo={app_no}"
if app_no
else "https://www.accessdata.fda.gov"
)
name_str = f"{brand} ({generic})" if generic else brand
results.append(
{
"url": url,
"snippet": f"{name_str}: {indication}",
"date_retrieved": int(time.time()),
"source_name": "FDA",
}
)
return results