Spaces:
Build error
Build error
| import logging | |
| from typing import Optional | |
| from open_webui.retrieval.web.main import SearchResult, get_filtered_results | |
| log = logging.getLogger(__name__) | |
| """ | |
| Azure AI Search integration for Open WebUI. | |
| Documentation: https://learn.microsoft.com/en-us/python/api/overview/azure/search-documents-readme?view=azure-python | |
| Required package: azure-search-documents | |
| Install: pip install azure-search-documents | |
| """ | |
| def search_azure( | |
| api_key: str, | |
| endpoint: str, | |
| index_name: str, | |
| query: str, | |
| count: int, | |
| filter_list: Optional[list[str]] = None, | |
| ) -> list[SearchResult]: | |
| """ | |
| Search using Azure AI Search. | |
| Args: | |
| api_key: Azure Search API key (query key or admin key) | |
| endpoint: Azure Search service endpoint (e.g., https://myservice.search.windows.net) | |
| index_name: Name of the search index to query | |
| query: Search query string | |
| count: Number of results to return | |
| filter_list: Optional list of domains to filter results | |
| Returns: | |
| List of SearchResult objects with link, title, and snippet | |
| """ | |
| try: | |
| from azure.core.credentials import AzureKeyCredential | |
| from azure.search.documents import SearchClient | |
| except ImportError: | |
| log.error( | |
| "azure-search-documents package is not installed. " | |
| "Install it with: pip install azure-search-documents" | |
| ) | |
| raise ImportError( | |
| "azure-search-documents is required for Azure AI Search. " | |
| "Install it with: pip install azure-search-documents" | |
| ) | |
| try: | |
| # Create search client with API key authentication | |
| credential = AzureKeyCredential(api_key) | |
| search_client = SearchClient( | |
| endpoint=endpoint, index_name=index_name, credential=credential | |
| ) | |
| # Perform the search | |
| results = search_client.search(search_text=query, top=count) | |
| # Convert results to list and extract fields | |
| search_results = [] | |
| for result in results: | |
| # Azure AI Search returns documents with custom schemas | |
| # We need to extract common fields that might represent URL, title, and content | |
| # Common field names to look for: | |
| result_dict = dict(result) | |
| # Try to find URL field (common names) | |
| link = ( | |
| result_dict.get("url") | |
| or result_dict.get("link") | |
| or result_dict.get("uri") | |
| or result_dict.get("metadata_storage_path") | |
| or "" | |
| ) | |
| # Try to find title field (common names) | |
| title = ( | |
| result_dict.get("title") | |
| or result_dict.get("name") | |
| or result_dict.get("metadata_title") | |
| or result_dict.get("metadata_storage_name") | |
| or None | |
| ) | |
| # Try to find content/snippet field (common names) | |
| snippet = ( | |
| result_dict.get("content") | |
| or result_dict.get("snippet") | |
| or result_dict.get("description") | |
| or result_dict.get("summary") | |
| or result_dict.get("text") | |
| or None | |
| ) | |
| # Truncate snippet if too long | |
| if snippet and len(snippet) > 500: | |
| snippet = snippet[:497] + "..." | |
| if link: # Only add if we found a valid link | |
| search_results.append( | |
| { | |
| "link": link, | |
| "title": title, | |
| "snippet": snippet, | |
| } | |
| ) | |
| # Apply domain filtering if specified | |
| if filter_list: | |
| search_results = get_filtered_results(search_results, filter_list) | |
| # Convert to SearchResult objects | |
| return [ | |
| SearchResult( | |
| link=result["link"], | |
| title=result.get("title"), | |
| snippet=result.get("snippet"), | |
| ) | |
| for result in search_results | |
| ] | |
| except Exception as ex: | |
| log.error(f"Azure AI Search error: {ex}") | |
| raise ex | |