Coverage for open_webui/retrieval/web/openserp.py: 32%
17 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 05:07 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 05:07 +0000
1from __future__ import annotations
3import logging
5from open_webui.retrieval.web.main import SearchResult, get_filtered_results
6from open_webui.utils.session_pool import get_session
8log = logging.getLogger(__name__)
11async def search_openserp(
12 base_url: str,
13 query: str,
14 count: int,
15 filter_list: list[str] | None = None,
16) -> list[SearchResult]:
17 """Query an OpenSERP instance and return normalised results.
19 OpenSERP aggregates results from 6 engines (google, bing, yandex,
20 baidu, duckduckgo, ecosia) at once via ``/mega/search``.
22 No API key is required -- only a reachable OpenSERP base URL.
23 """
24 url = f'{base_url.rstrip("/")}/mega/search'
25 params = {'text': query, 'limit': count}
27 log.debug('searching OpenSERP at %s', url)
29 session = await get_session()
30 async with session.get(url, params=params) as response:
31 response.raise_for_status()
32 payload = await response.json()
34 results = payload.get('results', [])
35 if filter_list:
36 results = get_filtered_results(results, filter_list)
38 return [
39 SearchResult(
40 link=item.get('url', ''),
41 title=item.get('title'),
42 snippet=item.get('snippet'),
43 )
44 for item in results[:count]
45 ]