mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-06-15 15:24:06 +00:00
fix(web): update Kagi search API integration
Use Kagi's documented v1 Search API shape from the OpenAPI spec: POST /search, Bearer auth, JSON query payload, and data.search results.
This commit is contained in:
parent
4f14f980d9
commit
172ec4d4c4
@ -455,17 +455,16 @@ class WebSearchTool(Tool):
|
|||||||
return await self._search_duckduckgo(query, n)
|
return await self._search_duckduckgo(query, n)
|
||||||
try:
|
try:
|
||||||
async with httpx.AsyncClient(proxy=self.proxy) as client:
|
async with httpx.AsyncClient(proxy=self.proxy) as client:
|
||||||
r = await client.get(
|
r = await client.post(
|
||||||
"https://kagi.com/api/v0/search",
|
"https://kagi.com/api/v1/search",
|
||||||
params={"q": query, "limit": n},
|
json={"query": query, "limit": n},
|
||||||
headers={"Authorization": f"Bot {api_key}", "User-Agent": self.user_agent},
|
headers={"Authorization": f"Bearer {api_key}", "User-Agent": self.user_agent},
|
||||||
timeout=10.0,
|
timeout=10.0,
|
||||||
)
|
)
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
# t=0 items are search results; other values are related searches, etc.
|
|
||||||
items = [
|
items = [
|
||||||
{"title": d.get("title", ""), "url": d.get("url", ""), "content": d.get("snippet", "")}
|
{"title": d.get("title", ""), "url": d.get("url", ""), "content": d.get("snippet", "")}
|
||||||
for d in r.json().get("data", []) if d.get("t") == 0
|
for d in r.json().get("data", {}).get("search", [])
|
||||||
]
|
]
|
||||||
return _format_results(query, items, n)
|
return _format_results(query, items, n)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
@ -202,19 +202,23 @@ async def test_jina_search(monkeypatch):
|
|||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_kagi_search(monkeypatch):
|
async def test_kagi_search(monkeypatch):
|
||||||
async def mock_get(self, url, **kw):
|
async def mock_post(self, url, **kw):
|
||||||
assert "kagi.com/api/v0/search" in url
|
assert "kagi.com/api/v1/search" in url
|
||||||
assert kw["headers"]["Authorization"] == "Bot kagi-key"
|
assert kw["headers"]["Authorization"] == "Bearer kagi-key"
|
||||||
assert kw["headers"]["User-Agent"] == "nanobot-search-test"
|
assert kw["headers"]["User-Agent"] == "nanobot-search-test"
|
||||||
assert kw["params"] == {"q": "test", "limit": 2}
|
assert kw["json"] == {"query": "test", "limit": 2}
|
||||||
return _response(json={
|
return _response(json={
|
||||||
"data": [
|
"data": {
|
||||||
{"t": 0, "title": "Kagi Result", "url": "https://kagi.com", "snippet": "Premium search"},
|
"search": [
|
||||||
{"t": 1, "list": ["ignored related search"]},
|
{"title": "Kagi Result", "url": "https://kagi.com", "snippet": "Premium search"},
|
||||||
]
|
],
|
||||||
|
"related_search": [
|
||||||
|
{"title": "ignored related search", "url": "", "snippet": ""},
|
||||||
|
],
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
monkeypatch.setattr(httpx.AsyncClient, "get", mock_get)
|
monkeypatch.setattr(httpx.AsyncClient, "post", mock_post)
|
||||||
tool = _tool(provider="kagi", api_key="kagi-key", user_agent="nanobot-search-test")
|
tool = _tool(provider="kagi", api_key="kagi-key", user_agent="nanobot-search-test")
|
||||||
result = await tool.execute(query="test", count=2)
|
result = await tool.execute(query="test", count=2)
|
||||||
assert "Kagi Result" in result
|
assert "Kagi Result" in result
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user