Skip to content

Search Tools

enhancedtoolkits.searxng.SearxngTools

SearxngTools(host: str, max_results: Optional[int] = 20, timeout: int = 30, enable_content_fetching: Optional[bool] = False, enable_file_downloads: Optional[bool] = True, max_file_size_mb: int = 10, file_download_timeout: int = 60, byparr_enabled: Optional[bool] = True, add_instructions: bool = True, **kwargs)

Bases: StrictToolkit

Enhanced SearxNG Tools v2.0

A production-ready search toolkit with optional content fetching, robust error handling, and comprehensive search capabilities.

Parameters:

Name Type Description Default
host str

SearxNG instance URL

required
max_results Optional[int]

Maximum number of search results to return

20
timeout int

Request timeout in seconds

30
enable_content_fetching Optional[bool]

Whether to fetch full content from URLs

False
enable_file_downloads Optional[bool]

Whether to download and process files (PDF, TXT, MD)

True
max_file_size_mb int

Maximum file size to download in MB

10
file_download_timeout int

Timeout for file downloads in seconds

60
byparr_enabled Optional[bool]

Override for Byparr usage (None = auto-detect)

True
Source code in src/enhancedtoolkits/searxng.py
def __init__(  # pylint: disable=too-many-arguments,too-many-positional-arguments
    self,
    host: str,
    max_results: Optional[int] = 20,
    timeout: int = 30,
    enable_content_fetching: Optional[bool] = False,
    enable_file_downloads: Optional[bool] = True,
    max_file_size_mb: int = 10,
    file_download_timeout: int = 60,
    byparr_enabled: Optional[bool] = True,
    add_instructions: bool = True,
    **kwargs,
):
    """
    Initialize Enhanced SearxNG Tools.

    Args:
        host: SearxNG instance URL
        max_results: Maximum number of search results to return
        timeout: Request timeout in seconds
        enable_content_fetching: Whether to fetch full content from URLs
        enable_file_downloads: Whether to download and process files (PDF, TXT, MD)
        max_file_size_mb: Maximum file size to download in MB
        file_download_timeout: Timeout for file downloads in seconds
        byparr_enabled: Override for Byparr usage (None = auto-detect)
    """
    if not host:
        raise ValueError("Invalid SearxNG host URL")

    # Configuration
    self.host = self._validate_host(host)
    self.max_results = max(
        1, min(30, max_results or 20)
    )  # Limit between 1-30
    self.timeout = max(5, min(120, timeout))  # Limit between 5-120 seconds
    self.enable_content_fetching = enable_content_fetching
    self.enable_file_downloads = enable_file_downloads
    self.supported_file_types = ["pdf", "txt", "md"]
    self.max_file_size_mb = max(
        1, min(500, max_file_size_mb)
    )  # Limit between 1-500 MB
    self.file_download_timeout = max(
        10, min(300, file_download_timeout)
    )  # 10-300 seconds
    self.add_instructions = add_instructions
    self.instructions = SearxngTools.get_llm_usage_instructions()

    super().__init__(name="enhanced_searxng_tools", **kwargs)

    # Byparr configuration (optional)
    if byparr_enabled is not None:
        self.byparr_enabled = byparr_enabled
    else:
        self.byparr_enabled = (
            BYPARR_ENABLED and self.enable_content_fetching
        )

    # HTTP client configuration
    self.client = httpx.Client(
        timeout=httpx.Timeout(self.timeout),
        follow_redirects=True,
        headers={
            "User-Agent": "Enhanced-SearxNG-Tools/2.0 (Python/httpx)"
        },
    )

    # File download client configuration (separate timeout)
    if self.enable_file_downloads:
        self.file_client = httpx.Client(
            timeout=httpx.Timeout(self.file_download_timeout),
            follow_redirects=True,
            headers=self._get_file_download_headers(),
        )
    else:
        self.file_client = None

    # Register search methods
    self.register(self.perform_web_search)
    self.register(self.perform_news_search)
    self.register(self.perform_image_search)
    self.register(self.perform_video_search)
    self.register(self.perform_category_search)

    log_info(
        "Enhanced SearxNG Tools initialized - "
        f"Host: {self.host}, Max Results: {self.max_results}, "
        f"Content Fetching: {self.enable_content_fetching}, "
        f"File Downloads: {self.enable_file_downloads}, "
        f"Supported Files: {self.supported_file_types}, "
        f"Byparr: {self.byparr_enabled}"
    )

Functions

perform_web_search(query: str, max_results: Optional[int] = None) -> str

Perform a web search using SearxNG.

Parameters:

Name Type Description Default
query str

Search query string

required
max_results Optional[int]

Maximum number of results (overrides default)

None

Returns:

Type Description
str

JSON string containing search results

Raises:

Type Description
SearxngSearchError

If search fails

Source code in src/enhancedtoolkits/searxng.py
def perform_web_search(
    self, query: str, max_results: Optional[int] = None
) -> str:
    """
    Perform a web search using SearxNG.

    Args:
        query: Search query string
        max_results: Maximum number of results (overrides default)

    Returns:
        JSON string containing search results

    Raises:
        SearxngSearchError: If search fails
    """
    return self._search(query, category="general", max_results=max_results)
perform_news_search(query: str, max_results: Optional[int] = None) -> str

Perform a news search using SearxNG.

Parameters:

Name Type Description Default
query str

Search query string

required
max_results Optional[int]

Maximum number of results (overrides default)

None

Returns:

Type Description
str

JSON string containing news search results

Raises:

Type Description
SearxngSearchError

If search fails

Source code in src/enhancedtoolkits/searxng.py
def perform_news_search(
    self, query: str, max_results: Optional[int] = None
) -> str:
    """
    Perform a news search using SearxNG.

    Args:
        query: Search query string
        max_results: Maximum number of results (overrides default)

    Returns:
        JSON string containing news search results

    Raises:
        SearxngSearchError: If search fails
    """
    return self._search(query, category="news", max_results=max_results)
perform_image_search(query: str, max_results: Optional[int] = None) -> str

Perform an image search using SearxNG.

Parameters:

Name Type Description Default
query str

Search query string

required
max_results Optional[int]

Maximum number of results (overrides default)

None

Returns:

Type Description
str

JSON string containing image search results

Raises:

Type Description
SearxngSearchError

If search fails

Source code in src/enhancedtoolkits/searxng.py
def perform_image_search(
    self, query: str, max_results: Optional[int] = None
) -> str:
    """
    Perform an image search using SearxNG.

    Args:
        query: Search query string
        max_results: Maximum number of results (overrides default)

    Returns:
        JSON string containing image search results

    Raises:
        SearxngSearchError: If search fails
    """
    return self._search(query, category="images", max_results=max_results)
perform_video_search(query: str, max_results: Optional[int] = None) -> str

Perform a video search using SearxNG.

Parameters:

Name Type Description Default
query str

Search query string

required
max_results Optional[int]

Maximum number of results (overrides default)

None

Returns:

Type Description
str

JSON string containing video search results

Raises:

Type Description
SearxngSearchError

If search fails

Source code in src/enhancedtoolkits/searxng.py
def perform_video_search(
    self, query: str, max_results: Optional[int] = None
) -> str:
    """
    Perform a video search using SearxNG.

    Args:
        query: Search query string
        max_results: Maximum number of results (overrides default)

    Returns:
        JSON string containing video search results

    Raises:
        SearxngSearchError: If search fails
    """
    return self._search(query, category="videos", max_results=max_results)
perform_category_search(query: str, category: str, max_results: Optional[int] = None) -> str

Perform a search in a specific category using SearxNG.

Parameters:

Name Type Description Default
query str

Search query string

required
category str

Search category (general, news, images, videos, etc.)

required
max_results Optional[int]

Maximum number of results (overrides default)

None

Returns:

Type Description
str

JSON string containing search results

Raises:

Type Description
SearxngSearchError

If search fails or category is invalid

Source code in src/enhancedtoolkits/searxng.py
def perform_category_search(
    self, query: str, category: str, max_results: Optional[int] = None
) -> str:
    """
    Perform a search in a specific category using SearxNG.

    Args:
        query: Search query string
        category: Search category (general, news, images, videos, etc.)
        max_results: Maximum number of results (overrides default)

    Returns:
        JSON string containing search results

    Raises:
        SearxngSearchError: If search fails or category is invalid
    """
    if category not in self.SUPPORTED_CATEGORIES:
        available_categories = ", ".join(self.SUPPORTED_CATEGORIES.keys())
        raise SearxngSearchError(
            f"Unsupported category '{category}'. Available categories: {available_categories}"
        )

    return self._search(query, category=category, max_results=max_results)

get_llm_usage_instructions staticmethod

get_llm_usage_instructions() -> str

Return precise, structured instructions for LLM tool calling.

Source code in src/enhancedtoolkits/searxng.py
    @staticmethod
    def get_llm_usage_instructions() -> str:
        """Return precise, structured instructions for LLM tool calling."""
        instructions = """
<internet_search_tools_instructions>
Web search via SearxNG (ranked results; optional limited content fetch)

GOAL
- Search the web via SearxNG and return ranked results as JSON.

OUTPUT
- Always returns a JSON string encoding a list of results.
- Each result includes: title, url, summary, category.
- Optional fields by category:
  - images: thumbnail/img_src/width/height
  - videos: thumbnail/duration/publishedDate
  - news: publishedDate/source
  - files: file_type/content_type
  - content: only if enable_content_fetching=True

TOOLS
- perform_web_search(query, max_results=None)
- perform_news_search(query, max_results=None)
- perform_image_search(query, max_results=None)
- perform_video_search(query, max_results=None)
- perform_category_search(query, category, max_results=None)
  categories: general|news|images|videos|music|files|science|social

LIMITS / CONTEXT-SIZE RULES (IMPORTANT)
- query is trimmed and truncated to 500 chars.
- Keep max_results small (5–10) unless the user asks; internal clamping applies.
- Content fetching is OFF by default and expensive/large:
  - enabled only for general/news/files
  - fetches at most the first 3 results
- Do NOT paste large raw page/PDF content into the final answer; summarize.

ERRORS
- SearxngSearchError: invalid category / request failures
- SearxngContentError, FileDownloadError: content fetching or file processing

</internet_search_tools_instructions>
"""
        return instructions