mirror of
https://github.com/open-webui/open-webui.git
synced 2026-11-15 18:55:07 +03:00
8d7b71f6cc
The external reranker, Exa and Ollama web search wrote the full user query to the server log at info level, and reusing generated search queries logged them as well. Those lines no longer include the query. A failing external reranker also logged the provider URL in its error message along with a stack trace; it now logs only the error type. Co-authored-by: manooll <16244686+manooll@users.noreply.github.com>
57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
import logging
|
|
|
|
import requests
|
|
from open_webui.retrieval.web.main import SearchResult
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
EXA_API_BASE = 'https://api.exa.ai'
|
|
|
|
|
|
def search_exa(
|
|
api_key: str,
|
|
query: str,
|
|
count: int,
|
|
filter_list: list[str] | None = None,
|
|
max_content_length: int | None = None,
|
|
) -> list[SearchResult]:
|
|
"""Search using Exa Search API and return the results as a list of SearchResult objects.
|
|
|
|
Args:
|
|
api_key (str): A Exa Search API key
|
|
query (str): The query to search for
|
|
count (int): Number of results to return
|
|
filter_list (list[str] | None): List of domains to filter results by
|
|
max_content_length (int | None): Maximum characters per result; None leaves text unlimited.
|
|
"""
|
|
log.info('Searching with Exa')
|
|
|
|
headers = {'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json'}
|
|
|
|
payload = {
|
|
'query': query,
|
|
'numResults': count or 5,
|
|
'includeDomains': filter_list,
|
|
'contents': {'text': {'maxCharacters': max_content_length} if max_content_length is not None else True},
|
|
'type': 'auto', # Use the auto search type (keyword or neural)
|
|
}
|
|
|
|
try:
|
|
response = requests.post(f'{EXA_API_BASE}/search', headers=headers, json=payload)
|
|
response.raise_for_status()
|
|
data = response.json()
|
|
|
|
results = data['results']
|
|
log.info('Found %s results', len(results))
|
|
return [
|
|
SearchResult(
|
|
link=result['url'],
|
|
title=result['title'],
|
|
snippet=(result.get('text') or '')[:max_content_length],
|
|
)
|
|
for result in results
|
|
]
|
|
except Exception as e:
|
|
log.error(f'Error searching Exa: {e}')
|
|
return []
|