From 1c27e0f2aedf49e1b2e4623796df8319eace5416 Mon Sep 17 00:00:00 2001 From: Gordon Date: Mon, 22 Sep 2025 18:54:30 +0800 Subject: [PATCH] feat: add support for searx/searxng (#253) * add searx/searxng support * nit * Fix indentation in search.py for readability * Clean up imports in search.py Removed unused imports from search.py --------- Co-authored-by: Willem Jiang --- .env.example | 3 ++- README.md | 4 ++++ README_de.md | 4 ++++ README_es.md | 4 ++++ README_ja.md | 4 ++++ README_pt.md | 4 ++++ README_ru.md | 4 ++++ README_zh.md | 4 ++++ src/config/tools.py | 1 + src/tools/search.py | 10 ++++++++++ 10 files changed, 41 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index a4cd0b2..4ccc32f 100644 --- a/.env.example +++ b/.env.example @@ -22,9 +22,10 @@ ENABLE_MCP_SERVER_CONFIGURATION=false # Otherwise, you system could be compromised. ENABLE_PYTHON_REPL=false -# Search Engine, Supported values: tavily (recommended), duckduckgo, brave_search, arxiv +# Search Engine, Supported values: tavily (recommended), duckduckgo, brave_search, arxiv, searx SEARCH_API=tavily TAVILY_API_KEY=tvly-xxx +# SEARX_HOST=xxx # Required only if SEARCH_API is searx.(compatible with both Searx and SearxNG) # BRAVE_SEARCH_API_KEY=xxx # Required only if SEARCH_API is brave_search # JINA_API_KEY=jina_xxx # Optional, default is None diff --git a/README.md b/README.md index 1331e17..da9682e 100644 --- a/README.md +++ b/README.md @@ -169,6 +169,10 @@ DeerFlow supports multiple search engines that can be configured in your `.env` - No API key required - Specialized for scientific and academic papers +- **Searx/SearxNG**: Self-hosted metasearch engine + - Requires `SEARX_HOST` to be set in the `.env` file + - Supports connecting to either Searx or SearxNG + To configure your preferred search engine, set the `SEARCH_API` variable in your `.env` file: ```bash diff --git a/README_de.md b/README_de.md index bf126dc..d565edc 100644 --- a/README_de.md +++ b/README_de.md @@ -167,6 +167,10 @@ DeerFlow unterstützt mehrere Suchmaschinen, die in Ihrer `.env`-Datei über die - Kein API-Schlüssel erforderlich - Spezialisiert auf wissenschaftliche und akademische Papiere +- **Searx/SearxNG**: Selbstgehostete Metasuchmaschine + - Erfordert `SEARX_HOST` in Ihrer `.env`-Datei + - Unterstützt die Anbindung an Searx oder SearxNG + Um Ihre bevorzugte Suchmaschine zu konfigurieren, setzen Sie die Variable `SEARCH_API` in Ihrer `.env`-Datei: ```bash diff --git a/README_es.md b/README_es.md index f580f83..c556ef0 100644 --- a/README_es.md +++ b/README_es.md @@ -168,6 +168,10 @@ DeerFlow soporta múltiples motores de búsqueda que pueden configurarse en tu a - No requiere clave API - Especializado en artículos científicos y académicos +- **Searx/SearxNG**: Motor de metabúsqueda autoalojado + - Requiere `SEARX_HOST` en tu archivo `.env` + - Compatible con Searx o SearxNG + Para configurar tu motor de búsqueda preferido, establece la variable `SEARCH_API` en tu archivo `.env`: ```bash diff --git a/README_ja.md b/README_ja.md index 1ac5ab7..7fae560 100644 --- a/README_ja.md +++ b/README_ja.md @@ -162,6 +162,10 @@ DeerFlow は複数の検索エンジンをサポートしており、`.env`フ - APIキー不要 - 科学・学術論文専用 +- **Searx/SearxNG**セルフホスト型メタ検索エンジン + - `.env`ファイルに`SEARX_HOST`が必要 + - Searx または SearxNG に接続可能 + お好みの検索エンジンを設定するには、`.env`ファイルで`SEARCH_API`変数を設定します: ```bash diff --git a/README_pt.md b/README_pt.md index c9fe4f9..27e69c3 100644 --- a/README_pt.md +++ b/README_pt.md @@ -171,6 +171,10 @@ DeerFlow suporta múltiplos mecanismos de busca que podem ser configurados no se - Não requer chave API - Especializado em artigos científicos e acadêmicos +- **Searx/SearxNG**: Mecanismo de metabusca auto-hospedado + - Requer `SEARX_HOST` no seu arquivo `.env` + - Suporta integração com Searx ou SearxNG + Para configurar o seu mecanismo preferido, defina a variável `SEARCH_API` no seu arquivo: ```bash diff --git a/README_ru.md b/README_ru.md index 5581c9c..f9a7cf5 100644 --- a/README_ru.md +++ b/README_ru.md @@ -168,6 +168,10 @@ DeerFlow поддерживает несколько поисковых сист - Не требуется API-ключ - Специализируется на научных и академических статьях +- **Searx/SearxNG**: Самостоятельно размещённая метапоисковая система + - Требуется `SEARX_HOST` в вашем файле `.env` + - Поддерживает подключение к Searx или SearxNG + Чтобы настроить предпочитаемую поисковую систему, установите переменную `SEARCH_API` в вашем файле `.env`: ```bash diff --git a/README_zh.md b/README_zh.md index e45443c..d7feab9 100644 --- a/README_zh.md +++ b/README_zh.md @@ -163,6 +163,10 @@ DeerFlow 支持多种搜索引擎,可以在`.env`文件中通过`SEARCH_API` - 无需 API 密钥 - 专为科学和学术论文设计 +- **Searx/SearxNG**:自托管的元搜索引擎 + - 需要在`.env`文件中设置`SEARX_HOST` + - 支持对接Searx或SearxNG + 要配置您首选的搜索引擎,请在`.env`文件中设置`SEARCH_API`变量: ```bash diff --git a/src/config/tools.py b/src/config/tools.py index 26e3dc7..c30e53c 100644 --- a/src/config/tools.py +++ b/src/config/tools.py @@ -14,6 +14,7 @@ class SearchEngine(enum.Enum): DUCKDUCKGO = "duckduckgo" BRAVE_SEARCH = "brave_search" ARXIV = "arxiv" + SEARX = "searx" WIKIPEDIA = "wikipedia" diff --git a/src/tools/search.py b/src/tools/search.py index 5f1ef8b..ead9b6e 100644 --- a/src/tools/search.py +++ b/src/tools/search.py @@ -8,12 +8,14 @@ from typing import List, Optional from langchain_community.tools import ( BraveSearch, DuckDuckGoSearchResults, + SearxSearchRun, WikipediaQueryRun, ) from langchain_community.tools.arxiv import ArxivQueryRun from langchain_community.utilities import ( ArxivAPIWrapper, BraveSearchWrapper, + SearxSearchWrapper, WikipediaAPIWrapper, ) @@ -30,6 +32,7 @@ LoggedTavilySearch = create_logged_tool(TavilySearchWithImages) LoggedDuckDuckGoSearch = create_logged_tool(DuckDuckGoSearchResults) LoggedBraveSearch = create_logged_tool(BraveSearch) LoggedArxivSearch = create_logged_tool(ArxivQueryRun) +LoggedSearxSearch = create_logged_tool(SearxSearchRun) LoggedWikipediaSearch = create_logged_tool(WikipediaQueryRun) @@ -88,6 +91,13 @@ def get_web_search_tool(max_search_results: int): load_all_available_meta=True, ), ) + elif SELECTED_SEARCH_ENGINE == SearchEngine.SEARX.value: + return LoggedSearxSearch( + name="web_search", + wrapper=SearxSearchWrapper( + k=max_search_results, + ) + ) elif SELECTED_SEARCH_ENGINE == SearchEngine.WIKIPEDIA.value: wiki_lang = search_config.get("wikipedia_lang", "en") wiki_doc_content_chars_max = search_config.get(