diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 8294e5166..b8f92a26c 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -3186,6 +3186,12 @@ JINA_API_KEY = PersistentConfig( os.getenv("JINA_API_KEY", ""), ) +JINA_API_BASE_URL = PersistentConfig( + "JINA_API_BASE_URL", + "rag.web.search.jina_api_base_url", + os.getenv("JINA_API_BASE_URL", ""), +) + SEARCHAPI_API_KEY = PersistentConfig( "SEARCHAPI_API_KEY", "rag.web.search.searchapi_api_key", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 952ff7f2e..516056ada 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -299,6 +299,7 @@ from open_webui.config import ( WEB_SEARCH_DOMAIN_FILTER_LIST, OLLAMA_CLOUD_WEB_SEARCH_API_KEY, JINA_API_KEY, + JINA_API_BASE_URL, SEARCHAPI_API_KEY, SEARCHAPI_ENGINE, SERPAPI_API_KEY, @@ -969,6 +970,7 @@ app.state.config.SEARCHAPI_ENGINE = SEARCHAPI_ENGINE app.state.config.SERPAPI_API_KEY = SERPAPI_API_KEY app.state.config.SERPAPI_ENGINE = SERPAPI_ENGINE app.state.config.JINA_API_KEY = JINA_API_KEY +app.state.config.JINA_API_BASE_URL = JINA_API_BASE_URL app.state.config.BING_SEARCH_V7_ENDPOINT = BING_SEARCH_V7_ENDPOINT app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY = BING_SEARCH_V7_SUBSCRIPTION_KEY app.state.config.EXA_API_KEY = EXA_API_KEY diff --git a/backend/open_webui/retrieval/web/jina_search.py b/backend/open_webui/retrieval/web/jina_search.py index bcc579402..d1168bb36 100644 --- a/backend/open_webui/retrieval/web/jina_search.py +++ b/backend/open_webui/retrieval/web/jina_search.py @@ -7,17 +7,21 @@ from yarl import URL log = logging.getLogger(__name__) -def search_jina(api_key: str, query: str, count: int) -> list[SearchResult]: +def search_jina( + api_key: str, query: str, count: int, base_url: str = "" +) -> list[SearchResult]: """ Search using Jina's Search API and return the results as a list of SearchResult objects. Args: + api_key (str): The Jina API key query (str): The query to search for count (int): The number of results to return + base_url (str): Optional custom base URL for the Jina API Returns: list[SearchResult]: A list of search results """ - jina_search_endpoint = "https://s.jina.ai/" + jina_search_endpoint = base_url if base_url else "https://s.jina.ai/" headers = { "Accept": "application/json", diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index b93ea9ad8..6f6baedc9 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -548,6 +548,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "SERPAPI_API_KEY": request.app.state.config.SERPAPI_API_KEY, "SERPAPI_ENGINE": request.app.state.config.SERPAPI_ENGINE, "JINA_API_KEY": request.app.state.config.JINA_API_KEY, + "JINA_API_BASE_URL": request.app.state.config.JINA_API_BASE_URL, "BING_SEARCH_V7_ENDPOINT": request.app.state.config.BING_SEARCH_V7_ENDPOINT, "BING_SEARCH_V7_SUBSCRIPTION_KEY": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, "EXA_API_KEY": request.app.state.config.EXA_API_KEY, @@ -609,6 +610,7 @@ class WebConfig(BaseModel): SERPAPI_API_KEY: Optional[str] = None SERPAPI_ENGINE: Optional[str] = None JINA_API_KEY: Optional[str] = None + JINA_API_BASE_URL: Optional[str] = None BING_SEARCH_V7_ENDPOINT: Optional[str] = None BING_SEARCH_V7_SUBSCRIPTION_KEY: Optional[str] = None EXA_API_KEY: Optional[str] = None @@ -1094,6 +1096,7 @@ async def update_rag_config( request.app.state.config.SERPAPI_API_KEY = form_data.web.SERPAPI_API_KEY request.app.state.config.SERPAPI_ENGINE = form_data.web.SERPAPI_ENGINE request.app.state.config.JINA_API_KEY = form_data.web.JINA_API_KEY + request.app.state.config.JINA_API_BASE_URL = form_data.web.JINA_API_BASE_URL request.app.state.config.BING_SEARCH_V7_ENDPOINT = ( form_data.web.BING_SEARCH_V7_ENDPOINT ) @@ -1246,6 +1249,7 @@ async def update_rag_config( "SERPAPI_API_KEY": request.app.state.config.SERPAPI_API_KEY, "SERPAPI_ENGINE": request.app.state.config.SERPAPI_ENGINE, "JINA_API_KEY": request.app.state.config.JINA_API_KEY, + "JINA_API_BASE_URL": request.app.state.config.JINA_API_BASE_URL, "BING_SEARCH_V7_ENDPOINT": request.app.state.config.BING_SEARCH_V7_ENDPOINT, "BING_SEARCH_V7_SUBSCRIPTION_KEY": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, "EXA_API_KEY": request.app.state.config.EXA_API_KEY, @@ -2027,6 +2031,7 @@ def search_web( request.app.state.config.JINA_API_KEY, query, request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.JINA_API_BASE_URL, ) elif engine == "bing": return search_bing( diff --git a/src/lib/components/admin/Settings/WebSearch.svelte b/src/lib/components/admin/Settings/WebSearch.svelte index dc679bbe8..4cbd58115 100644 --- a/src/lib/components/admin/Settings/WebSearch.svelte +++ b/src/lib/components/admin/Settings/WebSearch.svelte @@ -469,6 +469,24 @@ {:else if webConfig.WEB_SEARCH_ENGINE === 'jina'}
+
+ {$i18n.t('Jina API Base URL')} +
+ +
+
+ +
+
+
+ +
{$i18n.t('Jina API Key')}