Source code for tooluniverse.semantic_scholar_tool
import requests
from .base_tool import BaseTool
from .tool_registry import register_tool
[docs]
@register_tool("SemanticScholarTool")
class SemanticScholarTool(BaseTool):
"""
Tool to search for papers on Semantic Scholar including abstracts.
"""
[docs]
def __init__(
self,
tool_config,
base_url="https://api.semanticscholar.org/graph/v1/paper/search",
):
super().__init__(tool_config)
self.base_url = base_url
[docs]
def run(self, arguments):
query = arguments.get("query")
limit = arguments.get("limit", 5)
api_key = arguments.get("api_key")
if not query:
return {"error": "`query` parameter is required."}
return self._search(query, limit, api_key)
[docs]
def _search(self, query, limit, api_key):
params = {
"query": query,
"limit": limit,
"fields": "title,abstract,year,venue,url",
}
headers = {"x-api-key": api_key} if api_key else {}
response = requests.get(
self.base_url, params=params, headers=headers, timeout=20
)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", "2"))
import time
time.sleep(retry_after)
response = requests.get(
self.base_url, params=params, headers=headers, timeout=20
)
if response.status_code != 200:
return {
"error": f"Semantic Scholar API error {response.status_code}",
"reason": response.reason,
}
results = response.json().get("data", [])
papers = [
{
"title": p.get("title"),
"abstract": p.get("abstract"),
"journal": p.get("venue"),
"year": p.get("year"),
"url": p.get("url"),
}
for p in results
]
return papers