Spaces:
Sleeping
Sleeping
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool, Tool | |
import datetime | |
import requests | |
import pytz | |
import yaml | |
import json | |
from tools.final_answer import FinalAnswerTool | |
from Gradio_UI import GradioUI | |
from smolagents import Tool | |
from epmc_xml import fetch | |
import requests | |
import json | |
class EuropePMCCitationsTool(Tool): | |
name = "europepmc_citation_downloader" | |
description = """ | |
This tool queries the Europe PMC API to retrieve citations for a given PMCID. | |
It returns a list of cited PMCID strings from the citation list. | |
""" | |
inputs = { | |
"pmcid": { | |
"type": "string", | |
"description": "the PMCID to query (e.g., 'PMC7779037')", | |
} | |
} | |
output_type = "array" | |
def forward(self, pmcid: str): | |
url = f"https://www.ebi.ac.uk/europepmc/webservices/rest/PMC/{pmcid}/citations?page=1&pageSize=1000&format=json" | |
headers = { | |
'Content-Type': 'application/json', | |
} | |
response = requests.get(url, headers=headers) | |
if response.status_code != 200: | |
raise Exception(f"Error querying Europe PMC API: {response.status_code}") | |
data = json.loads(response.text) | |
citations = data.get("citationList", {}).get("citation", []) | |
# Extract PMCID strings from citations | |
pmcid_list = [str(citation.get("id", "")) for citation in citations] | |
return pmcid_list | |
class EuropePMCArticleTextTool(Tool): | |
name = "europepmc_fulltext_downloader" | |
description = """ | |
This is a tool that fetches the full text of an article from Europe PMC. | |
It takes a PMCID (format PMC\d+) as input and returns the full text of the article as a string. | |
Articles can only be fetched if they are open access; returns emptty string if article is not open access. | |
""" | |
inputs = { | |
"pmcid": { | |
"type": "string", | |
"description": "the PMCID of the article to fetch (e.g., 'PMC7779037')", | |
} | |
} | |
output_type = "string" | |
def forward(self, pmcid: str): | |
# Fetch the article using epmc_xml | |
try: | |
article = fetch.article(pmcid) | |
# Extract the full text from the article object | |
full_text = article.get_body() | |
except: | |
full_text = ""#f"The article {pmcid} does not appear to be open access." | |
# Return the full text as a string | |
return full_text | |
class PMID2PMCIDConverter(Tool): | |
name = "pmid_2_pmcid_converter" | |
description = """ | |
This tool converts the pmids (all numbers) to pmcids (format PMC\d+). | |
Use this to convert pmids reported by the citation tool to pmcids needed by the fulltext downloader | |
""" | |
inputs = { | |
"pmid": { | |
"type": "string", | |
"description": "the PMID to query (e.g., '36033386')", | |
} | |
} | |
output_type = "string" | |
def forward(self, pmid): | |
url = f"https://www.ncbi.nlm.nih.gov/pmc/utils/idconv/v1.0?ids={pmid}&versions=no&format=json" | |
headers = { | |
'Content-Type': 'application/json', | |
} | |
response = requests.get(url, headers=headers) | |
if response.status_code != 200: | |
raise Exception(f"Error querying NCBI API: {response.status_code}") | |
data = json.loads(response.text) | |
pmcid = data.get("records", {})[0].get("pmcid", []) | |
return pmcid | |
def get_current_time_in_timezone(timezone: str) -> str: | |
"""A tool that fetches the current local time in a specified timezone. | |
Args: | |
timezone: A string representing a valid timezone (e.g., 'America/New_York'). | |
""" | |
try: | |
# Create timezone object | |
tz = pytz.timezone(timezone) | |
# Get current time in that timezone | |
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S") | |
return f"The current local time in {timezone} is: {local_time}" | |
except Exception as e: | |
return f"Error fetching time for timezone '{timezone}': {str(e)}" | |
final_answer = FinalAnswerTool() | |
citationtool = EuropePMCCitationsTool() | |
fulltexttool = EuropePMCArticleTextTool() | |
convert_id_tool = PMID2PMCIDConverter() | |
# If the agent does not answer, the model is overloaded, please use another model or the following Hugging Face Endpoint that also contains qwen2.5 coder: | |
# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud' | |
model = HfApiModel( | |
max_tokens=2096, | |
temperature=0.5, | |
model_id='deepseek-ai/DeepSeek-R1-Distill-Qwen-32B',# it is possible that this model may be overloaded | |
custom_role_conversions=None, | |
) | |
# Import tool from Hub | |
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True) | |
with open("prompts.yaml", 'r') as stream: | |
prompt_templates = yaml.safe_load(stream) | |
agent = CodeAgent( | |
model=model, | |
tools=[final_answer, citationtool, fulltexttool, convert_id_tool], ## add your tools here (don't remove final answer) | |
max_steps=6, | |
verbosity_level=1, | |
grammar=None, | |
planning_interval=None, | |
name=None, | |
description=None, | |
prompt_templates=prompt_templates | |
) | |
GradioUI(agent).launch() |