diff --git a/apps/scenarios/services.py b/apps/scenarios/services.py index 2120932..546ac70 100644 --- a/apps/scenarios/services.py +++ b/apps/scenarios/services.py @@ -36,9 +36,23 @@ def _get_nested(config: dict, path: tuple[str, ...]): def validate_scenario(config: dict) -> dict: + # 只校验真正影响运行闭环的必填字段; + # 页面展示类字段如 applicable_questions 允许缺失,并在归一化阶段补默认值。 for field_path in REQUIRED_FIELDS: _get_nested(config, field_path) - return config + return normalize_scenario(config) + + +def normalize_scenario(config: dict) -> dict: + """补齐页面和其他模块常用的派生字段,减少模板中的条件判断。""" + normalized = dict(config) + normalized["applicable_questions"] = list(config.get("applicable_questions") or []) + normalized["rag"] = dict(config.get("rag", {})) + normalized["rag"]["enabled"] = bool(normalized["rag"].get("enabled")) + normalized["tools"] = list(config.get("tools") or []) + normalized["tool_count"] = len(normalized["tools"]) + normalized["is_enabled"] = True + return normalized def _scenario_files() -> list[Path]: @@ -49,6 +63,7 @@ def _scenario_files() -> list[Path]: def list_scenarios() -> list[dict]: + # 首页每次读取最新 YAML,便于复试现场快速改题。 scenarios = [] for path in _scenario_files(): with path.open("r", encoding="utf-8") as file: diff --git a/apps/scenarios/views.py b/apps/scenarios/views.py index 496fc53..c17bf5f 100644 --- a/apps/scenarios/views.py +++ b/apps/scenarios/views.py @@ -4,4 +4,5 @@ from .services import list_scenarios def index(request): + # 首页只消费服务层给出的场景摘要,不自行拼装配置字段。 return render(request, "scenarios/index.html", {"scenarios": list_scenarios()}) diff --git a/templates/scenarios/index.html b/templates/scenarios/index.html index 83528cc..a7bb3d5 100644 --- a/templates/scenarios/index.html +++ b/templates/scenarios/index.html @@ -17,8 +17,16 @@ +

适用题型: + {% if scenario.applicable_questions %} + {{ scenario.applicable_questions|join:"、" }} + {% else %} + 暂未配置 + {% endif %} +

进入对话

diff --git a/tests/test_scenarios.py b/tests/test_scenarios.py index bca3b92..7c3ba85 100644 --- a/tests/test_scenarios.py +++ b/tests/test_scenarios.py @@ -23,8 +23,18 @@ def test_get_scenario_returns_full_agent_config(): assert scenario["agent"]["role"] == "质量管理专家" assert scenario["rag"]["enabled"] is True assert scenario["output"]["type"] == "quality_report" + assert "质量异常分析" in scenario["applicable_questions"][0] def test_get_scenario_raises_clear_error_for_missing_id(): with pytest.raises(ScenarioNotFound, match="场景不存在"): get_scenario("missing") + + +def test_home_page_shows_applicable_questions(client): + response = client.get("/") + + content = response.content.decode("utf-8") + assert response.status_code == 200 + assert "适用题型" in content + assert "SOP 问答" in content