Source code for tooluniverse.dailymed_tool
# dailymed_tool.py
import requests
from .base_tool import BaseTool
from .tool_registry import register_tool
DAILYMED_BASE = "https://dailymed.nlm.nih.gov/dailymed/services/v2"
[docs]
@register_tool("SearchSPLTool")
class SearchSPLTool(BaseTool):
"""
Search SPL list based on multiple filter conditions (drug_name/ndc/rxcui/setid/published_date).
Returns original DailyMed API JSON (including metadata + data array).
"""
[docs]
def __init__(self, tool_config):
super().__init__(tool_config)
self.endpoint = f"{DAILYMED_BASE}/spls.json"
[docs]
def run(self, arguments):
# Extract possible filter conditions from arguments
params = {}
# Four common filter fields
if arguments.get("drug_name"):
params["drug_name"] = arguments["drug_name"]
if arguments.get("ndc"):
params["ndc"] = arguments["ndc"]
if arguments.get("rxcui"):
params["rxcui"] = arguments["rxcui"]
if arguments.get("setid"):
params["setid"] = arguments["setid"]
# Published date range filter
if arguments.get("published_date_gte"):
params["published_date[gte]"] = arguments["published_date_gte"]
if arguments.get("published_date_eq"):
params["published_date[eq]"] = arguments["published_date_eq"]
# Pagination parameters
params["pagesize"] = arguments.get("pagesize", 100)
params["page"] = arguments.get("page", 1)
# Allow query all if no filter conditions and only pagination provided (be careful with return data volume)
try:
resp = requests.get(self.endpoint, params=params, timeout=10)
except Exception as e:
return {"error": f"Failed to request DailyMed search_spls: {str(e)}"}
if resp.status_code != 200:
return {
"error": f"DailyMed API access failed, HTTP {resp.status_code}",
"detail": resp.text,
}
try:
result = resp.json()
except ValueError:
return {
"error": "Unable to parse DailyMed returned JSON.",
"content": resp.text,
}
# Return original JSON, including metadata + data
return result
[docs]
@register_tool("GetSPLBySetIDTool")
class GetSPLBySetIDTool(BaseTool):
"""
Get complete SPL label based on SPL Set ID, returns content in XML or JSON format.
"""
[docs]
def __init__(self, tool_config):
super().__init__(tool_config)
# Different suffixes for XML and JSON
self.endpoint_template = f"{DAILYMED_BASE}/spls/{{setid}}.{{fmt}}"
[docs]
def run(self, arguments):
setid = arguments.get("setid")
fmt = arguments.get("format", "xml")
# DailyMed single SPL API only supports XML format
if fmt not in ("xml",):
return {
"error": "DailyMed single SPL API only supports 'xml' format, JSON is not supported."
}
url = self.endpoint_template.format(setid=setid, fmt=fmt)
try:
resp = requests.get(url, timeout=10)
except Exception as e:
return {"error": f"Failed to request DailyMed get_spl_by_setid: {str(e)}"}
if resp.status_code == 404:
return {"error": f"SPL label not found for Set ID={setid}."}
elif resp.status_code == 415:
return {
"error": f"DailyMed API does not support requested format. Set ID={setid} only supports XML format."
}
elif resp.status_code != 200:
return {
"error": f"DailyMed API access failed, HTTP {resp.status_code}",
"detail": resp.text,
}
# Return XML content
return {"xml": resp.text}