Coverage for open_webui/retrieval/web/serpapi.py: 35%
18 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
1import logging
2from typing import Optional
3from urllib.parse import urlencode
5import requests
6from open_webui.retrieval.web.main import SearchResult, get_filtered_results
8log = logging.getLogger(__name__)
11def search_serpapi(
12 api_key: str,
13 engine: str,
14 query: str,
15 count: int,
16 filter_list: Optional[list[str]] = None,
17) -> list[SearchResult]:
18 """Search using serpapi.com's API and return the results as a list of SearchResult objects.
20 Args:
21 api_key (str): A serpapi.com API key
22 query (str): The query to search for
23 """
24 url = 'https://serpapi.com/search'
26 engine = engine or 'google'
28 payload = {'engine': engine, 'q': query, 'api_key': api_key}
30 url = f'{url}?{urlencode(payload)}'
31 response = requests.request('GET', url)
33 json_response = response.json()
34 log.info('results from serpapi search: %s', json_response)
36 results = sorted(json_response.get('organic_results', []), key=lambda x: x.get('position', 0))
37 if filter_list:
38 results = get_filtered_results(results, filter_list)
39 return [
40 SearchResult(
41 link=result['link'],
42 title=result.get('title'),
43 snippet=result.get('snippet'),
44 )
45 for result in results[:count]
46 ]