Source code for tooluniverse.unpaywall_tool

import requests
from .base_tool import BaseTool
from .tool_registry import register_tool


[docs] @register_tool("UnpaywallTool") class UnpaywallTool(BaseTool): """ Query Unpaywall by DOI to check open-access status and OA locations. Requires a contact email. """
[docs] def __init__(self, tool_config, base_url="https://api.unpaywall.org/v2/"): super().__init__(tool_config) self.base_url = base_url.rstrip("/") + "/"
[docs] def run(self, arguments): doi = arguments.get("doi") email = arguments.get("email") # required by Unpaywall if not doi: return {"error": "`doi` parameter is required."} if not email: return {"error": "`email` parameter is required for Unpaywall."} return self._lookup(doi, email)
[docs] def _lookup(self, doi, email): url = f"{self.base_url}{doi}" params = {"email": email} try: response = requests.get( url, params=params, timeout=20, ) except requests.RequestException as e: return { "error": "Network error calling Unpaywall API", "reason": str(e), } if response.status_code != 200: return { "error": f"Unpaywall API error {response.status_code}", "reason": response.reason, } data = response.json() result = { "is_oa": data.get("is_oa"), "oa_status": data.get("oa_status"), "best_oa_location": data.get("best_oa_location"), "oa_locations": data.get("oa_locations"), "journal_is_oa": data.get("journal_is_oa"), "journal_issn_l": data.get("journal_issn_l"), "journal_issns": data.get("journal_issns"), "doi": data.get("doi"), "title": data.get("title"), "year": data.get("year"), "publisher": data.get("publisher"), "url": data.get("url"), } return result