File size: 2,823 Bytes
9bee6a4
117cd77
9bee6a4
117cd77
9bee6a4
117cd77
 
9bee6a4
117cd77
 
 
 
 
ef76eaa
117cd77
ef76eaa
117cd77
 
 
ef76eaa
117cd77
 
ef76eaa
117cd77
ef76eaa
117cd77
ef76eaa
117cd77
 
 
 
 
 
ef76eaa
117cd77
 
 
 
 
 
ef76eaa
117cd77
 
 
9bee6a4
117cd77
ef76eaa
117cd77
 
ef76eaa
117cd77
ef76eaa
117cd77
ef76eaa
117cd77
 
 
 
9bee6a4
ef76eaa
117cd77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ef76eaa
117cd77
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
91
92
93
94
95
96
97
98
99
# genesis/api_clients/ncbi_api.py
import os
import requests
from urllib.parse import urlencode

NCBI_API_KEY = os.getenv("NCBI_API_KEY")
NCBI_BASE_URL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/"

if not NCBI_API_KEY:
    raise ValueError("Missing NCBI_API_KEY in environment variables")


def _ncbi_request(endpoint: str, params: dict):
    """
    Generic helper for calling NCBI E-Utilities API.
    """
    params["api_key"] = NCBI_API_KEY
    url = f"{NCBI_BASE_URL}{endpoint}?{urlencode(params)}"
    res = requests.get(url)
    res.raise_for_status()
    return res.text


def search_pubmed(query: str, max_results: int = 10):
    """
    Search PubMed articles via NCBI.
    """
    params = {"db": "pubmed", "term": query, "retmax": max_results, "retmode": "json"}
    res = requests.get(f"{NCBI_BASE_URL}esearch.fcgi", params=params)
    res.raise_for_status()
    ids = res.json().get("esearchresult", {}).get("idlist", [])
    return ids


def fetch_pubmed_details(pubmed_ids: list):
    """
    Fetch PubMed details given a list of IDs.
    """
    if not pubmed_ids:
        return []
    params = {
        "db": "pubmed",
        "id": ",".join(pubmed_ids),
        "retmode": "xml"
    }
    res = requests.get(f"{NCBI_BASE_URL}efetch.fcgi", params=params)
    res.raise_for_status()
    return res.text  # XML response


def search_gene(query: str):
    """
    Search for a gene in NCBI Gene database.
    """
    params = {"db": "gene", "term": query, "retmode": "json", "retmax": 5}
    res = requests.get(f"{NCBI_BASE_URL}esearch.fcgi", params=params)
    res.raise_for_status()
    return res.json()


def fetch_gene_summary(gene_id: str):
    """
    Get detailed gene summary from NCBI.
    """
    params = {"db": "gene", "id": gene_id, "retmode": "json"}
    res = requests.get(f"{NCBI_BASE_URL}esummary.fcgi", params=params)
    res.raise_for_status()
    return res.json()


def search_protein(query: str):
    """
    Search proteins in NCBI Protein database.
    """
    params = {"db": "protein", "term": query, "retmode": "json", "retmax": 5}
    res = requests.get(f"{NCBI_BASE_URL}esearch.fcgi", params=params)
    res.raise_for_status()
    return res.json()


def search_pubchem_compound(query: str):
    """
    Search compounds in PubChem via NCBI.
    """
    params = {"db": "pccompound", "term": query, "retmode": "json", "retmax": 5}
    res = requests.get(f"{NCBI_BASE_URL}esearch.fcgi", params=params)
    res.raise_for_status()
    return res.json()


def search_clinical_trials(query: str):
    """
    Search clinical trials in ClinicalTrials.gov via NCBI.
    """
    params = {"db": "clinicaltrials", "term": query, "retmode": "json", "retmax": 5}
    res = requests.get(f"{NCBI_BASE_URL}esearch.fcgi", params=params)
    res.raise_for_status()
    return res.json()