|
@@ -55,6 +55,7 @@ from open_webui.retrieval.web.serply import search_serply
|
|
from open_webui.retrieval.web.serpstack import search_serpstack
|
|
from open_webui.retrieval.web.serpstack import search_serpstack
|
|
from open_webui.retrieval.web.tavily import search_tavily
|
|
from open_webui.retrieval.web.tavily import search_tavily
|
|
from open_webui.retrieval.web.bing import search_bing
|
|
from open_webui.retrieval.web.bing import search_bing
|
|
|
|
+from open_webui.retrieval.web.exa import search_exa
|
|
|
|
|
|
|
|
|
|
from open_webui.retrieval.utils import (
|
|
from open_webui.retrieval.utils import (
|
|
@@ -388,6 +389,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)):
|
|
"jina_api_key": request.app.state.config.JINA_API_KEY,
|
|
"jina_api_key": request.app.state.config.JINA_API_KEY,
|
|
"bing_search_v7_endpoint": request.app.state.config.BING_SEARCH_V7_ENDPOINT,
|
|
"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,
|
|
"bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
|
|
|
|
+ "exa_api_key": request.app.state.config.EXA_API_KEY,
|
|
"result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
|
"result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
|
"concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
|
"concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
|
},
|
|
},
|
|
@@ -436,6 +438,7 @@ class WebSearchConfig(BaseModel):
|
|
jina_api_key: Optional[str] = None
|
|
jina_api_key: Optional[str] = None
|
|
bing_search_v7_endpoint: Optional[str] = None
|
|
bing_search_v7_endpoint: Optional[str] = None
|
|
bing_search_v7_subscription_key: Optional[str] = None
|
|
bing_search_v7_subscription_key: Optional[str] = None
|
|
|
|
+ exa_api_key: Optional[str] = None
|
|
result_count: Optional[int] = None
|
|
result_count: Optional[int] = None
|
|
concurrent_requests: Optional[int] = None
|
|
concurrent_requests: Optional[int] = None
|
|
|
|
|
|
@@ -542,6 +545,8 @@ async def update_rag_config(
|
|
form_data.web.search.bing_search_v7_subscription_key
|
|
form_data.web.search.bing_search_v7_subscription_key
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+ request.app.state.config.EXA_API_KEY = form_data.web.search.exa_api_key
|
|
|
|
+
|
|
request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = (
|
|
request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = (
|
|
form_data.web.search.result_count
|
|
form_data.web.search.result_count
|
|
)
|
|
)
|
|
@@ -591,6 +596,7 @@ async def update_rag_config(
|
|
"jina_api_key": request.app.state.config.JINA_API_KEY,
|
|
"jina_api_key": request.app.state.config.JINA_API_KEY,
|
|
"bing_search_v7_endpoint": request.app.state.config.BING_SEARCH_V7_ENDPOINT,
|
|
"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,
|
|
"bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
|
|
|
|
+ "exa_api_key": request.app.state.config.EXA_API_KEY,
|
|
"result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
|
"result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
|
"concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
|
"concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
|
},
|
|
},
|
|
@@ -1099,6 +1105,7 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]:
|
|
- SERPER_API_KEY
|
|
- SERPER_API_KEY
|
|
- SERPLY_API_KEY
|
|
- SERPLY_API_KEY
|
|
- TAVILY_API_KEY
|
|
- TAVILY_API_KEY
|
|
|
|
+ - EXA_API_KEY
|
|
- SEARCHAPI_API_KEY + SEARCHAPI_ENGINE (by default `google`)
|
|
- SEARCHAPI_API_KEY + SEARCHAPI_ENGINE (by default `google`)
|
|
Args:
|
|
Args:
|
|
query (str): The query to search for
|
|
query (str): The query to search for
|
|
@@ -1233,6 +1240,13 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]:
|
|
request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
|
request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
|
request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
|
|
request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
|
|
)
|
|
)
|
|
|
|
+ elif engine == "exa":
|
|
|
|
+ return search_exa(
|
|
|
|
+ request.app.state.config.EXA_API_KEY,
|
|
|
|
+ query,
|
|
|
|
+ request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
|
|
|
+ request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
|
|
|
|
+ )
|
|
else:
|
|
else:
|
|
raise Exception("No search engine API key found in environment variables")
|
|
raise Exception("No search engine API key found in environment variables")
|
|
|
|
|