from __future__ import annotations import logging from open_webui.retrieval.web.main import SearchResult, get_filtered_results from open_webui.utils.session_pool import get_session log = logging.getLogger(__name__) async def search_openserp( base_url: str, query: str, count: int, filter_list: list[str | None] | None = None, ) -> list[SearchResult]: """Query an OpenSERP instance and return normalised results. OpenSERP aggregates results from 6 engines (google, bing, yandex, baidu, duckduckgo, ecosia) at once via ``/mega/search``. No API key is required -- only a reachable OpenSERP base URL. """ url = f"{base_url.rstrip('/')}/mega/search" params = {"text": query, "limit": count} log.debug("searching OpenSERP at %s", url) session = await get_session() async with session.get(url, params=params) as response: response.raise_for_status() payload = await response.json() results = payload.get("results", []) if filter_list: results = get_filtered_results(results, filter_list) return [ SearchResult( link=item.get("url", ""), title=item.get("title"), snippet=item.get("snippet"), ) for item in results[:count] ]