| |
| import os, httpx |
| from functools import lru_cache |
|
|
| UMLS_API_KEY = os.getenv("UMLS_KEY") |
| AUTH_URL = "https://utslogin.nlm.nih.gov/cas/v1/api-key" |
| SEARCH_URL = "https://uts-ws.nlm.nih.gov/rest/search/current" |
| CONTENT_URL = "https://uts-ws.nlm.nih.gov/rest/content/current/CUI/{cui}" |
|
|
| async def _get_ticket() -> str: |
| async with httpx.AsyncClient(timeout=10) as c: |
| r1 = await c.post(AUTH_URL, data={"apikey": UMLS_API_KEY}) |
| r1.raise_for_status() |
| tgt = r1.text.split('action="')[1].split('"')[0] |
| r2 = await c.post(tgt, data={"service": "http://umlsks.nlm.nih.gov"}) |
| r2.raise_for_status() |
| return r2.text |
|
|
| @lru_cache(maxsize=512) |
| async def lookup_umls(term: str) -> dict: |
| ticket = await _get_ticket() |
| params = {"string": term, "ticket": ticket, "pageSize": 1} |
| async with httpx.AsyncClient(timeout=10) as c: |
| r = await c.get(SEARCH_URL, params=params) |
| r.raise_for_status() |
| items = r.json().get("result", {}).get("results", []) |
| if not items: |
| return {"term": term} |
| itm = items[0] |
| cui, name = itm.get("ui"), itm.get("name") |
| r2 = await c.get(CONTENT_URL.format(cui=cui), params={"ticket": ticket}) |
| r2.raise_for_status() |
| entry = r2.json().get("result", {}) |
| types = [t["name"] for t in entry.get("semanticTypes", [])] |
| definition = entry.get("definitions", [{}])[0].get("value", "") |
| return { |
| "term": term, |
| "cui": cui, |
| "name": name, |
| "definition": definition, |
| "types": types |
| } |
|
|