tooluniverse.screen_tool 源代码

import requests
from typing import Any, Dict
from .base_tool import BaseTool
from .tool_registry import register_tool


[文档] @register_tool("SCREENRESTTool") class SCREENRESTTool(BaseTool):
[文档] def __init__(self, tool_config: Dict): super().__init__(tool_config) self.session = requests.Session() self.session.headers.update({"Accept": "application/json"}) self.timeout = 30
[文档] def run(self, arguments: Dict[str, Any]) -> Dict[str, Any]: try: # Accept 'query' as alias for 'gene_name' if "query" in arguments and "gene_name" not in arguments: arguments = dict(arguments) arguments["gene_name"] = arguments.pop("query") gene_name = arguments.get("gene_name", "") element_type = arguments.get("element_type", "enhancer") limit = int(arguments.get("limit", 10)) if not gene_name: return { "status": "error", "error": "gene_name (or query) is required.", } # Use ENCODE API as SCREEN alternative for regulatory element experiments url = ( f"https://www.encodeproject.org/search/" f"?type=Experiment" f"&target.label={gene_name}" f"&format=json&limit={limit}" ) response = self.session.get(url, timeout=self.timeout) response.raise_for_status() data = response.json() experiments = data.get("@graph", []) results = [ { "accession": e.get("accession", ""), "assay_title": e.get("assay_title", ""), "target": e.get("target", {}).get("label", "") if isinstance(e.get("target"), dict) else "", "biosample": e.get("biosample_ontology", {}).get("term_name", "") if isinstance(e.get("biosample_ontology"), dict) else "", "status": e.get("status", ""), } for e in experiments ] return { "status": "success", "data": { "gene_name": gene_name, "element_type": element_type, "count": len(results), "regulatory_elements": results, }, "metadata": { "source": "ENCODE (SCREEN alternative)", "url": url, }, } except requests.exceptions.HTTPError as e: return {"status": "error", "error": f"SCREEN API HTTP error: {str(e)}"} except Exception as e: return {"status": "error", "error": f"SCREEN API error: {str(e)}"}