- 入库历史遗漏源码/测试:router_system 9 模块(agent/executors/inference/knowledge/ memory/planner/skills/trace)、tests 11 个测试文件、config/knowledge 领域知识 - 入库根目录方案文档(v2/v3/可行性×2)、references 文献(arxiv 14-18/cnki_open/ 参考文献清单)、research 论文素材(routerarena/paper/中文文献 PDF) - 前端构建产物刷新(新 hash);webapp 误写文档删除 - gitignore 增补:deepseek-harness、research/_refs、.mimosa/.zcode、网关日志/pid、 临时调试脚本、tests/e2e/node_modules、AI代理功能开发/prefix - 基线确认:318 passed
60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
"""知识库(KnowledgeBase)单元测试。"""
|
|
from router_system.knowledge import KnowledgeBase, Rule
|
|
|
|
|
|
def test_builtin_rules_loaded():
|
|
kb = KnowledgeBase()
|
|
# 内置规则 + 文件规则合并后应至少有 10+ 条
|
|
assert kb.rules_count() >= 10
|
|
# 文件规则按 id 覆盖内置(code-sort 存在且可命中)
|
|
r = kb.rule("code-sort")
|
|
assert r is not None
|
|
assert r.template == "code-implement"
|
|
|
|
|
|
def test_match_priority_order():
|
|
kb = KnowledgeBase()
|
|
hits = kb.match("用 Python 写一个快速排序函数", domain="code")
|
|
assert hits, "应命中 code 领域规则"
|
|
# 优先级降序:排序规则(90) 应在通用实现规则(50) 之前
|
|
assert hits[0].id == "code-sort"
|
|
priorities = [h.priority for h in hits]
|
|
assert priorities == sorted(priorities, reverse=True)
|
|
|
|
|
|
def test_match_cross_domain():
|
|
kb = KnowledgeBase()
|
|
# 同一文本在不同领域过滤下命中不同规则
|
|
code_hits = kb.match("帮我调试报错 TypeError", domain="code")
|
|
assert code_hits and code_hits[0].id == "code-debug"
|
|
# 领域过滤:不指定 domain 时全领域匹配
|
|
all_hits = kb.match("帮我调试报错 TypeError")
|
|
assert len(all_hits) >= len(code_hits)
|
|
|
|
|
|
def test_task_template():
|
|
kb = KnowledgeBase()
|
|
tpl = kb.task_template("code-implement")
|
|
assert tpl is not None
|
|
steps = tpl["steps"]
|
|
assert len(steps) == 4
|
|
ids = [s["id"] for s in steps]
|
|
assert ids == ["analyze", "design", "implement", "verify"]
|
|
# 依赖关系存在
|
|
assert steps[1]["deps"] == ["analyze"]
|
|
|
|
|
|
def test_facts():
|
|
kb = KnowledgeBase()
|
|
legal_facts = kb.facts("legal")
|
|
assert any("竞业" in f["statement"] for f in legal_facts)
|
|
medical_facts = kb.facts("medical")
|
|
assert any("高血压" in f["statement"] for f in medical_facts)
|
|
|
|
|
|
def test_rule_matches_case_insensitive():
|
|
r = Rule(id="t", domain="code", patterns=["Sort", "Python"])
|
|
assert r.matches("用 python 写一个 sort 算法")
|
|
assert r.matches("PYTHON 快速排序")
|
|
assert not r.matches("java 写个函数")
|