afg1's picture
deepseek
a92b8b9 verified
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
@tool
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()