Source code for tooluniverse.osf_preprints_tool
import requests
from .base_tool import BaseTool
from .tool_registry import register_tool
[docs]
@register_tool("OSFPreprintsTool")
class OSFPreprintsTool(BaseTool):
"""
Search OSF Preprints via OSF API v2 filters.
Parameters (arguments):
query (str): Query string
max_results (int): Max results (default 10, max 100)
provider (str): Optional preprint provider (e.g., 'osf', 'psyarxiv')
"""
[docs]
def __init__(self, tool_config):
super().__init__(tool_config)
self.base_url = "https://api.osf.io/v2/preprints/"
[docs]
def run(self, arguments=None):
arguments = arguments or {}
query = arguments.get("query")
max_results = int(arguments.get("max_results", 10))
provider = arguments.get("provider")
if not query:
return {"error": "`query` parameter is required."}
params = {
"page[size]": max(1, min(max_results, 100)),
"filter[title]": query,
}
if provider:
params["filter[provider]"] = provider
try:
resp = requests.get(self.base_url, params=params, timeout=20)
resp.raise_for_status()
data = resp.json()
except requests.RequestException as e:
return {"error": "Network/API error calling OSF", "reason": str(e)}
except ValueError:
return {"error": "Failed to decode OSF response as JSON"}
results = []
for item in data.get("data", []):
attrs = item.get("attributes", {})
title = attrs.get("title")
date_published = attrs.get("date_published")
is_published = attrs.get("is_published")
doi = attrs.get("doi")
links_obj = item.get("links", {})
url = links_obj.get("html") or links_obj.get("self")
results.append(
{
"title": title,
"date_published": date_published,
"published": is_published,
"doi": doi,
"url": url,
"source": "OSF Preprints",
}
)
return results