diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 19e55db64e..3c21a828fd 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1345,8 +1345,7 @@ USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING = ( USER_PERMISSIONS_NOTES_ALLOW_SHARING = ( - os.environ.get("USER_PERMISSIONS_NOTES_ALLOW_SHARING", "False").lower() - == "true" + os.environ.get("USER_PERMISSIONS_NOTES_ALLOW_SHARING", "False").lower() == "true" ) USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING = ( @@ -3032,6 +3031,12 @@ SEARXNG_QUERY_URL = PersistentConfig( os.getenv("SEARXNG_QUERY_URL", ""), ) +SEARXNG_LANGUAGE = PersistentConfig( + "SEARXNG_LANGUAGE", + "rag.web.search.searxng_language", + os.getenv("SEARXNG_LANGUAGE", "all"), +) + YACY_QUERY_URL = PersistentConfig( "YACY_QUERY_URL", "rag.web.search.yacy_query_url", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 5609289166..d8e937a567 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -298,6 +298,7 @@ from open_webui.config import ( SERPAPI_API_KEY, SERPAPI_ENGINE, SEARXNG_QUERY_URL, + SEARXNG_LANGUAGE, YACY_QUERY_URL, YACY_USERNAME, YACY_PASSWORD, @@ -936,6 +937,7 @@ app.state.config.ENABLE_ONEDRIVE_INTEGRATION = ENABLE_ONEDRIVE_INTEGRATION app.state.config.OLLAMA_CLOUD_WEB_SEARCH_API_KEY = OLLAMA_CLOUD_WEB_SEARCH_API_KEY app.state.config.SEARXNG_QUERY_URL = SEARXNG_QUERY_URL +app.state.config.SEARXNG_LANGUAGE = SEARXNG_LANGUAGE app.state.config.YACY_QUERY_URL = YACY_QUERY_URL app.state.config.YACY_USERNAME = YACY_USERNAME app.state.config.YACY_PASSWORD = YACY_PASSWORD diff --git a/backend/open_webui/retrieval/web/searxng.py b/backend/open_webui/retrieval/web/searxng.py index 15e3c098a9..b7dfb3e844 100644 --- a/backend/open_webui/retrieval/web/searxng.py +++ b/backend/open_webui/retrieval/web/searxng.py @@ -27,7 +27,7 @@ def search_searxng( count (int): The maximum number of results to retrieve from the search. Keyword Args: - language (str): Language filter for the search results; e.g., "en-US". Defaults to an empty string. + language (str): Language filter for the search results; e.g., "all", "en-US", "es". Defaults to "all". safesearch (int): Safe search filter for safer web results; 0 = off, 1 = moderate, 2 = strict. Defaults to 1 (moderate). time_range (str): Time range for filtering results by date; e.g., "2023-04-05..today" or "all-time". Defaults to ''. categories: (Optional[list[str]]): Specific categories within which the search should be performed, defaulting to an empty string if not provided. @@ -40,7 +40,7 @@ def search_searxng( """ # Default values for optional parameters are provided as empty strings or None when not specified. - language = kwargs.get("language", "en-US") + language = kwargs.get("language", "all") safesearch = kwargs.get("safesearch", "1") time_range = kwargs.get("time_range", "") categories = "".join(kwargs.get("categories", [])) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 08ffde1733..07869df33f 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -507,6 +507,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "BYPASS_WEB_SEARCH_WEB_LOADER": request.app.state.config.BYPASS_WEB_SEARCH_WEB_LOADER, "OLLAMA_CLOUD_WEB_SEARCH_API_KEY": request.app.state.config.OLLAMA_CLOUD_WEB_SEARCH_API_KEY, "SEARXNG_QUERY_URL": request.app.state.config.SEARXNG_QUERY_URL, + "SEARXNG_LANGUAGE": request.app.state.config.SEARXNG_LANGUAGE, "YACY_QUERY_URL": request.app.state.config.YACY_QUERY_URL, "YACY_USERNAME": request.app.state.config.YACY_USERNAME, "YACY_PASSWORD": request.app.state.config.YACY_PASSWORD, @@ -566,6 +567,7 @@ class WebConfig(BaseModel): BYPASS_WEB_SEARCH_WEB_LOADER: Optional[bool] = None OLLAMA_CLOUD_WEB_SEARCH_API_KEY: Optional[str] = None SEARXNG_QUERY_URL: Optional[str] = None + SEARXNG_LANGUAGE: Optional[str] = None YACY_QUERY_URL: Optional[str] = None YACY_USERNAME: Optional[str] = None YACY_PASSWORD: Optional[str] = None @@ -1026,6 +1028,7 @@ async def update_rag_config( form_data.web.OLLAMA_CLOUD_WEB_SEARCH_API_KEY ) request.app.state.config.SEARXNG_QUERY_URL = form_data.web.SEARXNG_QUERY_URL + request.app.state.config.SEARXNG_LANGUAGE = form_data.web.SEARXNG_LANGUAGE request.app.state.config.YACY_QUERY_URL = form_data.web.YACY_QUERY_URL request.app.state.config.YACY_USERNAME = form_data.web.YACY_USERNAME request.app.state.config.YACY_PASSWORD = form_data.web.YACY_PASSWORD @@ -1181,6 +1184,7 @@ async def update_rag_config( "BYPASS_WEB_SEARCH_WEB_LOADER": request.app.state.config.BYPASS_WEB_SEARCH_WEB_LOADER, "OLLAMA_CLOUD_WEB_SEARCH_API_KEY": request.app.state.config.OLLAMA_CLOUD_WEB_SEARCH_API_KEY, "SEARXNG_QUERY_URL": request.app.state.config.SEARXNG_QUERY_URL, + "SEARXNG_LANGUAGE": request.app.state.config.SEARXNG_LANGUAGE, "YACY_QUERY_URL": request.app.state.config.YACY_QUERY_URL, "YACY_USERNAME": request.app.state.config.YACY_USERNAME, "YACY_PASSWORD": request.app.state.config.YACY_PASSWORD, @@ -1815,11 +1819,13 @@ def search_web( raise Exception("No PERPLEXITY_API_KEY found in environment variables") elif engine == "searxng": if request.app.state.config.SEARXNG_QUERY_URL: + searxng_kwargs = {"language": request.app.state.config.SEARXNG_LANGUAGE} return search_searxng( request.app.state.config.SEARXNG_QUERY_URL, query, request.app.state.config.WEB_SEARCH_RESULT_COUNT, request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, + **searxng_kwargs, ) else: raise Exception("No SEARXNG_QUERY_URL found in environment variables") diff --git a/src/lib/components/admin/Settings/WebSearch.svelte b/src/lib/components/admin/Settings/WebSearch.svelte index f26a9f85b8..588a5a6ac0 100644 --- a/src/lib/components/admin/Settings/WebSearch.svelte +++ b/src/lib/components/admin/Settings/WebSearch.svelte @@ -189,7 +189,7 @@ {:else if webConfig.WEB_SEARCH_ENGINE === 'searxng'}