Spaces:
Sleeping
Sleeping
File size: 2,662 Bytes
1c6cb4b 7b3f817 cdc75a8 ae6d61e 1c6cb4b ae6d61e 98d71a3 1087a21 ae6d61e 98d71a3 1087a21 ae6d61e 1087a21 ae6d61e cdc75a8 ae6d61e a9daa10 ae6d61e a9daa10 ae6d61e a9daa10 ae6d61e cdc75a8 1c6cb4b ae6d61e 1087a21 ae6d61e 1087a21 cdc75a8 ae6d61e 98d71a3 cdc75a8 ae6d61e 98d71a3 ae6d61e 98d71a3 ae6d61e a9daa10 ae6d61e a9daa10 cdc75a8 ae6d61e cdc75a8 ae6d61e 7b3f817 ae6d61e 7b3f817 ae6d61e 7b3f817 98d71a3 ae6d61e 98d71a3 ae6d61e cdc75a8 ae6d61e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# genesis/api_clients/umls_api.py
import os
import requests
from typing import List, Dict, Optional
UMLS_API_KEY = os.getenv("UMLS_API_KEY") # Set in Hugging Face secrets or .env
UMLS_AUTH_ENDPOINT = "https://utslogin.nlm.nih.gov/cas/v1/api-key"
UMLS_BASE = "https://uts-ws.nlm.nih.gov/rest"
# -------------------------
# AUTHENTICATION
# -------------------------
def get_tgt() -> str:
"""
Get Ticket Granting Ticket (TGT) from UMLS API key.
"""
params = {"apikey": UMLS_API_KEY}
r = requests.post(UMLS_AUTH_ENDPOINT, data=params)
r.raise_for_status()
# Extract TGT from HTML form action
tgt_url = r.text.split('action="')[1].split('"')[0]
return tgt_url
def get_service_ticket(tgt_url: str) -> str:
"""
Get a one-time Service Ticket (ST) for API calls.
"""
params = {"service": "http://umlsks.nlm.nih.gov"}
r = requests.post(tgt_url, data=params)
r.raise_for_status()
return r.text
# -------------------------
# SEARCH FUNCTIONS
# -------------------------
def search_umls(term: str, max_results: int = 10) -> List[Dict]:
"""
Search UMLS for a medical concept by term and return CUIs, preferred names, and semantic types.
"""
tgt = get_tgt()
st = get_service_ticket(tgt)
params = {
"string": term,
"ticket": st,
"pageSize": max_results
}
r = requests.get(f"{UMLS_BASE}/search/current", params=params)
r.raise_for_status()
data = r.json()
results = []
for item in data.get("result", {}).get("results", []):
results.append({
"ui": item.get("ui"), # CUI
"name": item.get("name"),
"rootSource": item.get("rootSource")
})
return results
def get_cui_details(cui: str) -> Dict:
"""
Retrieve details for a specific CUI.
"""
tgt = get_tgt()
st = get_service_ticket(tgt)
params = {"ticket": st}
r = requests.get(f"{UMLS_BASE}/content/current/CUI/{cui}", params=params)
r.raise_for_status()
return r.json()
def get_cui_relations(cui: str) -> List[Dict]:
"""
Get relationships for a CUI (e.g., associated diseases, drugs, symptoms).
"""
tgt = get_tgt()
st = get_service_ticket(tgt)
params = {"ticket": st}
r = requests.get(f"{UMLS_BASE}/content/current/CUI/{cui}/relations", params=params)
r.raise_for_status()
data = r.json()
relations = []
for rel in data.get("result", []):
relations.append({
"relationLabel": rel.get("relationLabel"),
"relatedId": rel.get("relatedId"),
"relatedName": rel.get("relatedIdName")
})
return relations
|