import gradio as gr import pandas as pd from langchain_community.utilities import SearxSearchWrapper from utils.helpers import map_results from .base import BaseInterfaceWrapper async def searxng_search( query: str, searxng_host: str, max_results: int = 5 ) -> pd.DataFrame: """ Given a search query, returns the search results from SearxNG. Args: query (str): The search query. searxng_host (str): The SearxNG host URL. searxng_headers (dict): The SearxNG headers for additional metadata and authentication. max_results (int, optional): The number of maximum results to return. Defaults to 5. Returns: dict: The search results from SearxNG Search Engine. Fields: headers (list): The headers of the columns in the search results. Contains "title", "link", "body". data (list): The data in the search results. Each row contains the title, link, and body of the search result. """ searxng = SearxSearchWrapper( searx_host=searxng_host, k=max_results, ) results = await searxng.aresults( query, num_results=max_results, ) mapping = { "title": "title", "link": "link", "snippet": "body", } results = await map_results(results, mapping) return results class SearxNGInterfaceWrapper(BaseInterfaceWrapper): def __init__(self): super().__init__( fn=searxng_search, inputs=[ gr.Textbox(label="Search Query"), gr.Slider( minimum=1, maximum=10, step=1, value=5, label="Number of Results" ), ], title="SearxNG Search", description="Search the web using SearxNG Search Engine.", )