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:
@@ -759,7 +759,7 @@ class WebSearchTool(Tool):
|
|||||||
# We run it in a thread to avoid blocking the loop
|
# We run it in a thread to avoid blocking the loop
|
||||||
from ddgs import DDGS
|
from ddgs import DDGS
|
||||||
|
|
||||||
ddgs = DDGS(timeout=10)
|
ddgs = DDGS(timeout=10, proxy=self.proxy)
|
||||||
raw = await asyncio.wait_for(
|
raw = await asyncio.wait_for(
|
||||||
asyncio.to_thread(ddgs.text, query, max_results=n),
|
asyncio.to_thread(ddgs.text, query, max_results=n),
|
||||||
timeout=self.config.timeout,
|
timeout=self.config.timeout,
|
||||||
|
|||||||
@@ -365,6 +365,27 @@ async def test_duckduckgo_search(monkeypatch):
|
|||||||
assert "DDG Result" in result
|
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
|
@pytest.mark.asyncio
|
||||||
async def test_brave_fallback_to_duckduckgo_when_no_key(monkeypatch):
|
async def test_brave_fallback_to_duckduckgo_when_no_key(monkeypatch):
|
||||||
class MockDDGS:
|
class MockDDGS:
|
||||||
|
|||||||
Reference in New Issue
Block a user