mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-10-28 06:00:38 +00:00
* feat(knowledge): add independent Wiki and entity relation retrieval tools * fix(knowledge): address review diagnostics and CI catalog coverage * fix(knowledge): deduplicate graph evidence and update catalog e2e * fix(knowledge): clarify bounded evidence and pin browser CI runners * Update e2e-tests to run on ubuntu-latest * Update workflow to use ubuntu-latest * test(ci): stop pinning maintainer-controlled browser runner images --------- Co-authored-by: Willem Jiang <willem.jiang@gmail.com>
68 lines
2.7 KiB
Python
68 lines
2.7 KiB
Python
"""Exercise real HTTPX/SSL construction with only the network response replaced."""
|
|
|
|
import asyncio
|
|
import ssl
|
|
from pathlib import Path
|
|
|
|
import httpx
|
|
import pytest
|
|
|
|
|
|
@pytest.fixture
|
|
def weknora_provider(monkeypatch):
|
|
monkeypatch.syspath_prepend(str(Path(__file__).resolve().parents[3] / "examples/deerflow-extension-weknora"))
|
|
from deerflow_extension_weknora import WeKnoraProvider
|
|
|
|
monkeypatch.setenv("WEKNORA_BLOCKING_TEST_KEY", "synthetic")
|
|
return WeKnoraProvider({"spaces": [{"base_url": "https://weknora.invalid", "tenant_id": "1", "api_key_env": "WEKNORA_BLOCKING_TEST_KEY", "user_ids": ["alice"]}]})
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_weknora_ssl_setup_is_off_loop(weknora_provider, monkeypatch):
|
|
from deerflow.knowledge import KnowledgeRequestContext
|
|
|
|
async def send(self, request, **kwargs):
|
|
assert request.headers["X-Tenant-ID"] == "1"
|
|
return httpx.Response(200, request=request, json={"success": True, "data": [{"id": "kb", "name": "Synthetic"}]})
|
|
|
|
original = ssl.create_default_context
|
|
|
|
def ssl_context(*args, **kwargs):
|
|
try:
|
|
asyncio.get_running_loop()
|
|
except RuntimeError:
|
|
return original(*args, **kwargs)
|
|
raise AssertionError("SSL trust loading must run off the event loop")
|
|
|
|
monkeypatch.setattr(ssl, "create_default_context", ssl_context)
|
|
monkeypatch.setattr(httpx.AsyncClient, "send", send)
|
|
catalog = await weknora_provider.catalog(context=KnowledgeRequestContext("alice", "lead_agent"), page=1, page_size=20, search="")
|
|
assert catalog.items[0].name == "Synthetic"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_lightrag_relation_ssl_setup_is_off_loop(monkeypatch):
|
|
monkeypatch.syspath_prepend(str(Path(__file__).resolve().parents[3] / "examples/deerflow-extension-lightrag"))
|
|
from deerflow_extension_lightrag import LightRAGProvider
|
|
|
|
from deerflow.knowledge import KnowledgeRequestContext
|
|
|
|
monkeypatch.setenv("LR_BLOCKING_KEY", "synthetic")
|
|
provider = LightRAGProvider({"base_url": "https://lightrag.invalid", "api_key_env": "LR_BLOCKING_KEY", "user_ids": ["alice"]})
|
|
|
|
async def send(self, request, **kwargs):
|
|
return httpx.Response(200, request=request, json={"status": "success", "data": {"entities": [], "relationships": [], "chunks": []}})
|
|
|
|
original = ssl.create_default_context
|
|
|
|
def ssl_context(*args, **kwargs):
|
|
try:
|
|
asyncio.get_running_loop()
|
|
except RuntimeError:
|
|
return original(*args, **kwargs)
|
|
raise AssertionError("SSL trust loading must run off the event loop")
|
|
|
|
monkeypatch.setattr(ssl, "create_default_context", ssl_context)
|
|
monkeypatch.setattr(httpx.AsyncClient, "send", send)
|
|
assert not (await provider.relations_search("q", context=KnowledgeRequestContext("alice"))).hits
|