Source code for tooluniverse.iedb_tool
from typing import Dict, Any, List, Optional
import requests
from .base_tool import BaseTool
from .tool_registry import register_tool
[docs]
@register_tool("IEDBTool")
class IEDBTool(BaseTool):
"""
Tool for interacting with the Immune Epitope Database (IEDB).
"""
QUERY_API_URL = "https://query-api.iedb.org"
[docs]
def run(self, arguments: Dict[str, Any]) -> Dict[str, Any]:
"""
Executes the IEDB tool action.
Args:
arguments (Dict[str, Any]):
- action (str): "search_epitopes"
- query (str, optional): Sequence fragment (e.g., "KVF") to search in linear sequence.
- structure_type (str, optional): "Linear peptide", etc.
- organism (str, optional): Source organism name.
- limit (int, default 10).
Returns:
Dict[str, Any]: Search results.
"""
action = arguments.get("action")
if action == "search_epitopes":
return self.search_epitopes(
query=arguments.get("query"),
structure_type=arguments.get("structure_type"),
organism=arguments.get("organism"),
limit=arguments.get("limit", 10),
)
else:
raise ValueError(f"Unknown action: {action}")
[docs]
def search_epitopes(
self,
query: Optional[str] = None,
structure_type: Optional[str] = None,
organism: Optional[str] = None,
limit: int = 10,
) -> Dict[str, Any]:
"""
Search for epitopes.
"""
url = f"{self.QUERY_API_URL}/epitope_search"
params = {"limit": limit, "order": "structure_id.asc"}
if query:
# Using ilike on linear_sequence as confirmed working
params["linear_sequence"] = f"ilike.*{query}*"
if structure_type:
params["structure_type"] = f"eq.{structure_type}"
try:
response = requests.get(url, params=params, timeout=30)
response.raise_for_status()
data = response.json()
epitopes = []
for item in data:
epitopes.append(
{
"id": item.get("structure_id"),
"type": item.get("structure_type"),
"sequence": item.get("linear_sequence"),
"description": item.get("structure_descriptions"),
"antigens": item.get("curated_source_antigens"),
}
)
return {"count": len(epitopes), "epitopes": epitopes}
except Exception as e:
return {"error": str(e)}