fix(web): pass proxy to DDGS client

The DuckDuckGo search provider instantiated DDGS(timeout=10) without
passing the configured proxy, making web_search unusable in environments
that require a proxy (e.g. behind GFW). DDGS supports a proxy parameter
and the proxy value is already available as self.proxy — it was simply
not forwarded.

Add a test verifying the proxy kwarg is forwarded to DDGS.
This commit is contained in:
hyoukadev
2026-06-24 15:45:44 +08:00
committed by Xubin Ren
parent 319791cd10
commit c66a0217d2
2 changed files with 22 additions and 1 deletions
+1 -1
View File
@@ -759,7 +759,7 @@ class WebSearchTool(Tool):
# We run it in a thread to avoid blocking the loop
from ddgs import DDGS
ddgs = DDGS(timeout=10)
ddgs = DDGS(timeout=10, proxy=self.proxy)
raw = await asyncio.wait_for(
asyncio.to_thread(ddgs.text, query, max_results=n),
timeout=self.config.timeout,
+21
View File
@@ -365,6 +365,27 @@ async def test_duckduckgo_search(monkeypatch):
assert "DDG Result" in result
@pytest.mark.asyncio
async def test_duckduckgo_search_passes_proxy(monkeypatch):
"""DDGS client must receive the configured proxy so search works behind a proxy."""
captured: dict = {}
class ProxyCaptorDDGS:
def __init__(self, **kw):
captured.update(kw)
def text(self, query, max_results=5):
return [{"title": "Proxied", "href": "https://ddg.example", "body": "OK"}]
monkeypatch.setattr("ddgs.DDGS", ProxyCaptorDDGS)
tool = _tool(provider="duckduckgo")
tool.proxy = "http://192.168.1.1:8080"
result = await tool.execute(query="hello")
assert captured.get("proxy") == "http://192.168.1.1:8080"
assert "Proxied" in result
@pytest.mark.asyncio
async def test_brave_fallback_to_duckduckgo_when_no_key(monkeypatch):
class MockDDGS: