From a0b0420e6fef6982a2946e7b181e37adb25dcca5 Mon Sep 17 00:00:00 2001 From: ThomasAngel <30532050+rekterakathom@users.noreply.github.com> Date: Wed, 10 Jun 2026 18:59:47 +0300 Subject: [PATCH] chore: Switch duckduckgo-search to ddgs (#3143) * Switch to ddgs duckduckgo_search was deprecated, this is the recommended replacement * Update test_service_search_provider_guards.py According to review comment --- README.md | 2 +- requirements-optional.txt | 2 +- services/search/providers.py | 2 +- tests/test_service_search_provider_guards.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a320f0052..a0dde96a9 100644 --- a/README.md +++ b/README.md @@ -329,7 +329,7 @@ To expose Odysseus on a local network or Tailscale with HTTPS: | Package | Feature unlocked | |---------|-----------------| | `faster-whisper` | Local speech-to-text (microphone -> text) via the "local" STT provider. | -| `duckduckgo-search` | DuckDuckGo as a search provider option. | +| `ddgs` | DuckDuckGo as a search provider option. | | `PyMuPDF` | PDF page rendering in the side viewer panel and form-filling. (Note: AGPL-3.0) | | `markitdown` | Office/EPUB document text extraction (converts .docx/.xlsx/.pptx/.xls/.epub to Markdown). | diff --git a/requirements-optional.txt b/requirements-optional.txt index eeb57c151..b4b654232 100644 --- a/requirements-optional.txt +++ b/requirements-optional.txt @@ -15,7 +15,7 @@ faster-whisper # DuckDuckGo as a search provider option. # Install if you want DDG in the search-provider dropdown. # Alternatives: SearXNG, Brave, Tavily, Serper, Google PSE. -duckduckgo-search +ddgs # PDF form-filling feature (fillable AcroForm detection, field extraction, # value/annotation/signature stamping, page rendering for the form overlay). diff --git a/services/search/providers.py b/services/search/providers.py index 1f8097ad8..b913e1c6f 100644 --- a/services/search/providers.py +++ b/services/search/providers.py @@ -417,7 +417,7 @@ def duckduckgo_search(query: str, count: Optional[int] = None, time_filter: Opti return [] try: - from duckduckgo_search import DDGS + from ddgs import DDGS except ImportError: logger.warning("duckduckgo-search package not installed; using HTML fallback") return _html_fallback() diff --git a/tests/test_service_search_provider_guards.py b/tests/test_service_search_provider_guards.py index 373928e64..cb9171a54 100644 --- a/tests/test_service_search_provider_guards.py +++ b/tests/test_service_search_provider_guards.py @@ -90,8 +90,8 @@ def test_service_ddg_html_fallback_sends_safesearch(monkeypatch): seen["params"] = kwargs["params"] return _Response() - monkeypatch.setitem(sys.modules, "duckduckgo_search", None) monkeypatch.setattr(providers, "_get_search_settings", lambda: {"search_safesearch": "off"}) + monkeypatch.setitem(sys.modules, "ddgs", None) monkeypatch.setattr(providers.httpx, "get", fake_get) results = providers.duckduckgo_search("odysseus", count=1)