from crewai.tools import BaseTool from typing import Literal import requests class URLValidatorTool(BaseTool): name: Literal["url_validator"] description : str = "Validate whether a given URL is reachable and returns a valid HTTP status." def _run(self, url: str) -> dict: """Synchronous tool execution""" try: response = requests.head(url, allow_redirects=True, timeout=15) return { "url": url, "status_code": response.status_code, "ok": response.status_code < 400 } except Exception as e: return { "url": url, "status_code": None, "ok": False, "error": str(e) } async def _arun(self, url: str) -> dict: """Asynchronous tool execution (not used but required)""" return self._run(url)