# genesis/api_clients/umls_api.py import os import requests UMLS_API_KEY = os.getenv("UMLS_API_KEY") UMLS_AUTH_URL = "https://utslogin.nlm.nih.gov" UMLS_API_URL = "https://uts-ws.nlm.nih.gov/rest" if not UMLS_API_KEY: raise ValueError("Missing UMLS_API_KEY in environment variables") def get_tgt(): """ Get a Ticket Granting Ticket (TGT) for UMLS authentication. """ url = f"{UMLS_AUTH_URL}/cas/v1/api-key" params = {"apikey": UMLS_API_KEY} res = requests.post(url, data=params) res.raise_for_status() # Extract TGT URL from HTML form action return res.text.split('action="')[1].split('"')[0] def get_service_ticket(tgt): """ Get a Service Ticket (ST) using TGT. """ params = {"service": "http://umlsks.nlm.nih.gov"} res = requests.post(tgt, data=params) res.raise_for_status() return res.text def search_umls(query: str, page: int = 1, page_size: int = 10): """ Search for a term in UMLS. """ tgt = get_tgt() ticket = get_service_ticket(tgt) url = f"{UMLS_API_URL}/search/current" params = { "string": query, "ticket": ticket, "pageNumber": page, "pageSize": page_size } res = requests.get(url, params=params) res.raise_for_status() return res.json().get("result", {}).get("results", []) def get_cui_details(cui: str): """ Get detailed info for a CUI (Concept Unique Identifier). """ tgt = get_tgt() ticket = get_service_ticket(tgt) url = f"{UMLS_API_URL}/content/current/CUI/{cui}" params = {"ticket": ticket} res = requests.get(url, params=params) res.raise_for_status() return res.json() def map_to_umls(term: str): """ Given a term, return the matching UMLS CUI(s) and definitions. """ matches = search_umls(term) return [ { "name": m.get("name"), "cui": m.get("ui"), "rootSource": m.get("rootSource") } for m in matches if m.get("ui") != "NONE" ]