Three near-identical Turn(...)+save_turn blocks (send-fail / poll-except / happy path) collapse into one _persist_turn helper differing only by the optional fields set. The期望→隐式规则 translation becomes a pure, unit-testable derive_implicit_rules seam (CONTEXT: 期望与规则叠加生效), and the rule_type→ModelPurpose map is hoisted to a module constant.
46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
"""Unit tests for derive_implicit_rules — 期望→隐式规则的纯翻译."""
|
|
|
|
from agenteval.evaluation.implicit_rules import derive_implicit_rules
|
|
from agenteval.models import Expectation
|
|
|
|
|
|
def test_empty_expectation_yields_no_rules():
|
|
assert derive_implicit_rules(Expectation()) == []
|
|
|
|
|
|
def test_intent_and_coherence_alone_yield_no_rules():
|
|
# intent / coherence_min_score 不派生隐式规则(无对应规则类型)
|
|
exp = Expectation(intent="问诊分流", coherence_min_score=0.8)
|
|
assert derive_implicit_rules(exp) == []
|
|
|
|
|
|
def test_response_time_yields_response_time_rule():
|
|
rules = derive_implicit_rules(Expectation(response_time_max_ms=2000))
|
|
assert len(rules) == 1
|
|
assert rules[0].type == "response_time"
|
|
assert rules[0].params == {"max_ms": 2000}
|
|
|
|
|
|
def test_keywords_include_yields_keyword_rule():
|
|
rules = derive_implicit_rules(Expectation(keywords_include=["挂号", "门诊"]))
|
|
assert len(rules) == 1
|
|
assert rules[0].type == "keyword_match"
|
|
assert rules[0].params == {"keywords": ["挂号", "门诊"], "exclude_keywords": []}
|
|
|
|
|
|
def test_keywords_exclude_alone_yields_keyword_rule():
|
|
rules = derive_implicit_rules(Expectation(keywords_exclude=["投诉"]))
|
|
assert len(rules) == 1
|
|
assert rules[0].type == "keyword_match"
|
|
assert rules[0].params == {"keywords": [], "exclude_keywords": ["投诉"]}
|
|
|
|
|
|
def test_both_expectations_yield_two_rules_in_order():
|
|
exp = Expectation(
|
|
response_time_max_ms=1500,
|
|
keywords_include=["预约"],
|
|
keywords_exclude=["取消"],
|
|
)
|
|
rules = derive_implicit_rules(exp)
|
|
assert [r.type for r in rules] == ["response_time", "keyword_match"]
|