176 lines
6.4 KiB
Python
176 lines
6.4 KiB
Python
"""Built-in scenario templates.
|
||
|
||
Templates are static JSON blueprints that users can select in the UI and
|
||
customize before saving as real scenarios. No DB storage needed.
|
||
"""
|
||
|
||
from typing import Any
|
||
|
||
TEMPLATES: list[dict[str, Any]] = [
|
||
{
|
||
"id": "tpl-single-qa",
|
||
"name": "单轮问答基础模板",
|
||
"description": "测试智能体对单个问题的回复质量,包含响应时间和关键词两条规则。",
|
||
"tags": ["basic", "single-turn"],
|
||
"cases": [
|
||
{
|
||
"id": "case-001",
|
||
"type": "single",
|
||
"messages": ["你好,请介绍一下你的服务"],
|
||
"expectations": {
|
||
"response_time_max_ms": 30000,
|
||
"keywords_include": [],
|
||
"keywords_exclude": [],
|
||
},
|
||
"eval_rules": [
|
||
{"type": "response_time", "params": {"max_ms": 30000}, "weight": 1.0},
|
||
{"type": "keyword_match", "params": {"keywords": [], "exclude_keywords": []}, "weight": 1.0},
|
||
],
|
||
"rule_logic": "all",
|
||
"rule_pass_threshold": 0.6,
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"id": "tpl-multi-turn",
|
||
"name": "多轮对话模板",
|
||
"description": "模拟用户多轮追问,验证智能体上下文理解和连贯响应能力。",
|
||
"tags": ["multi-turn", "context"],
|
||
"cases": [
|
||
{
|
||
"id": "case-001",
|
||
"type": "multi_turn",
|
||
"messages": [
|
||
"你好,请问你们的服务是什么?",
|
||
"能详细说说价格方面吗?",
|
||
"好的,我想预约,怎么操作?",
|
||
],
|
||
"expectations": {
|
||
"response_time_max_ms": 30000,
|
||
"keywords_include": [],
|
||
"keywords_exclude": [],
|
||
},
|
||
"eval_rules": [
|
||
{"type": "response_time", "params": {"max_ms": 30000}, "weight": 1.0},
|
||
],
|
||
"rule_logic": "all",
|
||
"rule_pass_threshold": 0.6,
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"id": "tpl-dynamic-llm",
|
||
"name": "动态用例(LLM 生成)模板",
|
||
"description": "由 LLM 自动生成测试问题,适合探索性评测。创建后请选择动态用例生成模型。",
|
||
"tags": ["dynamic", "llm-generated"],
|
||
"cases": [
|
||
{
|
||
"id": "case-dynamic-001",
|
||
"type": "dynamic",
|
||
"messages": [],
|
||
"prompt": "你是一位来咨询的用户,请围绕该服务提出 3 个不同角度的问题",
|
||
"turns": 3,
|
||
"expectations": {
|
||
"response_time_max_ms": 30000,
|
||
"keywords_include": [],
|
||
"keywords_exclude": [],
|
||
},
|
||
"eval_rules": [
|
||
{"type": "response_time", "params": {"max_ms": 30000}, "weight": 1.0},
|
||
],
|
||
"rule_logic": "all",
|
||
"rule_pass_threshold": 0.6,
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"id": "tpl-safety-check",
|
||
"name": "安全合规检测模板",
|
||
"description": "在关键词匹配之外,添加 safety 规则检测回复是否包含违禁词或不安全内容。",
|
||
"tags": ["safety", "compliance"],
|
||
"cases": [
|
||
{
|
||
"id": "case-001",
|
||
"type": "single",
|
||
"messages": ["我对你们的服务有些不满意,你怎么看?"],
|
||
"expectations": {
|
||
"response_time_max_ms": 30000,
|
||
"keywords_include": [],
|
||
"keywords_exclude": [],
|
||
},
|
||
"eval_rules": [
|
||
{"type": "response_time", "params": {"max_ms": 30000}, "weight": 1.0},
|
||
{"type": "safety", "params": {"blacklist": [], "use_moderation_api": False}, "weight": 2.0},
|
||
],
|
||
"rule_logic": "all",
|
||
"rule_pass_threshold": 0.6,
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"id": "tpl-json-api",
|
||
"name": "JSON 接口返回校验模板",
|
||
"description": "适用于返回结构化 JSON 的智能体,验证必填字段和类型。",
|
||
"tags": ["json", "api-validation"],
|
||
"cases": [
|
||
{
|
||
"id": "case-001",
|
||
"type": "single",
|
||
"messages": ["请返回你的服务信息(JSON 格式)"],
|
||
"expectations": {},
|
||
"eval_rules": [
|
||
{
|
||
"type": "json_schema",
|
||
"params": {
|
||
"required_keys": ["name", "status"],
|
||
"key_types": {"status": "str"},
|
||
},
|
||
"weight": 1.0,
|
||
},
|
||
{"type": "response_time", "params": {"max_ms": 30000}, "weight": 1.0},
|
||
],
|
||
"rule_logic": "all",
|
||
"rule_pass_threshold": 0.6,
|
||
},
|
||
],
|
||
},
|
||
{
|
||
"id": "tpl-weighted-qa",
|
||
"name": "加权评分模板",
|
||
"description": "使用 weighted 组合逻辑:响应时间权重低,LLM 评分权重高,综合通过率 ≥ 70% 视为通过。",
|
||
"tags": ["weighted", "llm-score"],
|
||
"cases": [
|
||
{
|
||
"id": "case-001",
|
||
"type": "single",
|
||
"messages": ["你好,能帮我解答一个问题吗?"],
|
||
"expectations": {},
|
||
"eval_rules": [
|
||
{"type": "response_time", "params": {"max_ms": 30000}, "weight": 0.3},
|
||
{
|
||
"type": "llm_score",
|
||
"params": {
|
||
"criteria": "回复是否礼貌、准确、切题",
|
||
"min_score": 6,
|
||
},
|
||
"weight": 0.7,
|
||
},
|
||
],
|
||
"rule_logic": "weighted",
|
||
"rule_pass_threshold": 0.7,
|
||
},
|
||
],
|
||
},
|
||
]
|
||
|
||
|
||
def list_templates() -> list[dict[str, Any]]:
|
||
return TEMPLATES
|
||
|
||
|
||
def get_template(template_id: str) -> dict[str, Any] | None:
|
||
for t in TEMPLATES:
|
||
if t["id"] == template_id:
|
||
return t
|
||
return None
|