mirror of
https://github.com/open-webui/open-webui.git
synced 2026-10-11 03:38:02 +00:00
With Kagi as the web search engine, any entry in the Domain Filter List made every search fail with "'SearchResult' object has no attribute 'get'", so the model got no search results. The Domain Filter List now works with Kagi the same way it does with the other search engines, and the remaining results reach the model. Fixes #32004
40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
import logging
|
|
from typing import Optional
|
|
|
|
import requests
|
|
from open_webui.retrieval.web.main import SearchResult, get_filtered_results
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
def search_kagi(api_key: str, query: str, count: int, filter_list: Optional[list[str]] = None) -> list[SearchResult]:
|
|
"""Search using Kagi's Search API and return the results as a list of SearchResult objects.
|
|
|
|
The Search API will inherit the settings in your account, including results personalization and snippet length.
|
|
|
|
Args:
|
|
api_key (str): A Kagi Search API key
|
|
query (str): The query to search for
|
|
count (int): The number of results to return
|
|
"""
|
|
url = 'https://kagi.com/api/v1/search'
|
|
headers = {
|
|
'Authorization': f'Bearer {api_key}',
|
|
}
|
|
params = {'query': query, 'limit': count}
|
|
|
|
response = requests.post(url, headers=headers, json=params)
|
|
response.raise_for_status()
|
|
json_response = response.json()
|
|
search_results = json_response.get('data', {}).get('search', [])
|
|
if filter_list:
|
|
search_results = get_filtered_results(search_results, filter_list)
|
|
|
|
results = [
|
|
SearchResult(link=result['url'], title=result['title'], snippet=result.get('snippet'))
|
|
for result in search_results
|
|
]
|
|
|
|
print(results)
|
|
|
|
return results
|