open-webui/backend/open_webui/retrieval/web/kagi.py
Classic298 e0b0edfeb0
fix: Kagi web search fails on every search when a domain filter list is set (#32183)
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
2026-10-10 19:55:00 +04:00

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