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_serpstack( api_key: str, query: str, count: int, filter_list: list[str | None] | None = None, https_enabled: bool = True, ) -> list[SearchResult]: """Query the serpstack.com API and return normalised results. Uses HTTPS by default; set ``https_enabled=False`` for free-tier HTTP access. """ scheme = 'https' if https_enabled else 'http' url = f'{scheme}://api.serpstack.com/search' params = {'access_key': api_key, 'query': query} session = await get_session() async with session.get(url, params=params) as response: response.raise_for_status() payload = await response.json() organic = sorted(payload.get('organic_results', []), key=lambda x: x.get('position', 0)) if filter_list: organic = get_filtered_results(organic, filter_list) return [ SearchResult( link=item.get('url', ''), title=item.get('title'), snippet=item.get('snippet'), ) for item in organic[:count] ]